iptables: acceda al cliente openvpn conectado desde la LAN con el servidor VPN

iptables: acceda al cliente openvpn conectado desde la LAN con el servidor VPN

Tengo lo que es esencialmente un problema de enrutamiento y no estoy lo suficientemente familiarizado con el enrutamiento y con iptables para solucionar problemas y configurar mis necesidades de red de manera efectiva.

¿Qué está funcionando?

Tengo una red openVPN configurada y funcionando; Los clientes pueden conectarse a una LAN a través de Internet.

Lo que me gustaría que pasara

...cuando un cliente se conecta a la VPN en una subred determinada.

  • El cliente debe ser accesible desde la red VPN.

Puntos de bonificación si las reglas pueden hacer uno o más de lo siguiente:

  • el cliente no debería poder iniciar conexiones a la VPN
  • el cliente debería aparecer en nuestro DNS

Topología

Nuestra topología de red se parece a esto:

   ______        ____________________
 /        \     /                    \
| internet |---| client (10.8.8.0/24) |
 \________/     \____________________/
     |
   ______
 /        \
| gateway  |
 \________/
     |
-----LAN------ (10.10.10.0/24)
|    |   |   |
             L_____VPN Server `VPN1` 10.10.10.2 (fictional name/subnet)

configuraciones actuales

Nuestra pasarela tiene definida la siguiente ruta:

10.8.8.0    255.255.255.0   10.10.10.2  LAN & WLAN

En VPN1, iptables tiene las siguientes reglas

# Flush the filter and nat tables
iptables -t filter -F
iptables -t nat -F

iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT

iptables -A INPUT -i eth0 -j ACCEPT -d 10.8.8.0/24
iptables -A FORWARD -i eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.10.10.0/16 -d 10.8.8.0/24 -o tun+ -j MASQUERADE

¿Qué está pasando actualmente?

La ejecución del comando mtr 10.8.8.1(la IP del cliente conectado en la VPN) muestra que la ruta actual oscila entre VPN1 y la puerta de enlace.

Respuesta1

Después de otra agotadora ronda de locura por el aprendizaje en línea de iptables, descubrí la solución.

En primer lugar, sin embargo, existe una suposición inválida con respecto a iptables. Mi enfoque inicial de las reglas fue que cuando se recibiera un paquete, pasaría por las cadenas de ENTRADA y SALIDA. No tan; en el momento en que una regla coincide con un paquete, sale de la mesa. Dado que se asume la tabla de filtros a menos que se especifique (por ejemplo, "-t nat"), la mayoría de las reglas enumeradas se ejecutan en la tabla de filtros.

Respecto a las cadenas

  • APORTE: se ejecuta en paquetes destinados al servidor
  • PRODUCCIÓN: se ejecuta en paquetes que se originan en el servidor
  • ADELANTE: todo lo demás - si una regla coincide aquí, y el "salto" (me gusta pensar si-jcomo "trabajo";) es ACEPTAR, el paquete se enrutará adecuadamente

Un desglose de las reglas

Esta es una descripción de las reglas bajoconfiguraciones actualesarriba

iptables -t filter -F
iptables -t nat -F

Estas reglas simplemente limpian elfiltrarynatmesas. Tenga en cuenta que hay más tablas y una forma más completa de borrar las reglas de iptables.

iptables -A INPUT -i tun+ -j ACCEPT

Esta regla no hace nada porque:

  • se ejecuta en tráfico destinado a VPN1, no a otra red
  • No hay ninguna política establecida para el tráfico entrante, por lo que está permitido de forma predeterminada.

hacia adelante...

iptables -A FORWARD -i tun+ -j ACCEPT

Esta regla permite enrutar el tráfico procedente de 10.8.8.0/24. reglas en elnatLa tabla se ejecuta en paquetes que coinciden con esta regla.

iptables -A INPUT -i eth0 -j ACCEPT -d 10.8.8.0/24

Esta regla tampoco tiene ningún efecto sobre el enrutamiento deseado, ya que el tráfico 10.8.8.0/24 no está destinado al servidor VPN1.

iptables -A FORWARD -i eth0 -j ACCEPT

Esta regla permite enrutar el tráfico desde 10.10.10.0/16.

iptables -t nat -A POSTROUTING -s 10.10.10.0/16 -d 10.8.8.0/24 -o tun+ -j MASQUERADE

Esta regla hace que el tráfico destinado a la VPN desde 10.10.10.0/16 parezca que proviene de VPN1, lo que efectivamente hace que VPN1 parezca una puerta de enlace.

¿Qué ocurre?

Las reglas deberían ser "OK" para llevar el tráfico de una red a la siguiente. No existe ninguna protección real, por ejemplo, una política "DROP" predeterminada, etc., pero ese no es el punto de la pregunta.

Si iptables está configurado para que pueda enrutar el tráfico a través de la VPN, ¿qué causaría que se envíe de regreso?eth0a la puerta de entrada? Si VPN1 no conocía 10.8.8.0/24. Si el servidor VPN no conocía esa red, sería tratado como tráfico de Internet y enviado de regreso a la puerta de enlace.

La solución

La solución fue informarle al servidor VPN sobre la red (este es un servidor openvpn). Hay dos maneras de hacer esto; Si el servidor solo presta servicio a una red, es una configuración simple:

server 10.8.8.0 255.255.255.0

En mi caso, tenía configurada la ruta del servidor y la necesitaba para conocer una red adicional. La configuración se parecía más a esto:

server 10.5.5.0 255.255.255.0
route 10.8.8.0 255.255.255.0

¡Eso es todo! Una vez que VPN1 tuvo una ruta a la red, la cadena FORWARD puede enrutar el tráfico.

Una mejor configuración de iptables

Después de vaciar iptables, una mejor configuración se vería así:

# Forward established traffic so that (in the above case) VPN1 doesn't
# drop responses from the client, A.K.A. "the magic"
iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -t filter -A FORWARD     -s 10.10.10.0/16 -d 10.8.8.0/24  -j ACCEPT
iptables -t nat    -A POSTROUTING -s 10.10.10.0/16 -d 10.8.8.0/24  -j MASQUERADE

# Drop everything else that wants to be forwarded
iptables -P FORWARD DROP

Tenga en cuenta que no existen reglas explícitas para el tráfico procedente de 10.8.8.0/24, lo que significa que, de forma predeterminada, el tráfico no llegará a la red 10.10.10.0/16, excepto el tráfico en respuesta al tráfico enviado desde 10.10.10.0/16. . Ahora que iptables está configurado, a los clientes se les puede asignar una IP en la configuración de VPN y agregarla a DNS para obtener una solución completa.

información relacionada