El objetivo de este manual es configurar un servidor OpenVPN que enrute solo la red visible del servidor OpenVPN o las redes que se quieran setear, excluyendo el tráfico externo a internet.
Pasos generales
- Actualizar e instalar paquetes necesarios.
- Configurar OpenVPN y crear usuarios.
- Configurar reglas de
iptables
. - Generar certificados.
- Configurar EasyRSA y crear credenciales.
- Generar y exportar configuraciones para clientes.
Actualización e instalación de paquetes
- Inicie con una máquina Debian 12 lista para conexión SSH.
- Ejecute los siguientes comandos:
apt update && apt upgrade -y wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg | gpg --dearmor -o /usr/share/keyrings/openvpn.asc
echo "deb [signed-by=/usr/share/keyrings/openvpn.asc] https://packages.openvpn.net/openvpn3/debian bullseye main" > /etc/apt/sources.list.d/openvpn.list
apt update
apt install openvpn iptables-persistent net-tools -y
Creación de usuario para OpenVPN
- Cree un usuario y grupo exclusivo para el servicio:
adduser --system --shell /usr/sbin/nologin --no-create-home ovpn
groupadd ovpn
usermod -g ovpn ovpn
Configuración de OpenVPN
- Cree el archivo
/etc/openvpn/server.conf
con la siguiente configuración base:dev tun
persist-key
persist-tun
topology subnet
port 1194
proto udp
keepalive 10 120
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dhp4096.pem
server 10.0.0.0 255.255.255.0
push "route 10.1.0.0 255.255.0.0"
user ovpn
group ovpn
tls-crypt /etc/openvpn/server/ta.key
auth SHA512
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256
ncp-ciphers AES-256-GCM:AES-256-CBC
ifconfig-pool-persist ipp.txt
status openvpn-status.log
log /var/log/openvpn.log
verb 3
Configuración de iptables
- Edite las reglas en
/etc/iptables/rules.v4
:*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.1.0.0/24 -o eth0 -j MASQUERADE
COMMIT
*filter
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i eth0 -p udp --dport 1194 -j ACCEPT
-A FORWARD -s 10.1.0.0/24 -i tun0 -o eth0 -j ACCEPT
-A OUTPUT -o eth0 -j ACCEPT
COMMIT
- Implemente las reglas:
iptables-restore < /etc/iptables/rules.v4
Configuración de sysctl
para reenvío de IP
- Edite
/etc/sysctl.conf
y asegúrese de quenet.ipv4.ip_forward=1
esté habilitado. - Recargue la configuración:
sysctl --system
Generación de certificados
- Cree la clave HMAC para los paquetes TLS:
openvpn --genkey --secret /etc/openvpn/server/ta.key
- Genere el parámetro Diffie-Hellman:
openssl genpkey -genparam -algorithm DH -out /etc/openvpn/server/dhp4096.pem -pkeyopt dh_paramgen_prime_len:4096
Configuración de EasyRSA
- Configure el entorno para la CA:
make-cadir ~/ca && cd ~/ca
ln -s openssl-1.0.0.cnf openssl.cnf
nano vars
- Defina las variables base en
vars
:export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"
- Genere credenciales:
source ./vars
./clean-all
./build-ca
./build-key-server server
Configuración para el cliente
- Cree un script para generar configuraciones de cliente:
nano clientevpn.sh
Contenido del script, donde pone serverip=<poner-ip-publica-del-servidor-a-conectar>:#!/bin/bash
clientuser=$1
cd /root/ca && source ./vars && ./pkitool --pass $clientuser
serverip="0.0.0.0"
cat << EOF > $clientuser.ovpn
client
dev tun
proto udp
remote $serverip 1194
persist-key
persist-tun
<ca>
$(cat keys/ca.crt)
</ca>
<cert>
$(cat keys/$clientuser.crt)
</cert>
<key>
$(cat keys/$clientuser.key)
</key>
<tls-crypt>
$(cat keys/ta.key)
</tls-crypt>
EOF
chmod +x $clientuser.ovpn
- Ejecútelo para generar el archivo
.ovpn
:./clientevpn.sh <nombre_cliente>
- El archivo resultante será el configurador para el cliente OpenVPN.
Finalmente, reinicie la máquina para que los cambios surtan efecto:
reboot