Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
servidores:general:openvpn_serverandclients [2009/10/31 21:15] fmolinuevo |
servidores:general:openvpn_serverandclients [2014/08/20 13:56] fmolinuevo [Configuración de Shorewall para el caso que el servidor OpenVPN esté en el propio firewall] |
||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== 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 <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: | ||
+ | |||
+ | <code> | ||
+ | ... | ||
+ | error 23 at 0 depth lookup:certificate revoked | ||
+ | </code> | ||
+ | |||
+ | 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> | ||
+ | |||
+ | ===== Configuración del servidor ===== | ||
+ | |||
+ | server.conf: | ||
+ | |||
+ | <code> | ||
+ | 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" | ||
+ | </code> | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code> | ||
+ | #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 | ||
+ | </code> | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code> | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | ==== 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: <code> | ||
+ | net.ipv4.ip_forward=1 | ||
+ | </code> y ejecutar sysctl -p | ||
+ | * Agregar la regla con Iptables: <code> | ||
+ | iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE | ||
+ | </code> 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: | ||
+ | |||
+ | <code> | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | 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 | ||