Iptables do CentOS 7 não persistentes após a reinicialização

11

Instalei uma versão mínima do CentOS 7 em um servidor de desenvolvimento para virtualizar alguns convidados do Linux com kvm / qemu.

Para usar o iptables em vez de firewalldinstalar iptables-servicee fazer:

systemctl stop firewalld
systemctl mask firewalld
systemctl enable iptables
systemctl start iptables

O SELinux é desativado pela edição /etc/sysconfig/selinux.

Minhas regras para iptables são as seguintes:

iptables -Z
iptables -F
iptables -X
iptables -t nat -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -o enp6s0 -j MASQUERADE
iptables -A FORWARD -i enp6s0 -o virbr0 -j ACCEPT

Agora eu salvo minhas configurações com o seguinte comando:

iptables-save > /etc/sysconfig/iptables

Meus iptables-filelooks:

# Generated by iptables-save v1.4.21 on Thu Aug 20 10:46:40 2015
*mangle
:PREROUTING ACCEPT [16736:10889078]
:INPUT ACCEPT [1063:106860]
:FORWARD ACCEPT [15679:10784186]
:OUTPUT ACCEPT [570:71275]
:POSTROUTING ACCEPT [15728:10809742]
-A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
# Completed on Thu Aug 20 10:46:40 2015
# Generated by iptables-save v1.4.21 on Thu Aug 20 10:46:40 2015
*filter
:INPUT ACCEPT [868:81772]
:FORWARD ACCEPT [8328:7311589]
:OUTPUT ACCEPT [233:32016]
-A FORWARD -i enp6s0 -o virbr0 -j ACCEPT
COMMIT
# Completed on Thu Aug 20 10:46:40 2015
# Generated by iptables-save v1.4.21 on Thu Aug 20 10:46:40 2015
*nat
:PREROUTING ACCEPT [1308:86998]
:INPUT ACCEPT [77:12475]
:OUTPUT ACCEPT [1:72]
:POSTROUTING ACCEPT [1228:74319]
-A POSTROUTING -o enp6s0 -j MASQUERADE
COMMIT
# Completed on Thu Aug 20 10:46:40 2015

Uma verificação rápida para ver se minhas regras estão corretas no momento:

[root@dev1 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

Mas depois de reiniciar o servidor, as regras do iptables se parecem com:

[root@dev1 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             10.0.1.0/24          ctstate RELATED,ESTABLISHED
ACCEPT     all  --  10.0.1.0/24          anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootpc

Não entendo de onde vêm as outras regras.

Ao chamar iptables-restore -c /etc/sysconfig/iptablesas regras esperadas são exibidas.

Parece que as regras salvas não são carregadas no momento da inicialização ou que as regras "padrão" não são liberadas ou o que seja.

Qual é o problema aqui ??? Estou lentamente ficando com cabelos grisalhos ...


Obrigado por suas respostas rápidas :)

Como mencionado acima, o iptables-services foi instalado por mim:

[root@dev1 ~]# rpm -aq iptables-services
iptables-services-1.4.21-13.el7.x86_64

Ativar o serviço com, em systemctl enable iptables.servicevez de usar, systemctl enable iptablesparece não fazer diferença, porque o mesmo arquivo de serviço está vinculado:

[root@dev1 ~]# systemctl disable iptables
rm '/etc/systemd/system/basic.target.wants/iptables.service'
[root@dev1 ~]# systemctl enable iptables.service
ln -s '/usr/lib/systemd/system/iptables.service' '/etc/systemd/system/basic.target.wants/iptables.service'

Este é o conteúdo do arquivo iptables após a chamada /usr/libexec/iptables/iptables.init save

[root@develcluster1 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Fri Aug 21 14:34:04 2015
*nat
:PREROUTING ACCEPT [351490:22546787]
:INPUT ACCEPT [15751:2400243]
:OUTPUT ACCEPT [324:21186]
:POSTROUTING ACCEPT [304860:18293418]
-A POSTROUTING -o enp6s0 -j MASQUERADE
COMMIT
# Completed on Fri Aug 21 14:34:04 2015
# Generated by iptables-save v1.4.21 on Fri Aug 21 14:34:04 2015
*filter
:INPUT ACCEPT [505048:69178501]
:FORWARD ACCEPT [55815086:22035726185]
:OUTPUT ACCEPT [325986:56595531]
-A FORWARD -i enp6s0 -o virbr0 -j ACCEPT
COMMIT
# Completed on Fri Aug 21 14:34:04 2015
# Generated by iptables-save v1.4.21 on Fri Aug 21 14:34:04 2015
*mangle
:PREROUTING ACCEPT [109215513:66867793592]
:INPUT ACCEPT [505243:69203589]
:FORWARD ACCEPT [108710264:66798590873]
:OUTPUT ACCEPT [326323:56634790]
:POSTROUTING ACCEPT [109036066:66855179944]
-A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
# Completed on Fri Aug 21 14:34:04 2015

Depois de reiniciar uma chamada para iptables -Lnão mostrar minhas regras salvas:

[root@dev1 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             10.0.1.0/24          ctstate RELATED,ESTABLISHED
ACCEPT     all  --  10.0.1.0/24          anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootpc

Talvez eu esteja fazendo algo fundamental errado. Mas cada thread que eu leio faz isso da mesma maneira e deve funcionar.

Se você precisar de mais informações, por favor me diga.

Enquanto isso, ajudei-me chamando um pequeno script que devo chamar após cada reinicialização.

#!/bin/sh

iptables -Z
iptables -F
iptables -X
iptables -t nat -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -o enp6s0 -j MASQUERADE
iptables -A FORWARD -i enp6s0 -o virbr0 -j ACCEPT

iptables --flush
iptables-restore -c /etc/sysconfig/iptables

Isso não é sexy, mas funciona até agora. Mas não poderia ser a solução final.

elpado
fonte
Você verificou o firewalld como é o CentOS7? Link relacionado: serverfault.com/questions/626521/… Espero não estar fora de assunto. Verifique também esta resposta stackoverflow.com/a/24827438/2522966, que está lhe dizendo para parar e mascarar o serviço firewalld ( service stop|mask firewalld)
Nico

Respostas:

13

Eu acho que você precisa habilitar o serviço com:

systemctl enable iptables.service

e você precisa executar o script init do iptables para salvar suas regras assim:

/usr/libexec/iptables/iptables.init save

Henrik Pingel
fonte
3

Verifique se você tem o pacote iptables-services instalado:

rpm -aq iptables-services

Caso contrário, instale-o:

yum install iptables-services

Você pode usar o comando service para controlá-lo como nas versões anteriores do CentOS:

service iptables save

A save, stop, start, restartcomandos todo o trabalho e ele deve carregar na inicialização.

Gene
fonte
Eu tenho o comando iptables. mas o `rpm -aq iptables-services` não gera nada. O que isso significa?
Saad Masood
rpm -aqpor si só, listará todos os pacotes instalados em um sistema e sua versão. rpm -aq <package>imprimirá informações sobre o pacote definido, se estiver instalado. Se rpm -aq iptables-services não retornar nada que signifique que o pacote 'iptables-services' não está instalado.
Gene
Se você tiver uma pergunta específica para o CentOS 7 e a AWS, publique uma pergunta totalmente nova, não faça comentários sobre uma resposta não relacionada. Não tenho idéia de quais pacotes a Amazon mantém em seus repositórios, mas posso dizer que iptables-servicesestá disponível no repositório padrão do CentOS 7.
Gene
1

Eu resolvi isso adicionando o comando 'service iptables stop \ iptables --flush' anexado à parte inferior /etc/rc.d/rc.local

Meu ambiente era o KVM do Centos 7 e meu problema era que a libvirt preencheria novamente o iptables em uma reinicialização - bloqueando o acesso às minhas máquinas virtuais.

3pence
fonte
0

Se bem me lembro, um dos serviços de virtualização (e você parece estar executando um, a julgar pelo nome da interface virbr0) estava adicionando algumas regras de firewall para acomodar redes e interfaces virtuais configuradas. Por favor, dê uma olhada nesta área (e libvirt-daemoné provavelmente um bom ponto de partida).

No entanto, não sei se o fato de parecer substituir suas regras é um bug ou um recurso. O RedHat parece estar bastante focado na firewalldsolução de firewall no RHEL (e isso também vai diretamente para o CentOS) e eles podem não suportar a operação correta de suas soluções de virtualização com firewalldalternativas.

Tomek
fonte
0

Tente o seguinte:

systemctl stop firewalld
systemctl disable firewalld
systemctl mask --now firewalld
yum -y remove iptables-services
yum -y install iptables-services
systemctl start iptables
systemctl status iptables

echo '# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT' > /etc/sysconfig/iptables

execute suas regras do iptables aqui agora

iptables-save > /etc/sysconfig/iptables
iptables-restore < /etc/sysconfig/iptables
systemctl restart iptables
systemctl restart iptables
systemctl enable iptables.service
David Bohbot
fonte