Regras UFW com NAT/mascaramento

Regras UFW com NAT/mascaramento

Estou tentando usar o Ubuntu como um tipo de roteador, limitando um computador na minha rede privada ao que ele pode se conectar na Internet.

A caixa do Ubuntu possui duas NICs, uma voltada para a Internet (enp0s3) e a outra voltada para este único PC privado (enp0s8).

Para começar, eu queria ver se poderia permitir o DNS da caixa privada através do Ubuntu. Segui algumas instruções para adicionar algumas regras de "permissão de rota", como resulta em:

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 é meu PC privado. Usando o Wireshark, posso ver solicitações de DNS sendo feitas no enp0s3 e no enp0s8, mas as do enp0s3 não têm resposta.

Então, depois de ler um pouco mais, descobri que precisava configurar o NAT e o mascaramento, então coloquei o seguinte em regras.before:

# 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

Isso funcionou - mas muito bem. Agora todo o tráfego está saindo e retornando ao meu PC privado, a negação padrão de saída e todas as outras regras do UFW parecem ter sido ignoradas.

Portanto, minha pergunta é simples - quero que o PC privado obtenha conectividade através do Ubuntu, como o NAT fornecido, mas com as restrições de saída que pensei ter configurado inicialmente usando as linhas de comando do ufw. Existe uma maneira de fazer com que as regras do UFW sejam aplicadas de alguma forma depois que o NAT fizer seu trabalho?

TIA.

Aqui está o arquivo before.rules completo. Minha única alteração foram as regras da tabela 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

Responder1

Parece que as regras de roteamento/encaminhamento sãocompletamente separadoàs regras normais de firewall. Movo o material NAT para after.rules e altero a regra padrão do tráfego "roteado" para "deny". Parece que POSTROUTING ocorredepoisa regra de negação padrão é aplicada - portanto, se algo for negado pela regra padrão, não será roteado nat. É possível adicionar regras de usuário, é claro (do tipo "ufw route permitir ...") e elas podem permitir o tráfego antes que a negação padrão seja aplicada, e isso será roteado conforme o esperado.

informação relacionada