CentOS 7 iptables non persistente dopo il riavvio


11

Ho installato una versione minima di CentOS 7 su un server di sviluppo per virtualizzare alcuni guest linux con kvm / qemu.

Per usare iptables invece di firewalldinstallare iptables-servicee fare:

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

SELinux è disabilitato modificando /etc/sysconfig/selinux.

Le mie regole per iptables sono le seguenti:

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

Ora salvo le mie impostazioni con il seguente comando:

iptables-save > /etc/sysconfig/iptables

I miei iptables-filesguardi:

# 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

Un rapido controllo per vedere se le mie regole sono corrette per ora:

[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 

Ma dopo aver riavviato il server le regole di iptables assomigliano a:

[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

Non capisco da dove vengano le altre regole.

Quando si chiamano iptables-restore -c /etc/sysconfig/iptablesvengono visualizzate le regole previste.

Sembra che le regole salvate non vengano caricate all'avvio o che le regole "predefinite" non vengano scaricate o altro.

Qual è il problema qui ??? Sto lentamente ottenendo i capelli grigi ...


Grazie per le tue risposte rapide :)

Come accennato in precedenza, i servizi iptables sono stati installati da me:

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

Abilitare il servizio con systemctl enable iptables.serviceinvece di usare systemctl enable iptablessembra non fare alcuna differenza perché è collegato lo stesso file di servizio:

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

Questo è il contenuto del file iptables dopo la chiamata /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

Dopo aver riavviato una chiamata per iptables -Lnon mostrare le mie regole salvate:

[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

Forse sto sbagliando qualcosa di fondamentale. Ma ogni thread che leggo lo fa allo stesso modo e dovrebbe funzionare.

Se hai bisogno di maggiori informazioni, per favore dimmelo.

Nel frattempo, mi ha aiutato chiamando un piccolo script che devo chiamare dopo ogni riavvio.

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

Quello non è sexy ma funziona finora. Ma non potrebbe essere la soluzione finale.


Hai controllato firewalld come CentOS7? Link correlato: serverfault.com/questions/626521/… Spero di non essere fuori argomento. Controlla anche questa risposta stackoverflow.com/a/24827438/2522966 che ti dice di interrompere e mascherare il servizio firewalld ( service stop|mask firewalld)
Nico

Risposte:


13

penso che devi abilitare il servizio con:

systemctl enable iptables.service

ed è necessario eseguire lo script init iptables per salvare le regole in questo modo:

/usr/libexec/iptables/iptables.init save


3

Assicurati di avere installato il pacchetto iptables-services:

rpm -aq iptables-services

In caso contrario installarlo:

yum install iptables-services

È quindi possibile utilizzare il comando di servizio per controllarlo proprio come con le versioni precedenti di CentOS:

service iptables save

La save, stop, start, restartcomandi tutti i lavori e dovrebbe caricare all'avvio.


ho il comando iptables. ma `rpm -aq iptables-services` non produce nulla. Cosa significa?
Saad Masood,

rpm -aqdi per sé elencherà tutti i pacchetti installati su un sistema e la loro versione. rpm -aq <package>stamperà le informazioni sul pacchetto definito se è installato. Se rpm -aq iptables-services non restituisce nulla, ciò significa che il pacchetto "iptables-services" non è installato.
Gene,

Se hai una domanda specifica per CentOS 7 e AWS, dovresti pubblicare una domanda completamente nuova, non fare commenti su una risposta non correlata. Non ho idea di quali pacchetti Amazon conservi nei loro repository, ma posso dirti che iptables-servicesè disponibile nel repository CentOS 7 standard di base.
Gene,

1

Ho risolto il problema aggiungendo il comando 'service iptables stop \ iptables --flush' aggiunto in fondo /etc/rc.d/rc.local

Il mio ambiente era Centos 7 KVM e il mio problema era che libvirt avrebbe ripopolato gli iptables al riavvio, bloccando l'accesso alle mie macchine virtuali.


0

Se ricordo correttamente uno dei servizi di virtualizzazione (e sembra che tu ne stia eseguendo uno, a giudicare dal nome dell'interfaccia virbr0) stava aggiungendo alcune regole del firewall per ospitare interfacce e reti virtuali configurate. Dai un'occhiata a quest'area (ed libvirt-daemonè probabilmente un buon punto di partenza).

Non so comunque se il fatto che sembri sovrascrivere le tue regole sia un bug o una caratteristica. RedHat sembra essere piuttosto focalizzato su firewalldcome la soluzione di firewall in RHEL (e questo va direttamente invariato anche a CentOS) e potrebbero non supportare il corretto funzionamento delle loro soluzioni di virtualizzazione con firewalldalternative.


0

Prova questo:

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

esegui le regole di iptables qui ora

iptables-save > /etc/sysconfig/iptables
iptables-restore < /etc/sysconfig/iptables
systemctl restart iptables
systemctl restart iptables
systemctl enable iptables.service
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.