firewall-cmd
26 Oct 2025 15:29Всі інтерпрайзні лайнакси зроблені для постійного нагадування що життя це є виживання найпристосованіших.
ОйБіЕмівські дістро мають агента-посередника поміж кернельним файрволом та істотою з клавіятурою. Без таких прокладок інтерпрайзний лайнакс немає сенсу: раціоналізація необхідності преміяльного саппорту тоді звужується до швидкості копіпасти. Додана вартість ув якості біспоукного софтware, яке повинно генерувати додаткове технічне обслуговування, необхідна як запас води ув пустелі.
Агента-посередник називається firewalld. Це є повільна як черепаха пáйфонівська аплікація, яка виконує команди "нумо відкрити порт нумеро 1488 на інтерхфесі enp13s77". З кернелом firewalld розмовляє за допомогою С бібліотеки libnftables, а з юзерлендом по протоколу dbus.
Якщо наївний користувач, чуждий духу інтєрпрайза, додасть свою chain чи rule командою nft, то firewalld на це відреагує ніяк--ув кернелі з'явиться гуляш з інструкцій від firewalld та користувача.
Що мене завжди неймовірно дратувало ув клайнтах до firewalld це їх відраза до показу номерів портів. Наприклад, активний "сервіс" (термінологія firewalld, нічого спільного з "сервісами" від systemd) з назвою samba контролює їх 2 штуки, але ані GUI клаент, ані жахлива, повільна як черепаха (се є пáйфон) ютіліта firewall-cmd, вам їх не покажуть. Where ignorance is bliss, 'tis folly to be wise.
Свій стейт firewalld зберігає ув /etc/firewalld/ (яка є чомусь 0750
root:root, що там такого секретного?), де мапінґа сервіс-порт є
відсутній.
З деяким дратування гортаючи man-сторінку firewall-cmd, можна знайти
опцію --info-service:
$ sudo firewall-cmd --info-service samba | grep /
  ports: 139/tcp 445/tcp
Для групи сервісів окремої зони це треба робити руками:
$ sudo firewall-cmd --zone=home --list-services |
     xargs -n1 sudo firewall-cmd --info-service |
     grep -ie ^[a-z] -e /
dhcp
  ports: 67/udp
dhcpv6-client
  ports: 546/udp
  destination: ipv6:fe80::/64
http
  ports: 80/tcp
…
Це займає секунди 3 якщо "сервісів" > 20 (можна прискорити через
xargs -P). Запити по dbus не є такими повільними per se навіть через
огидний пáйфон, повільна є ютіліта firewall-cmd.
Є також варіянт з dbus. Ви часто бачите скрипти які розмовляють з ґноумівською шиною? Я--ніколи. Можливо, нарід не знає що поттерінґівське busctl може друкувати результат ув json (додали недавно, 7 років тому), або просто цим гидують.
$ cat firewall-zone-ports
#!/usr/bin/env bash
set -e -o pipefail
zone="${1:?Usage: firewall-zone-ports zone}"
call_firewall='busctl -j call org.fedoraproject.FirewallD1'
$call_firewall \
       /org/fedoraproject/FirewallD1 \
       org.fedoraproject.FirewallD1.zone \
       getServices s "$zone" |
    jq -r .data[].[] |
    while read -r service; do
        interface=`$call_firewall \
            /org/fedoraproject/FirewallD1/config \
            org.fedoraproject.FirewallD1.config \
            getServiceByName s "$service" | jq -r '.data[]'`
        echo "$service"
        $call_firewall \
            "$interface" \
            org.fedoraproject.FirewallD1.config.service \
            getPorts | jq -r '[.data[][] | join("/")] | join(",")'
    done | xargs -r -n2 printf "%-30s %s\n"
Мілий ґлазу інтерпрайз org.fedoraproject.FirewallD1.config.service
справляється за 0.1 сек, але витрачати час на таку оптимізацію я не
раджу.