Concentrador OpenVPN en Debian GNU/Linux (o Ubuntu)

networkingseguridadArco

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

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de juanmi

¿ Type ether ?

Hola David! pues yo personalmente prefiero VTUN, sólo por una cosa y es porque tiene la opción de comportarse como una ethernet (type: ether) por lo demás openvpn es mejor, ya que admite cifrado y tiene clientes windows, pero que no tenga la opción de comportarse como una ethernet es una puñeta a la hora de enrutar con Iptable e Iproute. Si sabes como ponerlo en opción ethernet cuentame Eye-wink

¡¡ Saludos y gracias por la receta Eye-wink !!

Imagen de david.villa

Se puede

Según dice el propio howto de openvpn

«If you are using Ethernet bridging, you must use server-bridge and dev tap instead of server and dev tun

pero TAP tiene el grave problema de que envía por el túnel todo el tráfico broadcast y multicast Ethernet, a menos que hagas el filtrado correspondiente, lo que requiere afinar más la config que con TUN.

Saludos

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Imagen de juanmi

No me referia a Bridge

Hola de nuevo david, no me referia a meter la VPN en un bridge sino a poder utilziarla como tipo ethernet, es decir si pones ifconfig que salga esto:

tun0      Link encap:Ethernet  HWaddr 00:ff:1e:61:f1:e7
          inet addr:172.0.0.1  Bcast:172.0.0.3  Mask:255.255.255.252
          inet6 addr: fe80::2ff:1eff:fe61:f1e7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:163 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:35723 (34.8 KiB)  TX bytes:468 (468.0 B)

Si pones ifconfig con Openvpn te saldrá tipo Point to point o tipo tun, ¿podrias pegarme a ver que sale?

Mil gracias Eye-wink

Imagen de david.villa

Igual me equivoco, pero

Igual me equivoco, pero yo diría que estás hablando justo de Ethernet bridging. Cuando pueda lo probaré y te cuento. Y si lo pruebas tú, pues también nos lo cuentas, por favor, y salimos de dudas.

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Imagen de juanmi

Ok

Ok me pongo en cuanto tenga un hueco a probar y como funcione cambio de vtun a openvpn Eye-wink

Mil gracias de nuevo y si lo sacas antes que yo avisa Eye-wink