16/8/09

VPN OpenVPN

Vamos a configurar un servidor vpn ubuntu con openvpn, con clientes ubuntu y windows. Los clientes podrán acceder a los recursos tanto del servidor como de los equipos de la LAN del servidor; además su configuración será tipo RoadWarrior, donde los clientes podrán acceder también unos a otros.

En primer lugar instalamos el paquete openvpn:

apt-get install openvpn

Seguidamente crearemos los certificados del servidor y los clientes. Por comodidad copiamos los scripts para generar certificados al directorio de openvpn:

mkdir /etc/openvpn/easy-rsa
cp /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa

A continuación editamos el fichero vars, para personalizar los parámetros que deseemos:

export KEY_COUNTRY="ES"
export KEY_PROVINCE="03"
export KEY_CITY="Alicante"
export KEY_ORG="Empre S.A."
export KEY_EMAIL="correo@electroni.co"

Y ahora para generar los certificados, desde el directorio easy-rsa, ejecutamos los comandos:

. ./vars
./clean-all
./build-ca

Al crear los parámetros, por defecto tomará los datos que hemos introducido en el fichero vars, el único campo que debemos especificar cuando nos pregunte el script es Common Name, donde pondremos el nombre que queramos darle a la vpn.

Primero creamos el certificado y la clave privada para el servidor:

./build-key-server server

De nuevo tomaremos los parámetros por defecto, excepto en Common Name, donde introduciremos "server". Debemos contestar yes a las preguntas: "Sign the certificate?" y "1 out of 1 certificate request certified, commit?".

Ahora creamos los certificados y llaves para los clientes, por ejemplo:

./build-key client1
./build-key client2
...etc

Y por último para generar los parámetros de Diffie Hellman ejecutamos:

./build-dh

Ya tenemos las llaves generadas, para el servidor necesitamos los ficheros:

ca.crt
ca.key
server.crt
server.key
dh1024.pem

Los copiamos a /etc/openvpn o al directorio de nuestra elección.

A cada cliente debemos hacerle llegar de forma segura los ficheros:

ca.crt
client1.crt
client1.key

Vamos a crear los ficheros de configuración, podemos encontrar ficheros de ejemplo en /usr/share/doc/openvpn/examples/sample_config_files, los cuales podemos copiar a /etc/openvpn y modificar, o crear uno nuevo directamente. El fichero de ejemplo está bastante bien documentado con comentarios.

En el servidor creamos o modificamos el fichero /etc/openvpn/server.conf con el contenido:

port 1194
proto udp
dev tun
persist-tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh1024.pem

#rango de direcciones que se asignará a los clientes, el server es .1
server 10.99.0.0 255.255.255.0

ifconfig-pool-persist ipp.txt

#ruta para que los clientes alcancen la lan del server
push "route 192.168.0.0 255.255.255.0"

client-to-client
keepalive 10 120
comp-lzo

#asegurarse que existan el usuario y grupo utilizados
user nobody
group nogroup

persist-key
persist-tun
status openvpn-status.log
log-append /var/log/openvpn.log
verb 4


Y reiniciamos el servicio para que los cambios tomen efecto:

/etc/init.d/openvpn restart

Para que podamos acceder desde internet debemos redirigir el puerto 1194 del router al del equipo del servidor vpn.

Para poder acceder a internet a través de la VPN debemos realizar un par de cambios en el servidor.

En el fichero /etc/sysctl.conf

Debemos añadir o modificar la línea:

net.ipv4.ip_forward=1

Y debemos crear en iptables la regla:

iptables -t nat -A POSTROUTING -s 10.99.0.0/24 -o eth0 -j MASQUERADE

Para que esta regla se ejecute cada vez que reiniciemos el servidor, vamos a salvarla en un fichero y hacer que se cargue en el arranque.

Si es necesario creamos el directorio /var/lib/iptables

Comprobamos que están activas las reglas deseadas con:

iptables -t nat -n -L

Las volcamos a un fichero con:

iptables-save > /var/lib/iptables/iptablesReglas

Ahora crearemos un script en el directorio:

/etc/network/if-up.d

Lo llamaremos por ejemplo inicioIptables y el contenido será el siguiente:

#!/bin/sh
/sbin/iptables-restore < /var/lib/iptables/iptablesReglas

Hay que darle permisos de ejecución al fichero:

chmod a+x inicioIptables

Con esto en cada inicio del sistema, se cargaran las reglas para iptables.

Ya tenemos listo el servidor.


Para configurar un cliente ubuntu, instalamos el paquete openvpn:

apt-get install openvpn

Copiamos al directorio /etc/openvpn los certificados:

ca.crt
client1.crt
client1.key

Y creamos el fichero /etc/openvpn/cliente.conf con el contenido:

client
dev tun
proto udp
remote IP_PUBLICA_SERVIDOR_VPN 1194
resolv-retry infinite
nobind
#asegurarse que existan el usuario y grupo utilizados
user nobody
group nogroup
redirect-gateway def1
persist-key
persist-tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client1.crt
key /etc/openvpn/client1.key
comp-lzo
verb 4

En los clientes, seguramente no nos interesará que la vpn se arranque en el inicio del sistema, por lo que editamos el fichero /etc/default/openvpn y modificamos o agregamos la línea:

AUTOSTART="none"

Y para iniciar manualmente la vpn, ejecutaremos:

openvpn /etc/openvpn/cliente.conf &

Y para detenerla mataremos el proceso.


También podemos configurar el network manager de gnome para establecer la conexión desde el entorno gráfico.
Insatalamos el plugin para conexiones openvpn:

apt-get install network-manager-openvpn

(Nota: después de instalar el plugin, es conveniente reiniciar el sistema.)

Y en el menú del network manager seleccionamos "Conexiones VPN" y luego "Configurar VPN", le damos al botón de "Añadir", seleccionamos tipo de conexión "OpenVPN" y rellenamos los campos:

Nombre de conexión: el que queramos.
Pasarela: la ip pública del servidor vpn.
Tipo: certificados (TLS)
Certificado de usuario, Certificado CA, Clave privada: seleccionamos la ruta correspondiente.
Y en "Avanzado" marcamos "Usar compresión LZO".

Guardamos los cambios y ya podemos utilizar el network manager para conectar y desconectar a la vpn.


Para configurar un cliente windows xp, descargamos el programa cliente de http://openvpn.se/download.html, instalándolo con las opciones por defecto.

A través del grupo de programas que crea en el menú de Inicio de windows, podremos acceder a la carpeta de configuración del programa, en la que copiaremos los certificados:

ca.crt
client1.crt
client1.key

Y creamos el fichero client.ovpn con el contenido:

client
dev tun
proto udp
remote IP_PUBLICA_SERVIDOR_VPN 1194
resolv-retry infinite
nobind
redirect-gateway def1
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
comp-lzo
verb 4

A través del icono que coloca el programa en la barra de tareas podremos conectar y desconectar la conexión vpn.

No he probado con windows vista, pero parece ser que es necesario instalar y ejecutar el programa con permisos de administrador para que pueda funcionar.


Tanto en ubuntu como en windows, cuando nos conectemos a la vpn, podremos acceder al servidor, los equipos de la LAN y a los otros clientes, y navegar por internet (con la ip pública del servidor).

Si queremos crear certificados para más clientes, debemos tener ca.crt y ca.key en el directorio keys y ejecutar desde el directorio easy-rsa los comandos:

source ./vars
./build-key clientX

Obteniendo los nuevos certificados.

Actualización:

Para configurar clientes con windows vista en ediciones de 64 bits, descargamos el cliente OpenVPN_2.1_rc20 (o más reciente), y lo instalamos como administrador, nos creará un icono en el escritorio para lanzar el terminal, que también deberemos lanzar como administrador.

15 comentarios:

Anónimo dijo...

Pues esta grave amigo..voy a seguir intentandolo gracias...

Ubuntu 9.04

linux a martillazos dijo...

¡Ánimo! :-)

ðĄŘќЖăђ dijo...

Excelente 100% funcional lo recomiendo!!!

linux a martillazos dijo...

Me alegro de que te haya sido útil!

ðĄŘќЖăђ dijo...

Disculpa la forma pero es q no encontre un correo para contactarlo. Ya tengo el servidor en ubuntu (172.17.20.3 tiene casi todos los servicios arriba) y le tengo al DHCP que me asigne en el rango de 129 a 254 (esto para dejarle al VPN de la 5 a la 127 (en el open vpn (server.conf) tengo el segmento como una subred 172.17.20.0 255.255.255.128))y el cliente en windows, conecta y todo perfecto gracias a tu guia. Pero no se si has visto que te hace un "nateo" en el cliente Windows y te coloca en la direccion del DNS, DHCP, Gateway y Wins una direccion cualquiera distinta a la utilizada en la red real x lo general un x.x.x.5, Se puede cambiar el DNS y el WINS al "verdadero" haciendo en el server.conf push "dhcp-option DNS 172.17.20.3" y push "dhcp-option WINS 172.17.20.3" pero como hago para que me muestre en el cliente Windows el Gateway (172.17.20.1) y el DHCP de la red (172.17.20.3) real?

linux a martillazos dijo...

Hola Darkman.

No creo que se pueda hacer lo que tu dices. Piensa que en realidad el servidor vpn es quien actúa tanto de puerta de enlace como de servidor de dhcp para los clientes de la vpn. Por tanto cuando les consultes a ellos quien es su gateway y su dhcp, te contestarán con la dirección que el servidor vpn usa para tal propósito.

asdfg dijo...

Hola estoy configurando un servidor openvpn de acuerdo a tu guia, pero me asalta una duda, en la regla que creas de IPTABLES para la salida a inet, pq usas una red 10.0.0.0 no me cuadra no deberia ir la red local ahi?

supongo que debe ser asi pero quizás no lo haya entendido, excelente pagina a todo esto y felicitaciones

asdfg dijo...

Ah y la regla de ipatbles no me funciona me sale

iptables: No chain/target/match by that name.

por que pasa eso?

linux a martillazos dijo...

Hola Renato.

La regla de iptables que se crea para la red 10.99.0.0 es porque en /etc/openvpn/server.conf se define que ese es el rango de direcciones que se asignará a los clientes.

Respecto al error de la regla de iptables, acabo de darme cuenta de que en el post escribí "POSTROUTNIG" en lugar de "POSTROUTING" (ya lo he corregido), supongo que sería por eso. :-)

Profetius dijo...

Buenas.
En primer lugar felicitarte por tu blog.
Yo he montado mi VPN y todo me funciona correctamente, salvo algún problemilla con los time outs pero nada que no tenga solución.
Sin embargo me sucede una cosa curiosa que igual ya os ha pasado a alguno y sabréis el porqué.
El caso es que yo tengo mi servidor VPN lanzado en la red local que posee otro servidor interno DHCP. El servidor VPN creo un bridge entre ambas redes
server-bridge 192.168.1.3 255.255.255.0 192.168.1.128 192.168.1.254
y los clientes se conectas sin problemas
puedo acceder a ellos y hacerles un ping o conectarme via ssh. Pero al hacer un mapeo de la LAN:
nast -m
arp-scan -I br0 192.168.1.0/24
nmap -sP 192.168.1.0/24

En todos los casos no encuentra más que los equipos locales no los VPN. Sabeis a que puede ser debido????
Muchas gracias por todo.

linux a martillazos dijo...

Hola.

Creo que estas herramientas no sirven para detectar los equipos al otro lado de la vpn.
Dado que puedes conectarte a ellos por ssh, puedes ejecutar nmap desde uno de ellos, no se me ocurre otra cosa. :-)

Profetius dijo...

Hola
Perdon por volver al mismo hilo pero no tengo muy claro donde buscar para este problema.
La vpn me funciona de lujo, pero he detectado que envia muchisimo trafico del servidor a lso clientes. No creo q sea un problema de configuracion y no se si es normal. ¿Alguna idea?

Anónimo dijo...

Hola mi nombre es Walter
Excelente guia me sirvio bastante aunque tengo un pequeño problema.
Explico la situacion: Instale un servidor openvpn con clientes windows que se conectan desde otra sede. Atravez de iptables en mi servidor ellos ven tanto la red local como la red vpn es decir me funciona de maravilla a partir de los clientes hacia el server de la vpn. Ejemplo server ip: eth1: direccion dhcp eth0: 192.168.1.120 tun: 10.7.0.1 , los clientes hacen ping a estas direcciones y funcionan bien los clientes tienen las direcciones siguientes eth0: 192.168.2.xxx, tun/tap: 10.7.0.xxx , pero desde el servidor se le da pin a la direccion 10.7.0.xxx del cliente y funciona excelente mas no me da ping con la direccion de la red interna de la lan desde donde se esta conectando que seria 192.168.2.xxx , que me recomienda para poder realizar la conexion no solamente de la direccion vpn sino tambiem de la direccion interna. (osea desde el servidor dar ping a la subnet192.168.2.xxx) .


Nuevamente te digo que el manual esta excelente te felicito y te agradezco tu observaciòn, muchas gracias

Anónimo dijo...

Hola una pregunta a ver si puedes ayudarme tengo un servidor montado con openvpn solo tienes una tarjeta de red asi que se hace nat, los clientes Road Warrior conectan perfectamente y pueden ver la lan sin problema mi problema es que ocupo lo contrario necesito desde la lan conectarme a esos clientes a un puerto pero no los veo no me responden ping osea de la lan ellos no son accesibles que me recomiendas hacer, algun regla iptable Gracias

Anónimo dijo...

Hola yo tengo una consulta tengo montado un servidor openvpn en ubuntu, no tengo problemas mi problema es que tengo un cliente vpn que esta en linus tambien pero este cliente hace la funcion de router en otra sede, y necesito implementarle el squid para controlar el trafico y no se sature el ancho de banda. Me podrias instruir como puedo hacer esto ya que coloco la regla iptables -t nat ... prerouting -s 0.0.0.0 -i eth1 --dport 80 -j REDIRECT --to-ports 3128 no envia la trama al squid