Configurei o nftables como meu firewall padrão e único no openSUSE Tumbleweed. O iptables e o firewalld foram marcados como "tabu" e nunca serão reinstalados. Também verifiquei duas vezes para garantir que eles não estejam presentes no meu sistema. É o nftables e pronto.
Meu problema é que as cadeias de saída/entrada dentro de um inet
filtro não parecem afetar os dispositivos NAT. O nftables também está agindo como meu NAT para minha rede doméstica.
Tenho cerca de 8 dispositivos sempre conectados e, portanto, com NAT. Esses dispositivos (todos eles) não passam pelas minhas cadeias output
, input
o que é muito restritivo.
Não encontrei e não posso encontrar nenhuma informação sobre como garantir que dispositivos com NAT passem por outras tabelas e cadeias.
Alguém pode me explicar por que o nftables não roteia tráfego NAT por meio de outras tabelas e cadeias? Alguém pode fornecer uma maneira de enviar dados NAT por meio de outras tabelas do firewall?
Aqui está meu arquivo nftables.conf:
#!/usr/sbin/nft -f
flush ruleset
table inet filter{
chain state{
ct state {established, related} accept;
ct state invalid drop;
}
chain input{
type filter hook input priority 0; policy drop;
# allowed icmp types
ip protocol icmp icmp type {destination-unreachable, router-solicitation, router-advertisement, time-exceeded, parameter-problem} accept;
# if related or invalid
jump state;
# allow loopback
iif "lo" accept;
# NTP (Network Time)
udp dport 123 accept;
tcp dport 123 accept;
}
chain output{
type filter hook output priority 0; policy drop;
# allowed icmp types
ip protocol icmp icmp type {destination-unreachable, router-solicitation, router-advertisement, time-exceeded, parameter-problem} accept;
# if related or invalid
jump state;
# allow loopback
iif "lo" accept;
# allow TCP ident
tcp dport 113 accept;
# allow dns & dnssec
tcp dport { 53, 853 } accept;
udp dport { 53, 853 } accept;
# allow http
tcp dport { 80, 443, 1443, 8443, 8080 } accept;
udp dport { 80, 443, 1443, 8443, 8080 } accept;
# allow ftp
tcp dport { 20, 21 } accept;
udp dport 69 accept;
# allow ssh
tcp dport 22 accept;
udp dport 22 accept;
# allow email
tcp dport { 25, 465, 587 } accept; #SMTP & SMTPS
tcp dport { 110, 995 } accept; #POP3 & POP3S
udp dport { 110, 995 } accept; #POP3 & POP3S
tcp dport { 143, 993 } accept; #IMAP & IMAPS
udp dport { 143, 993 } accept; #IMAP & IMAPS
tcp dport 691; #MS Exchange
# IPsec VPN
udp dport { 500, 4500, 1701 } accept;
esp spi 50 accept;
ah spi 51 accept;
# NTP (Network Time)
udp dport 123 accept;
tcp dport 123 accept;
}
chain IPS_input{
type filter hook input priority 10; policy drop;
queue num 0
}
chain IPS_output{
type filter hook output priority 10; policy drop;
queue num 0;
}
chain IPS_forward {
type filter hook forward priority 10; policy drop;
queue num 0;
}
}
table nat {
chain prerouting {
type nat hook prerouting priority -100;
ct state invalid drop;
}
chain postrouting {
type nat hook postrouting priority 100;
ct state invalid drop;
ip saddr 10.0.0.0/24 oif eno2 masquerade; # "eno2" is our external interface
}
}
Embora não seja precisamente relevante se é NAT, de qualquer forma isso significaria que o tráfego encaminhado é o tráfego em questão (ou seja, tráfego originado de algum outro host que é, em última análise (ou seja, após
dnat
etc., se houver) destinado e, portanto, roteado para outro host).Para esse tráfego, você precisa de uma cadeia com
hook forward
para filtrar. Cadeias comhook input
/hook output
são atravessadas apenas pelo tráfego (L3-) destinado a este host / originado deste host. (Observe também que esse tráfego não atravessaria a cadeia comhook forward
nenhum dos dois.)