Вопрос: CentOS 7 iptables не сохраняется после перезагрузки


Я установил минимальную версию CentOS 7 на сервере разработки, чтобы виртуализировать некоторых пользователей Linux с помощью kvm / qemu.

Использовать iptables вместо firewalld Я устанавливаю iptables-service и делай:

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

SELinux отключен путем редактирования /etc/sysconfig/selinux,

Мои правила для iptables следующие:

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-save > /etc/sysconfig/iptables

мой iptables-file выглядит:

# 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

Быстрая проверка, правильно ли мои правила верны:

[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 

Но после перезагрузки сервера правила iptables выглядят так:

[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

Я не понимаю, откуда берутся другие правила.

При звонке iptables-restore -c /etc/sysconfig/iptables отображаются ожидаемые правила.

Кажется, что сохраненные правила не загружаются во время загрузки или что «default» -rules не сбрасываются или что-то еще.

В чем проблема? Я медленно получаю седые волосы ...


Спасибо за ваши быстрые ответы :)

Как упоминалось выше, iptables-services был установлен мной:

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

Включение службы с помощью systemctl enable iptables.service Вместо того, чтобы использовать systemctl enable iptables кажется, не имеет значения, потому что тот же самый служебный файл связан:

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

Это содержимое файла iptables после вызова /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

После перезагрузки вызова iptables -L не показывайте мои сохраненные правила:

[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

Возможно, я делаю что-то фундаментальное. Но каждый поток, который я читаю, делает это одинаково, и он должен работать.

Если вам нужна дополнительная информация, сообщите мне.

Тем временем я помог мне, вызвав небольшой скрипт, который я должен вызывать после каждой перезагрузки.

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

Это не сексуально, но работает до сих пор. Но не может быть окончательным решением.


9
2017-08-20 20:34


Источник


Вы проверяете firewalld, как это CentOS7? Ссылки по теме: serverfault.com/questions/626521/... Надеюсь, я не из темы. Проверьте также этот ответ stackoverflow.com/a/24827438/2522966 это говорит вам прекратить и замаскировать firewalld-сервис (service stop|mask firewalld) - Nico


Ответы:


Я думаю, вам нужно включить службу с помощью:

systemctl enable iptables.service

и вам нужно запустить скрипт инициализации iptables, чтобы сохранить ваши правила следующим образом:

/usr/libexec/iptables/iptables.init save


12
2017-08-20 21:09





Убедитесь, что у вас установлен пакет iptables-services:

rpm -aq iptables-services

Если его не установить:

yum install iptables-services

Затем вы можете использовать служебную команду для управления ею, как и в предыдущих версиях CentOS:

service iptables save

save, stop, start, restart команды будут работать, и он должен загружаться при загрузке.


2
2017-08-20 21:57



У меня есть команда iptables. но `rpm -aq iptables-services` ничего не выводит. Что это значит? - Saad Masood
rpm -aq сам по себе перечислит все пакеты, установленные в системе и их версии. rpm -aq <package> будет распечатывать информацию о определенном пакете, если он установлен. Если rpm -aq iptables-services  не возвращает ничего, что означает, что пакет «iptables-services» не установлен. - Gene
Если у вас есть вопрос, специфичный для CentOS 7 и AWS, тогда вы должны опубликовать совершенно новый вопрос, а не комментировать несвязанный ответ. Я понятия не имею, какие пакеты Amazon хранят в своих хранилищах, но я могу сказать вам, что iptables-servicesдоступен в стандартном базовом хранилище CentOS 7. - Gene


Я обошел это, добавив команду service iptables stop \ iptables -flush, добавленную к нижней части /etc/rc.d/rc.local

Моя среда была Centos 7 KVM, и моя проблема заключалась в том, что libvirt будет повторно заполнять iptables при перезагрузке - блокируя доступ к моим виртуальным машинам.


1
2018-06-05 10:14