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

11

Я установил минимальную версию 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ожидаемые правила отображаются.

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

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


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

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

[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

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

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

Ответы:

13

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

systemctl enable iptables.service

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

/usr/libexec/iptables/iptables.init save

Хенрик Пингел
источник
3

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

rpm -aq iptables-services

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

yum install iptables-services

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

service iptables save

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

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

Я справился с этим, добавив команду «service iptables stop \ iptables --flush», добавленную внизу /etc/rc.d/rc.local

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

3pence
источник
0

Если я правильно помню, одна из служб виртуализации (и вы, похоже, используете ее, судя по имени интерфейса virbr0) сама добавляла некоторые правила брандмауэра для поддержки настроенных, виртуальных сетей и интерфейсов. Пожалуйста, взгляните на эту область (и libvirt-daemon, вероятно, это хорошая отправная точка).

Однако я не знаю, является ли тот факт, что он перезаписывает ваши правила, ошибкой или особенностью. RedHat, кажется, довольно сфокусирован на firewalldрешении брандмауэра в RHEL (и это также касается и CentOS без изменений), и они могут не поддерживать правильную работу своих решений для виртуализации с firewalldальтернативами.

Томек
источник
0

Попробуй это:

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

выполнить ваши правила iptables здесь и сейчас

iptables-save > /etc/sysconfig/iptables
iptables-restore < /etc/sysconfig/iptables
systemctl restart iptables
systemctl restart iptables
systemctl enable iptables.service
Дэвид Бохбот
источник