Просто настраиваемый в простых случаях.
Штатный для RHEL, CentOS, openSUSE, REDOS...
https://www.dmosk.ru/miniinstruktions.php?mini=firewalld-centos
systemctl enable --now firewalld
systemctl stop firewalld # выключение firewalld
Для управления используется команда firewall-cmd, когда firewalld погашен, она не работает
firewall-offline-cmd # работает с "permanent"-конфигом при погашенном firewalld
Управление конфигурациями: их две: рабочая(work) и сохраняемая(permanent)
без ключа --permanent сразу изменяется действующий конфиг "work", но не все команды доступны
с ключем --permanent # работа с сохраняемым конфигом
firewall-cmd --reload # загрузить сохраненный конфиг (permanent >> work)
firewall-cmd --runtime-to-permanent # завиксировать текущую настройку (work >> permanent)
firewall-offline-cmd # работает с "permanent"-конфигом при погашенном firewalld
firewall-cmd --list-all # просмотреть конфиги: рабочий
firewall-cmd --list-all --permanent # и сохраненный
Логика разрешения/ограничения доступа при использовании зон
ZONA=(подцепленныe интерфейсы)+(открытыe порты)+(разрешенные source-IP)+(reach-rules)
Зона становится активной если в нее добавлен INTERFACE или SOURCE-IP
Добавление port/service/reach-rule зону НЕ активирует
firewall-cmd --get-active-zones
Доступ к входящему порту: (source-ip || interface ) && ( port || reach-rule )
source-ip проверяется РАНЬШЕ interface и передает разбор на source-ip-зону
узкие сетевые диапазоны проверяются РАНЬШЕ широких
ACCESS с ЛЮБЫХ ip на КОМПЛЕКТ портов
zona: добавить interface, добавить port
--permanent --add-interface=eth0 --add-port=777/udp --add-port=777-790/tcp
ACCESS с КОМПЛЕКТА ip на все порты
zona: НЕ добавлять интерфейс, добавить source-ip, --permanent --set-target=ACCEPT
--permanent --add-source=192.168.1.0/24 --set-target=ACCEPT
ACCESS с КОМПЛЕКТА ip на КОМПЛЕКТ портов
zona: НЕ добавлять интерфейс, добавить source-ip, добавить port
--permanent --zone nfs-zone --add-source=192.168.1.0/24 \
--add-service=nfs --add-service=rpc-bind --add-service=mountd
ACCESS|REJECT|DROP индивидуальный с разных ip на разные порты
zona: добавить интерфейс, НЕ добавлять port, добавить reach-rule
(source "address/netmask" + port|service ==> accept|reject|drop)
--permanent --zone buhgalt --add-interface=wlan0 \
--add-rich-rule 'rule family=ipv4 source ipset=hackers service name=ssh drop' \
--add-rich-rule 'rule family=ipv4 source address=10.8.1.0/24 port port=80 protocol=tcp accept'
ZONA=(подцепленныe интерфейсы)+(открытыe порты)+(разрешенные source-IP)+(reach-rules)
firewall-cmd --info-zone=public # конфиг зоны
firewall-cmd --list-all --zone=public # конфиг зоны
firewall-cmd --get-active-zones # зоны с интерфейсами
firewall-cmd --get-zones # список зон
# если не указано, к какой зоне применяется команда - то применяется к дефолтной
firewall-cmd --get-default-zone # изначально дефолтная зона == public
firewall-cmd --set-default-zone=internal
firewall-cmd --permanent --new-zone=region
firewall-cmd --zone=public --add-interface=ens34
firewall-cmd --zone=public --remove-interface=wlan0
firewall-cmd --zone=dmz --add-source=192.168.1.0/24
firewall-cmd --zone=trusted --add-source=ipset:IP-whitelist
firewall-cmd --permanent --zone=trusted --set-target=ACCEPT
firewall-cmd --permanent --zone=region --set-target=DROP
# дефолтное правило для зоны ACCEPT|DROP|REJECT|default=reject+accept-icmp
Открытие/закрытие портов и сервисов
firewall-cmd --list-all # просмотреть порты и сервисы: рабочий дефолтной зоны
firewall-cmd --list-all --zone public --permanent # просмотреть сохраненный конфиг зоны public
firewall-cmd --list-ports # открытые порты
firewall-cmd --list-services # открытые сервисы
firewall-cmd --get-services # все известные сервисы
firewall-cmd --info-service=nfs # подробности о сервисе
firewall-cmd --add-service=iscsi [--timeout=600s] # открыть сервис [на несколько секунд]
firewall-cmd --remove-service=rkn-service # закрыть сервис
firewall-cmd --add-port=777/udp --add-port=8200-8250/tcp # открыть порты
Управление входящими сервисами (требуется ключ --permanent)
### создать свой сервис и добавить в него порты и source-IP
firewall-cmd --permanent --new-service=rkn-service --set-short="Name RKN-SERVICE"
firewall-cmd --permanent --service=rkn-service --add-port=2200/tcp
firewall-cmd --info-service=name-service
Управление исходящими сервисами (требуется ключ --permanent)
Дефолтный сервис не уточняяет, входящи он или исходящий, что, конечно,
свинство. Желательно делать два разных сервиса для входящих и исходящих с
одним и тем же портом.
firewall-cmd --permanent --new-service=rkn-out --set-short="Исходящий RKN-SERVICE"
firewall-cmd --permanent --service=rkn-out --add-port=2233/tcp
firewall-cmd --permanent --service=rkn-out --set-destination=ipv4:192.168.1.0/24 # один
Открывать такой сервис надо в отдельной policy (с egress-zone) т.к. в public исходящий разрешен.
Ограничение доступа по IP (белые и черные списки)
firewall-cmd --add-source=192.168.1.0/24 --permanent --zone web # добавить в белый список зоны
firewall-cmd --remove-source=192.168.1.0/24 --permanent --zone web # удалить из белого списка зоны
# ограничить доступ по IP
firewall-cmd --add-rich-rule='rule family="ipv4" source address="X.X.X.X/Y" reject'
firewall-cmd --add-rich-rule='rule source ipset=blacklist drop' # блэклист зоны из ipset
# ограничить доступ к порту/сервису по IP
--add-rich-rule 'rule family=ipv4 source address=10.9.8.0/24 service name=ssh reject'
--add-rich-rule 'rule family=ipv4 source address=15.1.1.9/32 port port=22 protocol=tcp accept'
firewall-cmd --get-ipset-types
hash:ip hash:ip,mark hash:ip,port hash:ip,port,ip hash:ip,port,net hash:mac
hash:net hash:net,iface hash:net,net hash:net,port hash:net,port,net
firewall-cmd --get-ipsets
firewall-cmd --permanent --new-ipset=IPSETNAME --type=hash:net
firewall-cmd --ipset=IPSETNAME --set-description="IPSet Description" --set-short="Description"
firewall-cmd --delete-ipset=IPSETNAME
firewall-cmd --info-ipset=IPSETNAME
firewall-cmd --ipset=IPSETNAME --add-entry=192.168.1.0/24 --add-entry=10.10.1.12
firewall-cmd --ipset=IPSETNAME --add-entries-from-file=/path/to/file.list # по одному в строке
firewall-cmd --ipset=IPSETNAME --get-entries > /path/to/file.list # сохранить ipset в файле
firewall-cmd --add-rich-rule='rule source ipset=IPSETNAME drop' # блэклист дефолтной зоны
firewall-cmd --ipset=ipset --get-entries
firewall-cmd --ipset=ipset --add-entry=entry
firewall-cmd --ipset=ipset --remove-entry=entry
firewall-cmd --ipset=ipset --query-entry=entry # истина если входит в ipset
# Redirect blacklist to drop-zone
# firewall-cmd --permanent --new-zone=drop --set-target=DROP # уже есть
firewall-cmd --permanent --new-ipset=blacklist --type=hash:net
firewall-cmd --permanent --zone=drop --add-source=ipset:blacklist
############## ~/bin/ban_ip
#!/bin/sh
firewall-cmd --ipset=blacklist --add-entry=$1 --permanent
firewall-cmd --ipset=blacklist --add-entry=$1
Режим --direct - использование iptables
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens32 -o ens33 -j ACCEPT
firewall-cmd --permanent --zone=dmz --add-masquerade
Проброс порта 25/tcp -> 192.168.0.15:8025
--zone=external --permanent --add-forward-port=port=25:proto=tcp:toport=825:toaddr=10.1.0.9
Зоны контролируют ТОЛЬКО входящий трафик. Исходящий трафик контролируется POLICY
POLICY = ingress-zone + egress-zone + ports/services + target=accept/drop/reject
ingress/egress зон может быть несколько в т.ч. HOST, ANY
firewall-cmd --get-policies
firewall-cmd --list-all-policies
firewall-cmd --info-policy=policy
--permanent --new-policy=policy
--permanent --new-policy-from-file=filename [--name=policy]
--permanent --delete-policy=policy
--permanent --policy=policy --set-target=target
policies target: CONTINUE, ACCEPT, DROP, REJECT
--policy=policy --add-service=service [--timeout=24h]
# firewall-cmd --permanent --new-policy clientConntrack
# firewall-cmd --permanent --policy clientConntrack --add-ingress-zone HOST
# firewall-cmd --permanent --policy clientConntrack --add-egress-zone ANY
# firewall-cmd --permanent --policy clientConntrack --add-service tftp
--policy=policy --add-source-port=portid[-portid]/protocol
--permanent --policy=policy --get-priority
--permanent --policy=policy --set-priority=priority
[-32768..32767] -1 is the default
If < 0, then policy's rules execute before rules in zones
If > 0, then policy's rules execute after rules in zones
[--permanent] --policy=policy --list-ingress-zones
[--permanent] --policy=policy --add-ingress-zone=zone
pseudo-zones: HOST, ANY.
[--permanent] --policy=policy --remove-ingress-zone=zone
Заблокировать любой ИСХОДЯЩИЙ трафик в конкретный ipset через policy
firewall-cmd --permanent --new-ipset=somezone_ipset --ipset-type=hash:net
firewall-cmd --permanent --ipset=somezone_ipset --add-entry=X.Y.X.Z/N
firewall-cmd --permanent --new-zone=somezone
firewall-cmd --permanent --zone=somezone --add-source=ipset:somezone_ipset
# политика для трафика host >> список-ip
firewall-cmd --permanent --new-policy=ZAPRET
firewall-cmd --permanent --policy=ZAPRET --add-ingress-zone=HOST
firewall-cmd --permanent --policy=ZAPRET --add-egress-zone=somezone
firewall-cmd --permanent --policy=ZAPRET --set-priority=-2
firewall-cmd --permanent --policy=ZAPRET --set-target=DROP # наружу никуда нельзя
firewall-cmd --permanent --add-service=ssh --policy=ZAPRET # но по ssh можно
firewall-cmd --reload
Заблокировать ИСХОДЯЩИЙ трафик через policy, открыть лишь конкретные порты
# политика для трафика host >> список-ip
firewall-cmd --permanent --new-policy=OUT
firewall-cmd --permanent --policy=OUT --set-target=REJECT
firewall-cmd --permanent --policy=OUT --add-ingress-zone=HOST
firewall-cmd --permanent --policy=OUT --add-egress-zone=ANY
firewall-cmd --permanent --new-service=ssh-out
firewall-cmd --permanent --service=ssh-out --add-port=22/tcp
firewall-cmd --permanent --service=ssh-out --set-destination=ipv4:192.168.1.0/24
vi `firewall-cmd --permanent --path-service=ssh-out` # ручное редактирование
firewall-cmd --permanent --info-service=ssh-out
firewall-cmd --permanent --add-service=ssh-out --policy=OUT
firewall-cmd --reload
Популярность: 9, Last-modified: Mon, 22 Dec 2025 20:26:11 GmT