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/24
que está guardada y tiene 172.18.15.2
una subred privada del dispositivo 10.0.0.0/24
en 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.1
y 10.0.0.1
. En iptables tengo la regla DNAT para reenviar 80
el tráfico del puerto 10.0.0.1
hacia 172.18.15.2
MASQUERADE 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.1
como puerta de enlace predeterminada o crea una ruta a 172.18.15.0/24
través de 10.0.0.1
ella, 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.2
la 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.2
Es 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-For
encabezado 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/24
no deben utilizar el enrutador como enrutador, al menos no para llegar172.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
) para10.0.0.0/24
los 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.1
y luego DNAT o si fueron enviados directamente a172.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 DROP
impedir 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/24
con -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