Precisa reiniciar o iptables após o encerramento do servidor

1

Eu tenho um servidor atuando como host (KVM), proxy e firewall. Para acessar os serviços fornecidos pelas máquinas virtuais neste host, iptables deve funcionar para redirecionar os pacotes adequadamente para os convidados.

O problema ocorre quando o servidor é desligado (por exemplo, reinicialização ou perda de energia). Quando o servidor é iniciado novamente, os redirecionamentos de portas parecem não estar funcionando (por exemplo, não é possível o SSH para os computadores convidados ou acessar seus serviços usando as portas redirecionadas do host).

Nesse momento, posso enviar o SSH para o host e verificar se iptables está sendo executado. No entanto, preciso de service iptables restart para que tudo funcione como esperado.

Por que isso está acontecendo? Está relacionado ao uso do KVM? Como posso evitar a reinicialização manual do iptables sempre que o servidor fica inativo?

Observe que não preciso alterar a configuração iptables para que tudo funcione conforme o esperado. Só preciso reiniciar o serviço (como se a configuração não tivesse sido aplicada corretamente ou sobrescrita em algum momento).

UPDATE

No host:

# chkconfig --list iptables
0:off   1:off   2:on    3:on    4:on    5:on    6:off

Comparando as regras iptables antes e depois de reiniciar o serviço:

  • A corrente PREROUTING parece exatamente igual.
  • A cadeia INPUT parece muito semelhante. A única diferença é que, antes de reiniciar, existem algumas entradas duplicadas, mas a ordem das entradas também é semelhante.
  • A cadeia POSTROUTING parece muito semelhante. A única diferença é que, antes de reiniciar, existem algumas entradas duplicadas, mas a ordem das entradas também é semelhante.
  • A cadeia de corrente FORWARD parece mais diferente. Existem algumas entradas duplicadas antes de reiniciar o serviço, mas a ordem das entradas é alterada antes e depois.

Aqui estão as diferenças (a corrente PREROUTING foi excluída porque parecia exatamente a mesma antes e depois de reiniciar iptables ):

Antes

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        
MASQUERADE  tcp  --  10.0.0.0/24         !10.0.0.0/24         masq ports: 1024-65535
MASQUERADE  udp  --  10.0.0.0/24         !10.0.0.0/24         masq ports: 1024-65535
MASQUERADE  all  --  10.0.0.0/24         !10.0.0.0/24        
MASQUERADE  tcp  --  10.0.0.0/24         !10.0.0.0/24         masq ports: 1024-65535
MASQUERADE  udp  --  10.0.0.0/24         !10.0.0.0/24         masq ports: 1024-65535
MASQUERADE  all  --  10.0.0.0/24         !10.0.0.0/24        

Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:67
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:67
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:67
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:67
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3300
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:4333
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     all  --  0.0.0.0/0            10.0.0.0/24         state RELATED,ESTABLISHED
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
ACCEPT     all  --  0.0.0.0/0            10.0.0.0/24         state NEW,RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            10.0.0.0/24         state RELATED,ESTABLISHED
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

DEPOIS

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        
MASQUERADE  tcp  --  10.0.0.0/24         !10.0.0.0/24         masq ports: 1024-65535
MASQUERADE  udp  --  10.0.0.0/24         !10.0.0.0/24         masq ports: 1024-65535
MASQUERADE  all  --  10.0.0.0/24         !10.0.0.0/24        

Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:67
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:67
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3300
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:4333
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     all  --  0.0.0.0/0            10.0.0.0/24         state NEW,RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            10.0.0.0/24         state RELATED,ESTABLISHED
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
    
por Peque 03.02.2015 / 14:33

2 respostas

0

Minhas máquinas virtuais usam a rede NAT e uma rede virtual controlada pelo libvirt, então o libvirt tenta alterar as regras do iptables para enviar o tráfego certo para a VM certa, mas, aparentemente, não funciona corretamente.

Basicamente, o libvirt está adicionando regras ao iptables depois que o iptables já carregou sua configuração.

Rápido, hack sujo

Simples e funcional:

echo "service iptables restart" >> /etc/rc.d/rc.local

O /etc/rc.d/rc.local será executado após todos os outros scripts init.

Outras opções (apenas idéias)

  • Uma solução pode ser usar scripts "hook" do libvirt que podem ser usados para fazer um trabalho um pouco melhor (consulte libvirt e filtragem de rede com nat - iptables substitui ).
  • Refazendo a rede para que não use NAT (isso não é realmente uma solução, significa apenas alterar a arquitetura do servidor).
  • Atualizar o servidor para o CentOS 7 (agora ele usa o CentOS 6) também pode ajudar (usando o firewalld).

Qualquer ajuda para estender esta resposta com soluções mais detalhadas (etapas a seguir) ou novas opções ainda será apreciada.

Obrigado ao TrevorH e às pessoas do #centos (freenode) pela gentil ajuda.

    
por 04.02.2015 / 13:20
0

Existe alguma chance de você estar usando algum outro script dentro do arquivo '/ etc / network / interfaces' na linha "post-up iptables-restore < /etc/iptables.up.rules"

    
por 04.02.2015 / 11:34