Primeiro: você não deve usar o iptables - restaurar como você está tentando aqui, certamente há uma solução melhor, mais segura e elegante. Talvez com a sugestão do grawity usando ipset, ou por ter uma cadeia específica que pode se dar ao luxo de ser deletada.
Eu não vejo um bug em nenhum lugar.
Considere apenas que :
são definições de "criação de cadeia". Usando -n
esta cadeia não é destruída, então não há necessidade de defini-la novamente. Se não for redefinido, não será apagado junto com seu conteúdo.
Então, para preservar o antigo custom_chain, tente isso como arquivo new_rules:
*filter
:INPUT DROP - [0:0]
:FORWARD DROP - [0:0]
:OUTPUT DROP - [0:0]
:new_chain - [0:0]
-A new_chain -j DROP
-A custom_chain -j DROP
COMMIT
resultará quando você tiver as regras iniciais e aplicará new_rules:
# iptables-restore -n < new_rules
# iptables-save
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:custom_chain - [0:0]
:new_chain - [0:0]
-A INPUT -j custom_chain
-A OUTPUT -j ACCEPT
-A custom_chain -j ACCEPT
-A custom_chain -j DROP
-A new_chain -j DROP
COMMIT
custom_chain teve mais conteúdo adicionado e o conteúdo anterior foi preservado: é o que você queria.
Claro que agora você não pode usar o arquivo new_rules sozinho (sem -n
), você receberia um erro porque custom_chain
não está definido.
Você pode até mesmo fragmentar suas regras usadas com -n
em um arquivo com regras que realmente sobrescrevem correntes existentes, e a outra que não seria se fosse mais gerenciável (mas novamente ... não).
new_rule1:
*filter
:new_chain - [0:0]
-A new_chain -j DROP
COMMIT
new_rule2:
*filter
-A custom_chain -j DROP
COMMIT
Aplicando ambos (usando -n
com ambos) depois que as novas regras anteriores passariam a dar:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:custom_chain - [0:0]
:new_chain - [0:0]
-A INPUT -j custom_chain
-A OUTPUT -j ACCEPT
-A custom_chain -j ACCEPT
-A custom_chain -j DROP
-A custom_chain -j DROP
-A new_chain -j DROP
COMMIT
mas em vez de seguir este caminho, talvez seja preferível usar diretamente comandos antigos do iptables diretamente.