Iptables CentOS 7 nie jest trwały po ponownym uruchomieniu

11

Zainstalowałem minimalną wersję CentOS 7 na serwerze programistycznym, aby zwirtualizować niektórych gości Linuksa za pomocą kvm / qemu.

Aby użyć iptables zamiast firewalldinstalować iptables-servicei wykonywać:

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

SELinux jest wyłączany przez edycję /etc/sysconfig/selinux.

Moje zasady dotyczące iptables są następujące:

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

Teraz zapisuję moje ustawienia za pomocą następującego polecenia:

iptables-save > /etc/sysconfig/iptables

Mój iptables-filewygląd:

# 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

Szybkie sprawdzenie, czy moje zasady są na razie poprawne:

[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 

Ale po ponownym uruchomieniu serwera reguły iptables wyglądają następująco:

[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

Nie rozumiem, skąd pochodzą inne zasady.

Podczas połączenia iptables-restore -c /etc/sysconfig/iptableswyświetlane są oczekiwane reguły.

Wygląda na to, że zapisane reguły nie są ładowane podczas uruchamiania lub że „domyślne” reguły nie są opróżniane.

Jaki jest tutaj problem ??? Powoli mam siwe włosy ...


Dziękuję za szybką odpowiedź :)

Jak wspomniano powyżej, usługi iptables zostały zainstalowane przeze mnie:

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

Włączenie usługi systemctl enable iptables.servicezamiast zamiast systemctl enable iptableswydaje się nie mieć znaczenia, ponieważ ten sam plik usługi jest połączony:

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

To jest zawartość pliku iptables po wywołaniu /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

Po ponownym uruchomieniu połączenia, aby iptables -Lnie wyświetlać moich zapisanych reguł:

[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

Może robię coś fundamentalnie złego. Ale każdy wątek, który czytam, robi to w ten sam sposób i powinien działać.

Jeśli potrzebujesz więcej informacji, powiedz mi.

Tymczasem pomogłem, wywołując mały skrypt, który muszę wywoływać po każdym ponownym uruchomieniu.

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

To nie jest seksowne, ale działa do tej pory. Ale nie mogło być ostatecznym rozwiązaniem.

elpado
źródło
Czy sprawdziłeś zaporę ogniową, ponieważ jest to CentOS7? Powiązany link: serverfault.com/questions/626521/… Mam nadzieję, że nie jestem z tematu. Sprawdź również tę odpowiedź stackoverflow.com/a/24827438/2522966, która mówi ci, abyś przestał i maskował firewalld service ( service stop|mask firewalld)
Nico

Odpowiedzi:

13

myślę, że musisz włączyć usługę za pomocą:

systemctl enable iptables.service

i musisz uruchomić skrypt inicjujący iptables, aby zapisać swoje reguły w następujący sposób:

/usr/libexec/iptables/iptables.init save

Henrik Pingel
źródło
3

Upewnij się, że masz zainstalowany pakiet usług iptables:

rpm -aq iptables-services

Jeśli nie, zainstaluj:

yum install iptables-services

Następnie możesz użyć polecenia serwisowego, aby sterować nim tak, jak w poprzednich wersjach CentOS:

service iptables save

save, stop, start, restartKomendy i wszystkie prace należy załadować przy starcie.

Gen
źródło
Mam polecenie iptables. ale `rpm -aq iptables-services` nic nie wypisuje. Co to znaczy?
Saad Masood,
rpm -aqsama w sobie wyświetli listę wszystkich pakietów zainstalowanych w systemie i ich wersji. rpm -aq <package>wypisze informacje o zdefiniowanym pakiecie, jeśli jest zainstalowany. Jeśli rpm -aq iptables-services nic nie zwraca, oznacza to, że pakiet „iptables-services” nie jest zainstalowany.
Gene,
Jeśli masz pytanie dotyczące CentOS 7 i AWS, powinieneś opublikować zupełnie nowe pytanie, a nie komentować niezwiązanej odpowiedzi. Nie mam pojęcia, jakie pakiety Amazon przechowuje w swoich repozytoriach, ale mogę powiedzieć, że iptables-servicesjest on dostępny w standardowym podstawowym repozytorium CentOS 7.
Gen
1

Obejrzałem to, dodając polecenie „service iptables stop \ iptables --flush” dołączone na dole /etc/rc.d/rc.local

Moim środowiskiem był Centos 7 KVM, a moim problemem było to, że libvirt ponownie zaludnił iptables przy ponownym uruchomieniu - blokując dostęp do moich maszyn wirtualnych.

3 pensy
źródło
0

Jeśli dobrze pamiętam, jedna z usług wirtualizacji (a wydaje się, że działasz, sądząc po nazwie interfejsu virbr0) dodawała same reguły zapory, aby dostosować się do skonfigurowanych wirtualnych sieci i interfejsów. Zajrzyj do tego obszaru (i libvirt-daemonprawdopodobnie jest to dobry punkt wyjścia).

Nie wiem jednak, czy fakt, że wydaje się, że zastępuje twoje reguły, jest błędem lub cechą. Wydaje się, że RedHat jest dość skoncentrowany na firewalldrozwiązaniu zapory ogniowej w RHEL (i to również bezpośrednio w CentOS) i mogą nie obsługiwać poprawnego działania swoich rozwiązań wirtualizacyjnych z firewalldalternatywami.

Tomek
źródło
0

Spróbuj tego:

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

wykonaj tutaj swoje reguły iptables

iptables-save > /etc/sysconfig/iptables
iptables-restore < /etc/sysconfig/iptables
systemctl restart iptables
systemctl restart iptables
systemctl enable iptables.service
David Bohbot
źródło