<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>iptables &amp;mdash; Cyberdyne Systems</title>
    <link>https://noblogo.org/aytin/tag:iptables</link>
    <description>&#34;Fare o non fare. Non c&#39;è provare!&#34;</description>
    <pubDate>Mon, 03 Aug 2026 11:33:55 +0000</pubDate>
    <item>
      <title>Sveliamo i misteri di Firewalld (Parte 2 di 2)</title>
      <link>https://noblogo.org/aytin/sveliamo-i-misteri-di-firewalld-parte-2-di-2</link>
      <description>&lt;![CDATA[tux-firewalld&#xA;---&#xA;N.B. Sono stato costretto a spezzare l&#39;articolo perché, quello originale di 8836 parole (per un totale di 76309 bytes effettivi), veniva troncato dopo il salvataggio a 7533 parole (65.356 bytes), cosa che mi fa sospettare che la grandezza del body non possa superare i 64k.&#xA;---&#xA;Nel capitolo precedente (Sveliamo i misteri di firewalld (Parte 1 di 2), abbiamo esaminato abbastanza nel dettaglio la cli di firewalld (firewall-cmd) con un focus particolare sul suo man, fatto molto bene.&#xA;&#xA;Nel seguito ci concentreremo soprattutto su casi d&#39;uso per vedere firewalld in azione, analizzando alcuni possibili cortocircuiti logici e approfondendo  quanto già enunciato nei capitoli 1, 2, 4 della parte 1.&#xA;!--more--&#xA;&#xA;5. Esempi&#xA;   5.1. Caso 1: host con una sola interfaccia&#xA;      5.1.2. Esposizione di servizi custom con restrizioni&#xA;      5.1.3. Esposizione con port forwarding statico&#xA;   5.2. Caso 2: Configurazione di un fw personale su un host con 3 interfacce&#xA;   5.3. Caso 3: Router Firewall-Gateway&#xA;   5.4. Trappole nascoste&#xA;      5.4.1. Caso 1. Restrizioni con solo \-\-add-source&#xA;      5.4.2. Caso 2: Combinazione di \-\-add-source e \-\-add-interface&#xA;      5.4.3. Remediation per la zone &#34;hijacking&#34;&#xA;6. Tips&#xA;&#x9;6.1. Le azioni di firewall-cmd&#xA;&#x9;6.2. Comandi utili&#xA;&#x9;6.3. Considerazioni di contorno&#xA;&#xA;5. Esempi&#xA;Nel configurare firewalld, da utente, la difficoltà più grande per me consiste nel sapersi districare in mezzo alla ragnatela di zone, policy, servizi, nat, rich-rules ecc.&#xA;&#xA;Come dicevo in precedenza per un firewall personale, bastano le zone con la dichiarazione dei servizi, così da filtrare il traffico in ingresso e finisce il gioco.&#xA;&#xA;Quando invece lo scenario si complica, è necessario capire bene come funzioni il routing dei pacchetti fatto da firewalld e qual sia l&#39;ordine di valutazione che firewalld fa dei vari oggetti che poi si traduce nell&#39;accettazione o nel rifiuto del pacchetto.&#xA;&#xA;Provo a tracciare una scaletta che però è frutto di esperienza nell&#39;uso, di sperimentazione  personale, nulla di ufficiale.&#xA;&#xA;Fase 1: Associazione alle Zone&#xA;firewalld per prima cosa deve capire quali siano le zone interessate controllando l&#39;ip sorgente del pacchetto.&#xA;&#xA;Se c&#39;è una sorgente associata esplicitamente ad una zona, il pacchetto viene assegnato a quella zona.&#xA;Se non c&#39;è alcuna sorgente, si controlla l&#39;interfaccia fisica da cui è entrato il pacchetto e si assegna alla zona che trusta quell&#39;interfaccia.&#xA;Se non c&#39;è nessuna zona associata all&#39;interfaccia, il pacchetto finisce alla zona impostata come default&#xA;&#xA;Fase 2: Selezione del contesto (zone vs policy)&#xA;Una volta identificate la zona di ingresso (e l&#39;eventuale zona di uscita se il traffico è in transito/forwarding), firewalld decide quale &#34;contenitore di regole&#34; applicare:&#xA;&#xA;Le policy vengono valutate prima delle singole regole delle zone.&#xA;In base alle zone associate, firewalld verifica se esiste una Policy che le unisce e applica i filtri presenti nella policy&#xA;Se non ci sono policy object applicabili a quel flusso, il pacchetto viene processato direttamente all&#39;interno della singola zona identificata nella Fase 1. Questo vuol dire che se ci sono filtri nella zona e c&#39;è una policy del tipo zone-to-host, i filtri della policy vincono.&#xA;&#xA;Fase 3: Valutazione delle regole interne (servizi, porte e NAT)&#xA;Ora che abbiamo il contesto, è importante capire in che ordine firewalld applica i filtri.&#xA;&#xA;come prima cosa si valutano le rich-rules con priorità negativa;&#xA;in seguito si prende in esame il dnat in modo che i filtri successivi lavorino sull&#39;indirizzo e sulla porta di destinazione corretti;&#xA;successivamente si valutano i servizi e le porte standard, quelli aggiunti con --add-service e --add-port per capirci&#xA;dopo i servizi, vengono valutate le rich-rule tradizionali, quelle con priorità 0&#xA;come ultimo passo, se c&#39;è, viene preso in carico il SNAT Masquerade&#xA;&#xA;Fase 4: Il target di default&#xA;Se un pacchetto è arrivato fino a questo punto significa che non ha trovato nessuna regola esplicita (nessun servizio o porta lo ha accettato o rifiutato prima) e viene applicato il target della zona (DROP/REJECT/ACCEPT/default) o della policy (DROP/REJECT/ACCEPT/CONTINUE)&#xA;&#xA;La fase 3 è quella critica, quella che emette il verdetto di accettazione o rifiuto. E qui bisogna fare attenzione.&#xA;&#xA;Le azioni di manipolazione dei pacchetti come il NAT non corrispondono ad un verdetto, che avviene invece:&#xA;&#xA;nei servizi (--add-service o --add-port): accettazione (o rifiuto) implicita&#xA;nelle rich-rule se uno dei target viene esplicitato&#xA;&#xA;Quindi, ad es. se nella zona o nella policy, c&#39;è un add-service che accetta un determinato servizio e di seguito una rich rule che invece lo nega, add-service ha priorità e un pacchetto che richieda quel servizio verrebbe accettato e non scartato. Come pure, in una zona/policy default drop, se fosse presente un masquerade o un dnat senza alcuna accettazione esplicite, il pacchetto verrebbe rifiutato dalle politiche della zona/policy.&#xA;&#xA;Alla luce di questa nuova consapevolezza, proverò a mostrare  come risolvere alcuni tipici casi d&#39;uso, partendo dalla configurazione di un semplice firewall personale che protegge l&#39;esposizione di servizi standard, per proseguire in maniera incrementale arricchendo di volta in volta la configurazione iniziale.&#xA;5.1. Caso 1: host con una sola interfaccia&#xA;È il caso classico di un personal firewall.&#xA;&#xA;Nel primo blocco di esempi mostrerò anche le configurazioni di un approccio full-policy. &#xA;&#xA;Non ci sono vantaggi evidenti perché si tratta di casi semplici però concentrare la logica nelle policy piuttosto che nelle zone permette per es. di bloccare tutto il traffico in una zona default drop semplicemente disabilitando la policy.&#xA;&#xA;Oppure posso usare la stessa logica di filtraggio su altre zone senza doverle replicare ma solo aggiungendo egress-zone e ingress-zone opportue. &#xA;5.1.1. Esposizione semplice&#xA;Ipotizziamo quindi di avere un host con una sola interfaccia e di voler configurare il firewall per filtrare i servizi ssh (22/tcp) e http(s) (80,443/tcp) che questo host espone su una lan.&#xA;&#xA;Versione zone-oriented:&#xA;creazione zona, binding su eth0, policy di default DROP (l&#39;host non sarà nemmeno &#34;pingabile&#34;)&#xA;firewall-cmd --permanent --new-zone=server-lan&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --set-target=DROP&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-interface=eth0&#xA;&#xA;abilitazione servizi ssh, http(s)&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-service=ssh&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-service=http&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-service=https&#xA;Come si può vedere, la configurazione è pulita, lineare ed è veramente &#34;parlante&#34;.&#xA;Chiunque bussi all&#39;interfaccia eth0, accede ai servizi esposti dall&#39;host.&#xA;&#xA;Versione policy-oriented:&#xA;creazione zona, binding su eth0, policy di default DROP (l&#39;host non sarà nemmeno &#34;pingabile&#34;)&#xA;firewall-cmd --permanent --new-zone=&#34;server-lan&#34;&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --set-target=DROP&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-interface=eth0&#xA;&#xA;creazione policy&#xA;firewall-cmd --permanent --new-policy=&#34;lan-to-host&#34;&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-ingress-zone=&#34;server-lan&#34;&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-egress-zone=HOST&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --set-target=REJECT&#xA;&#xA;binding dei servizi ssh, http(s)&#xA;firewall-cmd --permanent --policy=lan-to-host --add-service=ssh&#xA;firewall-cmd --permanent --policy=lan-to-host --add-service=http&#xA;firewall-cmd --permanent --policy=lan-to-host --add-service=https&#xA;Non cambia quasi nulla se non il fatto che il filtering ora avviene attraverso la policy mentre la zona contiene solo il trust delle sorgenti.&#xA;5.1.2. Esposizione di servizi custom con restrizioni&#xA;L&#39;host stavolta esporrà i servizi su porte custom con questi vincoli:&#xA;&#xA;chiunque bussi a eth0 avrà accesso web&#xA;mentre ssh sarà ristretto al solo ip 192.168.10.21&#xA;&#xA;Versione zone-oriented:&#xA;creazione zona, binding su eth0, policy di default DROP (l&#39;host non sarà nemmeno &#34;pingabile&#34;)&#xA;firewall-cmd --permanent --new-zone=server-lan&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --set-target=DROP&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-interface=eth0&#xA;&#xA;creazione servizio &#34;webcustom&#34;&#xA;firewall-cmd --permanent --new-service=&#34;webcustom&#34;&#xA;firewall-cmd --permanent --service=&#34;webcustom&#34; --set-description=&#34;My HTTP(S) service&#34;&#xA;firewall-cmd --permanent --service=&#34;webcustom&#34; --add-port=8080/tcp --add-port=8443/tcp&#xA;&#xA;creazione servizio &#34;sshcustom&#34;&#xA;firewall-cmd --permanent --new-service=&#34;sshcustom&#34;&#xA;firewall-cmd --permanent --service=&#34;sshcustom&#34; --set-description=&#34;My SSH service&#34;&#xA;firewall-cmd --permanent --service=&#34;sshcustom&#34; --add-port=2222/tcp&#xA;&#xA;chiunque bussi a eth0 sulle porte 8080 e 8443, verrà accettato &#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-service=webcustom&#xA;&#xA;sshcustom invece è ristretto con una rich-rule al solo ip 192.168.10.21&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source address=&#34;192.168.10.21&#34; service name=&#34;sshcustom&#34; accept&#39;&#xA;Versione policy-oriented:&#xA;creazione zona, binding su eth0, policy di default DROP (l&#39;host non sarà nemmeno &#34;pingabile&#34;)&#xA;firewall-cmd --permanent --new-zone=&#34;server-lan&#34;&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --set-target=DROP&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-interface=eth0&#xA;&#xA;creazione servizio &#34;webcustom&#34;&#xA;firewall-cmd --permanent --new-service=&#34;webcustom&#34;&#xA;firewall-cmd --permanent --service=&#34;webcustom&#34; --set-description=&#34;My HTTP(S) service&#34;&#xA;firewall-cmd --permanent --service=&#34;webcustom&#34; --add-port=8080/tcp --add-port=8443/tcp&#xA;&#xA;creazione servizio &#34;sshcustom&#34;&#xA;firewall-cmd --permanent --new-service=&#34;sshcustom&#34;&#xA;firewall-cmd --permanent --service=&#34;sshcustom&#34; --set-description=&#34;My SSH service&#34;&#xA;firewall-cmd --permanent --service=&#34;sshcustom&#34; --add-port=2222/tcp&#xA;&#xA;creazione policy&#xA;firewall-cmd --permanent --new-policy=&#34;lan-to-host&#34;&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-ingress-zone=&#34;server-lan&#34;&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-egress-zone=HOST&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --set-target=REJECT&#xA;&#xA;binding webcustom su tutta eth0&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-service=webcustom&#xA;&#xA;sshcustom invece è ristretto con una rich-rule al solo ip 192.168.10.21&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source address=&#34;192.168.10.21&#34; service name=&#34;sshcustom&#34; accept&#39;&#xA;5.1.3. Esposizione con port forwarding statico&#xA;Facciamo il caso che i servizi ssh e web siano in ascolto sull&#39;interfaccia di loopback.&#xA;Vogliamo comunque esporli attraverso un port redirect facendo in modo che:&#xA;&#xA;HOST:22   → localhost:2222&#xA;HOST:8080 → localhost:8080&#xA;HOST:8443 → localhost:8443&#xA;&#xA;In più vogliamo restringere l&#39;accesso ssh a 3 soli ip: 192.168.10.20, 192.168.10.21, 192.168.10.22 e vogliamo bloccare tutto il traffico ICMP ad eccezione di echo-request.&#xA;&#xA;Versione zone-oriented:&#xA;creazione zona, binding su eth0, policy di default DROP&#xA;firewall-cmd --permanent --new-zone=&#34;server-lan&#34;&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --set-target=DROP&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-interface=eth0&#xA;&#xA;icmp solo request&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-icmp-block-inversion&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-icmp-block=echo-request&#xA;&#xA;ipset per ssh&#xA;firewall-cmd --permanent --new-ipset=&#34;ssh-allowed&#34; --type=hash:ip&#xA;firewall-cmd --permanent --ipset=&#34;ssh-allowed&#34; --add-entry=&#34;192.168.10.20&#34; &#xA;firewall-cmd --permanent --ipset=&#34;ssh-allowed&#34; --add-entry=&#34;192.168.10.21&#34; &#xA;firewall-cmd --permanent --ipset=&#34;ssh-allowed&#34; --add-entry=&#34;192.168.10.22&#34;&#xA;&#xA;Esposizione dei servizi&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-service=&#34;http&#34;&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-service=&#34;https&#34;&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-service=&#34;ssh&#34;&#xA;&#xA;Per il local forward è necessario abilitare il routing verso loopback&#xA;sysctl -w net.ipv4.conf.eth0.routelocalnet=1&#xA;&#xA;local forward 80 → 8080, 443 → 8443&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-forward-port=port=80:proto=tcp:to-port=8080:to-addr=127.0.0.1&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-forward-port=port=443:proto=tcp:to-port=8443:to-addr=127.0.0.1&#xA;&#xA;rich-rule per l&#39;accesso filtrato ssh con local forward 22 → 2222&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source ipset=&#34;ssh-allowed&#34; forward-port port=&#34;22&#34; protocol=&#34;tcp&#34; to-port=&#34;2222&#34; to-addr=&#34;127.0.0.1&#34;&#39;&#xA;Anche qui la configurazione rimane molto pulita e lineare.&#xA;&#xA;Versione policy-oriented:&#xA;creazione zona, binding su eth0, policy di default DROP&#xA;firewall-cmd --permanent --new-zone=&#34;server-lan&#34;&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --set-target=DROP&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-interface=eth0&#xA;&#xA;icmp solo request&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-icmp-block-inversion&#xA;firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-icmp-block=echo-request&#xA;&#xA;ipset per ssh&#xA;firewall-cmd --permanent --new-ipset=&#34;ssh-allowed&#34; --type=hash:ip&#xA;firewall-cmd --permanent --ipset=&#34;ssh-allowed&#34; --add-entry=&#34;192.168.10.20&#34;&#xA;firewall-cmd --permanent --ipset=&#34;ssh-allowed&#34; --add-entry=&#34;192.168.10.21&#34;&#xA;firewall-cmd --permanent --ipset=&#34;ssh-allowed&#34; --add-entry=&#34;192.168.10.22&#34;&#xA;&#xA;firewall-cmd --permanent --new-policy=&#34;lan-to-host&#34;&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-ingress-zone=&#34;server-lan&#34;&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-egress-zone=HOST&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --set-target=REJECTED&#xA;&#xA;Esposizione dei servizi&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-service=&#34;http&#34;&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-service=&#34;https&#34;&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-service=&#34;ssh&#34;&#xA;&#xA;Per il local forward è necessario abilitare il routing verso loopback&#xA;sysctl -w net.ipv4.conf.eth0.routelocalnet=1&#xA;&#xA;local forward 80 → 8080, 443 → 8443&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-forward-port=port=80:proto=tcp:to-port=8080:to-addr=127.0.0.1&#xA;firewall-cmd --permanent--policy=&#34;lan-to-host&#34; --add-forward-port=port=443:proto=tcp:to-port=8443:to-addr=127.0.0.1&#xA;&#xA;rich-rule per l&#39;accesso filtrato ssh con local forward 22 → 2222&#xA;firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source ipset=&#34;ssh-allowed&#34; forward-port port=&#34;22&#34; protocol=&#34;tcp&#34; to-port=&#34;2222&#34; to-addr=&#34;127.0.0.1&#34;&#39;&#xA;N.B. In realtà, casi di questo genere che non rientrano nella casistica più ampia del routing e del dnat che giustificherebbero l&#39;uso di regole firewall, si risolverebbero più elegantemente con un reverse proxy (posto che i servizi siano reverse-proxabili), agire quindi a livello applicativo (L7) invece che a livello di indirizzamento e trasporto (L3 e L4 rispettivamente.)&#xA;&#xA;Infine, ciliegina sulla torta, vogliamo che sia filtrato anche il traffico in uscita consentendo solo il traffico web  per gli aggiornamenti di sistema (80,443/tcp) e quello dns (53/udp)&#xA;&#xA;Sarà necessario un policy object per il flusso in uscita, sia nella versione zone-oriented che in quella policy-oriented&#xA;creazione policy object, default policy REJECT&#xA;firewall-cmd --permanent --new-policy=host-to-any&#xA;firewall-cmd --permanent --policy=host-to-any --set-target=REJECT&#xA;&#xA;definizione della direzione del traffico: HOST → dmz (eth0)&#xA;firewall-cmd --permanent --policy=&#34;host-to-any&#34; --add-ingress-zone=HOST&#xA;firewall-cmd --permanent --policy=&#34;host-to-any&#34; --add-egress-zone=myZone&#xA;&#xA;traffico consentito: http(s), dns&#xA;firewall-cmd --permanent --policy=&#34;host-to-any&#34; --add-service=http&#xA;firewall-cmd --permanent --policy=&#34;host-to-any&#34; --add-service=https&#xA;firewall-cmd --permanent --policy=&#34;host-to-any&#34; --add-service=dns&#xA;Per la configurazione di un firewall personale, esempi di questo tipo coprono il 95% dei casi ordinari, anche senza considerare il filtro del traffico in uscita.&#xA;5.2. Caso 2: Configurazione di un fw personale su un host con 3 interfacce&#xA;Proviamo a immaginare uno scenario leggermente più complesso, un host con 3 interfacce per segregare la rete in 3 flussi: management, ingresso, uscita. &#xA;&#xA;un&#39;interfaccia per la rete di management (eth0: 192.168.0.0/24)&#xA;un&#39;interfaccia per il traffico in ingresso, la rete per il provisioning o per i servizi che l&#39;host espone (eth1: 192.168.1.0/24)&#xA;un&#39;interfaccia per il data networking, la rete server-to server (eth2: 192.168.2.0/24)&#xA;&#xA;L&#39;host espone un servizio web, fa delle richieste ad un server mysql nel backend e consente di essere contattato via ssh per il management.&#xA;Dall&#39;interfaccia di backend invece l&#39;host non può essere contattato.&#xA;&#xA;Le policy invece riguarderanno la gestione del traffico in ingresso, dalle rispettive interfacce solo per ssh e web, e del traffico in uscita solo verso il backend mysql.&#xA;ip che possono accedere al management dell&#39;host&#xA;firewall-cmd --permanent --new-ipset=&#34;sshallowed&#34; --type=&#34;hash:net&#34;&#xA;firewall-cmd --permanent --ipset=&#34;sshallowed&#34; --add-entry=&#34;192.168.5.32/27&#34; --add-entry=&#34;192.168.6.32/27&#34;&#xA;&#xA;per aggregare http/https in un unico servizio&#xA;firewall-cmd --permanent --new-service=&#34;web&#34;&#xA;firewall-cmd --permanent --service=&#34;web&#34; --add-include=&#34;http&#34; --add-include=&#34;https&#34;&#xA;&#xA;zona di management&#xA;firewall-cmd --permanent --new-zone=&#34;mgmt&#34;&#xA;firewall-cmd --permanent --zone=&#34;mgmt&#34; --add-interface=eth0&#xA;firewall-cmd --permanent --zone=&#34;mgmt&#34; --set-target=DROP&#xA;&#xA;zona del servizio web&#xA;firewall-cmd --permanent --new-zone=&#34;webserver&#34;&#xA;firewall-cmd --permanent --zone=&#34;webserver&#34; --add-interface=eth1&#xA;firewall-cmd --permanent --zone=&#34;webserver&#34; --set-target=DROP&#xA;&#xA;zona del backend&#xA;firewall-cmd --permanent --new-zone=&#34;backend&#34;&#xA;firewall-cmd --permanent --zone=&#34;backend&#34; --add-interface=eth2&#xA;firewall-cmd --permanent --zone=&#34;backend&#34; --set-target=DROP&#xA;&#xA;policy per il traffico WEBSERVER → HOST (traffico IN ↑)&#xA;firewall-cmd --permanent --new-policy=&#34;any-to-webserver&#34;&#xA;firewall-cmd --permanent --policy=&#34;any-to-webserver&#34; --add-ingress-zone=webserver&#xA;firewall-cmd --permanent --policy=&#34;any-to-webserver&#34; --add-egress-zone=HOST&#xA;firewall-cmd --permanent --policy=&#34;any-to-webserver&#34; --set-target=DROP&#xA;firewall-cmd --permanent --policy=&#34;any-to-webserver&#34; --add-service=&#34;web&#34;&#xA;&#xA;policy per il traffico MGMT → HOST (traffico IN ↑)&#xA;firewall-cmd --permanent --new-policy=&#34;mgmt-host&#34;&#xA;firewall-cmd --permanent --policy=&#34;mgmt-host&#34; --add-ingress-zone=mgmt&#xA;firewall-cmd --permanent --policy=&#34;mgmt-host&#34; --add-egress-zone=HOST&#xA;firewall-cmd --permanent --policy=&#34;mgmt-host&#34; --set-target=DROP&#xA;firewall-cmd --permanent --policy=&#34;mgmt-host&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source ipset=&#34;sshallowed&#34; service name=&#34;ssh&#34; accept&#39;&#xA;&#xA;policy per il traffico HOST → backend (traffico OUT ↓)&#xA;firewall-cmd --permanent --new-policy=&#34;webserver-to-backend&#34;&#xA;firewall-cmd --permanent --policy=&#34;webserver-to-backend&#34; --add-ingress-zone=HOST&#xA;firewall-cmd --permanent --policy=&#34;webserver-to-backend&#34; --add-egress-zone=backend&#xA;firewall-cmd --permanent --policy=&#34;webserver-to-backend&#34; --set-target=DROP&#xA;firewall-cmd --permanent --policy=&#34;webserver-to-backend&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; service name=&#34;mysql&#34; accept&#39;&#xA;Il fatto che ci siano servizi con restrizioni sul sorgente, mi permetterà di porre l&#39;attenzione su una particolarità di firewalld poco evidente ma responsabile di errori talmente gravi da invalidare le nostre policy di sicurezza.&#xA;&#xA;In generale, i servizi con restrizioni si gestiscono SEMPRE con rich-rule per evitare spiacevoli effetti laterali.&#xA;&#xA;Le rich-rules danno la granularità necessaria in questi casi accettando solo il traffico indicato in zone default drop.&#xA;&#xA;Come negli esempi precedenti, alle definizioni di zona posso sostituire quelle di policy se voglio un approccio policy-oriented.&#xA;5.3. Caso 3: Router Firewall-Gateway&#xA;Ora facciamo l&#39;esempio del classico router-firewall domestico.&#xA;&#xA;L&#39;host avrà quattro interfacce per altrettante reti. Una wan, una rete guest, una dmz e un backend che ospita servizi.&#xA;&#xA;Condizioni&#xA;&#xA;In DMZ c&#39;è un reverse proxy, un server web e un client di file sharing (p2p).&#xA;Il Backend ospita un server mysql ad uso del server web, un servizio di file sharing solo per la rete di Backend (nfs).&#xA;La rete pubblica non accetta connessioni in ingresso, salvo che quelle destinate al reverse proxy e al client di file sharing via port forwarding.&#xA;Il reverseproxy media il contatto col server web che gira in localhost.&#xA;Il Backend è inaccessibile da qualunque rete. La DMZ può contattare il Backend esclusivamente per i transiti:&#xA;&#x9;server web → server mysql&#xA;&#x9;client p2p → server nfs&#xA;La rete guest ha accesso pieno a internet ma deve essere isolata sia da DMZ che da Backend. Anche i servizi esposti in DMZ possono essere contattati solo da rete pubblica.&#xA;&#xA;Piano di indirizzamento&#xA;&#xA;wan0: 151.22.44.88, è l&#39;indirizzo ip della zona pubblica&#xA;eth0: 192.168.1.1 (192.168.1.0/24), gateway per la DMZ&#xA;wlan0: 192.168.2.1 (192.168.2.0/24), gateway per il Backend&#xA;wlan1: 192.168.3.1 (192.168.3.0/24), gateway per il guest.&#xA;&#xA;Host in DMZ&#xA;&#xA;192.168.1.2: server reverse-proxy (port 8080,8443)  / web (localhost)&#xA;192.168.1.3:  client p2p (port 36119)&#xA;&#xA;Host in Backend&#xA;&#xA;192.168.2.2: server mysql (port 3306)&#xA;192.168.2.3: server nfs (port 2049)&#xA;&#xA;###########&#xA;Servizi &#xA;###########&#xA;firewall-cmd --permanent --new-service=&#34;web&#34;&#xA;firewall-cmd --permanent --service=&#34;web&#34; --add-include=&#34;http&#34; --add-include=&#34;https&#34;&#xA;&#xA;firewall-cmd --permanent --new-service=&#34;p2p&#34;&#xA;firewall-cmd --permanent --service=&#34;p2p&#34; --add-port=&#34;36119/tcp&#34; --add-port=&#34;36119/udp&#34;&#xA;&#xA;########&#xA;Zone &#xA;########&#xA;firewall-cmd --permanent --new-zone=&#34;pubblica&#34;&#xA;firewall-cmd --permanent --zone=&#34;pubblica&#34; --add-interface=&#34;wan0&#34;&#xA;firewall-cmd --permanent --zone=&#34;pubblica&#34; --set-target=DROP&#xA;&#xA;firewall-cmd --permanent --new-zone=&#34;dmz&#34;&#xA;firewall-cmd --permanent --zone=&#34;dmz&#34; --add-interface=&#34;eth0&#34;&#xA;firewall-cmd --permanent --zone=&#34;dmz&#34; --set-target=DROP&#xA;&#xA;firewall-cmd --permanent --new-zone=&#34;p2p&#34;&#xA;firewall-cmd --permanent --zone=&#34;p2p&#34; --add-interface=&#34;eth1&#34;&#xA;firewall-cmd --permanent --zone=&#34;p2p&#34; --set-target=DROP&#xA;&#xA;firewall-cmd --permanent --new-zone=&#34;backend&#34;&#xA;firewall-cmd --permanent --zone=&#34;backend&#34; --add-interface=&#34;wlan0&#34;&#xA;firewall-cmd --permanent --zone=&#34;backend&#34; --set-target=DROP&#xA;&#xA;firewall-cmd --permanent --new-zone=&#34;guest&#34;&#xA;firewall-cmd --permanent --zone=&#34;guest&#34; --add-interface=&#34;wlan1&#34;&#xA;firewall-cmd --permanent --zone=&#34;guest&#34; --set-target=DROP&#xA;&#xA;##########&#xA;Policy &#xA;##########&#xA;##############################&#xA;pubblica-dmz (wan0 → eth0) &#xA;##############################&#xA;Dalla rete pubblica arrivano le richieste da inoltrare sui&#xA;server interni (DMZ).&#xA;Definizione policy con default target DROP.&#xA;firewall-cmd --permanent --new-policy=&#34;pubblica-to-dmz&#34;&#xA;firewall-cmd --permanent --policy=&#34;pubblica-to-dmz&#34; --add-ingress-zone=&#34;pubblica&#34;&#xA;firewall-cmd --permanent --policy=&#34;pubblica-to-dmz&#34; --add-egress-zone=&#34;dmz&#34;&#xA;firewall-cmd --permanent --policy=&#34;pubblica-to-dmz&#34; --set-target=DROP&#xA;Inoltri consentiti verso il reverse proxy.&#xA;firewall-cmd --permanent --policy=&#34;pubblica-to-dmz&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; forward-port port=&#34;80&#34; protocol=&#34;tcp&#34; to-port=&#34;8080&#34; to-addr=&#34;192.168.1.2&#34; accept&#39;&#xA;firewall-cmd --permanent --policy=&#34;pubblica-to-dmz&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; forward-port port=&#34;443&#34; protocol=&#34;tcp&#34; to-port=&#34;8443&#34; to-addr=&#34;192.168.1.2&#34; accept&#39;&#xA;firewall-cmd --permanent --policy=&#34;pubblica-to-dmz&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; forward-port port=&#34;36119&#34; protocol=&#34;tcp&#34; to-port=&#34;36119&#34; to-addr=&#34;192.168.1.3&#34; accept&#39;&#xA;firewall-cmd --permanent --policy=&#34;pubblica-to-dmz&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; forward-port port=&#34;36119&#34; protocol=&#34;udp&#34; to-port=&#34;36119&#34; to-addr=&#34;192.168.1.3&#34; accept&#39;&#xA;&#xA;##############################&#xA;dmz-backend (eth0 → wlan0) &#xA;##############################&#xA;Solo il reverse proxy (DMZ) può contattare mysql e nfs (Backend).&#xA;Definizione policy con default target DROP.&#xA;firewall-cmd --permanent --new-policy=&#34;dmz-to-backend&#34;&#xA;firewall-cmd --permanent --policy=&#34;dmz-to-backend&#34; --add-ingress-zone=&#34;dmz&#34;&#xA;firewall-cmd --permanent --policy=&#34;dmz-to-backend&#34; --add-egress-zone=&#34;backend&#34;&#xA;firewall-cmd --permanent --policy=&#34;dmz-to-backend&#34; --set-target=DROP&#xA;Transito consentito solo per rp verso mysql e per p2p verso nfs.&#xA;firewall-cmd --permanent --policy=&#34;dmz-to-backend&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source address=&#34;192.168.1.2&#34; destination address=&#34;192.168.2.2&#34; service name=&#34;mysql&#34; accept&#39;&#xA;firewall-cmd --permanent --policy=&#34;dmz-to-backend&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source address=&#34;192.168.1.3&#34; destination address=&#34;192.168.2.3&#34; service name=&#34;p2p&#34; accept&#39;&#xA;&#xA;##############################&#xA;dmz-pubblica (eth0 → wan0) &#xA;##############################&#xA;Abilitazione del solo browsing agli host (nattati) in DMZ.&#xA;Abilitazione full all&#39;host p2p (nattato) in DMZ.&#xA;Definizione policy con default target DROP.&#xA;firewall-cmd --permanent --new-policy=&#34;dmz-to-pubblica&#34;&#xA;firewall-cmd --permanent --policy=&#34;dmz-to-pubblica&#34; --add-ingress-zone=&#34;dmz&#34;&#xA;firewall-cmd --permanent --policy=&#34;dmz-to-pubblica&#34; --add-egress-zone=&#34;pubblica&#34;&#xA;firewall-cmd --permanent --policy=&#34;dmz-to-pubblica&#34; --set-target=DROP&#xA;Servizi&#xA;firewall-cmd --permanent --policy=&#34;dmz-to-pubblica&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source address=&#34;192.168.1.2 service=&#34;web&#34; masquerade accept&#39;&#xA;firewall-cmd --permanent --policy=&#34;dmz-to-pubblica&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source address=&#34;192.168.1.3 masquerade accept&#39;&#xA;&#xA;##################################&#xA;backend-pubblica (eth0 → wan0) &#xA;##################################&#xA;Abilitazione del solo browsing degli host (nattati) in Backend.&#xA;Qualunque altra richiesta verrà droppata dalle policy di zona.&#xA;Definizione policy con default target DROP.&#xA;firewall-cmd --permanent --new-policy=&#34;backend-to-pubblica&#34;&#xA;firewall-cmd --permanent --policy=&#34;backend-to-pubblica&#34; --add-ingress-zone=&#34;backend&#34;&#xA;firewall-cmd --permanent --policy=&#34;backend-to-pubblica&#34; --add-egress-zone=&#34;pubblica&#34;&#xA;firewall-cmd --permanent --policy=&#34;backend-to-pubblica&#34; --set-target=DROP&#xA;servizi&#xA;firewall-cmd --permanent --policy=&#34;backend-to-pubblica&#34; --add-service=&#34;web&#34;&#xA;firewall-cmd --permanent --policy=&#34;backend-to-pubblica&#34; --add-service=&#34;dns&#34;&#xA;masquerade&#xA;firewall-cmd --permanent --policy=&#34;backend-to-pubblica&#34; --add-masquerade&#xA;&#xA;#################################&#xA;guest-pubblica (wlan1 → wan0) &#xA;#################################&#xA;I client, nattati, hanno pieno accesso alla rete pubblica.&#xA;Qualunque richiesta verso altre reti, verrà droppata&#xA;dalle policy di zona.&#xA;Definizione policy con default target ACCEPT.&#xA;firewall-cmd --permanent --new-policy=&#34;guest-to-pubblica&#34;&#xA;firewall-cmd --permanent --policy=&#34;guest-to-pubblica&#34; --add-ingress-zone=&#34;guest&#34;&#xA;firewall-cmd --permanent --policy=&#34;guest-to-pubblica&#34; --add-egress-zone=&#34;pubblica&#34;&#xA;firewall-cmd --permanent --policy=&#34;guest-to-pubblica&#34; --set-target=ACCEPT&#xA;masquerade&#xA;firewall-cmd --permanent --policy=&#34;guest-to-pubblica&#34; --add-masquerade&#xA;5.4. Trappole nascoste&#xA;Può capitare che definizioni di zone poco accorte aprano le maglie della gabbia che noi vorremmo cucire attorno all&#39;esposizione dei servizi.&#xA;&#xA;Vediamo un po&#39; di scenari per analizzare le conseguenza delle scelte di design.&#xA;&#xA;Per semplicità esaminerò il caso di un singolo host (192.168.1.2) che ospita un servizio web e un servizio mysql che vogliamo confinare con firewalld nel seguente modo:&#xA;&#xA;Il servizio web deve essere raggiungibile solo da 192.168.1.3&#xA;Il servizio mysql deve essere raggiungibile solo da 192.168.1.4&#xA;&#xA;5.4.1. Caso 1. Restrizioni con solo \-\-add-source&#xA;firewall-cmd --permanent --new-zone=zone1&#xA;firewall-cmd --permanent --zone=zone1 --set-target=REJECT&#xA;firewall-cmd --permanent --zone=zone1 --add-source=192.168.1.3&#xA;firewall-cmd --permanent --zone=zone1 --add-service=http&#xA;firewall-cmd --permanent --zone=zone1 --add-service=https&#xA;&#xA;firewall-cmd --permanent --new-zone=zone2&#xA;firewall-cmd --permanent --zone=zone2 --set-target=REJECT&#xA;firewall-cmd --permanent --zone=zone2 --add-source=192.168.1.4&#xA;firewall-cmd --permanent --zone=zone2 --add-service=mysql&#xA;&#xA;firewall-cmd --set-default-zone=zone2&#xA;Questo tipo di configurazione è soggetto a quello che viene chiamato &#34;zone hijacking&#34; che permette a ip non autorizzati di accedere a risorse a cui non dovrebbero avere accesso situate nella zona di default o di fallback.&#xA;&#xA;Nel caso specifico, un ip come 192.168.1.10, o qualunque altro a cui le policy di routing consentano di bussare lecitamente all&#39;interfaccia, chiede di accedere a mysql, avrà il via libera vanificando tutte le nostre politiche di confinamento.&#xA;&#xA;Vediamo perché succede questo.&#xA;&#xA;192.168.1.10 bussa alla porta 3306&#xA;Step 1: Verifica sorgenti&#xA;&#x9;192.168.1.10 corrisponde a zone1 (192.168.1.3)? NO.&#xA;&#x9;192.168.1.10 corrisponde a zone2 (192.168.1.4)? NO.&#xA;Step 2: Verifica interfacce&#xA;&#x9;Non ci sono interfacce associate&#xA;Il pacchetto viene consegnato alla zona di fallback, zone2, per l&#39;elaboraziona finale,  richiede lecitamente l&#39;accesso a mysql che viene autorizzato →  ❌ ERRORE!&#xA;&#xA;5.4.2. Caso 2: Combinazione di \-\-add-source e \-\-add-interface&#xA;Quando l&#39;ingresso alla zona viene mediato da una combinazione sorgenti e interfacce, non c&#39;è il rischio di zone hijacking ma può essere ugualmente insidioso se non si capisce bene che fine facciano i pacchetti.&#xA;&#xA;In generale basta ricordarsi sempre che la presenza di sorgenti e interfacce ha l&#39;obiettivo opposto della restrizione perché va ad estendere l&#39;insieme degli aventi diritto al servizio.&#xA;&#xA;Facciamo sempre conto che 192.168.1.10 provi a bussare sulla 3306.&#xA;firewall-cmd --permanent --new-zone=zone1&#xA;firewall-cmd --permanent --zone=zone1 --set-target=REJECT&#xA;firewall-cmd --permanent --zone=zone1 --add-source=192.168.1.3&#xA;firewall-cmd --permanent --zone=zone1 --add-service=http&#xA;firewall-cmd --permanent --zone=zone1 --add-service=https&#xA;&#xA;firewall-cmd --permanent --new-zone=zone2&#xA;firewall-cmd --permanent --zone=zone2 --set-target=REJECT&#xA;firewall-cmd --permanent --zone=zone2 --add-source=192.168.1.4&#xA;firewall-cmd --permanent --zone=zone2 --add-interface=eth0&#xA;firewall-cmd --permanent --zone=zone2 --add-service=mysql&#xA;&#xA;firewall-cmd --set-default-zone=zone2&#xA;Anche facendo finta di non accorgersi che l&#39;add-source della zona2 sia ridondante avendo la disponibilità dell&#39;intera interfaccia che lo contiene, l&#39;accesso in questo caso sarà consentito proprio perchè nello step2 della valutazione, la presenza dell&#39;interfaccia fa ricadere il pacchetto nella zona 2 (accesso consentito) → ⚠️ ATTENZIONE!&#xA;&#xA;Se invece spostassi il binding dell&#39;interfaccia nella zona1,&#xA;firewall-cmd --permanent --new-zone=zone1&#xA;firewall-cmd --permanent --zone=zone1 --set-target=REJECT&#xA;firewall-cmd --permanent --zone=zone2 --add-interface=eth0&#xA;firewall-cmd --permanent --zone=zone1 --add-source=192.168.1.3&#xA;firewall-cmd --permanent --zone=zone1 --add-service=http&#xA;firewall-cmd --permanent --zone=zone1 --add-service=https&#xA;&#xA;firewall-cmd --permanent --new-zone=zone2&#xA;firewall-cmd --permanent --zone=zone2 --set-target=REJECT&#xA;firewall-cmd --permanent --zone=zone2 --add-source=192.168.1.4&#xA;firewall-cmd --permanent --zone=zone2 --add-service=mysql&#xA;&#xA;firewall-cmd --set-default-zone=zone2&#xA;il binding dell&#39;interfaccia fa ricadere la richiesta nella zona1 che rifiuta l&#39;accesso → ⚠️ ATTENZIONE!&#xA;5.4.3. Remediation per la &#34;zone hijacking&#34;&#xA;L&#39;utilizzo delle sole sorgenti per restringere l&#39;accesso non è sufficiente perché ip che transitano sull&#39;host e non appartengano a nessuna sorgente di zona, possono richiedere lecitamente i servizi appartenenti alla zona di fallback&#xA;&#xA;Ci sono un paio di modi per evitare questo tranello.&#xA;&#xA;Uno consiste nell&#39;usare le rich-rules come abbiamo fatto nella gestione delle zone di management e di backend del punto 5.2. Caso 2: Configurazione di un fw personale su un host con 3 interfacce. Accesso pieno alle sole interfacce e i sorgenti nelle rich-rules sono le white-list che consentono puntualmente chi può accedere a cosa.&#xA;&#xA;Un altro metodo consiste nell&#39;usare come zona di default, una zona senza alcun binding, con lo scopo di droppare tutto ciò che vi finisce dentro.&#xA;firewall-cmd --permanent --new-zone=default-drop&#xA;firewall-cmd --permanent --zone=default-drop --set-target=DROP&#xA;firewall-cmd --set-default-zone=default-drop&#xA;In questo modo la zona di default che riceverà il pacchetto sospeso non avrà alcun servizio associato a differenza di prima, ma dropperà tutto ciò che incontra.&#xA;6. Tips&#xA;6.1. Le azioni di firewall-cmd&#xA;Per districarsi rapidamente nella sintassi di firewall-cmd, mi viene comodo ricordare &#34;le azioni&#34; distintive principali in un&#39;ottica CRUD:&#xA;&#xA;--get / --info /  --list. recupera (legge) informazioni sulla configurazione&#xA;--new / --add, crea nuovi oggetti / elementi&#xA;--set, modifica gli elementi&#xA;--remove / --delete, rimuove gli elementi / oggetti&#xA;&#xA;E più precisamente:&#xA;&#xA;--get, restituisce un elenco di oggetti complessi a livello di sistema (ad es. icmptypes, servizi, zone o policy) o il valore di un suo campo ;&#xA;--set, imposta il valore di un campo;&#xA;--info, restituisce il recordset di un determinato oggetto complesso come un servizio, una policy, una zona, un ipset;&#xA;--list, come --info ma più articolato; &#xA;--new, crea nuovi oggetti complessi;&#xA;--add, aggiunge un elemento ad un oggetto complesso;&#xA;--remove, rimuove elementi da un oggetto complesso ad es. un servizio da una zona/policy, una entry da un servizio, una rule da una zona/policy ecc.&#xA;--delete, rimuove un oggetto complesso come una zona, una policy, un ipset, un servizio ecc.&#xA;&#xA;6.2. Comandi utili&#xA;Di seguito. un sottinsieme di comandi già visti, utili per catturare velocemente informazioni sulla configurazione del firewall.&#xA;&#xA;Elenco di tutti gli ipset:&#xA;firewall-cmd --permanent --get-ipsets&#xA;Elenco di tutti i tipi di ipset:&#xA;firewall-cmd --get-ipset-types&#xA;Elenco di tutti tipi di icmp:&#xA;firewall-cmd --get-icmptypes&#xA;Elenco di tutti i servizi:&#xA;firewall-cmd --get-services&#xA;Individuare la zona dall&#39;interfaccia:&#xA;firewall-cmd --permanent --get-zone-of-interface=&#34;nome interfaccia&#34;&#xA;Individuare la zona dal sorgente:&#xA;firewall-cmd --permanent --get-zone-of-source=ip | MAC | ipset:&#34;nomeipset&#34;&#xA;Zona di default:&#xA;firewall-cmd --get-default-zone&#xA;Zone attive:&#xA;firewall-cmd --get-active-zones&#xA;Elenco di tutte le zone/policies:&#xA;firewall-cmd --get-zones&#xA;firewall-cmd --get-policies&#xA;Dettaglio delle configurazione di tutte le zone/policy:&#xA;firewall-cmd --list-all-zone&#xA;firewall-cmd --list-all-policies&#xA;Dettaglio della configurazione di una zona/policy:&#xA;firewall-cmd --permanent --info-zone=&#34;nomezona&#34;&#xA;firewall-cmd --permanent --info-policy=&#34;nomepolicy&#34;&#xA;Elenco di tutti i servizi di una zona/policy:&#xA;firewall-cmd --zone=&#34;nomezona&#34; --list-services&#xA;firewall-cmd --policy=&#34;nomepolicy&#34; --list-services&#xA;Elenco di tutte le porte di una zona/policy:&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --list-ports&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --list-ports&#xA;Elenco di tutte le rich rules di una zona/policy:&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --list-rich-rules&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --list-rich-rules&#xA;Elenco di tutte le forward ports di una zona/policy:&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --list-forward-ports&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --list-forward-ports&#xA;Dettaglio della configurazione di un servizio:&#xA;firewall-cmd --permanent --info-service=&#34;nomeservizio&#34;&#xA;Elenco di tutte le porte di un servizio:&#xA;firewall-cmd --permanent --service=&#34;nomeservizio&#34; --get-ports&#xA;Dettaglio della configurazione di un ipset:&#xA;firewall-cmd --permanent --info-ipset=&#34;nomeipset&#34;&#xA;Elenco di tutte le entry di un ipset:&#xA;firewall-cmd --permanent --ipset=&#34;nomeipset&#34; --get-entries&#xA;6.3. Considerazioni di contorno&#xA;Concludendo, firewalld, in quanto frontend fedele di nftables, rappresenta il futuro del firewalling linux.&#xA;&#xA;Aspetti comuni:&#xA;&#xA;Configurare i servizi ove possibile è sempre da preferire rispetto a porte/protocolli sparati direttamente nella zona o nella policy.&#xA;Ricorrere alle rich-rules solo se si devono gestire flussi puntuali, altrimenti è sufficiente il bind dell&#39;interfaccia alla zona.&#xA;&#xA;Approccio conservativo:&#xA;Per configurazioni semplici, bastano zone e servizi.&#xA;&#xA;In presenza di più interfacce, obbligatorio anche il ricorso ai policy object, perché ci sarà da gestire di sicuro traffico interzona.&#xA;&#xA;Pro: curva d&#39;apprendimento morbida, ideale se la necessità è di essere operativi nel breve. Ideali per firewall personali e configurazioni semplici.&#xA;Contro: le configurazioni tendono ad irrigidirsi al crescere della complessità degli scenari e quindi a complicare le manutenzioni.&#xA;&#xA;Approccio spregiudicato:&#xA;Delegare alle zone solo il trust delle sorgenti e spostare la logica dei flussi interamente ai policy object.&#xA;&#xA;Pro: massima flessibilità, maggiore pulizia delle configurazioni. Ideale per scenari complessi.&#xA;Contro: curva d&#39;apprendimento più ripida, le configurazioni più semplici tendono ad apparire molto più verbose e di conseguenza meno chiare.&#xA;&#xA;#firewall #firewallcmd #firewalld #iptables #netfilter  #nftables #ufw]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/b5862bd14-4506fa/gBxZ8Bb3JsyX/aoPYucfwCvDfgYXOXGHOkG7aqrFBwjspQetNhz0S.jpg" alt="tux-firewalld"></p>

<hr>

<p><strong>N.B. Sono stato costretto a spezzare l&#39;articolo perché, quello originale di 8836 parole (per un totale di 76309 bytes effettivi), veniva troncato dopo il salvataggio a 7533 parole (65.356 bytes), cosa che mi fa sospettare che la grandezza del body non possa superare i 64k.</strong></p>

<hr>

<p>Nel capitolo precedente (<a href="/aytin/sveliamo-i-misteri-di-firewalld-parte-1-di-2/" rel="nofollow">Sveliamo i misteri di firewalld (Parte 1 di 2)</a>, abbiamo esaminato abbastanza nel dettaglio la cli di firewalld (<code>firewall-cmd</code>) con un focus particolare sul suo man, fatto molto bene.</p>

<p>Nel seguito ci concentreremo soprattutto su casi d&#39;uso per vedere firewalld in azione, analizzando alcuni possibili cortocircuiti logici e approfondendo  quanto già enunciato nei capitoli 1, 2, 4 della parte 1.
</p>
<ul><li><a href="#5-esempi" rel="nofollow">5. Esempi</a>
<ul><li><a href="#5-1-caso-1-host-con-una-sola-interfaccia" rel="nofollow">5.1. Caso 1: host con una sola interfaccia</a>
<ul><li><a href="#5-1-2-esposizione-di-servizi-custom-con-restrizioni" rel="nofollow">5.1.2. Esposizione di servizi custom con restrizioni</a></li>
<li><a href="#5-1-3-esposizione-con-port-forwarding-statico" rel="nofollow">5.1.3. Esposizione con port forwarding statico</a></li></ul></li>
<li><a href="#5-2-caso-2-configurazione-di-un-fw-personale-su-un-host-con-3-interfacce" rel="nofollow">5.2. Caso 2: Configurazione di un fw personale su un host con 3 interfacce</a></li>
<li><a href="#5-3-caso-3-router-firewall-gateway" rel="nofollow">5.3. Caso 3: Router Firewall-Gateway</a></li>
<li><a href="#5-4-trappole-nascoste" rel="nofollow">5.4. Trappole nascoste</a>
<ul><li><a href="#5-4-1-caso-1-restrizioni-con-solo-add-source" rel="nofollow">5.4.1. Caso 1. Restrizioni con solo --add-source</a></li>
<li><a href="#5-4-2-caso-2-combinazione-di-add-source-e-add-interface" rel="nofollow">5.4.2. Caso 2: Combinazione di --add-source e --add-interface</a></li>
<li><a href="#5-4-3-remediation-per-la-zone-hijacking" rel="nofollow">5.4.3. Remediation per la zone “hijacking”</a></li></ul></li></ul></li>
<li><a href="#6-tips" rel="nofollow">6. Tips</a>
<ul><li><a href="#6-1-le-azioni-di-firewall-cmd" rel="nofollow">6.1. Le azioni di firewall-cmd</a></li>
<li><a href="#6-2-comandi-utili" rel="nofollow">6.2. Comandi utili</a></li>
<li><a href="#6-3-considerazioni-di-contorno" rel="nofollow">6.3. Considerazioni di contorno</a></li></ul></li></ul>

<h2 id="5-esempi">5. Esempi</h2>

<p>Nel configurare firewalld, da utente, la difficoltà più grande per me consiste nel sapersi districare in mezzo alla ragnatela di zone, policy, servizi, nat, rich-rules ecc.</p>

<p>Come dicevo in precedenza per un firewall personale, bastano le zone con la dichiarazione dei servizi, così da filtrare il traffico in ingresso e finisce il gioco.</p>

<p>Quando invece lo scenario si complica, è necessario capire bene come funzioni il routing dei pacchetti fatto da firewalld e qual sia l&#39;ordine di valutazione che firewalld fa dei vari oggetti che poi si traduce nell&#39;accettazione o nel rifiuto del pacchetto.</p>

<p>Provo a tracciare una scaletta che però è frutto di esperienza nell&#39;uso, di sperimentazione  personale, nulla di ufficiale.</p>

<p><strong>Fase 1: Associazione alle Zone</strong>
firewalld per prima cosa deve capire quali siano le zone interessate controllando l&#39;ip sorgente del pacchetto.</p>
<ol><li>Se c&#39;è una sorgente associata esplicitamente ad una zona, il pacchetto viene assegnato a quella zona.</li>
<li>Se non c&#39;è alcuna sorgente, si controlla l&#39;interfaccia fisica da cui è entrato il pacchetto e si assegna alla zona che trusta quell&#39;interfaccia.</li>
<li>Se non c&#39;è nessuna zona associata all&#39;interfaccia, il pacchetto finisce alla zona impostata come default</li></ol>

<p><strong>Fase 2: Selezione del contesto (zone vs policy)</strong>
Una volta identificate la zona di ingresso (e l&#39;eventuale zona di uscita se il traffico è in transito/forwarding), firewalld decide quale “contenitore di regole” applicare:</p>
<ol><li>Le policy <strong>vengono valutate prima</strong> delle singole regole delle zone.
In base alle zone associate, firewalld verifica se esiste una Policy che le unisce e applica i filtri presenti nella policy</li>
<li>Se non ci sono policy object applicabili a quel flusso, il pacchetto viene processato direttamente all&#39;interno della singola zona identificata nella Fase 1. Questo vuol dire che se ci sono filtri nella zona e c&#39;è una policy del tipo zone-to-host, i filtri della policy vincono.</li></ol>

<p><strong>Fase 3: Valutazione delle regole interne (servizi, porte e NAT)</strong>
Ora che abbiamo il contesto, è importante capire in che ordine firewalld applica i filtri.</p>
<ol><li>come prima cosa si valutano le rich-rules con priorità negativa;</li>
<li>in seguito si prende in esame il <strong>dnat</strong> in modo che i filtri successivi lavorino sull&#39;indirizzo e sulla porta di destinazione corretti;</li>
<li>successivamente si valutano i servizi e le porte standard, quelli aggiunti con <code>--add-service</code> e <code>--add-port</code> per capirci</li>
<li>dopo i servizi, vengono valutate le rich-rule tradizionali, quelle con priorità 0</li>
<li>come ultimo passo, se c&#39;è, viene preso in carico il SNAT Masquerade</li></ol>

<p><strong>Fase 4: Il target di default</strong>
Se un pacchetto è arrivato fino a questo punto significa che non ha trovato nessuna regola esplicita (nessun servizio o porta lo ha accettato o rifiutato prima) e viene applicato il target della zona (DROP/REJECT/ACCEPT/default) o della policy (DROP/REJECT/ACCEPT/CONTINUE)</p>

<p>La fase 3 è quella critica, quella che emette il verdetto di accettazione o rifiuto. E qui bisogna fare attenzione.</p>

<p>Le azioni di manipolazione dei pacchetti come il NAT non corrispondono ad un verdetto, che avviene invece:</p>
<ol><li>nei servizi (<code>--add-service</code> o <code>--add-port</code>): accettazione (o rifiuto) implicita</li>
<li>nelle rich-rule se uno dei target viene esplicitato</li></ol>

<p>Quindi, ad es. se nella zona o nella policy, c&#39;è un add-service che accetta un determinato servizio e di seguito una rich rule che invece lo nega, add-service ha priorità e un pacchetto che richieda quel servizio verrebbe accettato e non scartato. Come pure, in una zona/policy default drop, se fosse presente un masquerade o un dnat senza alcuna accettazione esplicite, il pacchetto verrebbe rifiutato dalle politiche della zona/policy.</p>

<p>Alla luce di questa nuova consapevolezza, proverò a mostrare  come risolvere alcuni tipici casi d&#39;uso, partendo dalla configurazione di un semplice firewall personale che protegge l&#39;esposizione di servizi standard, per proseguire in maniera incrementale arricchendo di volta in volta la configurazione iniziale.</p>

<h3 id="5-1-caso-1-host-con-una-sola-interfaccia">5.1. Caso 1: host con una sola interfaccia</h3>

<p>È il caso classico di un personal firewall.</p>

<p>Nel primo blocco di esempi mostrerò anche le configurazioni di un approccio full-policy.</p>

<p>Non ci sono vantaggi evidenti perché si tratta di casi semplici però concentrare la logica nelle policy piuttosto che nelle zone permette per es. di bloccare tutto il traffico in una zona default drop semplicemente disabilitando la policy.</p>

<p>Oppure posso usare la stessa logica di filtraggio su altre zone senza doverle replicare ma solo aggiungendo egress-zone e ingress-zone opportue.</p>

<h4 id="5-1-1-esposizione-semplice">5.1.1. Esposizione semplice</h4>

<p>Ipotizziamo quindi di avere un host con una sola interfaccia e di voler configurare il firewall per filtrare i servizi ssh (22/tcp) e http(s) (80,443/tcp) che questo host espone su una lan.</p>

<p><strong>Versione zone-oriented:</strong></p>

<pre><code class="language-bash"># creazione zona, binding su eth0, policy di default DROP (l&#39;host non sarà nemmeno &#34;pingabile&#34;)
firewall-cmd --permanent --new-zone=server-lan
firewall-cmd --permanent --zone=&#34;server-lan&#34; --set-target=DROP
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-interface=eth0

# abilitazione servizi ssh, http(s)
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-service=ssh
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-service=http
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-service=https
</code></pre>

<p>Come si può vedere, la configurazione è pulita, lineare ed è veramente “parlante”.
Chiunque bussi all&#39;interfaccia eth0, accede ai servizi esposti dall&#39;host.</p>

<p><strong>Versione policy-oriented:</strong></p>

<pre><code class="language-bash"># creazione zona, binding su eth0, policy di default DROP (l&#39;host non sarà nemmeno &#34;pingabile&#34;)
firewall-cmd --permanent --new-zone=&#34;server-lan&#34;
firewall-cmd --permanent --zone=&#34;server-lan&#34; --set-target=DROP
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-interface=eth0

# creazione policy
firewall-cmd --permanent --new-policy=&#34;lan-to-host&#34;
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-ingress-zone=&#34;server-lan&#34;
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-egress-zone=HOST
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --set-target=REJECT

# binding dei servizi ssh, http(s)
firewall-cmd --permanent --policy=lan-to-host --add-service=ssh
firewall-cmd --permanent --policy=lan-to-host --add-service=http
firewall-cmd --permanent --policy=lan-to-host --add-service=https
</code></pre>

<p>Non cambia quasi nulla se non il fatto che il filtering ora avviene attraverso la policy mentre la zona contiene solo il trust delle sorgenti.</p>

<h4 id="5-1-2-esposizione-di-servizi-custom-con-restrizioni">5.1.2. Esposizione di servizi custom con restrizioni</h4>

<p>L&#39;host stavolta esporrà i servizi su porte custom con questi vincoli:</p>
<ul><li>chiunque bussi a eth0 avrà accesso web</li>
<li>mentre ssh sarà ristretto al solo ip 192.168.10.21</li></ul>

<p><strong>Versione zone-oriented:</strong></p>

<pre><code class="language-bash"># creazione zona, binding su eth0, policy di default DROP (l&#39;host non sarà nemmeno &#34;pingabile&#34;)
firewall-cmd --permanent --new-zone=server-lan
firewall-cmd --permanent --zone=&#34;server-lan&#34; --set-target=DROP
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-interface=eth0

# creazione servizio &#34;web_custom&#34;
firewall-cmd --permanent --new-service=&#34;web_custom&#34;
firewall-cmd --permanent --service=&#34;web_custom&#34; --set-description=&#34;My HTTP(S) service&#34;
firewall-cmd --permanent --service=&#34;web_custom&#34; --add-port=8080/tcp --add-port=8443/tcp

# creazione servizio &#34;ssh_custom&#34;
firewall-cmd --permanent --new-service=&#34;ssh_custom&#34;
firewall-cmd --permanent --service=&#34;ssh_custom&#34; --set-description=&#34;My SSH service&#34;
firewall-cmd --permanent --service=&#34;ssh_custom&#34; --add-port=2222/tcp

# chiunque bussi a eth0 sulle porte 8080 e 8443, verrà accettato 
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-service=web_custom

# ssh_custom invece è ristretto con una rich-rule al solo ip 192.168.10.21
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source address=&#34;192.168.10.21&#34; service name=&#34;ssh_custom&#34; accept&#39;
</code></pre>

<p><strong>Versione policy-oriented:</strong></p>

<pre><code class="language-bash"># creazione zona, binding su eth0, policy di default DROP (l&#39;host non sarà nemmeno &#34;pingabile&#34;)
firewall-cmd --permanent --new-zone=&#34;server-lan&#34;
firewall-cmd --permanent --zone=&#34;server-lan&#34; --set-target=DROP
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-interface=eth0

# creazione servizio &#34;web_custom&#34;
firewall-cmd --permanent --new-service=&#34;web_custom&#34;
firewall-cmd --permanent --service=&#34;web_custom&#34; --set-description=&#34;My HTTP(S) service&#34;
firewall-cmd --permanent --service=&#34;web_custom&#34; --add-port=8080/tcp --add-port=8443/tcp

# creazione servizio &#34;ssh_custom&#34;
firewall-cmd --permanent --new-service=&#34;ssh_custom&#34;
firewall-cmd --permanent --service=&#34;ssh_custom&#34; --set-description=&#34;My SSH service&#34;
firewall-cmd --permanent --service=&#34;ssh_custom&#34; --add-port=2222/tcp

# creazione policy
firewall-cmd --permanent --new-policy=&#34;lan-to-host&#34;
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-ingress-zone=&#34;server-lan&#34;
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-egress-zone=HOST
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --set-target=REJECT

# binding web_custom su tutta eth0
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-service=web_custom

# ssh_custom invece è ristretto con una rich-rule al solo ip 192.168.10.21
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source address=&#34;192.168.10.21&#34; service name=&#34;ssh_custom&#34; accept&#39;
</code></pre>

<h4 id="5-1-3-esposizione-con-port-forwarding-statico">5.1.3. Esposizione con port forwarding statico</h4>

<p>Facciamo il caso che i servizi ssh e web siano in ascolto sull&#39;interfaccia di loopback.
Vogliamo comunque esporli attraverso un port redirect facendo in modo che:</p>
<ul><li><code>HOST:22   → localhost:2222</code></li>
<li><code>HOST:8080 → localhost:8080</code></li>
<li><code>HOST:8443 → localhost:8443</code></li></ul>

<p>In più vogliamo restringere l&#39;accesso ssh a 3 soli ip: 192.168.10.20, 192.168.10.21, 192.168.10.22 e vogliamo bloccare tutto il traffico ICMP ad eccezione di <code>echo-request</code>.</p>

<p><strong>Versione zone-oriented:</strong></p>

<pre><code class="language-bash"># creazione zona, binding su eth0, policy di default DROP
firewall-cmd --permanent --new-zone=&#34;server-lan&#34;
firewall-cmd --permanent --zone=&#34;server-lan&#34; --set-target=DROP
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-interface=eth0

# icmp solo request
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-icmp-block-inversion
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-icmp-block=echo-request

# ipset per ssh
firewall-cmd --permanent --new-ipset=&#34;ssh-allowed&#34; --type=hash:ip
firewall-cmd --permanent --ipset=&#34;ssh-allowed&#34; --add-entry=&#34;192.168.10.20&#34; 
firewall-cmd --permanent --ipset=&#34;ssh-allowed&#34; --add-entry=&#34;192.168.10.21&#34; 
firewall-cmd --permanent --ipset=&#34;ssh-allowed&#34; --add-entry=&#34;192.168.10.22&#34;

# Esposizione dei servizi
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-service=&#34;http&#34;
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-service=&#34;https&#34;
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-service=&#34;ssh&#34;

# Per il local forward è necessario abilitare il routing verso loopback
sysctl -w net.ipv4.conf.eth0.route_localnet=1

# local forward 80 → 8080, 443 → 8443
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-forward-port=port=80:proto=tcp:to-port=8080:to-addr=127.0.0.1
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-forward-port=port=443:proto=tcp:to-port=8443:to-addr=127.0.0.1

# rich-rule per l&#39;accesso filtrato ssh con local forward 22 → 2222
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source ipset=&#34;ssh-allowed&#34; forward-port port=&#34;22&#34; protocol=&#34;tcp&#34; to-port=&#34;2222&#34; to-addr=&#34;127.0.0.1&#34;&#39;
</code></pre>

<p>Anche qui la configurazione rimane molto pulita e lineare.</p>

<p>Versione <strong>policy-oriented:</strong></p>

<pre><code class="language-bash"># creazione zona, binding su eth0, policy di default DROP
firewall-cmd --permanent --new-zone=&#34;server-lan&#34;
firewall-cmd --permanent --zone=&#34;server-lan&#34; --set-target=DROP
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-interface=eth0

# icmp solo request
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-icmp-block-inversion
firewall-cmd --permanent --zone=&#34;server-lan&#34; --add-icmp-block=echo-request

# ipset per ssh
firewall-cmd --permanent --new-ipset=&#34;ssh-allowed&#34; --type=hash:ip
firewall-cmd --permanent --ipset=&#34;ssh-allowed&#34; --add-entry=&#34;192.168.10.20&#34;
firewall-cmd --permanent --ipset=&#34;ssh-allowed&#34; --add-entry=&#34;192.168.10.21&#34;
firewall-cmd --permanent --ipset=&#34;ssh-allowed&#34; --add-entry=&#34;192.168.10.22&#34;

firewall-cmd --permanent --new-policy=&#34;lan-to-host&#34;
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-ingress-zone=&#34;server-lan&#34;
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-egress-zone=HOST
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --set-target=REJECTED

# Esposizione dei servizi
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-service=&#34;http&#34;
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-service=&#34;https&#34;
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-service=&#34;ssh&#34;

# Per il local forward è necessario abilitare il routing verso loopback
sysctl -w net.ipv4.conf.eth0.route_localnet=1

# local forward 80 → 8080, 443 → 8443
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-forward-port=port=80:proto=tcp:to-port=8080:to-addr=127.0.0.1
firewall-cmd --permanent--policy=&#34;lan-to-host&#34; --add-forward-port=port=443:proto=tcp:to-port=8443:to-addr=127.0.0.1

# rich-rule per l&#39;accesso filtrato ssh con local forward 22 → 2222
firewall-cmd --permanent --policy=&#34;lan-to-host&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source ipset=&#34;ssh-allowed&#34; forward-port port=&#34;22&#34; protocol=&#34;tcp&#34; to-port=&#34;2222&#34; to-addr=&#34;127.0.0.1&#34;&#39;
</code></pre>

<p><strong>N.B.</strong> In realtà, casi di questo genere che non rientrano nella casistica più ampia del routing e del dnat che giustificherebbero l&#39;uso di regole firewall, si risolverebbero più elegantemente con un reverse proxy (posto che i servizi siano reverse-proxabili), agire quindi a livello applicativo (L7) invece che a livello di indirizzamento e trasporto (L3 e L4 rispettivamente.)</p>

<p>Infine, ciliegina sulla torta, vogliamo che sia filtrato anche il traffico in uscita consentendo solo il traffico web  per gli aggiornamenti di sistema (80,443/tcp) e quello dns (53/udp)</p>

<p>Sarà necessario un policy object per il flusso in uscita, sia nella versione <strong>zone-oriented</strong> che in quella <strong>policy-oriented</strong></p>

<pre><code class="language-bash"># creazione policy object, default policy REJECT
firewall-cmd --permanent --new-policy=host-to-any
firewall-cmd --permanent --policy=host-to-any --set-target=REJECT

# definizione della direzione del traffico: HOST → dmz (eth0)
firewall-cmd --permanent --policy=&#34;host-to-any&#34; --add-ingress-zone=HOST
firewall-cmd --permanent --policy=&#34;host-to-any&#34; --add-egress-zone=myZone

# traffico consentito: http(s), dns
firewall-cmd --permanent --policy=&#34;host-to-any&#34; --add-service=http
firewall-cmd --permanent --policy=&#34;host-to-any&#34; --add-service=https
firewall-cmd --permanent --policy=&#34;host-to-any&#34; --add-service=dns
</code></pre>

<p>Per la configurazione di un firewall personale, esempi di questo tipo coprono il 95% dei casi ordinari, anche senza considerare il filtro del traffico in uscita.</p>

<h3 id="5-2-caso-2-configurazione-di-un-fw-personale-su-un-host-con-3-interfacce">5.2. Caso 2: Configurazione di un fw personale su un host con 3 interfacce</h3>

<p>Proviamo a immaginare uno scenario leggermente più complesso, un host con 3 interfacce per segregare la rete in 3 flussi: management, ingresso, uscita.</p>
<ul><li>un&#39;interfaccia per la rete di management (<strong>eth0</strong>: 192.168.0.0/24)</li>
<li>un&#39;interfaccia per il traffico in ingresso, la rete per il provisioning o per i servizi che l&#39;host espone (<strong>eth1</strong>: 192.168.1.0/24)</li>
<li>un&#39;interfaccia per il data networking, la rete server-to server (<strong>eth2</strong>: 192.168.2.0/24)</li></ul>

<p>L&#39;host espone un servizio web, fa delle richieste ad un server mysql nel backend e consente di essere contattato via ssh per il management.
Dall&#39;interfaccia di backend invece l&#39;host non può essere contattato.</p>

<p>Le policy invece riguarderanno la gestione del traffico in ingresso, dalle rispettive interfacce solo per ssh e web, e del traffico in uscita solo verso il backend mysql.</p>

<pre><code class="language-bash"># ip che possono accedere al management dell&#39;host
firewall-cmd --permanent --new-ipset=&#34;ssh_allowed&#34; --type=&#34;hash:net&#34;
firewall-cmd --permanent --ipset=&#34;ssh_allowed&#34; --add-entry=&#34;192.168.5.32/27&#34; --add-entry=&#34;192.168.6.32/27&#34;

# per aggregare http/https in un unico servizio
firewall-cmd --permanent --new-service=&#34;web&#34;
firewall-cmd --permanent --service=&#34;web&#34; --add-include=&#34;http&#34; --add-include=&#34;https&#34;

# zona di management
firewall-cmd --permanent --new-zone=&#34;mgmt&#34;
firewall-cmd --permanent --zone=&#34;mgmt&#34; --add-interface=eth0
firewall-cmd --permanent --zone=&#34;mgmt&#34; --set-target=DROP

# zona del servizio web
firewall-cmd --permanent --new-zone=&#34;webserver&#34;
firewall-cmd --permanent --zone=&#34;webserver&#34; --add-interface=eth1
firewall-cmd --permanent --zone=&#34;webserver&#34; --set-target=DROP

# zona del backend
firewall-cmd --permanent --new-zone=&#34;backend&#34;
firewall-cmd --permanent --zone=&#34;backend&#34; --add-interface=eth2
firewall-cmd --permanent --zone=&#34;backend&#34; --set-target=DROP

# policy per il traffico WEBSERVER → HOST (traffico IN ↑)
firewall-cmd --permanent --new-policy=&#34;any-to-webserver&#34;
firewall-cmd --permanent --policy=&#34;any-to-webserver&#34; --add-ingress-zone=webserver
firewall-cmd --permanent --policy=&#34;any-to-webserver&#34; --add-egress-zone=HOST
firewall-cmd --permanent --policy=&#34;any-to-webserver&#34; --set-target=DROP
firewall-cmd --permanent --policy=&#34;any-to-webserver&#34; --add-service=&#34;web&#34;

# policy per il traffico MGMT → HOST (traffico IN ↑)
firewall-cmd --permanent --new-policy=&#34;mgmt-host&#34;
firewall-cmd --permanent --policy=&#34;mgmt-host&#34; --add-ingress-zone=mgmt
firewall-cmd --permanent --policy=&#34;mgmt-host&#34; --add-egress-zone=HOST
firewall-cmd --permanent --policy=&#34;mgmt-host&#34; --set-target=DROP
firewall-cmd --permanent --policy=&#34;mgmt-host&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source ipset=&#34;ssh_allowed&#34; service name=&#34;ssh&#34; accept&#39;

# policy per il traffico HOST → backend (traffico OUT ↓)
firewall-cmd --permanent --new-policy=&#34;webserver-to-backend&#34;
firewall-cmd --permanent --policy=&#34;webserver-to-backend&#34; --add-ingress-zone=HOST
firewall-cmd --permanent --policy=&#34;webserver-to-backend&#34; --add-egress-zone=backend
firewall-cmd --permanent --policy=&#34;webserver-to-backend&#34; --set-target=DROP
firewall-cmd --permanent --policy=&#34;webserver-to-backend&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; service name=&#34;mysql&#34; accept&#39;
</code></pre>

<p>Il fatto che ci siano servizi con restrizioni sul sorgente, mi permetterà di porre l&#39;attenzione su una particolarità di firewalld poco evidente ma responsabile di errori talmente gravi da invalidare le nostre policy di sicurezza.</p>

<p>In generale, i servizi con restrizioni si gestiscono <strong>SEMPRE</strong> con rich-rule per evitare spiacevoli effetti laterali.</p>

<p>Le rich-rules danno la granularità necessaria in questi casi accettando solo il traffico indicato in zone default drop.</p>

<p>Come negli esempi precedenti, alle definizioni di zona posso sostituire quelle di policy se voglio un approccio policy-oriented.</p>

<h3 id="5-3-caso-3-router-firewall-gateway">5.3. Caso 3: Router Firewall-Gateway</h3>

<p>Ora facciamo l&#39;esempio del classico router-firewall domestico.</p>

<p>L&#39;host avrà quattro interfacce per altrettante reti. Una wan, una rete guest, una dmz e un backend che ospita servizi.</p>

<p><strong>Condizioni</strong></p>
<ul><li>In DMZ c&#39;è un reverse proxy, un server web e un client di file sharing (p2p).</li>
<li>Il Backend ospita un server mysql ad uso del server web, un servizio di file sharing solo per la rete di Backend (nfs).</li>
<li>La rete pubblica non accetta connessioni in ingresso, salvo che quelle destinate al reverse proxy e al client di file sharing via port forwarding.</li>
<li>Il reverseproxy media il contatto col server web che gira in localhost.</li>
<li>Il Backend è inaccessibile da qualunque rete. La DMZ può contattare il Backend esclusivamente per i transiti:
<ul><li>server web → server mysql</li>
<li>client p2p → server nfs</li></ul></li>
<li>La rete guest ha accesso pieno a internet ma deve essere isolata sia da DMZ che da Backend. Anche i servizi esposti in DMZ possono essere contattati solo da rete pubblica.</li></ul>

<p><strong>Piano di indirizzamento</strong></p>
<ul><li>wan0: 151.22.44.88, è l&#39;indirizzo ip della zona pubblica</li>
<li>eth0: 192.168.1.1 (192.168.1.0/24), gateway per la DMZ</li>
<li>wlan0: 192.168.2.1 (192.168.2.0/24), gateway per il Backend</li>
<li>wlan1: 192.168.3.1 (192.168.3.0/24), gateway per il guest.</li></ul>

<p><strong>Host in DMZ</strong></p>
<ul><li>192.168.1.2: server reverse-proxy (port 8080,8443)  / web (localhost)</li>
<li>192.168.1.3:  client p2p (port 36119)</li></ul>

<p><strong>Host in Backend</strong></p>
<ul><li>192.168.2.2: server mysql (port 3306)</li>
<li>192.168.2.3: server nfs (port 2049)</li></ul>

<pre><code class="language-bash">###########
# Servizi #
###########
firewall-cmd --permanent --new-service=&#34;web&#34;
firewall-cmd --permanent --service=&#34;web&#34; --add-include=&#34;http&#34; --add-include=&#34;https&#34;

firewall-cmd --permanent --new-service=&#34;p2p&#34;
firewall-cmd --permanent --service=&#34;p2p&#34; --add-port=&#34;36119/tcp&#34; --add-port=&#34;36119/udp&#34;

########
# Zone #
########
firewall-cmd --permanent --new-zone=&#34;pubblica&#34;
firewall-cmd --permanent --zone=&#34;pubblica&#34; --add-interface=&#34;wan0&#34;
firewall-cmd --permanent --zone=&#34;pubblica&#34; --set-target=DROP

firewall-cmd --permanent --new-zone=&#34;dmz&#34;
firewall-cmd --permanent --zone=&#34;dmz&#34; --add-interface=&#34;eth0&#34;
firewall-cmd --permanent --zone=&#34;dmz&#34; --set-target=DROP

firewall-cmd --permanent --new-zone=&#34;p2p&#34;
firewall-cmd --permanent --zone=&#34;p2p&#34; --add-interface=&#34;eth1&#34;
firewall-cmd --permanent --zone=&#34;p2p&#34; --set-target=DROP

firewall-cmd --permanent --new-zone=&#34;backend&#34;
firewall-cmd --permanent --zone=&#34;backend&#34; --add-interface=&#34;wlan0&#34;
firewall-cmd --permanent --zone=&#34;backend&#34; --set-target=DROP

firewall-cmd --permanent --new-zone=&#34;guest&#34;
firewall-cmd --permanent --zone=&#34;guest&#34; --add-interface=&#34;wlan1&#34;
firewall-cmd --permanent --zone=&#34;guest&#34; --set-target=DROP


##########
# Policy #
##########
##############################
# pubblica-dmz (wan0 → eth0) #
##############################
# Dalla rete pubblica arrivano le richieste da inoltrare sui
# server interni (DMZ).
# Definizione policy con default target DROP.
firewall-cmd --permanent --new-policy=&#34;pubblica-to-dmz&#34;
firewall-cmd --permanent --policy=&#34;pubblica-to-dmz&#34; --add-ingress-zone=&#34;pubblica&#34;
firewall-cmd --permanent --policy=&#34;pubblica-to-dmz&#34; --add-egress-zone=&#34;dmz&#34;
firewall-cmd --permanent --policy=&#34;pubblica-to-dmz&#34; --set-target=DROP
# Inoltri consentiti verso il reverse proxy.
firewall-cmd --permanent --policy=&#34;pubblica-to-dmz&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; forward-port port=&#34;80&#34; protocol=&#34;tcp&#34; to-port=&#34;8080&#34; to-addr=&#34;192.168.1.2&#34; accept&#39;
firewall-cmd --permanent --policy=&#34;pubblica-to-dmz&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; forward-port port=&#34;443&#34; protocol=&#34;tcp&#34; to-port=&#34;8443&#34; to-addr=&#34;192.168.1.2&#34; accept&#39;
firewall-cmd --permanent --policy=&#34;pubblica-to-dmz&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; forward-port port=&#34;36119&#34; protocol=&#34;tcp&#34; to-port=&#34;36119&#34; to-addr=&#34;192.168.1.3&#34; accept&#39;
firewall-cmd --permanent --policy=&#34;pubblica-to-dmz&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; forward-port port=&#34;36119&#34; protocol=&#34;udp&#34; to-port=&#34;36119&#34; to-addr=&#34;192.168.1.3&#34; accept&#39;

##############################
# dmz-backend (eth0 → wlan0) #
##############################
# Solo il reverse proxy (DMZ) può contattare mysql e nfs (Backend).
# Definizione policy con default target DROP.
firewall-cmd --permanent --new-policy=&#34;dmz-to-backend&#34;
firewall-cmd --permanent --policy=&#34;dmz-to-backend&#34; --add-ingress-zone=&#34;dmz&#34;
firewall-cmd --permanent --policy=&#34;dmz-to-backend&#34; --add-egress-zone=&#34;backend&#34;
firewall-cmd --permanent --policy=&#34;dmz-to-backend&#34; --set-target=DROP
# Transito consentito solo per rp verso mysql e per p2p verso nfs.
firewall-cmd --permanent --policy=&#34;dmz-to-backend&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source address=&#34;192.168.1.2&#34; destination address=&#34;192.168.2.2&#34; service name=&#34;mysql&#34; accept&#39;
firewall-cmd --permanent --policy=&#34;dmz-to-backend&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source address=&#34;192.168.1.3&#34; destination address=&#34;192.168.2.3&#34; service name=&#34;p2p&#34; accept&#39;

##############################
# dmz-pubblica (eth0 → wan0) #
##############################
# Abilitazione del solo browsing agli host (nattati) in DMZ.
# Abilitazione full all&#39;host p2p (nattato) in DMZ.
# Definizione policy con default target DROP.
firewall-cmd --permanent --new-policy=&#34;dmz-to-pubblica&#34;
firewall-cmd --permanent --policy=&#34;dmz-to-pubblica&#34; --add-ingress-zone=&#34;dmz&#34;
firewall-cmd --permanent --policy=&#34;dmz-to-pubblica&#34; --add-egress-zone=&#34;pubblica&#34;
firewall-cmd --permanent --policy=&#34;dmz-to-pubblica&#34; --set-target=DROP
# Servizi
firewall-cmd --permanent --policy=&#34;dmz-to-pubblica&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source address=&#34;192.168.1.2 service=&#34;web&#34; masquerade accept&#39;
firewall-cmd --permanent --policy=&#34;dmz-to-pubblica&#34; --add-rich-rule=&#39;rule family=&#34;ipv4&#34; source address=&#34;192.168.1.3 masquerade accept&#39;

##################################
# backend-pubblica (eth0 → wan0) #
##################################
# Abilitazione del solo browsing degli host (nattati) in Backend.
# Qualunque altra richiesta verrà droppata dalle policy di zona.
# Definizione policy con default target DROP.
firewall-cmd --permanent --new-policy=&#34;backend-to-pubblica&#34;
firewall-cmd --permanent --policy=&#34;backend-to-pubblica&#34; --add-ingress-zone=&#34;backend&#34;
firewall-cmd --permanent --policy=&#34;backend-to-pubblica&#34; --add-egress-zone=&#34;pubblica&#34;
firewall-cmd --permanent --policy=&#34;backend-to-pubblica&#34; --set-target=DROP
# servizi
firewall-cmd --permanent --policy=&#34;backend-to-pubblica&#34; --add-service=&#34;web&#34;
firewall-cmd --permanent --policy=&#34;backend-to-pubblica&#34; --add-service=&#34;dns&#34;
# masquerade
firewall-cmd --permanent --policy=&#34;backend-to-pubblica&#34; --add-masquerade

#################################
# guest-pubblica (wlan1 → wan0) #
#################################
# I client, nattati, hanno pieno accesso alla rete pubblica.
# Qualunque richiesta verso altre reti, verrà droppata
# dalle policy di zona.
# Definizione policy con default target ACCEPT.
firewall-cmd --permanent --new-policy=&#34;guest-to-pubblica&#34;
firewall-cmd --permanent --policy=&#34;guest-to-pubblica&#34; --add-ingress-zone=&#34;guest&#34;
firewall-cmd --permanent --policy=&#34;guest-to-pubblica&#34; --add-egress-zone=&#34;pubblica&#34;
firewall-cmd --permanent --policy=&#34;guest-to-pubblica&#34; --set-target=ACCEPT
# masquerade
firewall-cmd --permanent --policy=&#34;guest-to-pubblica&#34; --add-masquerade
</code></pre>

<h3 id="5-4-trappole-nascoste">5.4. Trappole nascoste</h3>

<p>Può capitare che definizioni di zone poco accorte aprano le maglie della gabbia che noi vorremmo cucire attorno all&#39;esposizione dei servizi.</p>

<p>Vediamo un po&#39; di scenari per analizzare le conseguenza delle scelte di design.</p>

<p>Per semplicità esaminerò il caso di un singolo host (192.168.1.2) che ospita un servizio web e un servizio mysql che vogliamo confinare con firewalld nel seguente modo:</p>
<ul><li>Il servizio web deve essere raggiungibile solo da 192.168.1.3</li>
<li>Il servizio mysql deve essere raggiungibile solo da 192.168.1.4</li></ul>

<h4 id="5-4-1-caso-1-restrizioni-con-solo-add-source">5.4.1. Caso 1. Restrizioni con solo --add-source</h4>

<pre><code class="language-bash">firewall-cmd --permanent --new-zone=zone1
firewall-cmd --permanent --zone=zone1 --set-target=REJECT
firewall-cmd --permanent --zone=zone1 --add-source=192.168.1.3
firewall-cmd --permanent --zone=zone1 --add-service=http
firewall-cmd --permanent --zone=zone1 --add-service=https

firewall-cmd --permanent --new-zone=zone2
firewall-cmd --permanent --zone=zone2 --set-target=REJECT
firewall-cmd --permanent --zone=zone2 --add-source=192.168.1.4
firewall-cmd --permanent --zone=zone2 --add-service=mysql

firewall-cmd --set-default-zone=zone2
</code></pre>

<p>Questo tipo di configurazione è soggetto a quello che viene chiamato “<strong>zone hijacking</strong>” che permette a ip non autorizzati di accedere a risorse a cui non dovrebbero avere accesso situate nella <strong>zona di default o di fallback</strong>.</p>

<p>Nel caso specifico, un ip come 192.168.1.10, o qualunque altro a cui le policy di routing consentano di bussare lecitamente all&#39;interfaccia, chiede di accedere a mysql, avrà il via libera vanificando tutte le nostre politiche di confinamento.</p>

<p>Vediamo perché succede questo.</p>
<ol><li>192.168.1.10 bussa alla porta 3306</li>
<li>Step 1: Verifica sorgenti
<ol><li>192.168.1.10 corrisponde a zone1 (192.168.1.3)? NO.</li>
<li>192.168.1.10 corrisponde a zone2 (192.168.1.4)? NO.</li></ol></li>
<li>Step 2: Verifica interfacce
<ol><li>Non ci sono interfacce associate</li></ol></li>
<li>Il pacchetto viene consegnato alla zona di fallback, zone2, per l&#39;elaboraziona finale,  richiede lecitamente l&#39;accesso a mysql che viene autorizzato →  ❌ <strong>ERRORE!</strong></li></ol>

<h4 id="5-4-2-caso-2-combinazione-di-add-source-e-add-interface">5.4.2. Caso 2: Combinazione di --add-source e --add-interface</h4>

<p>Quando l&#39;ingresso alla zona viene mediato da una combinazione sorgenti e interfacce, non c&#39;è il rischio di zone hijacking ma può essere ugualmente insidioso se non si capisce bene che fine facciano i pacchetti.</p>

<p>In generale basta <strong>ricordarsi sempre</strong> che la presenza di sorgenti e interfacce ha l&#39;obiettivo opposto della restrizione perché va ad <strong>estendere l&#39;insieme degli aventi diritto al servizio</strong>.</p>

<p>Facciamo sempre conto che 192.168.1.10 provi a bussare sulla 3306.</p>

<pre><code class="language-bash">firewall-cmd --permanent --new-zone=zone1
firewall-cmd --permanent --zone=zone1 --set-target=REJECT
firewall-cmd --permanent --zone=zone1 --add-source=192.168.1.3
firewall-cmd --permanent --zone=zone1 --add-service=http
firewall-cmd --permanent --zone=zone1 --add-service=https

firewall-cmd --permanent --new-zone=zone2
firewall-cmd --permanent --zone=zone2 --set-target=REJECT
firewall-cmd --permanent --zone=zone2 --add-source=192.168.1.4
firewall-cmd --permanent --zone=zone2 --add-interface=eth0
firewall-cmd --permanent --zone=zone2 --add-service=mysql

firewall-cmd --set-default-zone=zone2
</code></pre>

<p>Anche facendo finta di non accorgersi che l&#39;add-source della zona2 sia ridondante avendo la disponibilità dell&#39;intera interfaccia che lo contiene, l&#39;accesso in questo caso sarà consentito proprio perchè nello step2 della valutazione, la presenza dell&#39;interfaccia fa ricadere il pacchetto nella zona 2 (accesso consentito) → ⚠️ <strong>ATTENZIONE!</strong></p>

<p>Se invece spostassi il binding dell&#39;interfaccia nella zona1,</p>

<pre><code class="language-bash">firewall-cmd --permanent --new-zone=zone1
firewall-cmd --permanent --zone=zone1 --set-target=REJECT
firewall-cmd --permanent --zone=zone2 --add-interface=eth0
firewall-cmd --permanent --zone=zone1 --add-source=192.168.1.3
firewall-cmd --permanent --zone=zone1 --add-service=http
firewall-cmd --permanent --zone=zone1 --add-service=https

firewall-cmd --permanent --new-zone=zone2
firewall-cmd --permanent --zone=zone2 --set-target=REJECT
firewall-cmd --permanent --zone=zone2 --add-source=192.168.1.4
firewall-cmd --permanent --zone=zone2 --add-service=mysql

firewall-cmd --set-default-zone=zone2
</code></pre>

<p>il binding dell&#39;interfaccia fa ricadere la richiesta nella zona1 che rifiuta l&#39;accesso → ⚠️ <strong>ATTENZIONE!</strong></p>

<h4 id="5-4-3-remediation-per-la-zone-hijacking">5.4.3. Remediation per la “zone hijacking”</h4>

<p>L&#39;utilizzo delle sole sorgenti per restringere l&#39;accesso non è sufficiente perché ip che transitano sull&#39;host e non appartengano a nessuna sorgente di zona, <strong>possono richiedere lecitamente i servizi appartenenti alla zona di fallback</strong></p>

<p>Ci sono un paio di modi per evitare questo tranello.</p>

<p>Uno consiste nell&#39;usare le rich-rules come abbiamo fatto nella gestione delle zone di management e di backend del punto <a href="#5-2-caso-2-configurazione-di-un-fw-personale-su-un-host-con-3-interfacce" rel="nofollow">5.2. Caso 2: Configurazione di un fw personale su un host con 3 interfacce</a>. Accesso pieno alle sole interfacce e i sorgenti nelle rich-rules sono le white-list che consentono puntualmente chi può accedere a cosa.</p>

<p>Un altro metodo consiste nell&#39;usare come zona di default, una zona senza alcun binding, con lo scopo di droppare tutto ciò che vi finisce dentro.</p>

<pre><code class="language-bash">firewall-cmd --permanent --new-zone=default-drop
firewall-cmd --permanent --zone=default-drop --set-target=DROP
firewall-cmd --set-default-zone=default-drop
</code></pre>

<p>In questo modo la zona di default che riceverà il pacchetto sospeso non avrà alcun servizio associato a differenza di prima, ma dropperà tutto ciò che incontra.</p>

<h2 id="6-tips">6. Tips</h2>

<h3 id="6-1-le-azioni-di-firewall-cmd">6.1. Le azioni di firewall-cmd</h3>

<p>Per districarsi rapidamente nella sintassi di <code>firewall-cmd</code>, mi viene comodo ricordare “le azioni” distintive principali in un&#39;ottica CRUD:</p>
<ul><li><code>--get</code> / <code>--info</code> /  <code>--list</code>. <strong>recupera (legge)</strong> informazioni sulla configurazione</li>
<li><code>--new</code> / <code>--add</code>, <strong>crea</strong> nuovi oggetti / elementi</li>
<li><code>--set</code>, <strong>modifica</strong> gli elementi</li>
<li><code>--remove</code> / <code>--delete</code>, <strong>rimuove</strong> gli elementi / oggetti</li></ul>

<p>E più precisamente:</p>
<ul><li><code>--get</code>, restituisce un elenco di oggetti complessi a livello di sistema (ad es. icmptypes, servizi, zone o policy) o il valore di un suo campo ;</li>
<li><code>--set</code>, imposta il valore di un campo;</li>
<li><code>--info</code>, restituisce il recordset di un determinato oggetto complesso come un servizio, una policy, una zona, un ipset;</li>
<li><code>--list</code>, come <code>--info</code> ma più articolato;</li>
<li><code>--new</code>, crea nuovi oggetti complessi;</li>
<li><code>--add</code>, aggiunge un elemento ad un oggetto complesso;</li>
<li><code>--remove</code>, rimuove elementi da un oggetto complesso ad es. un servizio da una zona/policy, una entry da un servizio, una rule da una zona/policy ecc.</li>
<li><code>--delete</code>, rimuove un oggetto complesso come una zona, una policy, un ipset, un servizio ecc.</li></ul>

<h3 id="6-2-comandi-utili">6.2. Comandi utili</h3>

<p>Di seguito. un sottinsieme di comandi già visti, utili per catturare velocemente informazioni sulla configurazione del firewall.</p>

<p><strong>Elenco di tutti gli ipset:</strong></p>

<pre><code class="language-bash">firewall-cmd --permanent --get-ipsets
</code></pre>

<p><strong>Elenco di tutti i tipi di ipset:</strong></p>

<pre><code class="language-bash">firewall-cmd --get-ipset-types
</code></pre>

<p><strong>Elenco di tutti tipi di icmp:</strong></p>

<pre><code class="language-bash">firewall-cmd --get-icmptypes
</code></pre>

<p><strong>Elenco di tutti i servizi:</strong></p>

<pre><code class="language-bash">firewall-cmd --get-services
</code></pre>

<p><strong>Individuare la zona dall&#39;interfaccia:</strong></p>

<pre><code class="language-bash">firewall-cmd --permanent --get-zone-of-interface=&#34;&lt;nome interfaccia&gt;&#34;
</code></pre>

<p><strong>Individuare la zona dal sorgente:</strong></p>

<pre><code class="language-bash">firewall-cmd --permanent --get-zone-of-source=ip | MAC | ipset:&#34;&lt;nome_ipset&gt;&#34;
</code></pre>

<p><strong>Zona di default:</strong></p>

<pre><code class="language-bash">firewall-cmd --get-default-zone
</code></pre>

<p><strong>Zone attive:</strong></p>

<pre><code class="language-bash">firewall-cmd --get-active-zones
</code></pre>

<p><strong>Elenco di tutte le zone/policies:</strong></p>

<pre><code class="language-bash">firewall-cmd --get-zones
firewall-cmd --get-policies
</code></pre>

<p><strong>Dettaglio delle configurazione di tutte le zone/policy:</strong></p>

<pre><code class="language-bash">firewall-cmd --list-all-zone
firewall-cmd --list-all-policies
</code></pre>

<p><strong>Dettaglio della configurazione di una zona/policy:</strong></p>

<pre><code class="language-bash">firewall-cmd --permanent --info-zone=&#34;&lt;nome_zona&gt;&#34;
firewall-cmd --permanent --info-policy=&#34;&lt;nome_policy&gt;&#34;
</code></pre>

<p><strong>Elenco di tutti i servizi di una zona/policy:</strong></p>

<pre><code class="language-bash">firewall-cmd --zone=&#34;&lt;nome_zona&gt;&#34; --list-services
firewall-cmd --policy=&#34;&lt;nome_policy&gt;&#34; --list-services
</code></pre>

<p><strong>Elenco di tutte le porte di una zona/policy:</strong></p>

<pre><code class="language-bash">firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --list-ports
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --list-ports
</code></pre>

<p><strong>Elenco di tutte le rich rules di una zona/policy:</strong></p>

<pre><code class="language-bash">firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --list-rich-rules
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --list-rich-rules
</code></pre>

<p><strong>Elenco di tutte le forward ports di una zona/policy:</strong></p>

<pre><code class="language-bash">firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --list-forward-ports
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --list-forward-ports
</code></pre>

<p><strong>Dettaglio della configurazione di un servizio:</strong></p>

<pre><code class="language-bash">firewall-cmd --permanent --info-service=&#34;&lt;nome_servizio&gt;&#34;
</code></pre>

<p><strong>Elenco di tutte le porte di un servizio:</strong></p>

<pre><code class="language-bash">firewall-cmd --permanent --service=&#34;&lt;nome_servizio&gt;&#34; --get-ports
</code></pre>

<p><strong>Dettaglio della configurazione di un ipset:</strong></p>

<pre><code class="language-bash">firewall-cmd --permanent --info-ipset=&#34;&lt;nome_ipset&gt;&#34;
</code></pre>

<p><strong>Elenco di tutte le entry di un ipset:</strong></p>

<pre><code class="language-bash">firewall-cmd --permanent --ipset=&#34;&lt;nome_ipset&gt;&#34; --get-entries
</code></pre>

<h3 id="6-3-considerazioni-di-contorno">6.3. Considerazioni di contorno</h3>

<p>Concludendo, firewalld, in quanto frontend fedele di nftables, rappresenta il futuro del firewalling linux.</p>

<p><strong>Aspetti comuni:</strong></p>
<ol><li>Configurare i servizi ove possibile è sempre da preferire rispetto a porte/protocolli sparati direttamente nella zona o nella policy.</li>
<li>Ricorrere alle rich-rules solo se si devono gestire flussi puntuali, altrimenti è sufficiente il bind dell&#39;interfaccia alla zona.</li></ol>

<p><strong>Approccio conservativo:</strong>
Per configurazioni semplici, bastano zone e servizi.</p>

<p>In presenza di più interfacce, obbligatorio anche il ricorso ai policy object, perché ci sarà da gestire di sicuro traffico interzona.</p>
<ul><li><strong>Pro:</strong> curva d&#39;apprendimento morbida, ideale se la necessità è di essere operativi nel breve. Ideali per firewall personali e configurazioni semplici.</li>
<li><strong>Contro:</strong> le configurazioni tendono ad irrigidirsi al crescere della complessità degli scenari e quindi a complicare le manutenzioni.</li></ul>

<p><strong>Approccio spregiudicato:</strong>
Delegare alle zone solo il trust delle sorgenti e spostare la logica dei flussi interamente ai policy object.</p>
<ul><li><strong>Pro:</strong> massima flessibilità, maggiore pulizia delle configurazioni. Ideale per scenari complessi.</li>
<li><strong>Contro:</strong> curva d&#39;apprendimento più ripida, le configurazioni più semplici tendono ad apparire molto più verbose e di conseguenza meno chiare.</li></ul>

<p><a href="/aytin/tag:firewall" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">firewall</span></a> <a href="/aytin/tag:firewallcmd" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">firewallcmd</span></a> <a href="/aytin/tag:firewalld" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">firewalld</span></a> <a href="/aytin/tag:iptables" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">iptables</span></a> <a href="/aytin/tag:netfilter" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">netfilter</span></a>  <a href="/aytin/tag:nftables" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">nftables</span></a> <a href="/aytin/tag:ufw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ufw</span></a></p>
]]></content:encoded>
      <guid>https://noblogo.org/aytin/sveliamo-i-misteri-di-firewalld-parte-2-di-2</guid>
      <pubDate>Fri, 10 Jul 2026 14:14:03 +0000</pubDate>
    </item>
    <item>
      <title>Sveliamo i misteri di Firewalld (Parte 1 di 2)</title>
      <link>https://noblogo.org/aytin/sveliamo-i-misteri-di-firewalld-parte-1-di-2</link>
      <description>&lt;![CDATA[tux-firewalld&#xA;---&#xA;N.B. Sono stato costretto a spezzare l&#39;articolo perché, quello originale di 8836 parole (per un totale di 76309 bytes effettivi), veniva troncato dopo il salvataggio a 7533 parole (65.356 bytes), cosa che mi fa sospettare che la grandezza del body non possa superare i 64k.&#xA;---&#xA;firewalld fornisce funzionalità firewall fungendo da frontend per netfilter.&#xA;&#xA;Nell&#39;interagire con netfilter, analogamente a ufw con iptables, firewalld usa come backend nftables, un tool nella user-space del kernel linux, che va a sostituire proprio iptables. Entrambi i backend forniscono filtraggio e classificazione dei pacchetti di rete /datagrammi/frame.&#xA;!--more--&#xA;&#xA;1. Come ragiona firewalld&#xA;2. Come procedo nella configurazione di Firewalld?&#xA;3. Il man di firewall-cmd&#xA;4. Come configurare firewalld&#xA;   4.1. Helpers&#xA;   4.2. Servizi&#xA;   4.3. Gestione ICMP&#xA;   4.4. Porte e protocolli&#xA;   4.5. IPset&#xA;   4.6. Rich-Rules&#xA;   4.7. Forwarding e Masquerade&#xA;   4.8. Zona&#xA;   4.9. Policy Objects&#xA;   4.10. Comandi di utilità generale&#xA;&#xA;Attualmente ufw usa ancora iptables ma in modalità legacy, consistente in uno strato software che traduce i comandi iptables nei corrispondenti comandi nftables.&#xA;&#xA;Firewalld supporta le zone di rete/firewall che definiscono il livello di fiducia delle connessioni o delle interfacce di rete.&#xA;&#xA;C&#39;è una separazione fra runtime e configurazione permanente che consente di testare una configurazione prima di renderla effettiva.&#xA;&#xA;firewalld, con nftables, è certamente il frontend ideale per netfilter dal momento che recepisce tutte le sue innovazioni. La possibilità di usare, nella stessa cli, filtraggio, routing, snat e dnat per es. rende l&#39;esperienza certamente più omogenea (con ufw, masquerade e port-forwarding richiedono una gestione aggiuntiva direttamente con iptables per ora).&#xA;&#xA;Sebbene destinato ad essere rimpiazzato, iptables continua ad avere una sua specificità visto che viene ancora usato da docker per agire direttamente su netfilter bypassando eventuali firewall locali quano deve esporre una porta.&#xA;&#xA;Con l&#39;attuale versione di docker, la 29, è stato introdotto il supporto diretto su nftables in via sperimentale.&#xA;&#xA;Ad ogni modo, chi approccia per la prima volta a firewalld (come è successo a me) all&#39;inizio può essere sopraffatto dall&#39;allegro affollamento di opzioni a disposizione.&#xA;&#xA;zone&#xA;porte&#xA;protocolli&#xA;servizi&#xA;policy objects&#xA;rich-rules&#xA;port forwarding&#xA;masquerade&#xA;ipset&#xA;helper&#xA;....&#xA;&#xA;La gui (firewall-config) mette certamente ordine ma non aiuta fino in fondo. Oltre a questo la gui non racchiude tutta la logica della cli (ad es. mancano i policy objects).&#xA;&#xA;La cli di firewalld è il riferimento e come tutte le cli, può spaventare.&#xA;&#xA;In realtà la cli, firewall-cmd nello specifico, è una delle più pulite e lineari che conosca, basta conoscere gli la logica a oggetti che governa firewalld.&#xA;1. Come ragiona firewalld&#xA;Se guardassi firewalld dall&#39;alto, riconoscerei 7 oggetti principali:&#xA;&#xA;Zone&#xA;Policy Objects&#xA;Services&#xA;IPSet&#xA;ICMP Types&#xA;Helper&#xA;Direct Options (Deprecato)&#xA;&#xA;Zone: è un po&#39; il tratto distintivo di firewalld. Concettualmente rappresenta il livello di fiducia che si ha nei confronti di una rete connessa a una specifica interfaccia (es. eth0) o di un indirizzo IP. Ogni pacchetto dati che entra nel server viene catturato da una zona in base alla sua sorgente o all&#39;interfaccia da cui arriva. È qui che avviene la configurazione del traffico in ingresso.&#xA;&#xA;Policy Objects: è una delle novità di firewalld. I policy object nascono per gestire il traffico inter-zona. Inizialmente il filtraggio avveniva all&#39;interno dell&#39;oggetto (la zona) che accoglie il pacchetto, ora viene disaccoppiato e trasferito in un altro oggetto che gestisce il transito dei pacchetti tra una zona e l&#39;altra (o se stessa).&#xA;In questo modo cambia profondamente il paradigma di manipolazione dei pacchetti. La zona attiva il filtraggio quando il pacchetto entra da una delle sorgenti associate alla zone. La policy, attiva il filtraggio quando il pacchetto transita tra le zone specifiche definite dalla policy.&#xA;&#xA;Services: rappresenta ciò che esponiamo (o che dobbiamo raggiungere, se filtriamo il traffico in uscita dal nostro host quando si comporta da client).&#xA;&#xA;L&#39;IPSet: permette di definire dei blocchi di ip a cui applicare regole massivamente invece che definirle puntalmente.&#xA;&#xA;ICMP Types: è relativo ai pacchetti ICMP e permette di rendere disponibile il pacchetto scelto al traffico di tipo ipv4 e/o ipv6  &#xA;&#xA;Helper: torna comodo invece per quei protocolli che aprono una connessione su una porta e poi negoziano dinamicamente un&#39;altra porta per il trasferimento dei dati (es. ftp, netbios-ns, sip, vecchi protocolli di gaming/streaming ecc.). Invece che aprire un intervallo ampio di porte, l&#39;helper, che è un modulo del kernel, &#34;ascolta&#34; il flusso di controllo, capisce quale porta casuale sta per essere usata e la apre temporaneamente al volo solo per quel trasferimento.&#xA;&#xA;Direct Options: le direct options (ormai deprecate e sostituite dai policy objects) sono la parte legacy di firewalld attraverso cui parla con iptables invece che con nftables.&#xA;&#xA;Questi sono gli oggetti principali su cui si costruiscono le regole per il firewall attraverso una sintassi molto corposa ma ragionata e lineare.&#xA;&#xA;La cli mette a disposizione delle istruzioni per fare praticamente qualunque cosa:&#xA;&#xA;visualizzare lo stato del firewall;&#xA;istanziare gli oggetti;&#xA;combinare gli oggetti istanziati al fine di creare la nostra logica di firewalling;&#xA;effettuare delle query di verifica esistenziale sugli oggetti;&#xA;effettuare il binding delle zone con interfacce o sorgenti;&#xA;&#xA;Da tenere presente che la configurazione di firewalld, come iptables, può essere effimera. Se la configurazione a caldo non viene resa &#34;permanente&#34;, produce effetti fino a quando il servizio viene riavviato. Quando avviene, lo stato di firewalld ritorna ad essere quello che era prima delle modifiche.&#xA;2. Come procedo nella configurazione di Firewalld?&#xA;Come abbiamo visto, firewalld ha una logica di funzionamento molto più versatile di iptables, decisamente più rigido al confronto.&#xA;Questa versatilità però può portare a rendere gli scenari più caotici potendo mescolare diverse tecniche di filtraggio. &#xA;Come dire, il solito problema della scelta quando ce n&#39;è troppa.&#xA;&#xA;My two cents:&#xA;&#xA;Se l&#39;esigenza è quella di configurare un firewall personale, è sufficiente configurare opportunamente zone e servizi.&#xA;Se bisogna tenere in considerazione traffico inter-zona (in presenza di più interfacce per es.) ci vengono in aiuto i policy objects.&#xA;Se abbiamo ulteriori esigenze di granularità, la zona permette di definire delle rich-rules.&#xA;&#xA;Un canovaccio del genere aiuta a mantenere la configurazione pulita, altrimenti potrei sporcarla in mille modi differenti rendendo però complicata la manutenzione futura.&#xA;&#xA;Cercando di mettere a fattor comune quello che faccio con firewall-cmd la maggior parte delle volte, se volessi configurare un firewall personale secondo il canovaccio di cui sopra, i passi da fare sono i seguenti:&#xA;&#xA;creo la zona&#xA;se non sono presenti nel default perché magari le porte dei servizi sono custom, creo anche i servizi (descrizione, porta/e e protocollo/i)&#xA;nella configurazione della zona, faccio il binding con l&#39;interfaccia e con i servizi (eventualmente custom) che ho definito.&#xA;&#xA;Stop.&#xA;&#xA;Non occorre altro.&#xA;&#xA;Ma firewalld permette anche configurazioni molto più borderline.&#xA;&#xA;Nella mia zona potrei non avere alcun oggetto di tipo servizio ma potrei semplicemente assegnare direttamente una sbrodolata di porte e protocolli.&#xA;&#xA;Oppure potrei lavorare direttamente con le rich-rules (approccio simil-ufw).&#xA;&#xA;Oppure potrei affidare la logica direttamente ai policy objects.&#xA;&#xA;Personalmente, tutte queste alternative (a parte l&#39;ultima) le vedo più come un esercizio accademico senza una reale utilità pratica perché in scenari complessi questi approcci possono dar luogo a configurazioni estremamente caoitche.&#xA;3. Il man di firewall-cmd&#xA;Il man di firewall-cmd è molto chiaro e lineare e sarebbe bene tenerlo presente quando ci si lavora per le prime volte.&#xA;&#xA;È strutturato in 3 grossi blocchi:&#xA;&#xA;Sezioni di carattere generale. Stato firewall, verbosity log, salvataggio configurazioni, ecc&#xA;&#xA;General Options&#xA;Status Options&#xA;Log Denied Options&#xA;Permanent Options&#xA;Panic Options&#xA;&#xA;Sezioni per la configurazione delle componenti core. Zone , Policy Objects, IPSet, Service, ecc.&#xA;&#xA;Zone Options&#xA;Policy Options&#xA;IPSet Options&#xA;Service Options&#xA;Helper Options&#xA;ICMP type Options&#xA;Direct Options (deprecato)&#xA;&#xA;Sezioni per l&#39;interrogazione e la configurazione delle combinazioni fra zone, policy objects, interfacce e sorgenti&#xA;&#xA;Options to Adapt and Query Zones and Policies&#xA;Options to Adapt and Query Zones&#xA;Options to Adapt and Query Policies&#xA;Options to Handle Bindings of Interfaces&#xA;Options to Handle Bindings of Sources&#xA;&#xA;4. Come configurare firewalld&#xA;Come anticipato, la configurazione della zona con associati servizi, interfaccia e sorgenti, è tutto ciò che serve.&#xA;&#xA;Se le mie policy sono complesse e ho necessità di centralizzarle, posso usare i policy objects.&#xA;&#xA;Se si deve intervenire chirurgicamente per impedire o abilitare del traffico, ci sono le rich-rules.&#xA;&#xA;In sostanza, tutto ruota attorno a due grossi item, le zone e i policy objects, che, forse in maniera un po&#39; ridondante, combinano una serie di componenti che concorrono a formare la logica di firewalling.&#xA;&#xA;Per entrare nel merito della configurazione partirò da quelle che per me sono le &#34;foglie&#34; di un ipotetico albero che, attraverso una serie di inclusioni, termina con 2 grosse radici: zone o police objects.&#xA;&#xA;Fra gli elementi terminali nella gerarchia di firewalld, per me, ci sono gli helpers che poi concorrono a formare i servizi che insieme a porte e protocolli, IPset, forwarding, masquerade finiranno in zone, policy objects e rich-rules.&#xA;4.1. Helpers&#xA;Gli helpers sono degli oggetti basati sul modulo nfconntrack del kernel Netfilter, che permettono di tracciare le connessioni, per la precisione sono delle interfacce che permettono a firewalld di caricare e configurare il relativo modulo nfconntrack del kernel. &#xA;&#xA;Ci sono protocolli come ftp, tftp, alcuni protocolli di gaming, voip ecc. che, oltre che esporre la porta per essere contattati, in un secondo momento devono negoziare dinamicamente con il client un&#39;altra porta per lo scambio dei dati.&#xA;&#xA;Questo tipo di servizi non è facilmente controllabile senza gli helpers perché la negoziazione dinamica imporrebbe di aprire un set molto ampio di porte.&#xA;&#xA;Con gli helpers le connessioni di questi servizi &#34;anomali&#34; verranno tracciate in modo che, quando dal cliente arriva un pacchetto che richiede l&#39;apertura di una porta random per lo scambio dati, quella connessione verrà marchiata come RELATED, che come tutto il traffico RELATED viene accettata nativamente, invece che come NEW che sarebbe destinata ad essere scartata.&#xA;&#xA;Gli helpers, lista dei quali disponibile con:&#xA;firewall-cmd --get-helpers&#xA;corrispondono all&#39;incirca ai moduli nfconntrack presenti nel kernel Netfilter e si trovano in /lib/modules/$(uname -r)/kernel/net/netfilter.&#xA;&#xA;Andranno aggiunti ai servizi, qualora servissero, in modo che firewalld accetti, e solo per quei servizi, connessioni da porte dinamiche.&#xA;&#xA;Un po&#39; di storia&#xA;In passato, il kernel linux abilitava (con qualcosa tipo nfconntrackhelper=1) gli helpers per default su tutto il traffico favorendo attacchi basati sullo spoofing dei pacchetti con cui farsi aprire porte a caso.&#xA;&#xA;Poi quest&#39;opzione è stata prima disabilitata di defautl con nfconntrackhelper=0 permettendo un&#39;attivazione prudente solo da file di configurazione con AutomaticHelpers=yes/no/system, poi è stata definitivamente rimossa sia dal kernel che dal file di configurazione.&#xA;&#xA;Oggi, per attivare gli helper, basta dichiararli e associarli ad un servizio. Firewalld provvederà a caricare dinamicamente solo i moduli del kernel Netfilter necessari gestendo sia la porta dalla quale il servizio verrà contattato sia le porte dinamiche che verranno negoziate per lo scambio dei dati.&#xA;restituisce tutte le informazioni di un helper&#xA;firewall-cmd --permanent --info-helper=&#34;nomehelper&#34;&#xA;&#xA;dichiaro un nuovo helper&#xA;firewall-cmd --permanent --new-helper=&#34;nomehelper&#34; --module=nfconntracknomemodulo&#xA;&#xA;restituisce tutti gli helper presenti&#xA;firewall-cmd --permanent --get-helpers&#xA;&#xA;imposta / restituisce una descrizione&#xA;firewall-cmd --permanent --helper=&#34;nomehelper&#34; --set-description=&#34;descrizione&#34;&#xA;firewall-cmd --permanent --helper=&#34;nomehelper&#34; --get-description&#xA;&#xA;imposta / restituisce una descrizione breve&#xA;firewall-cmd --permanent --helper=&#34;nomehelper&#34; --set-short=&#34;descrizione&#34;&#xA;firewall-cmd --permanent --helper=&#34;nomehelper&#34; --get-short&#xA;&#xA;aggiunge/rimuove la porta o il range di porte dall&#39;helper&#xA;firewall-cmd --permanent --helper=&#34;nomehelper&#34; --add-port=port[-port]/protocol&#xA;firewall-cmd --permanent --helper=&#34;nomehelper&#34; --remove-port=port[-port]/protocol&#xA;&#xA;restituisce tutte le porte associate all&#39;helper&#xA;firewall-cmd --permanent --helper=&#34;nomehelper&#34; --get-ports&#xA;&#xA;imposta / restituisce un modulo per l&#39;helper&#xA;firewall-cmd --permanent --helper=&#34;nomehelper&#34; --set-module=nfconntracknomemodulo&#xA;firewall-cmd --permanent --helper=&#34;nomehelper&#34; --get-module&#xA;&#xA;rimuove un helper da sistema&#xA;--permanent --delete-helper=&#34;nomehelper&#34;&#xA;&#xA;4.2. Servizi&#xA;Per creare un servizio, si assegna un nome e un insieme di porte e protocolli.&#xA;firewall-cmd --permanent --new-service=&#34;nomeservizio&#34;&#xA;firewall-cmd --permanent --service=&#34;nomeservizio&#34; --set-description=&#34;Descrizione del servizio&#34;&#xA;firewall-cmd --permanent --service=&#34;nomeservizio&#34; [--add-port=port/tcp | udp | sctp | dccp]+&#xA;Di seguito una lista di comandi utili:&#xA;elenco di tutti i servizi&#xA;firewall-cmd --get-services&#xA;elenco dei servizi della zona attiva&#xA;firewall-cmd --list-services&#xA;elenco dei servizi di una determinata zona&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --list-services&#xA;restituisce le info di un servizio&#xA;firewall-cmd --permanent --info-service=&#34;nomeservizio&#34;&#xA;&#xA;imposta / restituisce una descrizione&#xA;firewall-cmd --permanent --service=&#34;nomeservizio&#34; --get-description&#xA;firewall-cmd --permanent --service=&#34;nomeservizio&#34; --set-description=&#34;descrizione&#34;&#xA;&#xA;imposta / restituisce una descrizione breve&#xA;firewall-cmd --permanent --service=&#34;nomeservizio&#34; --get-short-description&#xA;firewall-cmd --permanent --service=&#34;nomeservizio&#34; --set-short-description=&#34;descrizione&#34;&#xA;&#xA;restituisce tutte le porte del servizio&#xA;firewall-cmd --permanent --service=&#34;nomeservizio&#34; --get-ports&#xA;&#xA;imposta / restituisce un (o più) protocollo di un servizio&#xA;firewall-cmd --permanent --service=&#34;nomeservizio&#34; --get-protocols&#xA;firewall-cmd --permanent --service=&#34;nomeservizio&#34; [--add-protocol=tcp | udp | sctp | dccp]+&#xA;&#xA;rimozione (porta, protocollo) / protocollo&#xA;firewall-cmd --permanent --service=&#34;nomeservizio&#34; [--remove-port=port/tcp | udp | sctp | dccp]+&#xA;firewall-cmd --permanent --service=&#34;nomeservizio&#34; [--remove-protocol=tcp | udp | sctp | dccp]+&#xA;&#xA;aggiunge / rimuove un helper da un servizio&#xA;firewall-cmd --permanent --service=&#34;nomeservizio&#34; --add-helper=&#34;nomehelper&#34;&#xA;firewall-cmd --permanent --service=&#34;nomeservizio&#34; --remove-helper=&#34;nomehelper&#34;&#xA;&#xA;restituisce gli helper collegati al servizio&#xA;firewall-cmd --permanent --service=&#34;nomeservizio&#34; --get-service-helpers&#xA;&#xA;elimina un servizio&#xA;firewall-cmd --permanent --delete-service==&#34;nomeservizio&#34;&#xA;(rif. man service)&#xA;4.3. Gestione ICMP&#xA;Il traffico ICMP viene impostato a livello di zona o a livello di policy object.&#xA;&#xA;Al solito, agire a livello di zona è più semplice, usare i policy objects permette di guadagnare in modularità e scalabilità.&#xA;&#xA;Di default, ICMP lavora su blacklist. È tutto consentito tranne ciò che viene esplicitamente vietato con le istruzioni --add-icmp-block per aggiungere il tipo icmp che si vuole bloccare o --remove-icmp-block per rimuovere il blocco.&#xA;&#xA;È possibile invertire la logica di funzionamento, a livello globale o di singola zona, passando ad una whitelist. È tutto vietato tranne cio che è consentito con --add-icmp-block (un po&#39; fuorviante, ne convengo). --remove-icmp-block rimuove il consenso.&#xA;&#xA;Di seguito, un elenco dei comandi di utilità disponibili per gli icmptype:&#xA;Elenca tutti gli icmptype&#xA;firewall-cmd --get-icmptypes&#xA;&#xA;inverte / disattiva globalmente la logica del blocco icmp (attiva / disattiva whitelist)&#xA;firewall-cmd --permanent --add-icmp-block-inversion&#xA;firewall-cmd --permanent --remove-icmp-block-inversion&#xA;&#xA;Creazione e cancellazione di un icmptype&#xA;firewall-cmd  --permanent --new-icmptype=&#34;nome icmptype&#34;&#xA;firewall-cmd  --permanent --delete-icmptype=&#34;nome icmptype&#34;&#xA;&#xA;imposta / restituisce la descrizione di un icmptype&#xA;firewall-cmd  --permanent --icmptype=&#34;nome icmptype&#34; --set-description=&#34;descrizione&#34;&#xA;firewall-cmd  --permanent --icmptype=&#34;nome icmptype&#34; --get-description&#xA;&#xA;imposta / restituisce la descrizione breve di un icmptype&#xA;firewall-cmd  --permanent --icmptype=&#34;nome icmptype&#34; --set-short=&#34;descrizione&#34;&#xA;firewall-cmd  --permanent --icmptype=&#34;nome icmptype&#34; --get-short&#xA;&#xA;imposta/cancella/restituisce la destinazione (ipv4 o ipv6) di un icmptype&#xA;firewall-cmd  --permanent --icmptype=&#34;nome icmptype&#34; --add-destination=&#34;[ipv4 | ipv6]&#34;&#xA;firewall-cmd  --permanent --icmptype=&#34;nome icmptype&#34; --remove-destination=&#34;[ipv4 | ipv6]&#34;&#xA;firewall-cmd  --permanent --icmptype=&#34;nome icmptype&#34; --get-destinations&#xA;(rif. man icmp type) &#xA;4.4. Porte e protocolli&#xA;Zone e policy objects permettono di fare binding diretto su porte e protocolli.&#xA;&#xA;Non è generalmente una cosa che mi faccia impazzire perché si bypassano i servizi.&#xA;&#xA;Si fa tutto più velocemente, è vero, ma quando le regole sono numerose e si usano porte non canoniche, la probabilità che, al tendere, non si capisca più su quale servizio si stia agendo, è elevatissima. (cfr. 4.8. Zona e 4.9. Policy objects)&#xA;4.5. IPset&#xA;Gli ipset sono liste di subnet o di ip che definiscono le sorgenti nelle zone, nei policy object o nelle rich-rules. La centralizzazione della dichiarazione delle sorgenti disaccoppia la dichiarazione dal suo utilizzo.&#xA;&#xA;Per gli ipset basta indicarre, nome, tipo e una lista di entry.&#xA;firewall-cmd --permanent --new-ipset=&#34;nomeipset&#34; --type=type&#xA;firewall-cmd --permanent --ipset=&#34;nomeipset&#34; [--add-entry= subnet | ip]+&#xA;Di seguito, un elenco dei comandi di utilità disponibili per gli ipsets:&#xA;Restituisce tutti gli ipsets&#xA;firewall-cmd --permanent --get-ipsets&#xA;&#xA;Restituisce tutte le info di un ipset&#xA;firewall-cmd --permanent --info-ipset=&#34;nomeipset&#34;&#xA;&#xA;Restituisce la lista dei tipi di ipset:&#xA;firewall-cmd --get-ipset-types&#xA;&#xA;Restituisce tutte le entry di un ipset&#xA;firewall-cmd --permanent --ipset=&#34;nomeipset&#34; --get-entries&#xA;&#xA;Cancella un ipset&#xA;firewall-cmd --permanent --ipset=&#34;nomeipset&#34; --remove-entry=subnet | ip&#xA;&#xA;Cancella una (o più) entry da un ipset&#xA;firewall-cmd --permanent --ipset=&#34;nomeipset&#34; [--delete-entry=subnet | ip]+&#xA;&#xA;imposta / restituisce la descrizione di un ipset&#xA;firewall-cmd --permanent --ipset=&#34;nomeipset&#34; --set-description=&#34;descrizione&#34;&#xA;firewall-cmd --permanent --ipset=&#34;nomeipset&#34; --get-description&#xA;&#xA;imposta / restituisce la descrizione breve di un ipset&#xA;firewall-cmd --permanent --ipset=&#34;nomeipset&#34; --set-short=&#34;descrizionebreve&#34;&#xA;firewall-cmd --permanent --ipset=&#34;nomeipset&#34; --get-short-description&#xA;(rif. man ipset) &#xA;4.6. Rich-Rules&#xA;Le rich rules danno quel controllo granulare alle zone che è essenziale se si deve intervenire chirurgicamente per accettare o negare del traffico specifico.&#xA;&#xA;Le rich-rules hanno una sintassi leggermente più corposa dello standard firewalld, è un approccio simil-iptables, o meglio, simil-ufw, e vanno aggiunte o alle zone o alle policy. O a entrambe.&#xA;&#xA;Con le rich-rules possiamo abilitare o negare puntualmente il traffico (a seconda della action scelta),&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --add-rich-rule=&#39;rule family=&#34;ipv4 | ipv6&#34; \&#xA;  source address=&#34;nomeipset&#34; | subnet | ip \&#xA;  destination address=&#34;nomeipset&#34; | subnet | ip \&#xA;  # traffico indicato come servizio o come port:protocol&#xA;  service name=&#34;nomeservizio&#34; | port=port protocol=tcp|udp|sctp|dccp \&#xA;  log prefix=&#34;prefix&#34; \&#xA;  level=&#34;emerg | alert | crit | error | warning | notice | info | debug&#34; \&#xA;  limit value=&#34;rate/duration&#34; \&#xA;  # azioni&#xA;  accept | reject | drop | mark&#39;&#xA;configurare il masquerade,&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --add-rich-rule=&#39;rule family=&#34;ipv4 | ipv6&#34; \&#xA;  source address=&#34;nomeipset&#34; | &#34;subnet&#34; | &#34;ip&#34; \&#xA;  destination address=&#34;nomeipset&#34; | &#34;subnet&#34; | &#34;ip&#34; \&#xA;  masquerade&#39;&#xA;agire di fino sul NAT,&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --add-rich-rule=&#39;rule family=&#34;ipv4 | ipv6&#34; \&#xA;  source address=&#34;nomeipset&#34; | &#34;subnet&#34; | &#34;ip&#34; \&#xA;  destination address=&#34;nomeipset&#34; | &#34;subnet&#34; | &#34;ip&#34; \&#xA;  forward-port port=&#34;[port]+&#34; protocol=&#34;tcp|udp|sctp|dccp&#34; \&#xA;  to-port=&#34;[port]+&#34; to-addr=&#34;ip&#34;&#39;&#xA;bloccare traffico ICMP.&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --add-rich-rule=&#39;rule family=&#34;ipv4 | ipv6&#34; \ &#xA;  source address=&#34;nomeipset&#34; | &#34;subnet&#34; | &#34;ip&#34; \&#xA;  destination address=&#34;nomeipset&#34; | &#34;subnet&#34; | &#34;ip&#34; \&#xA;  [icmp-block name=&#34;nomeicmptype&#34; [drop | reject]]+&#xA;Di seguito una lista di comandi utili:&#xA;Rimozione di una rich-rule&#xA;firewall-cmd --permanent [--zone=&#34;nomezona&#34; | --policy=&#34;nomepolicy&#34;] --remove-rich-rule=&#39;rule&#39;&#xA;&#xA;Elenca tutte le rich-rules di una policy&#xA;firewall-cmd --permanent [--zone=&#34;nomezona&#34; | --policy=&#34;nomepolicy&#34;] --list-rich-rules&#xA;(rif. man rich-rules)&#xA;4.7. Forwarding e Masquerade&#xA;Firewalld gestisce il nat attraverso dei costrutti all&#39;interno delle zone, dei policy objects o delle rich-rules.&#xA;&#xA;In particolare, zone e policy consentono di configurare velocemente casi particolari di DNAT e SNAT, port forwarding e masquerade nello specifico, mentre per una gestione del DNAT più granulare si ricorre alle rich-rules, a livello di zona o di policy a seconda che si vogliano, al solito, manipolare i pacchetti quando entrano nella zona o quando il pacchetto transita tra le zone specifiche definite dalla policy.&#xA;&#xA;Esempio Port forwarding statico:&#xA;inoltra a 192.168.2.10:22, tutto ciò che la zona riceve sulla &#xA;porta 2222&#xA;firewall-cmd --permanent --zone=esterna --add-forward-port=port=2222:proto=tcp:to-port=22:to-addr=192.168.2.10&#xA;In questo modo inoltro tutto il traffico relativo alla zona.&#xA;&#xA;Se voglio un controllo più fine, devo ricorrere alla combo policy (o zona) +  rich-rules.&#xA;In questo modo posso arrivare a determinare quale sia l&#39;ip (o il gruppo di ip) client per il quale è abilitato l&#39;inoltro ed eventualmente verso quale ip pubblico server, potendone scegliere diversi, effettuare l&#39;inoltro.&#xA;&#xA;Esempio DNAT generico:&#xA;inoltro di tutto il traffico proveniente da un ip fisso &#xA;verso un ip privato, con remapping delle porte.&#xA;firewall-cmd --permanent --policy=&#34;esterna-interna&#34; \&#xA;--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \&#xA;  source address=&#34;93.12.34.56&#34; \&#xA;  forward-port port=&#34;5001-6000&#34; protocol=&#34;udp&#34; to-port=&#34;15001-16000&#34; to-addr=&#34;192.168.1.100&#34;&#39;&#xA;&#xA;stesso esempio di prima in cui il sorgente client è un gruppo &#xA;di ip (ipset) fissi &#xA;firewall-cmd --permanent --policy=&#34;esterna-interna&#34; \&#xA;--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \&#xA;  source ipset=&#34;myipset&#34; \&#xA;  forward-port port=&#34;80&#34; protocol=&#34;tcp&#34; to-port=&#34;8080&#34; to-addr=&#34;192.168.1.100&#34;&#39;&#xA;&#xA;In questo caso suppongo che il fw esponga più indirizzi pubblici.&#xA;Solo un ip specifico può inoltrare il suo traffico &#xA;richiedendolo ad uno degli indirizzi pubblici del firewall&#xA;firewall-cmd --permanent --policy=&#34;esterna-interna&#34; \&#xA;--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \&#xA;  source address=&#34;151.12.13.14&#34;    # ip client \&#xA;  destination address=&#34;9.10.20.31&#34; # ip pubblico fw \&#xA;  forward-port port=&#34;53947&#34; protocol=&#34;tcp&#34; to-port=&#34;3306&#34; to-addr=&#34;192.168.1.100&#34;&#39;&#xA;Esempio Masquerade:&#xA;firewall-cmd --permanent --zone=esterna --add-masquerade&#xA;Come nell&#39;esempio del port forwarding statico, il nat a livello di zona o di policy altera qualunque pacchetto che transita nella zona o nella policy.&#xA;&#xA;Anche qui, per avere un controllo migliore l&#39;approccio policy (o zona) + rich-rules risulta vincente.&#xA;In questo modo posso arrivare a scegliere quali dei server interni deve essere nattato ed eventualmente verso quali ip (snat condizionale).&#xA;nat di un singolo ip interno&#xA;firewall-cmd --permanent --policy=&#34;interna-esterna&#34; \&#xA;--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \&#xA;  source address=192.168.10.10 masquerade&#39;&#xA;&#xA;nat di un gruppo di ip interni (ipset)&#xA;firewall-cmd --permanent --policy=&#34;interna-esterna&#34; \&#xA;--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \&#xA;  source ipset=&#34;myipset&#34; masquerade&#39;&#xA;&#xA;nat di tutta la zona interna quando la destinazione è un ip &#xA;(o gruppo di ip) specifico&#xA;firewall-cmd --permanent --policy=&#34;interna-esterna&#34; \&#xA;--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \&#xA;  destination ipset=&#34;myipset&#34; masquerade&#39;&#xA;&#xA;o, al contrario, si vuole nattare tutta la rete interna, o un&#xA;suo segmento, TRANNE il traffico destinato ad UN&#39;ALTRA rete&#xA;specifica (es. una vpn o altro).&#xA;firewall-cmd --permanent --policy=&#34;interna-esterna&#34; \&#xA;--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \&#xA;  source address=&#34;myipset&#34;&#xA;  destination not address=&#34;10.4.10.0/24&#34; masquerade&#39;&#xA;&#xA;nat di un gruppo di ip solo per il servizio web&#xA;firewall-cmd --permanent --new-service=&#34;navigazioneweb&#34;&#xA;firewall-cmd --permanent --service=&#34;navigazioneweb&#34; \&#xA;  --add-include=&#34;http&#34; \&#xA;  --add-include=&#34;https&#34; \&#xA;  --add-include=&#34;dns&#34;&#xA;&#xA;firewall-cmd --permanent --policy=&#34;interna-esterna&#34; \&#xA;--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \&#xA;  source ipset=&#34;myipset&#34; \&#xA;  service name=&#34;navigazioneweb&#34; masquerade&#39;&#xA;4.8. Zona&#xA;Per creare una zona basta assegnarle un nome e associarle una o più interfacce e/o una o più sorgente di indirizzi ip.&#xA;&#xA;Una zona senza alcun binding non è attiva.&#xA;firewall-cmd --permanent --new-zone=&#34;nomezona&#34;&#xA;&#xA;aggiunge un&#39;interfaccia&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; [--add-interface=&#34;nomeinterfaccia&#34;]+&#xA;&#xA;aggiunge sorgenti&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; [--add-source=subnet | ip | &#34;nomeipset&#34;]+&#xA;Se nella configurazione sono presenti sia l&#39;interfaccia che le sorgenti di ip, sto dichiarando che tutto ciò che transita per l&#39;interfaccia o che rientra nelle sorgenti indicate, ricadrà nelle regole della zona.&#xA;&#xA;Faccio notare che Il binding (sorgenti o interfacce) funziona in aggiunta, non restringe ciò che ad es. transita dall&#39;interfaccia.&#xA;Tenete bene a mente che nella gestione del routing dei pacchetti verso le zone che fa firewalld, vengono valutate prima le sorgenti e dopo l&#39;interfaccia.&#xA;&#xA;Se avessi l&#39;esigenza di restringere il traffico nella zona, si potrebbe pensare di limitare il binding alle sole sorgenti, escludendo l&#39;interfaccia, in modo che qualunque pacchetto che non provenga dagli ip o dalle subnet, a prescindere dall&#39;interfaccia, indicate venga respinto (in base alla politica della zona).&#xA;&#xA;Va tenuto presente che configurazioni di questo tipo, per quanto pulite e semplici da realizzare, possono dare luogo ad errori estremamente subdoli e pericolosissimi (vedremo un esempio in seguito).&#xA;&#xA;Tutti i pacchetti che, transitando per l&#39;host, non vengono assorbiti da alcuna zona, saranno gestiti dalla zona di default.&#xA;&#xA;Di seguito una lista di comandi utili:&#xA;restituisce la zona di default&#xA;firewall-cmd --get-default-zone&#xA;&#xA;setta la zona di default&#xA;firewall-cmd --set-default-zone=&#34;nomezona&#34;&#xA;&#xA;restituisce tutte le zone attive (tutte quelle con un binding ad un&#39;interfaccia e/o ad un sorgente)&#xA;firewall-cmd --get-active-zones&#xA;&#xA;restituisce tutte le zone accoppiate ad una specifica interfaccia/sorgente&#xA;firewall-cmd --permanent --get-zone-of-interface=&#34;nomeinterfaccia&#34;&#xA;firewall-cmd --permanent --get-zone-of-source=subnet | ip | &#34;nomeipset&#34;&#xA;&#xA;restituisce info dettagliate sulla zone&#xA;firewall-cmd --permanent --info-zone=&#34;nomezona&#34;&#xA;&#xA;elenca tutte le zone&#xA;firewall-cmd --permanent --list-all-zones&#xA;&#xA;cancella una zona&#xA;firewall-cmd --permanent --delete-zone=&#34;nomezona&#34;&#xA;&#xA;###########&#xA;Servizi &#xA;###########&#xA;aggiungi / cancella servizi da una zona o dalla zona attiva (se il nome zona non è specificato)&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; [--add-service=&#34;nomeservizio&#34;]+&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; [--remove-service=&#34;nomeservizio&#34;]+&#xA;&#xA;######################&#xA;porte e protocolli &#xA;######################&#xA;elencare tutte le porte e i protocolli della zona&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --list-ports&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --list-protocols&#xA;&#xA;aggiungere/cancellare una porta alla zona&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; [--add-port=port/tcp | udp | sctp | dccp]+&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; [--remove-port=port/tcp | udp | sctp | dccp]+&#xA;&#xA;aggiungere/cancellare un protocollo alla zona&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --add-protocol=protocol&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --remove-protocol=protocol&#xA;&#xA;##############&#xA;Rich-rules &#xA;##############&#xA;aggiungere/cancellare un protocollo alla zona&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --add-rich-rule=&#34;nomerich-rule&#34;&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --remove-rich-rule=&#34;nomerich-rule&#34;&#xA;&#xA;#############&#xA;ICMP Type &#xA;#############&#xA;inverte / disattiva la logica del blocco icmp nella zona (attiva / disattiva whitelist)&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --add-imcp-block-inversion&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --remove-imcp-block-inversion&#xA;&#xA;aggiunge un tipo icmp alla whitelist/blacklist&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; [--add-imcp-block=&#34;tipoicmp&#34;]+&#xA;&#xA;rimuove un tipo icmp dalla whitelist/blacklist&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; [--remove-imcp-block=&#34;tipoicmp&#34;]+&#xA;&#xA;##############&#xA;Masquerade &#xA;##############&#xA;aggiunge / rimuove il masquerade&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --add-masquerade&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --remove-masquerade&#xA;&#xA;###########################&#xA;Port forwarding statico &#xA;###########################&#xA;aggiunge / rimuove il port forwarding&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --add-forward-port=port=port-port]:proto=[tcp|udp|sctp|dccp]:to-port=port[-port&#xA;firewall-cmd --permanent --zone=&#34;nomezona&#34; --remove-forward-port=port=port-port]:proto=[tcp|udp|sctp|dccp]:to-port=port[-port&#xA;&#xA;es. di inoltro veerso un ip interno di un range di porte con offset deterministico&#xA;firewall-cmd --permanent --zone=&#34;esterna&#34; --add-forward-port=port=2501-3000:proto=tcp:to-port=5001-5500:to-addr=192.168.10.20&#xA;firewall-cmd --permanent --zone=&#34;esterna&#34; --remove-forward-port=port=2501-3000:proto=tcp:to-port=5001-5500:to-addr=192.168.10.20&#xA;(rif. man zone)&#xA;4.9. Policy Objects&#xA;I policy objects, presenti dall&#39;ormai lontano 2020 con la versione 0.9.0, hanno posto le basi per il futuro di firewalld. È il posto in cui si concentrano le policy di filtraggio sia per il traffico intra-zona che, soprattutto, per il traffico inter-zona.&#xA;&#xA;I policy objects cambiano radicalmente il disegno delle regole che, come detto in precedenza, vengono disaccoppiate dalla dichiarazione della zona che rimane il luogo in cui viene effettuato principalmente il trust delle sorgenti.&#xA;&#xA;Conseguenza immediata è una notevole flessibilità perché ho la possibilità di variare dinamicamente le regole da applicare alle zone semplicemente aggiungendo le policy opportune.&#xA;&#xA;Lavorare sulle zone è più immediato ma più lo scenario diventa articolato, più le configurazioni si complicano, oltre al fatto che alcune cose come il routing e l&#39;inoltro, con le sole zone non sono proprio realizzabili&#xA;&#xA;Le policy, al contrario, richiedono una maggiore complessità iniziale ma ha il vantaggio di mantenere il disegno generale più pulito nei casi in cui le configurazioni cambino con una certa frequenza o tendano a diventare via via più articolate.&#xA;&#xA;Nel seguito mostrerò degli esempi di configurazioni  fatte in modalità zone-oriented e policy-oriented.&#xA;&#xA;Gli elementi costitutivi del policy object sono il nome, il target policy (di base, &#34;default&#34;), la specifica della direzione del traffico, uno o più servizi da abilitare.&#xA;firewall-cmd --permanent --new-policy=&#34;nomepolicy&#34;&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --set-target=DROP | REJECT | ACCEPT | CONTINUE&#xA;&#xA;definizione della direzione del traffico&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; [--add-ingress-zone=HOST | &#34;nomezona&#34; | ANY]+&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; [--add-egress-zone=HOST | &#34;nomezona&#34; | ANY]+&#xA;&#xA;traffico consentito&#xA;firewall-cmd per --permanent --policy=&#34;nomepolicy&#34; [--add-service=&#34;nomeservizio&#34;]+&#xA;Di seguito, una lista di comandi utili:&#xA;elenco, sintetico o dettagliato, di tutti i policy objects&#xA;firewall-cmd --get-policies&#xA;firewall-cmd --permanent --list-all-policies&#xA;&#xA;estrae tutti i componenti della policy&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --list-all&#xA;&#xA;restituisce le ingress / egress zone&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --list-egress-zones&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --list-ingress-zones&#xA;&#xA;restituisce i servizi&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --list-services&#xA;&#xA;restituisce le rich-rules&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --list-rich-rules&#xA;&#xA;info di un policy object&#xA;firewall-cmd --permanent --info-policy=&#34;nomepolicy&#34;&#xA;&#xA;cambiare target di un policy object&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --set-target=DROP | REJECT | ACCEPT | CONTINUE&#xA;&#xA;eliminare un policy object&#xA;firewall-cmd --permanent --delete-policy=&#34;nomepolicy&#34;&#xA;&#xA;###########&#xA;Servizi &#xA;###########&#xA;aggiungi / cancella servizi dal policy object specificato&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; [--add-service=&#34;nomeservizio&#34;]+&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; [--remove-service=&#34;nomeservizio&#34;]+&#xA;&#xA;######################&#xA;Porte e protocolli &#xA;######################&#xA;elencare tutte le porte e i protocolli del policy object specificato&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --list-ports&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --list-protocols&#xA;&#xA;aggiungere/cancellare una porta dal policy object specificato&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; [--add-port=port/tcp | udp | sctp | dccp]+&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; [--remove-port=port/tcp | udp | sctp | dccp]+&#xA;&#xA;aggiungere/cancellare un protocollo dal policy object specificato&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --add-protocol=[tcp | udp | sctp | dccp]&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --remove-protocol=[tcp | udp | sctp | dccp]&#xA;&#xA;##############&#xA;Rich-rules &#xA;##############&#xA;aggiungere/cancellare una (o più) rich-rule dal policy object specificato&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; [--add-rich-rule=&#34;nomerich-rule&#34;]+&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; [--remove-rich-rule=&#34;nomerich-rule&#34;]+&#xA;&#xA;##############&#xA;ICMP Types &#xA;##############&#xA;Aggiunge un tipo icmp alla whitelist/blacklist&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; [--add-imcp-block=&#34;tipoicmp&#34;]+&#xA;&#xA;Rimuove un tipo icmp dalla whitelist/blacklist&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; [--remove-imcp-block=&#34;tipoicmp&#34;]+&#xA;&#xA;##############&#xA;Masquerade &#xA;##############&#xA;aggiunge / rimuove il masquerade&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --add-masquerade&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --remove-masquerade&#xA;&#xA;###########################&#xA;Port forwarding statico &#xA;###########################&#xA;aggiunge / rimuove il port forwarding&#xA;firewall-cmd --permanent --policy=&#34;nomepolicy&#34; --add-forward-port=port=port-port]:proto=[tcp | udp | sctp | dccp]:to-port=port[-port&#xA;firewall-cmd --permanent --policy=&#34;nome_policy&#34; --remove-forward-port=port=port-port]:proto=[tcp | udp | sctp | dccp]:to-port=port[-port&#xA;&#xA;es. di inoltro veerso un ip interno di un range di porte con offset deterministico&#xA;firewall-cmd --permanent --policy=&#34;wan-to-lan&#34; --add-forward-port=port=2501-3000:proto=tcp:to-port=5001-5500:to-addr=192.168.10.20&#xA;firewall-cmd --permanent --zone=&#34;wan-to-lan&#34; --remove-forward-port=port=2501-3000:proto=tcp:to-port=5001-5500:to-addr=192.168.10.20&#xA;(rif. man policy, man policies)&#xA;4.10. Comandi di utilità generale&#xA;Di seguito, un elenco dei comandi di utilità generale disponibili per firewalld:&#xA;Restituisce lo stato di firewalld&#xA;firewall-cmd --state&#xA;&#xA;Riavvia firewalld&#xA;firewall-cmd --reload&#xA;&#xA;Riavvia firewalld ricaricando anche i moduli netfilter del kernel&#xA;firewall-cmd --complete-reload&#xA;&#xA;Restituisce il log level di firewalld&#xA;firewall-cmd --get-log-denied&#xA;&#xA;Imposta il log level di firewalld&#xA;firewall-cmd --set-log-denied=all | unicast | broadcast | multicast | off&#xA;&#xA;Rende permanente tutte le configurazioni effimere di firewalld. Necessario il reload.&#xA;firewall-cmd --runtime-to-permanent&#xA;&#xA;Kill switch ON /OFF&#xA;firewalld --panic-on&#xA;firewalld --panic-off&#xA;&#xA;Stato Kill switch [0 | 1]&#xA;firewalld --query-panic&#xA;&#xA;#firewall #firewallcmd #firewalld #iptables #netfilter  #nftables #ufw]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/b5862bd14-4506fa/gBxZ8Bb3JsyX/aoPYucfwCvDfgYXOXGHOkG7aqrFBwjspQetNhz0S.jpg" alt="tux-firewalld"></p>

<hr>

<p><strong>N.B. Sono stato costretto a spezzare l&#39;articolo perché, quello originale di 8836 parole (per un totale di 76309 bytes effettivi), veniva troncato dopo il salvataggio a 7533 parole (65.356 bytes), cosa che mi fa sospettare che la grandezza del body non possa superare i 64k.</strong></p>

<hr>

<p><strong>firewalld</strong> fornisce funzionalità firewall fungendo da frontend per <strong>netfilter</strong>.</p>

<p>Nell&#39;interagire con netfilter, analogamente a <strong>ufw</strong> con <strong>iptables</strong>, firewalld usa come backend <strong>nftables</strong>, un tool nella user-space del kernel linux, che va a sostituire proprio <strong>iptables</strong>. Entrambi i backend forniscono filtraggio e classificazione dei pacchetti di rete /datagrammi/frame.
</p>
<ul><li><a href="#1-come-ragiona-firewalld" rel="nofollow">1. Come ragiona firewalld</a></li>
<li><a href="#2-come-procedo-nella-configurazione-di-firewalld" rel="nofollow">2. Come procedo nella configurazione di Firewalld?</a></li>
<li><a href="#3-il-man-di-firewall-cmd" rel="nofollow">3. Il man di firewall-cmd</a></li>
<li><a href="#4-come-configurare-firewalld" rel="nofollow">4. Come configurare firewalld</a>
<ul><li><a href="#4-1-helpers" rel="nofollow">4.1. Helpers</a></li>
<li><a href="#4-2-servizi" rel="nofollow">4.2. Servizi</a></li>
<li><a href="#4-3-gestione-icmp" rel="nofollow">4.3. Gestione ICMP</a></li>
<li><a href="#4-4-porte-e-protocolli" rel="nofollow">4.4. Porte e protocolli</a></li>
<li><a href="#4-5-ipset" rel="nofollow">4.5. IPset</a></li>
<li><a href="#4-6-rich-rules" rel="nofollow">4.6. Rich-Rules</a></li>
<li><a href="#4-7-forwarding-e-masquerade" rel="nofollow">4.7. Forwarding e Masquerade</a></li>
<li><a href="#4-8-zona" rel="nofollow">4.8. Zona</a></li>
<li><a href="#4-9-policy-objects" rel="nofollow">4.9. Policy Objects</a></li>
<li><a href="#4-10-comandi-di-utilit%C3%A0-generale" rel="nofollow">4.10. Comandi di utilità generale</a></li></ul></li></ul>

<p>Attualmente ufw usa ancora iptables ma in modalità legacy, consistente in uno strato software che traduce i comandi iptables nei corrispondenti comandi nftables.</p>

<p>Firewalld supporta le zone di rete/firewall che definiscono il livello di fiducia delle connessioni o delle interfacce di rete.</p>

<p>C&#39;è una separazione fra runtime e configurazione permanente che consente di testare una configurazione prima di renderla effettiva.</p>

<p>firewalld, con nftables, è certamente il frontend ideale per netfilter dal momento che recepisce tutte le sue innovazioni. La possibilità di usare, nella stessa cli, filtraggio, routing, snat e dnat per es. rende l&#39;esperienza certamente più omogenea (con ufw, masquerade e port-forwarding richiedono una gestione aggiuntiva direttamente con iptables per ora).</p>

<p>Sebbene destinato ad essere rimpiazzato, iptables continua ad avere una sua specificità visto che viene ancora usato da docker per agire direttamente su netfilter bypassando eventuali firewall locali quano deve esporre una porta.</p>

<p>Con l&#39;attuale versione di docker, la 29, è stato introdotto il supporto diretto su nftables in via sperimentale.</p>

<p>Ad ogni modo, chi approccia per la prima volta a <strong>firewalld</strong> (come è successo a me) all&#39;inizio può essere sopraffatto dall&#39;allegro affollamento di opzioni a disposizione.</p>
<ul><li>zone</li>
<li>porte</li>
<li>protocolli</li>
<li>servizi</li>
<li>policy objects</li>
<li>rich-rules</li>
<li>port forwarding</li>
<li>masquerade</li>
<li>ipset</li>
<li>helper</li>
<li>....</li></ul>

<p>La gui (<strong>firewall-config</strong>) mette certamente ordine ma non aiuta fino in fondo. Oltre a questo la gui non racchiude tutta la logica della cli (ad es. mancano i policy objects).</p>

<p>La cli di firewalld è il riferimento e come tutte le cli, può spaventare.</p>

<p>In realtà la cli, <strong>firewall-cmd</strong> nello specifico, è una delle più pulite e lineari che conosca, basta conoscere gli la logica a oggetti che governa firewalld.</p>

<h2 id="1-come-ragiona-firewalld">1. Come ragiona firewalld</h2>

<p>Se guardassi firewalld dall&#39;alto, riconoscerei 7 oggetti principali:</p>
<ul><li>Zone</li>
<li>Policy Objects</li>
<li>Services</li>
<li>IPSet</li>
<li>ICMP Types</li>
<li>Helper</li>
<li>Direct Options (Deprecato)</li></ul>

<p><strong>Zone</strong>: è un po&#39; il tratto distintivo di firewalld. Concettualmente rappresenta il livello di fiducia che si ha nei confronti di una rete connessa a una specifica interfaccia (es. eth0) o di un indirizzo IP. Ogni pacchetto dati che <strong>entra</strong> nel server viene catturato da una zona in base alla sua sorgente o all&#39;interfaccia da cui arriva. È qui che avviene la configurazione del traffico in ingresso.</p>

<p><strong>Policy Objects</strong>: è una delle novità di firewalld. I policy object nascono per gestire il traffico inter-zona. Inizialmente il filtraggio avveniva <strong>all&#39;interno</strong> dell&#39;oggetto (la zona) che accoglie il pacchetto, ora viene disaccoppiato e trasferito in un altro oggetto che <strong>gestisce il transito</strong> dei pacchetti tra una zona e l&#39;altra (o se stessa).
In questo modo cambia profondamente il paradigma di manipolazione dei pacchetti. La zona attiva il filtraggio quando <strong>il pacchetto entra</strong> da una delle sorgenti associate alla zone. La policy, attiva il filtraggio quando <strong>il pacchetto transita</strong> tra le zone specifiche definite dalla policy.</p>

<p><strong>Services</strong>: rappresenta ciò che esponiamo (o che dobbiamo raggiungere, se filtriamo il traffico in uscita dal nostro host quando si comporta da client).</p>

<p>L&#39;<strong>IPSet</strong>: permette di definire dei blocchi di ip a cui applicare regole massivamente invece che definirle puntalmente.</p>

<p><strong>ICMP Types</strong>: è relativo ai pacchetti ICMP e permette di rendere disponibile il pacchetto scelto al traffico di tipo ipv4 e/o ipv6</p>

<p><strong>Helper</strong>: torna comodo invece per quei protocolli che aprono una connessione su una porta e poi negoziano dinamicamente <strong>un&#39;altra porta</strong> per il trasferimento dei dati (es. ftp, netbios-ns, sip, vecchi protocolli di gaming/streaming ecc.). Invece che aprire un intervallo ampio di porte, l&#39;helper, che è un modulo del kernel, “ascolta” il flusso di controllo, capisce quale porta casuale sta per essere usata e la apre temporaneamente al volo solo per quel trasferimento.</p>

<p><strong>Direct Options</strong>: le direct options (ormai deprecate e sostituite dai policy objects) sono la parte legacy di firewalld attraverso cui parla con <strong>iptables</strong> invece che con <strong>nftables</strong>.</p>

<p>Questi sono gli oggetti principali su cui si costruiscono le regole per il firewall attraverso una sintassi molto corposa ma ragionata e lineare.</p>

<p>La cli mette a disposizione delle istruzioni per fare praticamente qualunque cosa:</p>
<ul><li>visualizzare lo stato del firewall;</li>
<li>istanziare gli oggetti;</li>
<li>combinare gli oggetti istanziati al fine di creare la nostra logica di firewalling;</li>
<li>effettuare delle query di verifica esistenziale sugli oggetti;</li>
<li>effettuare il binding delle zone con interfacce o sorgenti;</li></ul>

<p>Da tenere presente che la configurazione di firewalld, come iptables, può essere <strong>effimera</strong>. Se la configurazione a caldo non viene resa “permanente”, produce effetti fino a quando il servizio viene riavviato. Quando avviene, lo stato di firewalld ritorna ad essere quello che era prima delle modifiche.</p>

<h2 id="2-come-procedo-nella-configurazione-di-firewalld">2. Come procedo nella configurazione di Firewalld?</h2>

<p>Come abbiamo visto, firewalld ha una logica di funzionamento molto più versatile di iptables, decisamente più rigido al confronto.
Questa versatilità però può portare a rendere gli scenari più caotici potendo mescolare diverse tecniche di filtraggio.
Come dire, il solito problema della scelta quando ce n&#39;è troppa.</p>

<p>My two cents:</p>
<ol><li>Se l&#39;esigenza è quella di configurare un firewall personale, è sufficiente configurare opportunamente zone e servizi.</li>
<li>Se bisogna tenere in considerazione traffico inter-zona (in presenza di più interfacce per es.) ci vengono in aiuto i policy objects.</li>
<li>Se abbiamo ulteriori esigenze di granularità, la zona permette di definire delle rich-rules.</li></ol>

<p>Un canovaccio del genere aiuta a mantenere la configurazione pulita, altrimenti potrei sporcarla in mille modi differenti rendendo però complicata la manutenzione futura.</p>

<p>Cercando di mettere a fattor comune quello che faccio con firewall-cmd la maggior parte delle volte, se volessi configurare un firewall personale secondo il canovaccio di cui sopra, i passi da fare sono i seguenti:</p>
<ol><li>creo la zona</li>
<li>se non sono presenti nel default perché magari le porte dei servizi sono custom, creo anche i servizi (descrizione, porta/e e protocollo/i)</li>
<li>nella configurazione della zona, faccio il binding con l&#39;interfaccia e con i servizi (eventualmente custom) che ho definito.</li></ol>

<p>Stop.</p>

<p>Non occorre altro.</p>

<p>Ma firewalld permette anche configurazioni molto più borderline.</p>

<p>Nella mia zona potrei non avere alcun oggetto di tipo servizio ma potrei semplicemente assegnare direttamente una sbrodolata di porte e protocolli.</p>

<p>Oppure potrei lavorare direttamente con le rich-rules (approccio simil-ufw).</p>

<p>Oppure potrei affidare la logica direttamente ai policy objects.</p>

<p>Personalmente, tutte queste alternative (a parte l&#39;ultima) le vedo più come un esercizio accademico senza una reale utilità pratica perché in scenari complessi questi approcci possono dar luogo a configurazioni estremamente caoitche.</p>

<h2 id="3-il-man-di-firewall-cmd">3. Il man di firewall-cmd</h2>

<p>Il man di firewall-cmd è molto chiaro e lineare e sarebbe bene tenerlo presente quando ci si lavora per le prime volte.</p>

<p>È strutturato in 3 grossi blocchi:</p>

<p><strong>Sezioni di carattere generale. Stato firewall, verbosity log, salvataggio configurazioni, ecc</strong></p>
<ul><li>General Options</li>
<li>Status Options</li>
<li>Log Denied Options</li>
<li>Permanent Options</li>
<li>Panic Options</li></ul>

<p><strong>Sezioni per la configurazione delle componenti core. Zone , Policy Objects, IPSet, Service, ecc.</strong></p>
<ul><li>Zone Options</li>
<li>Policy Options</li>
<li>IPSet Options</li>
<li>Service Options</li>
<li>Helper Options</li>
<li>ICMP type Options</li>
<li>Direct Options (deprecato)</li></ul>

<p><strong>Sezioni per l&#39;interrogazione e la configurazione delle combinazioni fra zone, policy objects, interfacce e sorgenti</strong></p>
<ul><li>Options to Adapt and Query Zones and Policies</li>
<li>Options to Adapt and Query Zones</li>
<li>Options to Adapt and Query Policies</li>
<li>Options to Handle Bindings of Interfaces</li>
<li>Options to Handle Bindings of Sources</li></ul>

<h2 id="4-come-configurare-firewalld">4. Come configurare firewalld</h2>

<p>Come anticipato, la configurazione della zona con associati servizi, interfaccia e sorgenti, è tutto ciò che serve.</p>

<p>Se le mie policy sono complesse e ho necessità di centralizzarle, posso usare i <strong>policy objects</strong>.</p>

<p>Se si deve intervenire chirurgicamente per impedire o abilitare del traffico, ci sono le <strong>rich-rules</strong>.</p>

<p>In sostanza, tutto ruota attorno a due grossi item, le <strong>zone</strong> e i <strong>policy objects</strong>, che, forse in maniera un po&#39; ridondante, combinano una serie di componenti che concorrono a formare la logica di firewalling.</p>

<p>Per entrare nel merito della configurazione partirò da quelle che per me sono le “foglie” di un ipotetico albero che, attraverso una serie di inclusioni, termina con 2 grosse radici: zone o police objects.</p>

<p>Fra gli elementi terminali nella gerarchia di firewalld, per me, ci sono gli <strong>helpers</strong> che poi concorrono a formare i <strong>servizi</strong> che insieme a <strong>porte e protocolli</strong>, <strong>IPset</strong>, <strong>forwarding</strong>, <strong>masquerade</strong> finiranno in <strong>zone</strong>, <strong>policy objects</strong> e <strong>rich-rules</strong>.</p>

<h3 id="4-1-helpers">4.1. Helpers</h3>

<p>Gli <strong>helpers</strong> sono degli oggetti basati sul modulo <strong>nf_conntrack</strong> del kernel Netfilter, che permettono di tracciare le connessioni, per la precisione sono delle interfacce che permettono a firewalld di caricare e configurare il relativo modulo <strong>nf_conntrack</strong> del kernel.</p>

<p>Ci sono protocolli come ftp, tftp, alcuni protocolli di gaming, voip ecc. che, oltre che esporre la porta per essere contattati, in un secondo momento devono negoziare dinamicamente con il client un&#39;altra porta per lo scambio dei dati.</p>

<p>Questo tipo di servizi non è facilmente controllabile senza gli helpers perché la negoziazione dinamica imporrebbe di aprire un set molto ampio di porte.</p>

<p>Con gli helpers le connessioni di questi servizi “anomali” verranno tracciate in modo che, quando dal cliente arriva un pacchetto che richiede l&#39;apertura di una porta random per lo scambio dati, quella connessione verrà marchiata come <strong>RELATED</strong>, che come tutto il traffico <strong>RELATED</strong> viene accettata nativamente, invece che come <strong>NEW</strong> che sarebbe destinata ad essere scartata.</p>

<p>Gli helpers, lista dei quali disponibile con:</p>

<pre><code class="language-bash">firewall-cmd --get-helpers
</code></pre>

<p>corrispondono all&#39;incirca ai moduli <strong>nf_conntrack</strong> presenti nel kernel Netfilter e si trovano in <code>/lib/modules/$(uname -r)/kernel/net/netfilter</code>.</p>

<p>Andranno aggiunti ai servizi, qualora servissero, in modo che firewalld accetti, e solo per quei servizi, connessioni da porte dinamiche.</p>

<p><strong>Un po&#39; di storia</strong>
In passato, il kernel linux abilitava (con qualcosa tipo <code>nf_conntrack_helper=1</code>) gli helpers per default su tutto il traffico favorendo attacchi basati sullo spoofing dei pacchetti con cui farsi aprire porte a caso.</p>

<p>Poi quest&#39;opzione è stata prima disabilitata di defautl con <code>nf_conntrack_helper=0</code> permettendo un&#39;attivazione prudente solo da file di configurazione con <code>AutomaticHelpers=yes/no/system</code>, poi è stata definitivamente rimossa sia dal kernel che dal file di configurazione.</p>

<p>Oggi, per attivare gli helper, basta dichiararli e associarli ad un servizio. Firewalld provvederà a caricare dinamicamente solo i moduli del kernel Netfilter necessari gestendo sia la porta dalla quale il servizio verrà contattato sia le porte dinamiche che verranno negoziate per lo scambio dei dati.</p>

<pre><code class="language-bash"># restituisce tutte le informazioni di un helper
firewall-cmd --permanent --info-helper=&#34;&lt;nome_helper&gt;&#34;

# dichiaro un nuovo helper
firewall-cmd --permanent --new-helper=&#34;&lt;nome_helper&gt;&#34; --module=nf_conntrack_&lt;nome_modulo&gt;

# restituisce tutti gli helper presenti
firewall-cmd --permanent --get-helpers

# imposta / restituisce una descrizione
firewall-cmd --permanent --helper=&#34;&lt;nome_helper&gt;&#34; --set-description=&#34;&lt;descrizione&gt;&#34;
firewall-cmd --permanent --helper=&#34;&lt;nome_helper&gt;&#34; --get-description

# imposta / restituisce una descrizione breve
firewall-cmd --permanent --helper=&#34;&lt;nome_helper&gt;&#34; --set-short=&#34;&lt;descrizione&gt;&#34;
firewall-cmd --permanent --helper=&#34;&lt;nome_helper&gt;&#34; --get-short

# aggiunge/rimuove la porta o il range di porte dall&#39;helper
firewall-cmd --permanent --helper=&#34;&lt;nome_helper&gt;&#34; --add-port=&lt;port&gt;[-&lt;port&gt;]/&lt;protocol&gt;
firewall-cmd --permanent --helper=&#34;&lt;nome_helper&gt;&#34; --remove-port=&lt;port&gt;[-&lt;port&gt;]/&lt;protocol&gt;

# restituisce tutte le porte associate all&#39;helper
firewall-cmd --permanent --helper=&#34;&lt;nome_helper&gt;&#34; --get-ports

# imposta / restituisce un modulo per l&#39;helper
firewall-cmd --permanent --helper=&#34;&lt;nome_helper&gt;&#34; --set-module=nf_conntrack_&lt;nome_modulo&gt;
firewall-cmd --permanent --helper=&#34;&lt;nome_helper&gt;&#34; --get-module

# rimuove un helper da sistema
--permanent --delete-helper=&#34;&lt;nome_helper&gt;&#34;
</code></pre>

<h3 id="4-2-servizi">4.2. Servizi</h3>

<p>Per creare un servizio, si assegna un nome e un insieme di porte e protocolli.</p>

<pre><code class="language-bash">firewall-cmd --permanent --new-service=&#34;&lt;nome_servizio&gt;&#34;
firewall-cmd --permanent --service=&#34;&lt;nome_servizio&gt;&#34; --set-description=&#34;Descrizione del servizio&#34;
firewall-cmd --permanent --service=&#34;&lt;nome_servizio&gt;&#34; [--add-port=&lt;port&gt;/tcp | udp | sctp | dccp]+
</code></pre>

<p>Di seguito una lista di comandi utili:</p>

<pre><code class="language-bash"># elenco di tutti i servizi
firewall-cmd --get-services
# elenco dei servizi della zona attiva
firewall-cmd --list-services
# elenco dei servizi di una determinata zona
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --list-services
# restituisce le info di un servizio
firewall-cmd --permanent --info-service=&#34;&lt;nome_servizio&gt;&#34;

# imposta / restituisce una descrizione
firewall-cmd --permanent --service=&#34;&lt;nome_servizio&gt;&#34; --get-description
firewall-cmd --permanent --service=&#34;&lt;nome_servizio&gt;&#34; --set-description=&#34;&lt;descrizione&gt;&#34;

# imposta / restituisce una descrizione breve
firewall-cmd --permanent --service=&#34;&lt;nome_servizio&gt;&#34; --get-short-description
firewall-cmd --permanent --service=&#34;&lt;nome_servizio&gt;&#34; --set-short-description=&#34;&lt;descrizione&gt;&#34;

# restituisce tutte le porte del servizio
firewall-cmd --permanent --service=&#34;&lt;nome_servizio&gt;&#34; --get-ports

# imposta / restituisce un (o più) protocollo di un servizio
firewall-cmd --permanent --service=&#34;&lt;nome_servizio&gt;&#34; --get-protocols
firewall-cmd --permanent --service=&#34;&lt;nome_servizio&gt;&#34; [--add-protocol=tcp | udp | sctp | dccp]+

# rimozione (porta, protocollo) / protocollo
firewall-cmd --permanent --service=&#34;&lt;nome_servizio&gt;&#34; [--remove-port=&lt;port&gt;/tcp | udp | sctp | dccp]+
firewall-cmd --permanent --service=&#34;&lt;nome_servizio&gt;&#34; [--remove-protocol=tcp | udp | sctp | dccp]+

# aggiunge / rimuove un helper da un servizio
firewall-cmd --permanent --service=&#34;&lt;nome_servizio&gt;&#34; --add-helper=&#34;&lt;nome_helper&gt;&#34;
firewall-cmd --permanent --service=&#34;&lt;nome_servizio&gt;&#34; --remove-helper=&#34;&lt;nome_helper&gt;&#34;

# restituisce gli helper collegati al servizio
firewall-cmd --permanent --service=&#34;&lt;nome_servizio&gt;&#34; --get-service-helpers

# elimina un servizio
firewall-cmd --permanent --delete-service==&#34;&lt;nome_servizio&gt;&#34;
</code></pre>

<p>(rif. <a href="https://firewalld.org/documentation/man-pages/firewalld.service.html" rel="nofollow">man service</a>)</p>

<h3 id="4-3-gestione-icmp">4.3. Gestione ICMP</h3>

<p>Il traffico ICMP viene impostato a livello di zona o a livello di policy object.</p>

<p>Al solito, agire a livello di zona è più semplice, usare i policy objects permette di guadagnare in modularità e scalabilità.</p>

<p>Di default, ICMP lavora su <strong>blacklist</strong>. È tutto consentito tranne ciò che viene esplicitamente vietato con le istruzioni <code>--add-icmp-block</code> per aggiungere il tipo icmp che si vuole bloccare o <code>--remove-icmp-block</code> per rimuovere il blocco.</p>

<p>È possibile invertire la logica di funzionamento, a livello globale o di singola zona, passando ad una <strong>whitelist</strong>. È tutto vietato tranne cio che è consentito con <code>--add-icmp-block</code> (un po&#39; fuorviante, ne convengo). <code>--remove-icmp-block</code> rimuove il consenso.</p>

<p>Di seguito, un elenco dei comandi di utilità disponibili per gli icmptype:</p>

<pre><code class="language-bash"># Elenca tutti gli icmptype
firewall-cmd --get-icmptypes

# inverte / disattiva globalmente la logica del blocco icmp (attiva / disattiva whitelist)
firewall-cmd --permanent --add-icmp-block-inversion
firewall-cmd --permanent --remove-icmp-block-inversion

# Creazione e cancellazione di un icmptype
firewall-cmd  --permanent --new-icmptype=&#34;&lt;nome icmptype&gt;&#34;
firewall-cmd  --permanent --delete-icmptype=&#34;&lt;nome icmptype&gt;&#34;

# imposta / restituisce la descrizione di un icmptype
firewall-cmd  --permanent --icmptype=&#34;&lt;nome icmptype&gt;&#34; --set-description=&#34;&lt;descrizione&gt;&#34;
firewall-cmd  --permanent --icmptype=&#34;&lt;nome icmptype&gt;&#34; --get-description

# imposta / restituisce la descrizione breve di un icmptype
firewall-cmd  --permanent --icmptype=&#34;&lt;nome icmptype&gt;&#34; --set-short=&#34;&lt;descrizione&gt;&#34;
firewall-cmd  --permanent --icmptype=&#34;&lt;nome icmptype&gt;&#34; --get-short

# imposta/cancella/restituisce la destinazione (ipv4 o ipv6) di un icmptype
firewall-cmd  --permanent --icmptype=&#34;&lt;nome icmptype&gt;&#34; --add-destination=&#34;[ipv4 | ipv6]&#34;
firewall-cmd  --permanent --icmptype=&#34;&lt;nome icmptype&gt;&#34; --remove-destination=&#34;[ipv4 | ipv6]&#34;
firewall-cmd  --permanent --icmptype=&#34;&lt;nome icmptype&gt;&#34; --get-destinations
</code></pre>

<p>(rif. <a href="https://firewalld.org/documentation/icmptype/options.html" rel="nofollow">man icmp type</a>)</p>

<h3 id="4-4-porte-e-protocolli">4.4. Porte e protocolli</h3>

<p>Zone e policy objects permettono di fare binding diretto su porte e protocolli.</p>

<p>Non è generalmente una cosa che mi faccia impazzire perché si bypassano i servizi.</p>

<p>Si fa tutto più velocemente, è vero, ma quando le regole sono numerose e si usano porte non canoniche, la probabilità che, al tendere, non si capisca più su quale servizio si stia agendo, è elevatissima. (cfr. <a href="#4-8-zona" rel="nofollow">4.8. Zona</a> e <a href="#4-9-policy-objects" rel="nofollow">4.9. Policy objects</a>)</p>

<h3 id="4-5-ipset">4.5. IPset</h3>

<p>Gli <strong>ipset</strong> sono liste di subnet o di ip che definiscono le sorgenti nelle zone, nei policy object o nelle rich-rules. La centralizzazione della dichiarazione delle sorgenti disaccoppia la dichiarazione dal suo utilizzo.</p>

<p>Per gli ipset basta indicarre, nome, tipo e una lista di entry.</p>

<pre><code class="language-bash">firewall-cmd --permanent --new-ipset=&#34;&lt;nome_ipset&gt;&#34; --type=&lt;type&gt;
firewall-cmd --permanent --ipset=&#34;&lt;nome_ipset&gt;&#34; [--add-entry= subnet | ip]+
</code></pre>

<p>Di seguito, un elenco dei comandi di utilità disponibili per gli ipsets:</p>

<pre><code class="language-bash"># Restituisce tutti gli ipsets
firewall-cmd --permanent --get-ipsets

# Restituisce tutte le info di un ipset
firewall-cmd --permanent --info-ipset=&#34;&lt;nome_ipset&gt;&#34;

# Restituisce la lista dei tipi di ipset:
firewall-cmd --get-ipset-types

# Restituisce tutte le entry di un ipset
firewall-cmd --permanent --ipset=&#34;&lt;nome_ipset&gt;&#34; --get-entries

# Cancella un ipset
firewall-cmd --permanent --ipset=&#34;&lt;nome_ipset&gt;&#34; --remove-entry=subnet | ip

# Cancella una (o più) entry da un ipset
firewall-cmd --permanent --ipset=&#34;&lt;nome_ipset&gt;&#34; [--delete-entry=subnet | ip]+

# imposta / restituisce la descrizione di un ipset
firewall-cmd --permanent --ipset=&#34;&lt;nome_ipset&gt;&#34; --set-description=&#34;&lt;descrizione&gt;&#34;
firewall-cmd --permanent --ipset=&#34;&lt;nome_ipset&gt;&#34; --get-description

# imposta / restituisce la descrizione breve di un ipset
firewall-cmd --permanent --ipset=&#34;&lt;nome_ipset&gt;&#34; --set-short=&#34;&lt;descrizione_breve&gt;&#34;
firewall-cmd --permanent --ipset=&#34;&lt;nome_ipset&gt;&#34; --get-short-description
</code></pre>

<p>(rif. <a href="https://firewalld.org/documentation/man-pages/firewalld.ipset.html" rel="nofollow">man ipset</a>)</p>

<h3 id="4-6-rich-rules">4.6. Rich-Rules</h3>

<p>Le rich rules danno quel controllo granulare alle zone che è essenziale se si deve intervenire chirurgicamente per accettare o negare del traffico specifico.</p>

<p>Le rich-rules hanno una sintassi leggermente più corposa dello standard firewalld, è un approccio simil-iptables, o meglio, simil-ufw, e vanno aggiunte o alle zone o alle policy. O a entrambe.</p>

<p>Con le rich-rules possiamo abilitare o negare puntualmente il traffico (a seconda della action scelta),</p>

<pre><code class="language-bash">firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --add-rich-rule=&#39;rule family=&#34;ipv4 | ipv6&#34; \
  source address=&#34;&lt;nome_ipset&gt;&#34; | subnet | ip \
  destination address=&#34;&lt;nome_ipset&gt;&#34; | subnet | ip \
  # traffico indicato come servizio o come port:protocol
  service name=&#34;&lt;nome_servizio&gt;&#34; | port=&lt;port&gt; protocol=tcp|udp|sctp|dccp \
  log prefix=&#34;&lt;prefix&gt;&#34; \
  level=&#34;emerg | alert | crit | error | warning | notice | info | debug&#34; \
  limit value=&#34;rate/duration&#34; \
  # azioni
  accept | reject | drop | mark&#39;
</code></pre>

<p>configurare il masquerade,</p>

<pre><code class="language-bash">firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --add-rich-rule=&#39;rule family=&#34;ipv4 | ipv6&#34; \
  source address=&#34;&lt;nome_ipset&gt;&#34; | &#34;subnet&#34; | &#34;ip&#34; \
  destination address=&#34;&lt;nome_ipset&gt;&#34; | &#34;subnet&#34; | &#34;ip&#34; \
  masquerade&#39;
</code></pre>

<p>agire di fino sul NAT,</p>

<pre><code class="language-bash">firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --add-rich-rule=&#39;rule family=&#34;ipv4 | ipv6&#34; \
  source address=&#34;&lt;nome_ipset&gt;&#34; | &#34;subnet&#34; | &#34;ip&#34; \
  destination address=&#34;&lt;nome_ipset&gt;&#34; | &#34;subnet&#34; | &#34;ip&#34; \
  forward-port port=&#34;[port]+&#34; protocol=&#34;tcp|udp|sctp|dccp&#34; \
  to-port=&#34;[port]+&#34; to-addr=&#34;&lt;ip&gt;&#34;&#39;
</code></pre>

<p>bloccare traffico ICMP.</p>

<pre><code class="language-bash">firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --add-rich-rule=&#39;rule family=&#34;ipv4 | ipv6&#34; \ 
  source address=&#34;&lt;nome_ipset&gt;&#34; | &#34;subnet&#34; | &#34;ip&#34; \
  destination address=&#34;&lt;nome_ipset&gt;&#34; | &#34;subnet&#34; | &#34;ip&#34; \
  [icmp-block name=&#34;&lt;nome_icmptype&gt;&#34; [drop | reject]]+
</code></pre>

<p>Di seguito una lista di comandi utili:</p>

<pre><code class="language-bash"># Rimozione di una rich-rule
firewall-cmd --permanent [--zone=&#34;&lt;nome_zona&gt;&#34; | --policy=&#34;&lt;nome_policy&gt;&#34;] --remove-rich-rule=&#39;rule&#39;

# Elenca tutte le rich-rules di una policy
firewall-cmd --permanent [--zone=&#34;&lt;nome_zona&gt;&#34; | --policy=&#34;&lt;nome_policy&gt;&#34;] --list-rich-rules
</code></pre>

<p>(rif. <a href="https://firewalld.org/documentation/man-pages/firewalld.richlanguage.html" rel="nofollow">man rich-rules</a>)</p>

<h3 id="4-7-forwarding-e-masquerade">4.7. Forwarding e Masquerade</h3>

<p>Firewalld gestisce il nat attraverso dei costrutti all&#39;interno delle zone, dei policy objects o delle rich-rules.</p>

<p>In particolare, zone e policy consentono di configurare velocemente casi particolari di <strong>DNAT</strong> e <strong>SNAT</strong>, port forwarding e masquerade nello specifico, mentre per una gestione del <strong>DNAT</strong> più granulare si ricorre alle rich-rules, a livello di zona o di policy a seconda che si vogliano, al solito, manipolare i pacchetti quando entrano nella zona o quando il pacchetto transita tra le zone specifiche definite dalla policy.</p>

<p><strong>Esempio Port forwarding statico:</strong></p>

<pre><code class="language-bash"># inoltra a 192.168.2.10:22, tutto ciò che la zona riceve sulla 
# porta 2222
firewall-cmd --permanent --zone=esterna --add-forward-port=port=2222:proto=tcp:to-port=22:to-addr=192.168.2.10
</code></pre>

<p>In questo modo inoltro tutto il traffico relativo alla zona.</p>

<p>Se voglio un controllo più fine, devo ricorrere alla combo policy (o zona) +  rich-rules.
In questo modo posso arrivare a determinare quale sia l&#39;ip (o il gruppo di ip) client per il quale è abilitato l&#39;inoltro ed eventualmente verso quale ip pubblico server, potendone scegliere diversi, effettuare l&#39;inoltro.</p>

<p><strong>Esempio DNAT generico:</strong></p>

<pre><code class="language-bash"># inoltro di tutto il traffico proveniente da un ip fisso 
# verso un ip privato, con remapping delle porte.
firewall-cmd --permanent --policy=&#34;esterna-interna&#34; \
--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \
  source address=&#34;93.12.34.56&#34; \
  forward-port port=&#34;5001-6000&#34; protocol=&#34;udp&#34; to-port=&#34;15001-16000&#34; to-addr=&#34;192.168.1.100&#34;&#39;

# stesso esempio di prima in cui il sorgente client è un gruppo 
# di ip (ipset) fissi 
firewall-cmd --permanent --policy=&#34;esterna-interna&#34; \
--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \
  source ipset=&#34;my_ipset&#34; \
  forward-port port=&#34;80&#34; protocol=&#34;tcp&#34; to-port=&#34;8080&#34; to-addr=&#34;192.168.1.100&#34;&#39;

# In questo caso suppongo che il fw esponga più indirizzi pubblici.
# Solo un ip specifico può inoltrare il suo traffico 
# richiedendolo ad uno degli indirizzi pubblici del firewall
firewall-cmd --permanent --policy=&#34;esterna-interna&#34; \
--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \
  source address=&#34;151.12.13.14&#34;    # ip client \
  destination address=&#34;9.10.20.31&#34; # ip pubblico fw \
  forward-port port=&#34;53947&#34; protocol=&#34;tcp&#34; to-port=&#34;3306&#34; to-addr=&#34;192.168.1.100&#34;&#39;
</code></pre>

<p><strong>Esempio Masquerade:</strong></p>

<pre><code class="language-bash">firewall-cmd --permanent --zone=esterna --add-masquerade
</code></pre>

<p>Come nell&#39;esempio del port forwarding statico, il nat a livello di zona o di policy altera qualunque pacchetto che transita nella zona o nella policy.</p>

<p>Anche qui, per avere un controllo migliore l&#39;approccio policy (o zona) + rich-rules risulta vincente.
In questo modo posso arrivare a scegliere quali dei server interni deve essere nattato ed eventualmente verso quali ip (snat condizionale).</p>

<pre><code class="language-bash"># nat di un singolo ip interno
firewall-cmd --permanent --policy=&#34;interna-esterna&#34; \
--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \
  source address=192.168.10.10 masquerade&#39;

# nat di un gruppo di ip interni (ipset)
firewall-cmd --permanent --policy=&#34;interna-esterna&#34; \
--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \
  source ipset=&#34;my_ipset&#34; masquerade&#39;

# nat di tutta la zona interna quando la destinazione è un ip 
# (o gruppo di ip) specifico
firewall-cmd --permanent --policy=&#34;interna-esterna&#34; \
--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \
  destination ipset=&#34;my_ipset&#34; masquerade&#39;

# o, al contrario, si vuole nattare tutta la rete interna, o un
# suo segmento, TRANNE il traffico destinato ad UN&#39;ALTRA rete
# specifica (es. una vpn o altro).
firewall-cmd --permanent --policy=&#34;interna-esterna&#34; \
--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \
  source address=&#34;my_ipset&#34;
  destination not address=&#34;10.4.10.0/24&#34; masquerade&#39;

# nat di un gruppo di ip solo per il servizio web
firewall-cmd --permanent --new-service=&#34;navigazione_web&#34;
firewall-cmd --permanent --service=&#34;navigazione_web&#34; \
  --add-include=&#34;http&#34; \
  --add-include=&#34;https&#34; \
  --add-include=&#34;dns&#34;

firewall-cmd --permanent --policy=&#34;interna-esterna&#34; \
--add-rich-rule=&#39;rule family=&#34;ipv4&#34; \
  source ipset=&#34;my_ipset&#34; \
  service name=&#34;navigazione_web&#34; masquerade&#39;
</code></pre>

<h3 id="4-8-zona">4.8. Zona</h3>

<p>Per creare una zona basta assegnarle un nome e associarle una o più interfacce e/o una o più sorgente di indirizzi ip.</p>

<p>Una zona senza alcun binding <strong>non è attiva</strong>.</p>

<pre><code class="language-bash">firewall-cmd --permanent --new-zone=&#34;&lt;nome_zona&gt;&#34;

# aggiunge un&#39;interfaccia
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; [--add-interface=&#34;&lt;nome_interfaccia&gt;&#34;]+

# aggiunge sorgenti
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; [--add-source=subnet | ip | &#34;&lt;nome_ipset&gt;&#34;]+
</code></pre>

<p>Se nella configurazione sono presenti <strong>sia l&#39;interfaccia che le sorgenti di ip</strong>, sto dichiarando che tutto ciò che transita per l&#39;interfaccia o che rientra nelle sorgenti indicate, ricadrà nelle regole della zona.</p>

<p>Faccio notare che Il binding (sorgenti o interfacce) funziona <strong>in aggiunta</strong>, non restringe ciò che ad es. transita dall&#39;interfaccia.
Tenete bene a mente che nella gestione del routing dei pacchetti verso le zone che fa firewalld, vengono valutate <strong>prima</strong> le sorgenti e <strong>dopo</strong> l&#39;interfaccia.</p>

<p>Se avessi l&#39;esigenza di restringere il traffico nella zona, si potrebbe pensare di limitare il binding <strong>alle sole</strong> sorgenti, escludendo l&#39;interfaccia, in modo che qualunque pacchetto che non provenga dagli ip o dalle subnet, a prescindere dall&#39;interfaccia, indicate venga respinto (in base alla politica della zona).</p>

<p>Va tenuto presente che configurazioni di questo tipo, per quanto pulite e semplici da realizzare, possono dare luogo ad errori estremamente subdoli e pericolosissimi (vedremo un esempio in seguito).</p>

<p>Tutti i pacchetti che, transitando per l&#39;host, non vengono assorbiti da alcuna zona, saranno gestiti dalla zona di default.</p>

<p>Di seguito una lista di comandi utili:</p>

<pre><code class="language-bash"># restituisce la zona di default
firewall-cmd --get-default-zone

# setta la zona di default
firewall-cmd --set-default-zone=&#34;&lt;nome_zona&gt;&#34;

# restituisce tutte le zone attive (tutte quelle con un binding ad un&#39;interfaccia e/o ad un sorgente)
firewall-cmd --get-active-zones

# restituisce tutte le zone accoppiate ad una specifica interfaccia/sorgente
firewall-cmd --permanent --get-zone-of-interface=&#34;&lt;nome_interfaccia&gt;&#34;
firewall-cmd --permanent --get-zone-of-source=subnet | ip | &#34;&lt;nome_ipset&gt;&#34;

# restituisce info dettagliate sulla zone
firewall-cmd --permanent --info-zone=&#34;&lt;nome_zona&gt;&#34;

# elenca tutte le zone
firewall-cmd --permanent --list-all-zones

# cancella una zona
firewall-cmd --permanent --delete-zone=&#34;&lt;nome_zona&gt;&#34;


###########
# Servizi #
###########
# aggiungi / cancella servizi da una zona o dalla zona attiva (se il nome zona non è specificato)
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; [--add-service=&#34;&lt;nome_servizio&gt;&#34;]+
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; [--remove-service=&#34;&lt;nome_servizio&gt;&#34;]+


######################
# porte e protocolli #
######################
# elencare tutte le porte e i protocolli della zona
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --list-ports
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --list-protocols

# aggiungere/cancellare una porta alla zona
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; [--add-port=&lt;port&gt;/tcp | udp | sctp | dccp]+
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; [--remove-port=&lt;port&gt;/tcp | udp | sctp | dccp]+

# aggiungere/cancellare un protocollo alla zona
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --add-protocol=&lt;protocol&gt;
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --remove-protocol=&lt;protocol&gt;


##############
# Rich-rules #
##############
# aggiungere/cancellare un protocollo alla zona
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --add-rich-rule=&#34;&lt;nome_rich-rule&gt;&#34;
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --remove-rich-rule=&#34;&lt;nome_rich-rule&gt;&#34;


#############
# ICMP Type #
#############
# inverte / disattiva la logica del blocco icmp nella zona (attiva / disattiva whitelist)
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --add-imcp-block-inversion
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --remove-imcp-block-inversion

# aggiunge un tipo icmp alla whitelist/blacklist
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; [--add-imcp-block=&#34;&lt;tipo_icmp&gt;&#34;]+

# rimuove un tipo icmp dalla whitelist/blacklist
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; [--remove-imcp-block=&#34;&lt;tipo_icmp&gt;&#34;]+


##############
# Masquerade #
##############
# aggiunge / rimuove il masquerade
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --add-masquerade
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --remove-masquerade


###########################
# Port forwarding statico #
###########################
# aggiunge / rimuove il port forwarding
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --add-forward-port=port=&lt;port&gt;[-&lt;port&gt;]:proto=[tcp|udp|sctp|dccp]:to-port=&lt;port&gt;[-&lt;port&gt;][:to-addr=&lt;ip&gt;[/&lt;mask&gt;]
firewall-cmd --permanent --zone=&#34;&lt;nome_zona&gt;&#34; --remove-forward-port=port=&lt;port&gt;[-&lt;port&gt;]:proto=[tcp|udp|sctp|dccp]:to-port=&lt;port&gt;[-&lt;port&gt;][:to-addr=&lt;ip&gt;[/&lt;mask&gt;]

# es. di inoltro veerso un ip interno di un range di porte con offset deterministico
firewall-cmd --permanent --zone=&#34;esterna&#34; --add-forward-port=port=2501-3000:proto=tcp:to-port=5001-5500:to-addr=192.168.10.20
firewall-cmd --permanent --zone=&#34;esterna&#34; --remove-forward-port=port=2501-3000:proto=tcp:to-port=5001-5500:to-addr=192.168.10.20
</code></pre>

<p>(rif. <a href="https://firewalld.org/documentation/man-pages/firewalld.zone.html" rel="nofollow">man zone</a>)</p>

<h3 id="4-9-policy-objects">4.9. Policy Objects</h3>

<p>I policy objects, presenti dall&#39;ormai lontano 2020 con la versione 0.9.0, hanno posto le basi per il futuro di firewalld. È il posto in cui si concentrano le policy di filtraggio sia per il traffico intra-zona che, soprattutto, per il traffico inter-zona.</p>

<p>I policy objects cambiano radicalmente il disegno delle regole che, come detto in precedenza, vengono disaccoppiate dalla dichiarazione della zona che rimane il luogo in cui viene effettuato principalmente il trust delle sorgenti.</p>

<p>Conseguenza immediata è una notevole flessibilità perché ho la possibilità di variare dinamicamente le regole da applicare alle zone semplicemente aggiungendo le policy opportune.</p>

<p>Lavorare sulle zone è più immediato ma più lo scenario diventa articolato, più le configurazioni si complicano, oltre al fatto che alcune cose come il routing e l&#39;inoltro, con le sole zone non sono proprio realizzabili</p>

<p>Le policy, al contrario, richiedono una maggiore complessità iniziale ma ha il vantaggio di mantenere il disegno generale più pulito nei casi in cui le configurazioni cambino con una certa frequenza o tendano a diventare via via più articolate.</p>

<p>Nel seguito mostrerò degli esempi di configurazioni  fatte in modalità zone-oriented e policy-oriented.</p>

<p>Gli elementi costitutivi del policy object sono il nome, il target policy (di base, “default”), la specifica della direzione del traffico, uno o più servizi da abilitare.</p>

<pre><code class="language-bash">firewall-cmd --permanent --new-policy=&#34;&lt;nome_policy&gt;&#34;
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --set-target=DROP | REJECT | ACCEPT | CONTINUE

# definizione della direzione del traffico
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; [--add-ingress-zone=HOST | &#34;&lt;nome_zona&gt;&#34; | ANY]+
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; [--add-egress-zone=HOST | &#34;&lt;nome_zona&gt;&#34; | ANY]+

# traffico consentito
firewall-cmd per --permanent --policy=&#34;&lt;nome_policy&gt;&#34; [--add-service=&#34;&lt;nome_servizio&gt;&#34;]+
</code></pre>

<p>Di seguito, una lista di comandi utili:</p>

<pre><code class="language-bash"># elenco, sintetico o dettagliato, di tutti i policy objects
firewall-cmd --get-policies
firewall-cmd --permanent --list-all-policies

# estrae tutti i componenti della policy
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --list-all

# restituisce le ingress / egress zone
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --list-egress-zones
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --list-ingress-zones

# restituisce i servizi
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --list-services

# restituisce le rich-rules
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --list-rich-rules

# info di un policy object
firewall-cmd --permanent --info-policy=&#34;&lt;nome_policy&gt;&#34;

# cambiare target di un policy object
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --set-target=DROP | REJECT | ACCEPT | CONTINUE

# eliminare un policy object
firewall-cmd --permanent --delete-policy=&#34;&lt;nome_policy&gt;&#34;


###########
# Servizi #
###########
# aggiungi / cancella servizi dal policy object specificato
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; [--add-service=&#34;&lt;nome_servizio&gt;&#34;]+
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; [--remove-service=&#34;&lt;nome_servizio&gt;&#34;]+


######################
# Porte e protocolli #
######################
# elencare tutte le porte e i protocolli del policy object specificato
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --list-ports
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --list-protocols

# aggiungere/cancellare una porta dal policy object specificato
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; [--add-port=&lt;port&gt;/tcp | udp | sctp | dccp]+
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; [--remove-port=&lt;port&gt;/tcp | udp | sctp | dccp]+

# aggiungere/cancellare un protocollo dal policy object specificato
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --add-protocol=[tcp | udp | sctp | dccp]
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --remove-protocol=[tcp | udp | sctp | dccp]


##############
# Rich-rules #
##############
# aggiungere/cancellare una (o più) rich-rule dal policy object specificato
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; [--add-rich-rule=&#34;&lt;nome_rich-rule&gt;&#34;]+
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; [--remove-rich-rule=&#34;&lt;nome_rich-rule&gt;&#34;]+


##############
# ICMP Types #
##############
# Aggiunge un tipo icmp alla whitelist/blacklist
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; [--add-imcp-block=&#34;&lt;tipo_icmp&gt;&#34;]+

# Rimuove un tipo icmp dalla whitelist/blacklist
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; [--remove-imcp-block=&#34;&lt;tipo_icmp&gt;&#34;]+


##############
# Masquerade #
##############
# aggiunge / rimuove il masquerade
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --add-masquerade
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --remove-masquerade


###########################
# Port forwarding statico #
###########################
# aggiunge / rimuove il port forwarding
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --add-forward-port=port=&lt;port&gt;[-&lt;port&gt;]:proto=[tcp | udp | sctp | dccp]:to-port=&lt;port&gt;[-&lt;port&gt;][:to-addr=&lt;ip&gt;[/&lt;mask&gt;]
firewall-cmd --permanent --policy=&#34;&lt;nome_policy&gt;&#34; --remove-forward-port=port=&lt;port&gt;[-&lt;port&gt;]:proto=[tcp | udp | sctp | dccp]:to-port=&lt;port&gt;[-&lt;port&gt;][:to-addr=&lt;ip&gt;[/&lt;mask&gt;]

# es. di inoltro veerso un ip interno di un range di porte con offset deterministico
firewall-cmd --permanent --policy=&#34;wan-to-lan&#34; --add-forward-port=port=2501-3000:proto=tcp:to-port=5001-5500:to-addr=192.168.10.20
firewall-cmd --permanent --zone=&#34;wan-to-lan&#34; --remove-forward-port=port=2501-3000:proto=tcp:to-port=5001-5500:to-addr=192.168.10.20
</code></pre>

<p>(rif. <a href="https://firewalld.org/documentation/man-pages/firewalld.policy.html" rel="nofollow">man policy</a>, <a href="https://firewalld.org/documentation/man-pages/firewalld.policies.html" rel="nofollow">man policies</a>)</p>

<h3 id="4-10-comandi-di-utilità-generale">4.10. Comandi di utilità generale</h3>

<p>Di seguito, un elenco dei comandi di utilità generale disponibili per firewalld:</p>

<pre><code class="language-bash"># Restituisce lo stato di firewalld
firewall-cmd --state

# Riavvia firewalld
firewall-cmd --reload

# Riavvia firewalld ricaricando anche i moduli netfilter del kernel
firewall-cmd --complete-reload

# Restituisce il log level di firewalld
firewall-cmd --get-log-denied

# Imposta il log level di firewalld
firewall-cmd --set-log-denied=all | unicast | broadcast | multicast | off

# Rende permanente tutte le configurazioni effimere di firewalld. Necessario il reload.
firewall-cmd --runtime-to-permanent

# Kill switch ON /OFF
firewalld --panic-on
firewalld --panic-off

# Stato Kill switch [0 | 1]
firewalld --query-panic
</code></pre>

<p><a href="/aytin/tag:firewall" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">firewall</span></a> <a href="/aytin/tag:firewallcmd" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">firewallcmd</span></a> <a href="/aytin/tag:firewalld" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">firewalld</span></a> <a href="/aytin/tag:iptables" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">iptables</span></a> <a href="/aytin/tag:netfilter" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">netfilter</span></a>  <a href="/aytin/tag:nftables" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">nftables</span></a> <a href="/aytin/tag:ufw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ufw</span></a></p>
]]></content:encoded>
      <guid>https://noblogo.org/aytin/sveliamo-i-misteri-di-firewalld-parte-1-di-2</guid>
      <pubDate>Mon, 08 Jun 2026 13:10:26 +0000</pubDate>
    </item>
  </channel>
</rss>