Reglas de UFW con NAT/enmascaramiento

Reglas de UFW con NAT/enmascaramiento

Estoy tratando de usar Ubuntu como una especie de enrutador limitando una computadora en mi red privada a lo que puede conectarse a Internet.

La caja de Ubuntu tiene dos NIC, una orientada a Internet (enp0s3) y otra orientada a esta única PC privada (enp0s8).

Para empezar, quería ver si podía permitir DNS desde el cuadro privado a través de Ubuntu. Seguí algunas instrucciones para agregar algunas reglas de "permisión de ruta", como resultado:

ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), deny (outgoing), allow (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
8.8.8.8 on enp0s3          ALLOW FWD   Anywhere on enp0s8        
8.8.4.4 on enp0s3          ALLOW FWD   Anywhere on enp0s8        
10.0.1.5 on enp0s8         ALLOW FWD   Anywhere on enp0s3   

10.0.1.5 es mi PC privada. Usando Wireshark puedo ver que se realizan solicitudes de DNS tanto en enp0s3 como en enp0s8, pero las de enp0s3 no tienen respuesta.

Entonces, después de leer un poco más, descubrí que necesitaba configurar NAT y enmascaramiento, así que puse lo siguiente en reglas antes:

# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]

# Forward traffic through eth0 - Change to match you out-interface
-A POSTROUTING -s 10.0.1.0/24 -o enp0s3 -j MASQUERADE

# don't delete the 'COMMIT' line or these nat table rules won't
# be processed
COMMIT

Esto funcionó, pero demasiado bien. Ahora todo el tráfico sale y regresa a mi PC privada, la denegación de salida predeterminada y las otras reglas de UFW parecen haberse omitido.

Entonces, mi pregunta es simple: quiero que la PC privada obtenga conectividad a través de Ubuntu, como la NAT proporcionada, pero con las restricciones de salida que pensé que configuré inicialmente usando las líneas de comando ufw. ¿Hay alguna manera de conseguir que las reglas de UFW se apliquen de alguna manera después de que NAT haga su trabajo?

TIA.

Aquí está el archivo before.rules completo. Mi único cambio fueron las reglas de la tabla NAT:

#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
#   ufw-before-input
#   ufw-before-output
#   ufw-before-forward
#

# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]

# Forward traffic through eth0 - Change to match you out-interface
-A POSTROUTING -s 10.0.1.0/24 -o enp0s3 -j MASQUERADE

# don't delete the 'COMMIT' line or these nat table rules won't
# be processed
COMMIT


# Don't delete these required lines, otherwise there will be errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines


# allow all on loopback
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT

# quickly process packets for which we already have a connection
-A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-output -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# drop INVALID packets (logs these in loglevel medium and higher)
-A ufw-before-input -m conntrack --ctstate INVALID -j ufw-logging-deny
-A ufw-before-input -m conntrack --ctstate INVALID -j DROP

# ok icmp codes for INPUT
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT

# ok icmp code for FORWARD
-A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT

# allow dhcp client to work
-A ufw-before-input -p udp --sport 67 --dport 68 -j ACCEPT

#
# ufw-not-local
#
-A ufw-before-input -j ufw-not-local

# if LOCAL, RETURN
-A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN

# if MULTICAST, RETURN
-A ufw-not-local -m addrtype --dst-type MULTICAST -j RETURN

# if BROADCAST, RETURN
-A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN

# all other non-local packets are dropped
-A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny
-A ufw-not-local -j DROP

# allow MULTICAST mDNS for service discovery (be sure the MULTICAST line above
# is uncommented)
-A ufw-before-input -p udp -d 224.0.0.251 --dport 5353 -j ACCEPT

# allow MULTICAST UPnP for service discovery (be sure the MULTICAST line above
# is uncommented)
-A ufw-before-input -p udp -d 239.255.255.250 --dport 1900 -j ACCEPT

# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT

Respuesta1

Parece que las reglas de enrutamiento/reenvío soncompletamente separadoa las reglas normales de firewall. Muevo las cosas de NAT a after.rules y cambié la regla predeterminada para el tráfico "enrutado" a "denegar". Parece que se produce POSTROUTINGdespuésse aplica la regla de denegación predeterminada, por lo que si la regla predeterminada niega algo, no se enrutará de forma natural. Por supuesto, es posible agregar reglas de usuario (del tipo "permitir ruta ufw ...") y pueden permitir el tráfico antes de que se aplique la denegación predeterminada, y luego se enrutará como se esperaba.

información relacionada