sábado, marzo 29, 2008

Creacion ed una red virtual con openVPN

OpenVPN HowTo
Página Oficial
Autor del HowTo: Iñaki Baz (ibc)

Vamos a montar varias VPNs entre 3 delegaciones. Cada red dispone de un servidor Debian haciendo de router con IP pública dinámica y hace NAT para dar salida a los equipos de la red hacia Internet.

Este sería el escenario:

Delegación A
Dominio: a.com
Subred: 192.168.1.0/24
Nodo VPN: 10.0.1.2
[editar]Delegación B
Dominio: b.com
Subred: 192.168.2.0/24
Nodo VPN: 10.0.2.2
Delegación C
Dominio: c.com
Subred: 192.168.3.0/24
Nodo VPN: 10.0.1.1 (para A)
Nodo VPN: 10.0.2.1 (para B)
Vamos a conectar A con C y B con C mediante dos VPNs con OpenVPN. La seguridad será mediante una clave simétrica para simplificar, aunque podría hacerse con TLS.

Primeramente instalamos OpenVPN en los 3 routers:

#> apt-get install openvpn

Debian A
Creamos el fichero /etc/openvpn/vpn_a_c.conf:

remote c.org
float # por si c.org es IP dinámica.
port 1194
dev tun # creado por el paquete debian.
persist-tun # necesario al ejecutarse como "nobody".
ifconfig 10.0.1.2 10.0.1.1 # nodo local - nodo remoto.
comp-lzo
ping 15
ping-restart 120
verb 3
secret /etc/openvpn/clave_a_c.txt # hay que crearla y copiarla al remoto.
persist-key # necesario al ejecutarse como "nobody".
route 192.168.3.0 255.255.255.0 # se ruta por aquí lo que vaya a la red de C.
user nobody
group nogroup
chroot /var/empty # por seguridad.

Generemos la clave simétrica para la VPN entre A y C y la copiamos a C:

#> cd /etc/openvpn
#> openvpn --genkey --secret clave_a_c.txt
#> scp clave_a_c.txt c.org:/etc/openvpn/

Insertamos el módulo tun para controlar los interfaces /dev/net/tunX que se necesiten, creamos el directorio /var/empty para hacer chroot y reiniciamos OpenVPN:

#> modprobe tun
#> mkdir /var/empty
#> chown nobody.nogroup /var/empty
#> /etc/init.d/openvpn restart


Debian B
Creamos el fichero /etc/openvpn/vpn_b_c.conf:

remote c.org
float # por si c.org es IP dinámica.
port 1195 # podría ser distinto el local que el remoto pero así más sencillo.
dev tun # creado por el paquete debian.
persist-tun # necesario al ejecutarse como "nobody".
ifconfig 10.0.2.2 10.0.2.1 # nodo local - nodo remoto.
comp-lzo
ping 15
ping-restart 120
verb 3
secret /etc/openvpn/clave_b_c.txt # hay que crearla y copiarla al remoto.
persist-key # necesario al ejecutarse como "nobody".
route 192.168.3.0 255.255.255.0 # se ruta por aquí lo que vaya a la red de C.
user nobody
group nogroup
chroot /var/empty # por seguridad.

Generemos la clave simétrica para la VPN entre B y C y la copiamos a C:

#> cd /etc/openvpn
#> openvpn --genkey --secret clave_b_c.txt
#> scp clave_b_c.txt c.org:/etc/openvpn/

Insertamos el módulo tun para controlar los interfaces /dev/net/tunX que se necesiten, creamos el directorio /var/empty para hacer chroot y reiniciamos OpenVPN:

#> modprobe tun
#> mkdir /var/empty
#> chown nobody.nogroup /var/empty
#> /etc/init.d/openvpn restart


Debian C
Creamos el fichero /etc/openvpn/vpn_c_a.conf:

remote a.org
float # por si c.org es IP dinámica.
port 1194
dev-node /dev/net/tun1 # creado por el paquete debian y renombrado por nosotros.
persist-tun # necesario al ejecutarse como "nobody".
ifconfig 10.0.1.1 10.0.1.2 # nodo local - nodo remoto.
comp-lzo
ping 15
ping-restart 120
verb 3
secret /etc/openvpn/clave_a_c.txt
persist-key # necesario al ejecutarse como "nobody".
route 192.168.1.0 255.255.255.0 # se ruta por aquí lo que vaya a la red de A.
user nobody
group nogroup
chroot /var/empty # por seguridad.

Creamos el fichero /etc/openvpn/vpn_c_b.conf:

remote b.org
float # por si c.org es IP dinámica.
port 1195 # ¡¡ojo, el 1194 está ocupado en la otra VPN con A!!
dev-node /dev/net/tun2 # creado por nosotros.
persist-tun # necesario al ejecutarse como "nobody".
ifconfig 10.0.2.1 10.0.2.2 # nodo local - nodo remoto.
comp-lzo
ping 15
ping-restart 120
verb 3
secret /etc/openvpn/clave_b_c.txt
persist-key # necesario al ejecutarse como "nobody".
route 192.168.2.0 255.255.255.0 # se ruta por aquí lo que vaya a la red de B.
user nobody
group nogroup
chroot /var/empty # por seguridad.

Renombramos tun por tun1:

#> mv /dev/net/tun /dev/net/tun1

Creamos uno nuevo para la conexión con B:

#> mknod /dev/net/tun2 c 10 200

Insertamos el módulo tun para controlar los interfaces /dev/net/tunX que se necesiten, creamos el directorio /var/empty para hacer chroot y reiniciamos OpenVPN:

#> modprobe tun
#> mkdir /var/empty
#> chown nobody.nogroup /var/empty
#> /etc/init.d/openvpn restart


Iptables de A, B y C
Debemos introducir estas reglas en cada router:

# Aceptamos el tráfico entrante UDP por el puerto del OpenVPN sobre el interfaz real (eth0, ppp0...). Ojo, en C debemos abrir 2 puertos, el 1194 y 1195:
-A INPUT -i eth0 -p udp --dport 1194 -j ACCEPT
# Aceptamos también la salida por dicho puerto:
-A OUTPUT -o eth0 -p udp --sport 1194 -j ACCEPT
# Permitimos conectar desde cualquier equipo de las redes a nuestro router por la VPN:
-A INPUT -i tun+ -j ACCEPT
# Permitimos conectar por la VPN desde el router al resto de routers y equipos de cada red:
-A OUTPUT -o tun+ -j ACCEPT
# Permitimos que equipos de las otras redes accedan a nuestra red:
-A FORWARD -i tun+ -j ACCEPT
# Permitimos que los equipos de nuestra red accedan a la VPN:
-A FORWARD -o tun+ -j ACCEPT




Y ya está, ahora deberíamos poder hacer un ping desde cualquier ordenador de A (192.168.1.0/24) a cualquiera de C (192.168.3.0/24). Lo mismo desde B (192.168.2.0/24) a C. Y también en sentido contrario desde C a A y desde C a B.

Esto es sólo un simple ejemplo de lo que se puede hacer con OpenVPN. Te recomiendo que visites la página oficial de OpenVPN para obtener mucha más información (modo server-clients, TLS, clientes para Windows, road-warrior, etc).

Especial mención merece también el propio manual de OpenVPN (man openvpn), que explica detalladmente todas las posibilidades de este software.

No hay comentarios: