Cómo interconectar dos redes inaccesibles entre sí ya sea porque ambas están detrás de NAT o por consecuencias de las nuevas e incomprensibles «políticas de seguridad» de la empresa.

Ingredientes

  • openvpn
  • iptables

Generación de certificados y claves:

Ejecuta lo siguiente:

# cp -a /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn
# cd /etc/openvpn/easy-rsa/2.0
# . ./vars
# ./clean-all
# ./build-ca

Clave para el servidor.

El servidor debería ser una máquina con una IP pública. Si no es posible, se puede hacer en una máquina con IP privada pero habrá que redireccionar el puerto desde el router. El servidor va a rutar tráfico entre la red remota y redes locales que son accesibles para él pero no lo son remotamente.

# ./build-key-server servidor
# ./build-dh

Todo esto genera los siguientes ficheros en el directorio keys:

  • ca.crt
  • ca.key
  • servidor.crt
  • servidor.key
  • dh1024.pem

Los puedes mover a /etc/openvpn por comodidad.

Clave para el cliente

Cada cliente que quieras conectar a la red remota debe tener una clave y un certificado para autenticarse contra el servidor. Necesitas repetir esto por cada cliente que quieras incorporar a la VPN.

# ./build-key marcial

Esto genera los siguientes ficheros:

  • marcial.crt
  • marcial.key

Tienes que copiar esos dos ficheros y el ca.crt al directorio /etc/openvpn del cliente. Intenta que sea de la forma más segura posible.

Configuración

En el servidor crea el fichero /etc/openvpn/mivpn.conf y escribe esto:

port 1194
proto udp
dev tun
persist-tun
ca ca.crt
cert servidor.crt
key servidor.key
dh dh1024.pem
server 10.1.1.0 255.255.255.0
ifconfig-pool-persist ipp.txt
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 4

Y en los clientes:

tls-client
client
dev tun
proto udp
remote server.example.org  # El nombre público del servidor
float                      # Solo si el servidor tiene IP dinámica
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert marcial.crt           # Aquí tu certificado
key marcial.key            # y clave
comp-lzo
verb 4

Ejecuta lo siguiente en ambas máquinas:

# /etc/init.d/openvpn start

Probando…

Si todo ha ido bien tendrás una nueva interfaz de red llamada tun0 con una IP en la red 10.1.1.0/24:

# ip addr show tun0
10: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
    link/[65534]
    inet 10.1.1.10 peer 10.1.1.9/32 scope global tun0

Y tendrás también rutas nuevas para usar ese enlace:

# ip route show
10.1.1.0/24 via 10.1.1.9 dev tun0
10.1.1.9 dev tun0  proto kernel  scope link  src 10.1.1.10
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.4  metric 1
default via 192.168.1.1 dev eth0  proto static

Y deberías poder acceder desde el cliente al servidor y viceversa usando las direcciones privadas.

Encaminando

Imagina que el servidor tiene acceso a la red 120.20.30.0/24 pero que es inaccesible desde el exterior de la empresa. Veamos cómo conseguir que los clientes de la VPN puedan llegar a las máquinas de esa red utilizando el servidor de la VPN como router. Todos los cambios que se indican a continuación se realizan sólo en el servidor.

En fichero de configuración del servidor (el que escribiste antes) añade esto:

push "route 120.20.30.0 255.255.255.0"

Esa ruta se añadirá automáticamente a los clientes para que ruten el tráfico hacia esa red a través de la VPN.

Y por último es necesario activar el reenvío (forwarding) y el NAT, dado que el servidor actuará como router entre la red privada y una red pública. Para ello escribe lo siguiente en /etc/sysctl.conf:

net.ipv4.ip_forward=1

Y añade la siguiente regla iptables:

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Para que esta regla se aplique automáticamente aunque se reinicie el servidor modifica /etc/network/interfaces para que quede así:

iface eth0 inet static
        [...]
        pre-up iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Como ya he comentado esto es para un servidor con IP fija, pero si es dinámica los cambios son mínimos.

Para más información sobre configuración de iptables y rutado puedes mirar estas recetas:

No olvides reiniciar el servicio en el servidor y en el cliente:

# /etc/init.d/openvpn restart

Referencias



blog comments powered by Disqus