Les iptables de CentOS 7 ne persistent pas après le redémarrage

11

J'ai installé une version minimale de CentOS 7 sur un serveur de développement pour virtualiser certains invités Linux avec kvm / qemu.

Pour utiliser iptables au lieu d' firewalldinstaller iptables-serviceet de faire:

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

SELinux est désactivé par modification /etc/sysconfig/selinux.

Mes règles pour iptables sont les suivantes:

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

Maintenant, j'enregistre mes paramètres avec la commande suivante:

iptables-save > /etc/sysconfig/iptables

Mes 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

Une vérification rapide pour voir si mes règles sont correctes pour l'instant:

[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 

Mais après avoir redémarré le serveur, les règles iptables ressemblent à ceci:

[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

Je ne comprends pas d'où viennent les autres règles.

Lors de l'appel, iptables-restore -c /etc/sysconfig/iptablesles règles attendues sont affichées.

Il semble que les règles enregistrées ne soient pas chargées au démarrage ou que les règles "par défaut" ne soient pas vidées ou autre.

Quel est le problème ici ??? Je reçois lentement des cheveux gris ...


Merci pour vos réponses rapides :)

Comme mentionné ci-dessus, les services iptables ont été installés par moi:

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

L'activation du service avec systemctl enable iptables.serviceau lieu d'utiliser ne systemctl enable iptablessemble faire aucune différence car le même fichier de service est lié:

[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'

C'est le contenu du fichier iptables après avoir appelé /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

Après avoir redémarré un appel pour iptables -Lne pas afficher mes règles enregistrées:

[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

Peut-être que je fais quelque chose de fondamentalement mauvais. Mais chaque fil que je lis le fait de la même manière et cela devrait fonctionner.

Si vous avez besoin de plus d'informations, veuillez me le dire.

Pendant ce temps, je m'a aidé en appelant un petit script que je dois appeler après chaque redémarrage.

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

Ce n'est pas sexy mais fonctionne jusqu'à présent. Mais ne pouvait pas être la solution finale.

elpado
la source
Avez-vous vérifié firewalld comme c'est CentOS7? Lien connexe: serverfault.com/questions/626521/… J'espère que je ne suis pas hors sujet. Veuillez également vérifier cette réponse stackoverflow.com/a/24827438/2522966 qui vous dit d'arrêter et de masquer le service firewalld ( service stop|mask firewalld)
Nico

Réponses:

13

Je pense que vous devez activer le service avec:

systemctl enable iptables.service

et vous devez exécuter le script d'initialisation iptables pour enregistrer vos règles comme ceci:

/usr/libexec/iptables/iptables.init save

Henrik Pingel
la source
3

Assurez-vous que le package iptables-services est installé:

rpm -aq iptables-services

Sinon, installez-le:

yum install iptables-services

Vous pouvez ensuite utiliser la commande de service pour le contrôler comme avec les versions précédentes de CentOS:

service iptables save

Le save, stop, start, les restartcommandes seront tous les travaux et il devrait charger au démarrage.

Gène
la source
j'ai la commande iptables. mais `rpm -aq iptables-services` ne produit rien. Qu'est-ce que ça veut dire?
Saad Masood
rpm -aqpar lui-même listera tous les packages installés sur un système et leur version. rpm -aq <package>affichera les informations sur le package défini s'il est installé. Si rpm -aq iptables-services ne renvoie rien, cela signifie que le package «iptables-services» n'est pas installé.
Gene
Si vous avez une question spécifique à CentOS 7 et AWS, vous devez publier une toute nouvelle question, pas faire de commentaires sur une réponse sans rapport. Je n'ai aucune idée des packages conservés par Amazon dans leurs référentiels, mais je peux vous dire que ceux-ci iptables-servicessont disponibles dans le référentiel CentOS 7 de base standard.
Gene
1

J'ai contourné cela en ajoutant la commande «service iptables stop \ iptables --flush» ajoutée en bas /etc/rc.d/rc.local

Mon environnement était KVM Centos 7 et mon problème était que libvirt repeuplerait les iptables lors d'un redémarrage - bloquant l'accès à mes machines virtuelles.

3 pence
la source
0

Si je me souviens bien, l'un des services de virtualisation (et vous semblez en exécuter un, à en juger par le nom de l'interface virbr0) ajoutait lui-même des règles de pare-feu pour s'adapter aux réseaux et interfaces virtuels configurés. Veuillez jeter un œil à ce domaine (et libvirt-daemonc'est probablement un bon point de départ).

Je ne sais pas cependant si le fait qu'il semble écraser vos règles soit un bug ou une fonctionnalité. RedHat semble être assez concentré en firewalldtant que solution de pare-feu dans RHEL (et cela va directement à CentOS inchangé également) et ils peuvent ne pas prendre en charge le bon fonctionnement de leurs solutions de virtualisation avec des firewalldalternatives.

Tomek
la source
0

Essaye ça:

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

exécutez vos règles iptables ici maintenant

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