====== OpenVPN: configuración ====== //Por Félix Molinuevo, [[fmsi>|FMSI Sistemas de Informática]]// ===== Introducción ===== Este tutorial explica cómo configurar un servidor OpenVPN utilizando el método de routing en vez de bridging, [[http://openvpn.net/faq.html#bridge1|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). ===== Instalación de paquetes ===== Para OpenVPN, se instalaron los siguientes paquetes: * openvpn * openssl * bridge-utils aptitude install openvpn openssl bridge-utils ===== Creación del certificado y la clave Certificate Authority (CA) ===== 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 ===== Generación de los parámetros Diffie Hellman ===== ./build-dh ===== Creación de los certificados y claves de cada cliente ===== 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. ==== Creación del archivo crl.pem (Certificate Revocation List) y permisos ==== 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/ ===== Revocación de certificados ===== Para revocar un certificado se utiliza el siguiente comando: . ./vars ./revoke-full 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: ===== Configuración del servidor ===== 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. ===== Cambios en el archivo easy-rsa/openssl.cnf ===== 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. ===== Reglas necesarias en el firewall que protege al servidor OpenVPN ===== 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 ==== Configuración de Shorewall para el caso que el servidor OpenVPN esté en el propio firewall ==== 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 ==== Configuración de Shorewall para el caso que el servidor OpenVPN sea interno ==== 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 === Si se necesita llegar a otros equipos internos en este caso === Se debe activar IP forwarding en el servidor que está ejecutando el servicio OpenVPN, y generar una regla Netfilter para que realice masquerading (enmascaramiento): * En /etc/sysctl.conf poner lo siguiente: net.ipv4.ip_forward=1 y ejecutar sysctl -p * Agregar la regla con Iptables: 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 ==== Configuración de Shorewall para road warriors y OpenVPN corriendo en el firewall ==== 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 ===== Configuración del cliente ===== En Windows, instalar [[http://openvpn.se/|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. ===== Resolución de problemas ===== 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. ===== Notas finales ===== 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. ===== Bibliografía ===== -OpenVPN Home: http://openvpn.net/ -OpenVPN HOWTO: http://openvpn.net/howto.html -OpenVPN Windows HowTo: http://www.runpcrun.com/howtoopenvpn -How to install OpenVPN: http://www.thebakershome.net/openvpn_tutorial -OpenVPN Howto: http://people.mandriva.com/~ybourhis/openvpn/index.html -OpenVPN tunnels and bridges: http://www.shorewall.net/OPENVPN.html