Cortafuegos de iptables hacia adelante

Cortafuegos de iptables hacia adelante

Actualmente estoy trabajando en un enrutador Linux y no puedo protegerlo con un firewall como me gustaría.

El enrutador tiene tres interfaces: WAN, que es una subred privada de banda ancha móvil 172.18.15.0/24que está guardada y tiene 172.18.15.2una subred privada del dispositivo 10.0.0.0/24en la que no confío. WAN es para acceder a través de OpenVPN y es la puerta de enlace predeterminada del enrutador.

Las IP del enrutador son 172.18.15.1y 10.0.0.1. En iptables tengo la regla DNAT para reenviar 80el tráfico del puerto 10.0.0.1hacia 172.18.15.2MASQUERADE en el camino de regreso.

Esta parte funciona bien.

Lo que me preocupa es que cuando alguien de la subred privada elige 10.0.0.1como puerta de enlace predeterminada o crea una ruta a 172.18.15.0/24través de 10.0.0.1ella, también se expone 172.18.15.2. Me gustaría detener este comportamiento para que la única forma de acceder a 172.18.15.2la web sea a través de la dirección 10.0.0.1.

Si cancelo el reenvío, también cancelo DNAT, lo cual es un problema.

Una forma que se me ocurrió es instalar Apache y crear un proxy inverso. Sin embargo, no estoy seguro de si es la forma correcta y correcta.

¡Gracias por las sugerencias!

EDITAR:

172.18.15.2Es un dispositivo sencillo. Sólo puede tener su propia dirección y la dirección de la puerta de enlace, en este caso 172.18.15.1. Está respondiendo porque lo he configurado./etc/sysctl.conf net.ipv4.ip_forwarf=1

Aquí está el volcado de iptables-save -c
enp1s0 es la interfaz para 10.0.0.0/24
enp2s0 es la interfaz para 172.18.15.0/24
wwx582c80139263 es la interfaz para la puerta de enlace de banda ancha móvil

# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*filter
:INPUT ACCEPT [840:388180]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [643:92809]
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -j DROP
COMMIT
# Completed on Mon Apr 16 08:27:45 2018
# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*nat
:PREROUTING ACCEPT [10:648]
:INPUT ACCEPT [10:648]
:OUTPUT ACCEPT [11:770]
:POSTROUTING ACCEPT [11:770]
[0:0] -A PREROUTING -i enp1s0 -p tcp -m tcp --dport 80 -j DNAT --to- 
destination 172.18.15.2:80
[0:0] -A POSTROUTING -s 172.18.15.0/24 -j MASQUERADE
[0:0] -A POSTROUTING -o wwx582c80139263 -j MASQUERADE
COMMIT
# Completed on Mon Apr 16 08:27:45 2018

Respuesta1

Usar un proxy inverso (que debería insertar un X-Forwarded-Forencabezado para fines de registro) y eliminar el reenvío de red sería una solución limpia. La solución a continuación debe entenderse claramente para evitar efectos inesperados con cambios adicionales en las reglas de iptables.

Dicho eso...

El problema

  • Los nodos de LAN 10.0.0.0/24no deben utilizar el enrutador como enrutador, al menos no para llegar 172.18.15.0/24. Algunos lo hacen de todos modos.
  • El enrutador proporciona servicios ubicados en 172.18.15.0/24( 172.18.15.2:80) para 10.0.0.0/24los nodos, mediante el uso de DNAT y reenvío.
  • Una vez que los paquetes llegan al filtro/cadena ADELANTE, no hay forma de distinguir si inicialmente estaban destinados 10.0.0.1y luego DNAT o si fueron enviados directamente a 172.18.15.2(lo cual debería estar prohibido).

La solución

Entonces, la clasificación debe realizarse antes de que ocurra NAT: en la tabla mangle, como se puede ver en esteFlujo de paquetes en Netfilter y General Networkingesquemático. Esta regla única es suficiente para manejarlo:

iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j DROP

Pero normalmente, para una mejor gestión, debería haber una separación de roles: mangle para alterar (no eliminar) o marcar aquí, y la tabla de filtros (la predeterminada) para filtrar y eliminar. Esto es posible usando una marca en el paso de destrucción y haciendo coincidir esta marca para colocarla en el paso de filtro. Entonces esto es equivalente:

iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j MARK --set-mark 1
iptables -A FORWARD -m mark --mark 1 -j DROP

(y para ser realmente completo: iptables -A INPUT -m mark --mark 1 -j DROPimpedir el acceso a 172.18.15.1)

Cualquiera de los métodos es equivalente. Por supuesto, si en realidad solo es el dispositivo 172.18.15.2 el que debe protegerse, simplemente reemplácelo -d 172.18.15.0/24con -d 172.18.15.2.

ACTUALIZACIÓN: se puede utilizar un método más sencillo basado en conntrack (que ya está en uso debido a NAT): consultarconectarpara saber si el paquete realmente fue DNATed y, en caso contrario, descartarlo. Entonces esto simplifica las cosas, porque es sólo una regla, y simplemente en la cadena de filtro/ADELANTE. Entonces, como tercer método, en lugar de las reglas anteriores:

iptables -A FORWARD -s 10.0.0.0/24 -d 172.18.15.0/24 -m conntrack ! --ctstate DNAT -j DROP

Además, la siguiente línea es inútil y se puede eliminar. PREROUTING cambió el destino con DNAT, por lo que el flujo nunca llega a INPUT sino que pasa por la cadena FORWARD:

[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT

información relacionada