Mostrando entradas con la etiqueta openvpn. Mostrar todas las entradas
Mostrando entradas con la etiqueta openvpn. Mostrar todas las entradas

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.