Eu gostaria de carregar as regras do iptables na inicialização ou na interface do Ubuntu. Fiz uma pesquisa no StackExchange e em outros lugares e parece que a abordagem mais comumente aceita é usar iptables-save
/ iptables-restore
ou iptables-persistent
package. Eu prefiro (pode ser devido a minha natureza Linux ainda não amadurecida) para manter as regras do iptables em forma "explícita" (por exemplo, iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
) em vez de ter todas as regras diferentes despejadas no mesmo arquivo persistente onde, sem comentários e alguma estrutura , pode ser difícil encontrar uma regra específica e alterá-la.
O que eu fiz até agora - adicionei a seguinte linha ao /etc/network/interfaces
post-up sh -c "/etc/iptables/eth0.post-up.sh"
em que eth0.post-up.sh
é um arquivo no qual iptables são explicitamente definidos (por exemplo, iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
). Tudo seria bom, as regras são aplicadas, mas a razão pela qual estou escrevendo aqui é que, se eu tentar executar iptables -L FORWARD
, não vejo as regras carregadas, embora tenha certeza de que elas são aplicadas (é um encaminhamento de sub-rede). regras e vejo que o ping passa quando a regra é executada e não quando a regra não é executada. Aqui está a saída:
# iptables -L FORWARD
Chain FORWARD (policy DROP)
target prot opt source destination
ufw-before-logging-forward all -- anywhere anywhere
ufw-before-forward all -- anywhere anywhere
ufw-after-forward all -- anywhere anywhere
ufw-after-logging-forward all -- anywhere anywhere
ufw-reject-forward all -- anywhere anywhere
ufw-track-forward all -- anywhere anywhere
Se eu comentar o post-up acima ... no arquivo /etc/network/interfaces
(certificando-se de que as regras não são aplicadas) e depois executar as regras manualmente, recebo a saída:
# iptables -L FORWARD
Chain FORWARD (policy DROP)
target prot opt source destination
ufw-before-logging-forward all -- anywhere anywhere
ufw-before-forward all -- anywhere anywhere
ufw-after-forward all -- anywhere anywhere
ufw-after-logging-forward all -- anywhere anywhere
ufw-reject-forward all -- anywhere anywhere
ufw-track-forward all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
Assim, as regras são aplicadas em ambos os casos, mas no primeiro caso, iptables -L
não mostra as regras e, mais tarde, o faz.
Em última análise, funciona, mas eu gostaria de entender qual é a ressalva aqui, porque parece que eu sou o único em torno de quem está tentando usar essa abordagem, e por que iptables -L
não me dá a saída esperada.
ATUALIZAÇÃO: tenho que me corrigir, nem todas as regras do iptables no arquivo eth0.post-up.sh
são executadas, de 3 comandos abaixo:
/sbin/iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
/sbin/iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
somente o último (com POSTROUTING) é executado, o que é necessário para o envio do ping, enquanto os dois primeiros não possuem nenhum rastreio no iptables -Lnv FORWARD
nem o resultado da conexão é estabelecido (por exemplo, wget google.com
) de outro computador que usa esta caixa como um roteador. Mas se eu executar este arquivo manualmente após a inicialização - então tudo é executado corretamente, o ping e o wget do computador remoto funcionam como esperado.