
Estou usando o firewalld no RHEL 8 e preciso adicionar algumas regras nftáveis também.
(As regras nftáveis são baseadas na resposta aCentOS 8 como roteador NAT com nft e firewalld - como fazer com que ele passe TFTP?)
Em um firewall em execução, isso funciona bem com o comando nft -f.
No entanto, isso se perde na reinicialização.
ODocumentação RedHat(atrás do acesso pago) sugere o uso do serviço nftables.service para carregar regras na reinicialização, mas isso não funciona em conjunto com o firewalld. Os dois serviços estão listados como conflitantes e, mesmo que não estivessem, o firewalld provavelmente eliminaria as regras nftáveis.
Existe outra maneira de fazer com que as regras nftáveis sejam carregadas na reinicialização?
Responder1
Ofirewalldutilitário, ao usar onftáveisProcesso interno,não irá liberar tabelas que não pertencem a ele:
Apenas libere as regras do firewalld
Como o nftables permite namespaces (por meio de tabelas)firewalld não faz mais uma limpeza completa das regras de firewall. Ele apenas liberará regras no firewalldmesa. Isso evita cenários em que regras de usuário personalizadas ou regras instaladas por outras ferramentas são eliminadas inesperadamente quando o firewalld foi reiniciado ou recarregado.
O mesmo deve ser feito ao gerenciar outras tabelas.
Na verdade na resposta anterior já está feito: onftáveisregras exclui idempotentementeapenassua própria mesa: handletftp
.
Infelizmente, esse não é o caso para nftables.service
opararAção:
ExecStop=/sbin/nft flush ruleset
É preciso apenas garantir que a parte stop do serviço systemd não libere diretamente todas as regras enquanto ainda faz o trabalho. Este trabalho será delegado em funcionários dedicadosnftáveisregras para opararAção.
Então aqui está um método prático: duplique (por exemplo systemctl cat nftables.services
:) e altere nftables.service
para uma versão instanciada [email protected]
para ser colocada :/etc/systemd/system/[email protected]
[Unit]
Description=Idempotent nftables rules for %I
Wants=network-pre.target
Before=network-pre.target
[Service]
Type=oneshot
ProtectSystem=full
ProtectHome=true
ExecStart=/sbin/nft -f /etc/nftables/idempotent/%I.nft
# As the rules are idempotent, ExecReload is same as ExecStart
ExecReload=/sbin/nft -f /etc/nftables/idempotent/%I.nft
# The stop rules should only have the first boilerplate parts
ExecStop=/sbin/nft -f /etc/nftables/idempotent/stop-%I.nft
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Crie o diretório de configuração dedicado usado acima:
mkdir -p /etc/nftables/idempotent
Coloque regras que para cada tabela definida sempre comecem assim, portanto o carregamento das regras é independente de outras tabelas eidempotente(exemplo com tabelas ip foo
e bridge bar
):
table ip foo
delete table ip foo
table bridge bar
delete table bridge bar
table ip foo {
...
}
table bridge bar {
....
}
ou apenas use uma tabela por arquivo. A flush ruleset
declaração é proibida porque é global.
A razão pela qual uma tabela é criada, excluída e recriada é para obter o resultado idempotente: embora excluir uma tabela inexistente seja um erro e faria atomicamente todo o carregamento falhar, declarar uma tabela existente sem defini-la (adicionando uma tabela vazia) nunca falha e não faz nadaexceto criá-lo vaziose não existisse antes. Em ambos os casos (não existia na inicialização, existe na recarga)excluiragora pode funcionar, deixando o local para realmente definir a tabela logo em seguida. Tudo isso está acontecendo na mesma transação e ainda é atômico: nenhum pacote será avaliado com falta.ip footabela se ela existisse antes durante isso.
Prepare umpararversão acima que só será deletada (aqui as declarações vazias não são estritamente necessárias e poderiam ser removidas se houvesse apenas uma tabela, mas devem ser mantidas se houver mais de uma tabela: a falha é para toda a transação):
table ip foo
delete table ip foo
table bridge bar
delete table bridge bar
e coloque tudo em seu local:
/etc/nftables/idempotent/foobar.nft
/etc/nftables/idempotent/stop-foobar.nft
Agora isso pode ser ativado com:
systemctl enable --now local-idempotent-nft@foobar
Exemplo da pergunta anterior do OP:
em /etc/nftables/idempotent/handletftp.nft
:
table ip handletftp
delete table ip handletftp
table ip handletftp {
ct helper helper-tftp {
type "tftp" protocol udp
}
chain sethelper {
type filter hook forward priority 0; policy accept;
ip saddr 192.168.1.0/24 ip daddr 10.0.10.10 udp dport 69 ct helper set "helper-tftp"
}
}
Em/etc/nftables/idempotent/stop-handletftp.nft
table ip handletftp
delete table ip handletftp
Habilitando e iniciando:
systemctl enable --now local-idempotent-nft@handletftp
Parando:
systemctl stop local-idempotent-nft@handletftp
que vai sairfirewalldregras em vigor. Da mesma forma, parar ou reiniciarfirewallddeixará essas regras em vigor.
Provavelmente há melhorias a serem feitas:
- nftáveistem umincluirdeclaração que poderia ser usada de alguma forma para evitar a duplicação do padrão.
- o exemplo específico sobre TFTP depende de
nf_nat_tftp
cujo carregamento não será feito automaticamente (ao contrário donf_conntrack_tftp
que é carregado automaticamente a partir de referência nas regras ou contrário aofirewalldque carregarianf_nat_tftp
explicitamente). Tão relacionado, mas não estritamentenftáveisas configurações devem ser mantidas em mente (esta configuração pode simplesmente ser inserida/etc/modules-load.d/
).