OpenVPN cliente a cliente

16

Cuando uso un servidor OpenVPN TUN (capa 3) con client-to-clientdeshabilitado, mis clientes aún pueden hablar entre ellos.

La configuración de cliente a cliente debe evitar esto de acuerdo con la documentación:

Descomente la directiva de cliente a cliente si desea conectar clientes para poder comunicarse entre sí a través de la VPN. Por defecto, los clientes solo podrán llegar al servidor.

¿Por qué los clientes pueden continuar comunicándose entre sí cuando esta opción está desactivada?

Aquí está mi servidor conf:

port 443
proto tcp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh4096.pem
topology subnet
server 10.10.201.0 255.255.255.128
ifconfig-pool-persist ipp.txt
crl-verify /etc/openvpn/keys/crl.pem
push "route [omitted]"
push "dhcp-option DNS [omitted]"
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so login
cipher AES-256-CBC
tls-auth /etc/openvpn/keys/pfs.key 0
verb 4
lobi
fuente

Respuestas:

54

Si client-to-clientestá habilitado , el servidor VPN reenvía los paquetes de cliente a cliente internamente sin enviarlos a la capa IP del host (es decir, al núcleo). La pila de red del host no ve esos paquetes en absoluto.

           .-------------------.
           | IP Layer          |
           '-------------------'


           .-------------------.
           | TUN device (tun0) |
           '-------------------'


           .-------------------.
           | OpenVPN server    |
           '-------------------'
             ^           |
          1  |           |  2   
             |           v
 .----------------.  .----------------.
 | Client a       |  | Client b       |
 '----------------'  '----------------'

Si client-to-clientestá deshabilitado , los paquetes de un cliente a otro cliente pasan a través de la capa de IP del host (iptables, tabla de enrutamiento, etc.) de la máquina que aloja el servidor VPN: si el reenvío de IP está habilitado , el host puede reenviar el paquete (usando su tabla de enrutamiento) nuevamente a la interfaz TUN y el demonio VPN reenviará el paquete al cliente correcto dentro del túnel.

           .-------------------.
           | IP Layer          |  (4) routing, firewall, NAT, etc.
           '-------------------'      (iptables, nftables, conntrack, tc, etc.)
              ^          |
          3   |          |  5
              |          v
           .-------------------.
           | TUN device (tun0) |
           '-------------------'
             ^           |
          2  |           |  6  
             |           v
           .-------------------.
           | OpenVPN server    |
           '-------------------'
             ^           |
          1  |           |  7  
             |           v
 .----------------.  .----------------.
 | Client a       |  | Client b       |
 '----------------'  '----------------'

En este caso ( client-to-clientdeshabilitado), puede bloquear los paquetes de cliente a cliente usando iptables:

 iptables -A FORWARD -i tun0 -o tun0 -j DROP

¿Dónde tun0está tu interfaz VPN?

ysdx
fuente
Marcó esto como la respuesta; conciso pero muy informativo y en realidad proporciona la regla de firewall de iptables en la respuesta.
lobi
1
Tengo una pregunta sobre el diagrama, ¿lo dibujas char by char y space by space? ¿o usas alguna aplicación para ayudarte a conseguir eso de manera simple y rápida?
Mohammed Noureldin
3
@MohammedNoureldin, hice el diagrama original con asciio ( search.cpan.org/dist/App-Asciio ) que es un editor WYSWYG de apuntar y hacer clic para diagramas asciiart.
ysdx
Gracias, ¿lograste ejecutarlo en Windows? parece ser una aplicación de la edad media, y no pude ejecutarla en Windows, intenté instalarla con el paquete camelbox, pero siempre recibo un error 404.
Mohammed Noureldin
2
@MohammedNoureldin, no estoy usando Windows. Estoy usando Debian y es directamente instalable desde los paquetes.
ysdx
5

El siguiente párrafo de la página del manual para openvpnresponder esta pregunta, aunque no necesariamente está claro en la primera lectura:

Debido a que el modo de servidor OpenVPN maneja múltiples clientes a través de una única interfaz tun o tap, es efectivamente un enrutador. El --client-to-client indicador le dice a OpenVPN que enrute internamente el tráfico de cliente a cliente en lugar de enviar todo el tráfico de origen del cliente a la interfaz TUN / TAP.

Cuando se utiliza esta opción, cada cliente "verá" a los otros clientes que están conectados actualmente. De lo contrario, cada cliente solo verá el servidor. No use esta opción si desea cortafuegos en el tráfico del túnel utilizando reglas personalizadas por cliente.

La client-to-clientopción cortocircuita las tablas de enrutamiento normales en el servidor. Eliminarlo no impide que los clientes utilicen las tablas de enrutamiento del servidor. Si esas tablas de enrutamiento, y la configuración del servidor de seguridad del servidor, permiten que los clientes se vean, entonces podrán hacerlo.

roaima
fuente
5

Debe hacer algo más que comentar la directiva como dice aquí :

Elimine el comentario de esta directiva para permitir que diferentes clientes puedan "verse" entre sí. Por defecto, los clientes solo verán el servidor. Para obligar a los clientes a que solo vean el servidor, también necesitará proteger adecuadamente la interfaz TUN / TAP del servidor.

Por lo tanto, puede configurar una política de dirección IP separada para cada cliente. Consulte la sección Configuración de reglas específicas de cliente y políticas de acceso aquí: https://openvpn.net/index.php/open-source/documentation/howto.html . y aquí: https://www.sbarjatiya.com/notes_wiki/index.php/Configuring_separate_IP_and_firewall_rule_for_each_openvpn_client .

Diamant
fuente
Entonces esto significa lo que pensé: la única forma de lograr esto es colocar a cada cliente en subredes diferentes. Esto responde principalmente a la pregunta, además de que proporcionó cierta documentación sobre cómo hacerlo. Marcaré esto como la respuesta. Gracias.
lobi