Я установил минимальную версию 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-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
Это не сексуально, но пока работает. Но не могло быть окончательного решения.
Я думаю, вам нужно включить службу с помощью:
systemctl enable iptables.service
и вам нужно запустить сценарий инициализации iptables, чтобы сохранить ваши правила следующим образом:
/usr/libexec/iptables/iptables.init save
Убедитесь, что у вас установлен пакет iptables-services:
rpm -aq iptables-services
Если не установить:
yum install iptables-services
Затем вы можете использовать служебную команду для управления им, как и в предыдущих версиях CentOS:
service iptables save
В save
, stop
, start
, restart
все команды будут работать, и они должны загружаться при загрузке.
Я обошел это, добавив команду service iptables stop \ iptables --flush в нижнюю часть /etc/rc.d/rc.local
Моей средой был Centos 7 KVM, и моя проблема заключалась в том, что libvirt повторно заполнял iptables при перезагрузке, блокируя доступ к моим виртуальным машинам.
Если я правильно помню, одна из служб виртуализации (а вы, судя по имени интерфейса virbr0, похоже, работаете с ней) сама добавляла некоторые правила брандмауэра для размещения настроенных виртуальных сетей и интерфейсов. Пожалуйста, загляните в эту область (и libvirt-daemon
вероятно, хорошая отправная точка).
Однако я не знаю, является ли тот факт, что он перезаписывает ваши правила, ошибкой или особенностью. RedHat, похоже, очень сосредоточен на firewalld
в качестве решения для межсетевого экрана в RHEL (и это также относится непосредственно к CentOS без изменений), и они могут не поддерживать правильную работу своих решений виртуализации с firewalld
альтернативы.
Попробуй это:
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
У меня была такая же проблема, поэтому я попал на эту страницу.
Во время тестирования решения для удаления и переустановки iptables я заметил, что у меня уже был установлен firewalld (он должен быть отключен, но я не уверен, что это было так). Удаление firewalld с помощью:
yum remove firewalld
И все идет хорошо ....