systemadmin.es > Redes > Comunicación entre clientes OpenVPN con tun (routing)

Comunicación entre clientes OpenVPN con tun (routing)

En el caso que tengamos múltiples clientes conectados a un servidor con OpenVPN con TUN, deberemos configurar la rutas.

Los modos de funcionamiento de OpenVPN puede ser mediante TUN o TAP:

  • TAP: Modo de funcionamiento de capa 2, por lo tanto, los equipos se ven como si estuvieran conectados al mismo segmento de red. Por lo tanto, ven el tráfico broadcast que se genere en el segmento como si estuvieran directamente conectados.
  • TUN: Modo de funcionamiento de capa 3, por lo tanto, deberemos configurar routing.

Usando TAP podemos comunicar clientes entre sí directamente.

En el caso de TUN, si intentamos hacer un ping entre dos equipos conectados al mismo servidor OpenVPN podemos recibir un ICMP de “Packet filtered“:

# ping 172.16.101.16
PING 172.16.101.16 (172.16.101.16) 56(84) bytes of data.
From 80.80.80.117 icmp_seq=1 Packet filtered
From 80.80.80.117 icmp_seq=2 Packet filtered

Esto se debe a las rutas que hace que el paquete a otro equipo conectado al servidor se vaya por la default gateway. En el siguiente ejemplo podemos ver que todo paquete que no vaya al servidor (172.16.101.1) ni sea de ninguna de las otras redes irá por el default gateway, que en este caso será hacia Internet:

# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
172.16.101.1    0.0.0.0         255.255.255.255 UH        0 0          0 tun0
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth1
192.168.254.0   0.0.0.0         255.255.255.0   U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth1
0.0.0.0         192.168.254.1   0.0.0.0         UG        0 0          0 eth0

Por lo tanto, en todos los clientes (con la directiva client-config-dir) que queramos que se comuniquen entre sí deberemos añadir una ruta para la red que queramos configurar. En dicha configuración de cliente, forzamos una IP fija a cada cliente, que su gateway sea 172.16.101.1 y publicamos una ruta para que el segmento 172.16.101.0/24 vaya por dicho gateway:

# cat cliente.systemadmin.es
ifconfig-push 172.16.101.12 172.16.101.1
push "route  172.16.101.0 255.255.255.0 172.16.101.1"

Las rutas de los clientes quedarán como las siguientes:

# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
172.16.101.1    0.0.0.0         255.255.255.255 UH        0 0          0 tun0
172.16.101.0    172.16.101.1    255.255.255.0   UG        0 0          0 tun0
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth1
192.168.254.0   0.0.0.0         255.255.255.0   U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth1
0.0.0.0         192.168.254.1   0.0.0.0         UG        0 0          0 eth0

Por lo tanto, ahora deberemos hacer que los paquetes que se entregan por la interfaz tun del servidor se entreguen al cliente destino. Por defecto tendremos el forwarding desactivado, por lo tanto deberemos activarlo mediante el fichero /etc/sysctl.conf modificando la directiva net.ipv4.ip_forward a 1. Aplicamos los cambios mediante sysctl -p

# sysctl -p
(...)
net.ipv4.ip_forward = 1

A continuación definiremos dos reglas de iptables:

  • Una regla que permita el forwarding en las interfaces tun:
    iptables -A FORWARD -i tun+ -j ACCEPT
    
  • Otra regla que lo deniegue en las interfaces eth:
    iptables -A FORWARD -i eth+ -j DROP
    

    En lugar de cambiar la política por defecto de FORWARD, añado el DROP para tener el contador de paquetes para dicha regla.

Si lanzamos un ping entre dos clientes conectados veremos como aumentan los contadores y ya se ven entre sí:

# iptables -L -nv
(...)
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    6   504 ACCEPT     all  --  tun+   *       0.0.0.0/0            0.0.0.0/0
    0     0 DROP       all  --  eth+   *       0.0.0.0/0            0.0.0.0/0

3 comments to “Comunicación entre clientes OpenVPN con tun (routing)”

  1. Hola, solo un apunte…

    estuVieran, no estubieran.

    Por lo demás, buen artículo.

  2. corregido! muchas gracias!

  3. Hola tengo un problema quiero compartir una impresora desde un cliente conectado al servidor pero desde el servidor no puedo hacerle Ping al cliente que me falta configurar?

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>