Por Félix Molinuevo, FMSI Sistemas de Informática
Este tutorial explica cómo configurar un servidor OpenVPN utilizando el método de routing en vez de bridging, por las razones expuestas aquí.
Se hará uso de easy-rsa. Esto es una colección de scripts que facilitan el manejo de certificados, tanto del servidor como de los clientes. Dicho directorio easy-rsa/ deberá ser copiado de la ubicación original instalada por el paquete OpenVPN al directorio de configuración en /etc/openvpn.
cp -iva /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa
Tal como se menciona en la documentación y por las razones allí indicadas, se muestran aquí –y se recomienda usar– direcciones IP de clase A para el túnel (10.8.0.0/24) y de clase B para la intranet (172.16.10.0/24).
Para OpenVPN, se instalaron los siguientes paquetes:
aptitude install openvpn openssl bridge-utils
Los scripts para trabajar con certificados estarán en /etc/openvpn/easy-rsa luego de copiar dicho directorio tal como se explica más arriba.
En Lenny, Easy-RSA viene en las versiones 1.0 y 2.0. Se usará 2.0 en este tutorial.
Recordar editar las variables del archivo “vars” con los valores correctos para el servidor en cuestión. Adicionalmente, si se desea generar un CA con contraseña, tipear el parámetro “–pass” para el script build-ca
cd /etc/openvpn/easy-rsa/ . ./vars ./clean-all ./build-ca --pass
./build-key-server server
./build-dh
Sin contraseña:
. ./vars ./build-key client1 ./build-key client2 ./build-key client3
Con contraseña:
. ./vars ./build-key-pass client1 ./build-key-pass client2 ./build-key-pass client3
En cada cliente, se deben copiar en el directorio config/ los siguientes archivos: ca.crt (el CA parte pública del servidor), client1.crt, client1.key y client1.csr.
Si se usan varios servidores OpenVPN distintos, se puede cambiar los nombres de cada uno, para diferenciarlos, reflejando dichos cambios en los archivos de configuración del cliente; estos archivos de configuración del cliente también pueden ser varios. El cliente OpenVPN GUI luego mostrará un menú con los distintos servidores para los cuales está configurado, permitiendo establecer uno o más túneles simultáneamente o no.
Para generar el archivo crl.pem, necesario para la revocación de certificados, se debe crear un certificado y revocarlo para que dicho archivo se cree y OpenVPN funcione correctamente, pero antes se debe comentar en el openssl.cnf (ya sea el easy-rsa o el de OpenSSL instalado en el servidor) la sección PKCS (si no se utiliza) tal como se describe al final de este tutorial:
. ./vars ./build-key client1 ./revoke-full client1
Adicionalmente, como OpenVPN según esta configuración es ejecutado con el uid y gid “nobody”, se deben cambiar los permisos del directorio keys para que pueda leer el archivo “crl.pem”:
chmod o+x keys/
Para revocar un certificado se utiliza el siguiente comando:
. ./vars ./revoke-full <common-name>
<common-name> es simplemente el nombre del cliente tal como se creó, según se muestra más arriba. La revocación toma validez inmediatamente:
... error 23 at 0 depth lookup:certificate revoked
Notar el “error 23” la última línea. Esto es correcto, e indica que la verificación del certificado revocado falló, tal como se desea.
Si el usuario ya está conectado, se debe desconectarlo con:
<Completar>
server.conf:
port 1194 proto udp dev tun ca /etc/openvpn/easy-rsa/keys/ca.crt crl-verify /etc/openvpn/easy-rsa/keys/crl.pem cert /etc/openvpn/easy-rsa/keys/server.crt key /etc/openvpn/easy-rsa/keys/server.key # This file should be kept secret dh /etc/openvpn/easy-rsa/keys/dh1024.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo user nobody group nobody persist-key persist-tun status /var/log/openvpn-status.log verb 3 push "route 172.16.10.0 255.255.255.0" push "dhcp-option WINS 172.16.10.1" push "dhcp-option DNS 172.16.10.1" push "dhcp-option DOMAIN dominio"
Estos comandos “push” le inyectan al cliente la configuración de la ruta, el DNS, el WINS y el dominio, y deben ser los correspondientes a la red que el servidor OpenVPN está sirviendo.
Si no se usa PKCS, la siguiente sección debe estar comentada:
#pkcs11 = pkcs11_section # [ pkcs11_section ] # engine_id = pkcs11 # dynamic_path = /usr/lib/engines/engine_pkcs11.so # MODULE_PATH = $ENV::PKCS11_MODULE_PATH # PIN = $ENV::PKCS11_PIN # init = 0
Esto es necesario para que la línea “crl-verify /etc/openvpn/easy-rsa/keys/crl.pem” del archivo de configuración del servidor no provoque un error e impida iniciar OpenVPN. Dicha línea es necesaria para que la revocación de los certificados funcione.
Las siguientes reglas Iptables permiten que Netfilter acepte conexiones entrantes en la interfaz TUN y reenvíe las peticiones hacia dentro de la red:
iptables -I INPUT -i tun+ -j ACCEPT iptables -I FORWARD -i tun+ -s 10.8.0.0/24 -d 172.16.10.0/24 -j ACCEPT
En /etc/shorewall/interfaces:
vpn tun+
En /etc/shorewall/policy:
vpn loc ACCEPT loc vpn ACCEPT vpn $FW ACCEPT $FW vpn ACCEPT
En /etc/shorewall/tunnels (aaa.bbb.ccc.ddd es la IP externa del servidor OpenVPN):
openvpn:1194 net 0.0.0.0/0
En /etc/shorewall/zones:
vpn ipv4
En /etc/shorewall/policy:
vpn all ACCEPT -
En /etc/shorewall/rules:
DNAT net loc:192.168.1.1 udp 1194
En /etc/shorewall/zones:
vpn ipv4
Se debe activar IP forwarding en el servidor que está ejecutando el servicio OpenVPN, y generar una regla Netfilter para que realice masquerading (enmascaramiento):
net.ipv4.ip_forward=1
y ejecutar sysctl -p
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
donde 10.8.0.0/24 es la red que corresponde a OpenVPN y eth0 la interfaz interna
En /etc/shorewall/zones:
#ZONE TYPE OPTIONS IN OUT # OPTIONS OPTIONS road ipv4
En /etc/shorewall/interfaces:
#ZONE INTERFACE BROADCAST OPTIONS road tun+
En /etc/shorewall/tunnels:
#TYPE ZONE GATEWAY GATEWAY ZONE openvpnserver:1194 net 0.0.0.0/0
Para que los sistemas remotos (road warriors) tengan acceso a la red local, se debe permitir su acceso en /etc/shorewall/policy (asumiendo que la red local haya sido llamada zona “loc”):
#SOURCE DESTINATION POLICY road loc ACCEPT
En Windows, instalar OpenVPN GUI. Se deben copiar los archivos del servidor “ca.crt”, y los archivos específicos para ese cliente creados en el servidor, por ejemplo “client1.crt”, “client1.csr” y “client1.key”, al directorio config/, junto con el archivo de configuración que figura a continuación.
client.ovpn:
client proto udp dev tun remote aaa.bbb.ccc.ddd 1194 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert client1.crt key client1.key comp-lzo verb 3 ns-cert-type server
aaa.bbb.ccc.ddd es la dirección IP del servidor OpenVPN. Se deben cambiar también los valores ca, cert, y key por los correspondientes al cliente.
Se puede tener tantos archivos de configuración de cliente .ovpn como se necesiten, simplemente poniéndoles distintos nombres, dejando la misma extensión, y cambiando internamente los valores mencionados.
En ocasiones, cuando las redes tienen problemas con el MTU, se puede limitar este valor usando en el servidor algo como:
mssfix 1300 fragment 1300
y en el cliente:
fragment 1300
Los valores tienen que ser iguales para las tres líneas, tanto en el servidor como en el cliente. Valores comunes son 1200, 1300 o 1400. Se puede probar cuál anda mejor.
Esta configuración ha sido probada sobre conexiones de módem 56Kbps, a través de redes inalámbricas, y a través de NAT, incluso desde máquinas virtuales Qemu, mostrando siempre funcionar a la perfección.
La ventana de estado de OpenVPN GUI tiene un útil botón “Reconnect” que permite reconectar rápidamente la VPN; esto mostró ser muy práctico en las pruebas, ya que cambiábamos de una conexión a otra, y simplemente el pulsar ese botón reconectaba el túnel.