CentOS 7 iptables no persiste después de reiniciar

11

Instalé una versión mínima de CentOS 7 en un servidor de desarrollo para virtualizar algunos invitados de Linux con kvm / qemu.

Para usar iptables en lugar de firewalldinstalar iptables-servicey hacer:

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

SELinux se desactiva al editar /etc/sysconfig/selinux.

Mis reglas para iptables son las siguientes:

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

Ahora guardo mi configuración con el siguiente comando:

iptables-save > /etc/sysconfig/iptables

Mi iptables-fileapariencia

# 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

Una comprobación rápida para ver si mis reglas son correctas por ahora:

[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 

Pero después de reiniciar el servidor, las reglas de iptables se ven así:

[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

No entiendo de dónde vienen las otras reglas.

Al llamar iptables-restore -c /etc/sysconfig/iptablesse muestran las reglas esperadas.

Parece que las reglas guardadas no se cargan en el momento del arranque o que las reglas "predeterminadas" no se vacían o lo que sea.

Cuál es el problema aquí ??? Poco a poco me salen canas ...


Gracias por sus respuestas rápidas :)

Como se mencionó anteriormente, instalé los servicios de iptables:

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

Habilitar el servicio con en systemctl enable iptables.servicelugar de usar systemctl enable iptablesparece no hacer ninguna diferencia porque el mismo archivo de servicio 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 es el contenido del archivo iptables después de llamar /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

Después de reiniciar una llamada para iptables -Lno mostrar mis reglas guardadas:

[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

Tal vez estoy haciendo algo fundamental mal. Pero cada hilo que leo hace esto de la misma manera y debería funcionar.

Si necesita más información por favor dígame.

Mientras tanto, me ayudó llamando un pequeño script que debo llamar después de cada reinicio.

#!/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

Eso no es sexy pero funciona hasta ahora. Pero no podría ser la solución final.

elpado
fuente
¿Has revisado Firewalld ya que es CentOS7? Enlace relacionado: serverfault.com/questions/626521/… Espero no estar fuera de tema. Verifique también esta respuesta stackoverflow.com/a/24827438/2522966 que le dice que pare y enmascare el servicio Firewalld ( service stop|mask firewalld)
Nico

Respuestas:

13

Creo que necesita habilitar el servicio con:

systemctl enable iptables.service

y necesita ejecutar el script de inicio de iptables para guardar sus reglas de esta manera:

/usr/libexec/iptables/iptables.init save

Henrik Pingel
fuente
3

Asegúrese de tener instalado el paquete iptables-services:

rpm -aq iptables-services

Si no lo instala:

yum install iptables-services

Luego puede usar el comando de servicio para controlarlo al igual que con versiones anteriores de CentOS:

service iptables save

El save, stop, start, restartcomandos todo el trabajo y se deben cargar en el arranque.

Gene
fuente
Tengo el comando iptables. pero `rpm -aq iptables-services` no genera nada. Qué significa eso?
Saad Masood
rpm -aqpor sí solo enumerará todos los paquetes instalados en un sistema y su versión. rpm -aq <package>imprimirá información sobre el paquete definido si está instalado. Si rpm -aq iptables-services no devuelve nada, eso significa que el paquete 'iptables-services' no está instalado.
Gene
Si tiene una pregunta específica para CentOS 7 y AWS, debe publicar una pregunta completamente nueva, no hacer comentarios sobre una respuesta no relacionada. No tengo idea de qué paquetes mantiene Amazon en sus repositorios, pero puedo decirle que iptables-servicesestá disponible en el repositorio estándar, base de CentOS 7.
Gene
1

Lo solucioné agregando el comando 'service iptables stop \ iptables --flush' adjunto al final /etc/rc.d/rc.local

Mi entorno era Centos 7 KVM y mi problema era que libvirt volvería a llenar las iptables en un reinicio, bloqueando el acceso a mis máquinas virtuales.

3 peniques
fuente
0

Si recuerdo correctamente, uno de los servicios de virtualización (y parece que está ejecutando uno, a juzgar por el nombre de la interfaz virbr0) fue agregar algunas reglas de firewall para acomodar las redes e interfaces virtuales configuradas. Eche un vistazo a esta área (y libvirt-daemones probable que sea un buen punto de partida).

Sin embargo, no sé si el hecho de que parece sobrescribir sus reglas es un error o una característica. RedHat parece estar bastante centrado firewalldcomo la solución de firewall en RHEL (y esto también va directamente a CentOS sin cambios) y es posible que no admitan el funcionamiento correcto de sus soluciones de virtualización con firewalldalternativas.

Tomek
fuente
0

Prueba esto:

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

ejecuta tus reglas de iptables aquí ahora

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