Nftables a doménová jména

Nftables a doménová jména
« kdy: 18. 02. 2025, 10:02:22 »
Nftables nepodporuje doménová jména ani během načítání nebo reloadování firewallu.
Řeší se to přes sety.  Ale problém je, jak spravovat ty sety. Když si reloadnete firewall máte předpřipravený prázdný set, protože nftables pseudo scriptem z doménový jmen naplnit nejdou. Takže celé je to velmi neelegantní, to už je snad i lepší ty ip adresy občas měnit ručně. Nebo je možné includovat další soubor, který generuje nějaký script, ale tam zase hrozí, že zapomenete ten skript spustit.

Dnes jsem ale konečně, se zdá, narazil na uspokojivé řešení.

Kromě souboru /etc/nftables.conf si vytvořím i soubor /etc/nftables.sh . Bash či jiný skriptovací jazyk nemá omezení jako /etc/nfttables.conf, takže je možná předem připravené sety naplnit. Aby se na to při restartu nebo změně firewallu nezapomínalo, přidám do souboru /lib/systemd/system/nftables.service další řádky pro pro ExecStart a ExecReload:

Kód: [Vybrat]
ExecStart=/usr/sbin/nft -f /etc/nftables.conf
ExecStart=/etc/nftables.sh
ExecReload=/usr/sbin/nft -f /etc/nftables.conf
ExecReload=/etc/nftables.sh

Změn se uplatní pomocí
Kód: [Vybrat]
systemctl daemon-reload


Obash souboru /etc/nftables.sh může vypadat třeba takto:
Kód: [Vybrat]
#!/bin/bash
# obsah setu mohu mohu vypsat pomocí: nft list set filter ssh_acc_set
nft add element filter ssh_acc_set { $(dig +short domena.mooo.com) comment \"domena.mooo.com $(date +%F_%H:%M:%S)\" }
Každá doména má další řádek, případně je možné to řešit i cyklem.

A pak mohu reloadnout firewall jak je obvyklé pomocí.
Kód: [Vybrat]
systemctl reload nftables

A při té příležitosti se automaticky občerství všechny ip adresy v setu.

Automatické občerstvování setu je možné přidat i do cronu. V setu v poznámce se uchovává i datum, kdy byla ip adresa přidána a doména ke které patří, což podstatně zlepšuje přehled. Pokud je již v setu obsažena, další přidání téže ip adresy se ignoruje.


Re:Nftables a doménová jména
« Odpověď #1 kdy: 18. 02. 2025, 10:42:40 »
Proč by nebylo možné používat doménová jména?

Kód: [Vybrat]
set blackhole {
   type ipv4_addr
   elements = { www.example.com, www.example.org }
   }

Při zavádění konfigurace se ta doménová jména přeloží a do setu se uloží IP adresy.

Re:Nftables a doménová jména
« Odpověď #2 kdy: 18. 02. 2025, 11:09:20 »
Na zmeny systemd konfiguraci je lepsi vyrobit (idealne automatizaci) override soubor v /etc/systemd/system/nftables.service.d/override.conf
Diky tomu vam zmeny zustanou funkcni i po aktualizaci baliku.

Jinak problem s hostnamy ve firewallu je v tom, ze se prekladaji jen pri (re)loadu pravidel, takze pro podchyceni pripadne zmeny DNS zaznamu by bylo potreba jeste pravidelne spoustet reload skript, ktery hostnamy prelozi znovu.

Re:Nftables a doménová jména
« Odpověď #3 kdy: 18. 02. 2025, 12:42:49 »
Proč by nebylo možné používat doménová jména?

Kód: [Vybrat]
set blackhole {
   type ipv4_addr
   elements = { www.example.com, www.example.org }
   }

Při zavádění konfigurace se ta doménová jména přeloží a do setu se uloží IP adresy.

Opravdu. Zmátlo mne to, že jsem nikdy neviděl žádný příklad s použitím domény a odpovědi jako je tahle.
https://www.reddit.com/r/openwrt/comments/12hsji2/how_to_use_domains_in_nftables_rule/
No místo aby mu poradili, použít dig nebo nebo nftables.conf, tak říkají že to nejde.

Aby to fungovalo, musí se to resolvnout a resolvnout jen na jednu ip adresu.


Kód: [Vybrat]
Feb 18 12:11:37 d93 nft[648384]: /etc/nftables.conf:12:16-28: Error: Hostname resolves to multiple addresses
Feb 18 12:11:37 d93 nft[648384]: define pokus = www.seznam.cz

Tedy pak hrozí, že kvůli jedné doméně nenaběhne celý firewall?  To by pak už jen kvůli tomu byl lepší ten externí skript, kde to lze ošetřit?

Re:Nftables a doménová jména
« Odpověď #4 kdy: 18. 02. 2025, 13:30:27 »
Na zmeny systemd konfiguraci je lepsi vyrobit (idealne automatizaci) override soubor v /etc/systemd/system/nftables.service.d/override.conf
Diky tomu vam zmeny zustanou funkcni i po aktualizaci baliku.

Jinak problem s hostnamy ve firewallu je v tom, ze se prekladaji jen pri (re)loadu pravidel, takze pro podchyceni pripadne zmeny DNS zaznamu by bylo potreba jeste pravidelne spoustet reload skript, ktery hostnamy prelozi znovu.

Díky.
Kód: [Vybrat]
systemctl edit nftables

A tam vložím mezi poznámky
Kód: [Vybrat]
[Service]
 
ExecReload=/etc/nftables.sh
ExecStart=/etc/nftables.sh
a vypadá že to funguje.