Uso nftables há 2 anos com a mesma configuração, atualizei o programa outro dia e agora está reclamando que minha configuração não é válida embora toda a documentação ainda diga que está certa. talvez alguém consiga identificar um símbolo desonesto ou algo assim?
aqui está minha configuração:
flush ruleset
# `inet` applies to both IPv4 and IPv6.
table inet filter {
chain input {
type filter hook input priority 0;
# accept any localhost traffic
iif lo accept
# no ping floods:
ip protocol icmp icmp type echo-request limit rate over 10/second burst 4 packets drop
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
# accept traffic originated from us
ct state established,related accept
# ssh
tcp dport 22 accept
# http/https
tcp dport 80 accept
tcp dport 443 accept
# tftp/netboot
udp dport 4011 accept
udp dport 67 accept
tcp dport 69 accept
udp dport 69 accept
# listinator
tcp dport 8080 accept
tcp dport 4343 accept
# smb
tcp dport 139 accept
tcp dport 445 accept
udp dport 137 accept
udp dport 138 accept
# mc
tcp dport 25565 accept
# count and drop any other traffic
counter drop
}
chain output {
type filter hook output priority 0;
policy accept;
}
chain forward {
type filter hook forward priority 0;
nft add rule inet filter forward ct status dnat accept;
policy drop;
}
}
e o erro ao iniciar:
Starting nftables...
/etc/nftables.conf:57:6-8: Error: syntax error, unexpected add
nft add rule inet filter forward ct status dnat accept;
^^^
nftables.service: Main process exited, code=exited, status=1/FAILURE
nftables.service: Failed with result 'exit-code'.
Failed to start nftables.
Responder1
Isto está dentro de umnftáveis roteirocarregado com o comando nft -f
. A nft
palavra não tem significado por dentro e não deveria aparecer. Mas existem 1 1/2 outros problemas no mesmo lugar. Então vamos ver:
Ao redor da linha o nft
comando reclama que existe:
chain forward { type filter hook forward priority 0; nft add rule inet filter forward ct status dnat accept; policy drop; }
nft
para ser removido,já dentro de um
inet filter forward
bloco (cadeia)Portanto,
add rule inet filter forward
também deve ser removido. Na verdade,;
é supérfluo porque há uma nova linha depois.ct status dnat accept
policy drop;
deve ser colocado com a definição da cadeia baseDesta vez com sua
;
parte obrigatória da sintaxe. apolicy
palavra-chave faz parte docorrentedefinição, não faz parte de umregradefinição. Embora isso pareça ser atualmente aceito separado de sua definição de cadeia básica por regras intermediárias, isso não é algo em que se possa confiar: isso pode mudar em uma versão posterior.A mesma observação se aplica à
output
cadeia: não separepolicy accept;
de sua definição de cadeia base para não inserir regras por engano posteriormente.
A forward
corrente deve no final ser substituída por:
chain forward {
type filter hook forward priority 0; policy drop;
ct status dnat accept
}
O que seria uma sintaxe correta, mas não muito interessante, é definir a regra não dentro dos blocos, mas completamente fora das estruturas, no final do script assim:
chain forward {
type filter hook forward priority 0; policy drop;
}
}
add rule inet filter forward ct status dnat accept
De qualquer forma nft list ruleset
, ele será exibido novamente como antes, dentro do inet filter forward
bloco de cadeia.
Notas:
embora seja bom usar
ip protocol icmp
, não é bom usarip6 nexthdr ipv6-icmp
a razão é que, ao contrário do IPv4, onde o protocolo no cabeçalho IPv4 é sempre o protocolo da camada 4, o protocolo IPv6próximo cabeçalhonem sempre é o cabeçalho da camada 4 (icmp, udp, tcp...): poderia ser, em vez disso, umCabeçalho de extensãoaparecendo entre o cabeçalho IPv6 e o cabeçalho da camada 4 (final). Neste caso, a regra não corresponderá.
O sistema operacional já determinou a qual protocolo da camada 4 esse pacote pertence, portanto, as informações estão disponíveis como metainformações em vez de informações de conteúdo do pacote:
meta l4proto ipv6-icmp
.Isto é tambémdocumentado na página de manual:
Esta expressão refere-se aos campos do cabeçalho ipv6. Cuidado ao usar
ip6 nexthdr
, o valor refere-se apenas ao próximo cabeçalho, ou seja,ip6 nexthdr tcp
só corresponderá se o pacote ipv6 não contiver nenhum cabeçalho de extensão. Pacotes que estão fragmentados ou, por exemplo, contêm cabeçalhos de extensão de roteamento não serão correspondidos. Usemeta l4proto
se desejar corresponder ao cabeçalho de transporte real e ignorar quaisquer cabeçalhos de extensão adicionais.Mas na verdade, como a mesma linha inclui uma
icmpv6 type ...
linha, isso já filtra o protocolo da camada 4 para corresponder ao ICMPv6 e, ao mesmo tempo,o uso de ICMPv6 define implicitamente o protocolo da camada 3 para corresponder ao IPv6: nada é necessário para consertar.Da mesma forma, a linha anterior pode ser dispensada
ip protocol icmp
pelos mesmos motivos (mas seu comportamento atual ainda é bom).A linha:
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
deve ser substituído simplesmente por:
icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
(sem a necessidade de preceder
meta nfproto ipv6 meta l4proto icmpv6
)TFTP
-
A porta TCP 69 nunca é usada, portanto não requer uma regra para permitir isso.
TFTP e firewall com estado
TFTPé um protocolo tão difícil quanto o FTP para firewalls. Após a consulta inicial, a transferência de dados em si não usa mais a porta UDP 69 em lugar nenhum. Uso adequado doAuxiliar de conexão TFTPcom regras adicionais (que devem carregar automaticamente o
nf_conntrack_tftp
módulo do kernel) provavelmente serão necessárias, a menos que a configuração obsoleta do sysctlnet.netfilter.nf_conntrack_helper
tenha sido habilitada novamente.Seria realmente fora do assunto abordar isso aqui. Veja o início (apenas) da minha resposta paraCentOS 8 como roteador NAT com nft e firewalld - como fazer com que ele passe TFTP?ter um exemplo de conjunto de regras TFTP que possa ser copiado para substituir oExemplo de FTP no wiki nftables.
-
regras idênticas com apenas valores de porta diferentes podem ser fatoradas usandoconjuntos anônimos.nftáveis versão >= 1.0.2 ainda tem a
-o
opção (otimizar)para tentar fazer isso automaticamente.