Tak jsem to vyřešil pomoci Sets.
V /etc/nftables.conf v tabulce filter nadefinuji prázdný set
set ssh_acc_set {
type ipv4_addr
}
Přidám pak pravidlo:
ip saddr @ssh_acc_set counter accept # dynamické ip adesy
A do cronu pak pro každou doménu, co může změnit ip adresu dám tohle:
00 7 * * * root nft add element filter ssh_acc_set { $(dig +short subdomena.domena.cz) comment \"subdomena.domena.cz $(date +\%F_\%H:\%M:\%S)\" }
Tam je zajímavé, že znak % se v cronu musí escepovat, protože má zvláštní význam. ip adresu získávám pomocí příkazu
dig +short .
Že úloha crontabu proběhla mohu ověřit pomocí
journalctl -u cron| tail -n 50
Každou novou ip adresu to pak samo přidá do whitelistu včetně poznámky o jakou se jedná doménu a kdy se tak stalo. Pokud už tam ip adresa je (většina případů) tak se nestane nic. Zůstane původní záznam.
nft list set filter ssh_acc_set
table ip filter {
set ssh_acc_set {
type ipv4_addr
elements = { 49.176.124.121 comment "subdomena.domena.cz 2024-10-16_09:56:01" }
}
}
Množinu mohu promazat příkazem flush, ale pak je nutné přidat aktuální ip adresy.
nft flush set filter ssh_acc_set
Na to jak nftables přesložitělé, třetí předělávka, to bohužel nic moc neumí a nepracuje se s tím dobře.
Jako dynamický dns používám
http://freedns.afraid.org/ . Je zadarmo a možnosti jak aktualizovat ip adresu jsou pravdu bohaté. Např. stačí načíst speciální url s hashem z cronu.
Lézt na všechny servery jen pomocí dvou jiných strojů nebo tunelů je zbytečně omezující, protože když jsou problémy, nemusí fungovat kde co. Takže tohle řešení celkem ujde.