henry_flower: A melancholy wolf (Default)
henry_flower ([personal profile] henry_flower) wrote2025-10-26 03:29 pm

firewall-cmd

Всі інтерпрайзні лайнакси зроблені для постійного нагадування що життя це є виживання найпристосованіших.

ОйБіЕмівські дістро мають агента-посередника поміж кернельним файрволом та істотою з клавіятурою. Без таких прокладок інтерпрайзний лайнакс немає сенсу: раціоналізація необхідності преміяльного саппорту тоді звужується до швидкості копіпасти. Додана вартість ув якості біспоукного софт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 сек, але витрачати час на таку оптимізацію я не раджу.

kondybas: (Default)

[personal profile] kondybas 2025-10-26 07:45 pm (UTC)(link)
Вкотре переконуюся, що фрібсдишний IPFW - то взірець та еталон колупання в пакетах.
kondybas: (Default)

[personal profile] kondybas 2025-10-27 08:54 am (UTC)(link)
Ну, епл таки загорнув фрю у рожевий папар з бльостками, ще й попшикав на неї "Красною москвою", і продає, аж гай шумить. А ще соні.