Ubuntu
ufw disable
apt update
apt install firewalld
CentOS
yum install firewalld
systemctl restart firewalld
\
По-умолчанию блочит все нестандартные порты (кроме нескольких сервисов, которые у него прописаны: http, httpd, ssh).
Работа с зонами
# trusted - хороша для внутренней сети - отдельно разрешаем, что в ней нужно, dmz - для блока, public - для входа (интерфейс в интернет)
# Просмотреть какая зона файервола активная
firewall-cmd --get-active-zones
# Информация о зоне
firewall-cmd --info-zone=public
# Какие порты открыты в зоне (логично смотреть активную)
firewall-cmd --zone public --list-ports
# Добавить порт в зону
firewall-cmd --zone public --permanent --add-port 10050/tcp
# Удалить порт из зоны
firewall-cmd --zone public --permanent --remove-port 80/tcp
# Чтобы применились изменения
firewall-cmd --reload
# или перезапустить сервис firewalld
systemctl restart firewalld
# Установить активную зону
firewall-cmd --set-default-zone public
# Добавить в зону dmz интерфейс eth0
firewall-cmd --zone=dmz --add-interface=eth0
# Разрешить сервисы для nginx
# --permanent - для установки на постоянку, если без этой опции, то только на время выполнения, не запоминает
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# Удалить сервис http на постоянной основе
firewall-cmd --zone=public --remove-service=http --permanent
firewall-cmd --reload
Проброска портов
# Пробросит порт на этом же сервере
firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345
# Пробросит порт на другую машину 198.51.100.0
firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=198.51.100.0
# Установить на зону public masquerade и убрать его
firewall-cmd --zone=public --add-masquerade
firewall-cmd --zone=public --remove-masquerade
Rich Rules
Это расширенные правила - фактически обертка над прямыми правилами в iptables. Также можно вообще указать прямые правила без обертки.
# Показать расширенные правила в зоне public
firewall-cmd --zone=public --list-rich-rules
# Разрешить весь трафик IPv4 с хоста 192.0.2.0
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.0.2.0 accept'
# Запретить IPv4 трафик по TCP с хоста 192.0.2.0 на порт 22
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.0.2.0" port port=22 protocol=tcp reject'
# Разрешить IPv4 трафик по TCP с хоста 192.0.2.0 на порт 80 и перенаправить его на порт 6532
firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=192.0.2.0 forward-port port=80 protocol=tcp to-port=6532'
# Добавить доступ к порту 9080 для 3.17.28.7 на постоянку, порт внутренний - не пропущен во внешку
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="3.17.28.7" port port=9080 protocol=tcp accept' --permanent
# Также можно задавать правила в стиле iptables. Для этого используется параметр --direct. Также для запоминания правила используем --permanent
# Вывести все пользовательские цепочки (chains) и правила (rules), добавленные в firewalld
firewall-cmd --direct --get-all-chains
firewall-cmd --direct --get-all-rules
Прямая проброска портов (direct)
Позволяет хосту внутри (например, VM внутри локальной сети, а хост с proxmox снаружи) получать реальный IP-адрес, а не локальный IP хоста.
# Пробросить прямой порт с 10250 на 10050 и 111 на 111 порт
# Проверяем, что forward включен
sysctl net.ipv4.ip_forward
# Если нет, включаем
sysctl -w net.ipv4.ip_forward=1
# Смотрим через какие интерфейсы ходят активные зоны в firewalld, есть ли masquerade (должно быть yes) и включен ли forwarding (должно быть yes)
firewall-cmd --get-active-zones
firewall-cmd --zone=public --query-masquerade
firewall-cmd --zone=public --query-forward
firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -d 195.201.108.88 -p tcp --dport 10250 -j DNAT --to-destination 192.168.1.30:10050
firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -d 195.201.108.88 -p tcp --dport 111 -j DNAT --to-destination 192.168.1.30:111
firewall-cmd --reload
\
# Смотрим правила прямого форвардинга портов одним и вторым способом в firewalld и в iptables
firewall-cmd --direct --get-all-rules
firewall-cmd --direct --get-rules ipv4 nat PREROUTING
iptables -t nat -L PREROUTING -n -v
# Смотрим обычные правила форвардинга портов
firewall-cmd --list-forward-ports
Смотрим через какой интерфейс ходим на внешнем хосте и на какой на 192.168.1.30
ip route | grep default
ip route get 192.168.1.30
На внешнем хосте смотрим трафик и есть ли подключения по порту 111
tcpdump -i any host 192.168.1.30 and port 111 -nn
На внутреннем хосте проверяем трафик на 111 порт
tcpdump -i any port 111 -nn
\
Надежный вариант, не требует даже релоада nginx - рубит намертво.
IPv4
firewall-cmd --permanent --new-ipset=netban --type=hash:net --option=maxelem=1000000 --option=family=inet --option=hashsize=4096
firewall-cmd --permanent --zone=drop --add-source=ipset:netban
firewall-cmd --reload
IPv6
firewall-cmd --permanent --new-ipset=netban6 --type=hash:net --option=maxelem=1000000 --option=family=inet6 --option=hashsize=4096
firewall-cmd --permanent --zone=drop --add-source=ipset:netban6
firewall-cmd --reload
Забанить
# Забанить (если подсеть в конце .0/24)
firewall-cmd --permanent --ipset=netban --add-entry=X.X.X.X/32 && firewall-cmd --reload
# Забанить список с файла (файл должен содержать отдельную запись в каждой строке, # и ; и также пустые строки – игнорируются, если смешанно блочится, то лучше прописывать типа 192.168.0.1/32 и 192.168.0.1)
firewall-cmd --permanent --ipset=netban --add-entries-from-file=filename && firewall-cmd --reload
# Бан по IPv6
firewall-cmd --permanent --ipset=netban6 --add-entry=2003:d6:a732:3a00:1ce0:7514:ae71:9f4d && firewall-cmd --reload
Разбанить
# Разбанить (если подсеть в конце .0/24)
firewall-cmd --permanent --ipset=netban --remove-entry=X.X.X.X/32 && firewall-cmd --reload
# Разбанить список с файла (файл должен содержать отдельную запись в каждой строке, # и ; и также пустые строки – игнорируются)
firewall-cmd --permanent --ipset=netban --remove-entries-from-file=filename && firewall-cmd --reload
# Разбанить по IPv6
firewall-cmd --permanent --ipset=netban6 --remove-entry=2003:d6:a732:3a00:1ce0:7514:ae71:9f4d && firewall-cmd --reload
Разбанить в БД (symfio)
# IP БД 5.35.240.78, 5.35.248.26
db.getCollection("sy3__cache_sonata__spam").deleteMany({"spam_ip" : "93.170.44.43"})
Просмотр бани
# ipv4 и ipv6
ipset list netban
ipset list netban6
\
❌ Проблема: Проблемы по совместимости с docker
Aug 01 20:26:03 sy-harbor firewalld[655]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -F DOCKER' failed: iptables: No chain/target/match by that name.
Aug 01 20:26:03 sy-harbor firewalld[655]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER' failed: iptables: No chain/target/match by that name.
Aug 01 20:26:03 sy-harbor firewalld[655]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -F DOCKER-ISOLATION-STAGE-1' failed: iptables: No chain/target/match by that name.
Aug 01 20:26:03 sy-harbor firewalld[655]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION-STAGE-1' failed: iptables: No chain/target/match by that name.
Aug 01 20:26:03 sy-harbor firewalld[655]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -F DOCKER-ISOLATION-STAGE-2' failed: iptables: No chain/target/match by that name.
Aug 01 20:26:03 sy-harbor firewalld[655]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION-STAGE-2' failed: iptables: No chain/target/match by that name.
Aug 01 20:26:03 sy-harbor firewalld[655]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -F DOCKER-ISOLATION' failed: iptables: No chain/target/match by that name.
Aug 01 20:26:03 sy-harbor firewalld[655]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION' failed: iptables: No chain/target/match by that name.
Aug 01 20:26:03 sy-harbor firewalld[655]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matching rule exist in that chain?).
Aug 01 20:26:04 sy-harbor firewalld[655]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matching rule exist in that chain?).
Решение: На данный момент нет полного решения. Ниже предлагаемое, но после перезагрузки будет все тоже самое
firewall-cmd --permanent --zone=trusted --change-interface=docker0
firewall-cmd --permanent --zone=docker --change-interface=docker0
❌ Проблема:
WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a future release. Please consider disabling it now.
Решение: Отключаем зону
nano /etc/firewalld/firewalld.conf
AllowZoneDrifting=no