NAT | Connection tracking | nftables

NAT | Connection tracking | nftables
« kdy: 12. 09. 2023, 10:04:28 »
Zdravím všechny,

prosím mohl by mě někdo nasměrovat / či usměrnit, že řeším nesmysly? Nejsem žádný síťař, tak prosím berte ohledy. :)

Mám sw pc x64 router s Linuxem (Arch), který bez NAT-u obsluhuje klienty což tvoří cca 80% jeho provozu. V místě mám, ale i menší LAN, kterou mám za NAT-em. Takže vlastně jen kvůli natu se mi automaticky aktivuje connection tracking (ct) což je v pořádku jako vlastnost Netfilteru. Vzhledem k tomu, že nepotřebuji stavový firewall, tak mi to připadá zbytečné, aby router ct sledoval (i když to výkonově utáhne). Chci vás požádat o radu jestli ho lze nějak vypnout ... myslím pro provoz mimo ten subnet co je za NAt-em, tam je jasné, že je nutný a bez něj by nat nemohl fungovat.

Vím, že vás asi jako první varianta napadne vyhodit nat a routovat bez něj, ale chtěl bych ho zachovat. Jde mi spíš o edukaci. Je tedy možné, přes nftables použít notrack pro provoz mimo natovaný subnet? Nepodařilo se mi to rozchodit ... tu LANku si hned položím a nefunguje.

LAN = 10.11.12.0/28

Kód: [Vybrat]
table inet raw {
        chain PREROUTING {
                type filter hook prerouting priority raw; policy accept;
                ip saddr != 10.11.12.0/28 counter notrack
        }

        chain OUTPUT {
                type filter hook prerouting priority raw; policy accept;
        }
}

Díky za tipy


Re:NAT | Connection tracking | nftables
« Odpověď #1 kdy: 12. 09. 2023, 15:54:12 »
Ja mam vypnute trackovani nelokalnich spojeni pres
Kód: [Vybrat]
table inet raw {
        chain prerouting {
                type filter hook prerouting priority -300; policy accept;
                fib daddr type local accept
                notrack accept
        }
}

Re:NAT | Connection tracking | nftables
« Odpověď #2 kdy: 13. 09. 2023, 08:57:05 »
Díky za reakci - vyzkoušel jsem, ale v mém prostředí mi LANka přestane fungovat. Asi mám něco špatně. Mohl by jsi mi prosím ukázat jak děláš nat?

Já používám klasickej SNAT (abych si mohl určit za jakou IP chci lanku schovat):

Kód: [Vybrat]
table ip nat {
        chain POSTROUTING {
                type nat hook postrouting priority srcnat; policy accept;
                ip saddr 10.11.12.0/28 counter oifname { "vlan102", "vlan103" } snat to 10.xx.xx.xx comment "SNAT LAN"
        }


Šlo by to i přes masquerade, ale tím že mám více uplinků, tak nepoužívám.
Kód: [Vybrat]
table ip nat {
        chain POSTROUTING {
                type nat hook postrouting priority srcnat; policy accept;
                ip saddr 10.11.12.0/28 counter masquerade
        }

Re:NAT | Connection tracking | nftables
« Odpověď #3 kdy: 13. 09. 2023, 09:47:14 »
To nebyl navod, jenom napoveda. Dokumentace totiz rika:
Citace
To be effective your notrack rule must come before conntrack is triggered. You can ensure this by attaching it to a base chain with prerouting hook and priority < NF_IP_PRI_CONNTRACK (-200). Using raw priority (-300) is a good choice.
Takze si budes muset udelat chain s prioritou -300, kde si vyberes vyfiltrujes neco jako ip saddr 10.11.12.0/28 accept a zbytku das notrack accept.
A pak si v normalnim table ip nat chain postrouting udelas SNAT pro ten subnet. Na prvni pohled to tvoje pravidlo vypada OK.
Jinak vrele doporucuju sledovat, co ten firewall vlastne dela pres https://wiki.nftables.org/wiki-nftables/index.php/Ruleset_debug/tracing

Re:NAT | Connection tracking | nftables
« Odpověď #4 kdy: 13. 09. 2023, 10:31:36 »
Rozumím - nechci jen tupě opisovat. Snažím se to pochopit.

point:
Tu dokumentaci jsem se snažil přečíst ... i jsem četl ty priority -300 apod., ale v aktuálnějších verzích nftables (já jsem nyní na nftables-1.0.8) se to chová tak, že ve chvíli, když nastavíš prioritu na -300, tak se pravidlo automaticky vypíše přes nft list ruleset jako raw. To co popisuješ bylo ve starších verzích - opravte mě jestli píšu nesmysly, ale toto jsem vypozoroval.

Příklad zapíšu do /etc/nftables.conf:
Kód: [Vybrat]
table inet raw {
        chain prerouting {
                type filter hook prerouting priority -300; policy accept;
                fib daddr type local accept
                notrack accept
        }
}

a přes nft list ruleset se zobrazí:
Kód: [Vybrat]
table inet raw {
        chain prerouting {
                type filter hook prerouting priority raw; policy accept;
                fib daddr type local accept
                notrack accept
        }
}

Z toho usuzuju, že priority -300 se automaticky rovná = raw. Takže si myslím, že toto mám také správně.


Re:NAT | Connection tracking | nftables
« Odpověď #5 kdy: 13. 09. 2023, 11:19:05 »
Aktuálně tedy zkouším tento setup:

Kód: [Vybrat]
table inet raw {
        chain prerouting {
                type filter hook prerouting priority raw; policy accept;
                ip saddr 10.11.12.0/28 counter accept
                notrack counter accept
        }
}
table ip nat {
        chain POSTROUTING {
                type nat hook postrouting priority srcnat; policy accept;
                ip saddr 10.11.12.0/28 counter oifname { "vlan102", "vlan103" } snat to 10.xx.xx.xx comment "SNAT LAN"
        }
}

Ale zatím nejsem úspěšný ... LAN přestane fungovat. Asi tam mám stále někde nějakou botu. Zkusím ten Ruleset debug/tracing.

Re:NAT | Connection tracking | nftables
« Odpověď #6 kdy: 13. 09. 2023, 11:58:43 »
Numericky vystup se zapina parametrem -n a mas pravdu, ze raw je -300.
Mas v table inet (nebo ip) filter chain forward s policy accept?
Hybou se Ti ty countery?

Re:NAT | Connection tracking | nftables
« Odpověď #7 kdy: 13. 09. 2023, 17:46:56 »
Ano countery narůstají + mám filter chain forward s policy accept. Trochu jsem improvizoval - dal jsem si logovat co značkuju "notrack" a došel jsem k závěru, že nesmím nastavit notrack ani té IP adresy na kterou dělám SNAT. V mém případě 10.0.0.1 jakmile jsem ji přidal, tak se to rozběhlo. Uvedu to přímo na příkladu (lepší než 1000 slov...):

Kód: [Vybrat]
table ip raw {
        chain PREROUTING {
                type filter hook prerouting priority -300; policy accept;
                ip saddr { 10.11.12.0/28, 10.0.0.1 } counter packets 3410 bytes 1293532 accept
                ip daddr { 10.11.12.0/28, 10.0.0.1 } counter packets 2839 bytes 2530929 accept
                notrack accept
        }

        chain OUTPUT {
                type filter hook prerouting priority -300; policy accept;
        }
}
table ip nat {
        chain POSTROUTING {
                type nat hook postrouting priority 100; policy accept;
                ip saddr 10.11.12.0/28 counter packets 283 bytes 27112 oifname { "vlan102", "vlan103" } snat to 10.0.0.1
                counter packets 90 bytes 17857 comment "count postrouting packets"
        }

        chain PREROUTING {
                type nat hook prerouting priority 0; policy accept;
        }
}

Mám pocit, že s tímto setupem mi to funguje. Když se dívám přes conntrack -L -f ipv4, tak tam již vidím jen záznamy co jdou z LANky což je přesně co jsem chtěl. Budu to nějakou dobu testovat jestli jsem si tím nezadělal na nějaké problémy, ale zatím vše běží.

Díky za ten tip na -n já ho znám z jiných příkazů, ale u nftables jsem nebyl zvyklej ho používat.

Dedukce na závěr - chápu správně, že tímto se připravím o možnost používat stavový firewall v rámci nftables, že? Což mi nevadí vystačím si úplně s bezstavovým v mým prostředí.

Re:NAT | Connection tracking | nftables
« Odpověď #8 kdy: 13. 09. 2023, 18:15:55 »
Pridej si do raw pred finalni accept ten fib daddr type local accept.
V zasade jenom rikas, ze spojeni na lokalni ipcka se taky maji trackovat, takze pro vlastni router mas k dispozici normalni statefull firewall.

Re:NAT | Connection tracking | nftables
« Odpověď #9 kdy: 13. 09. 2023, 18:43:27 »
Ano přidal jsem fib daddr type local accept. Tak to je super, že i tak je možný používat stateful firewall.

Občas do toho conntracku vleze i OSPF:
Kód: [Vybrat]
unknown  89 599 src=10.0.0.1 dst=224.0.0.5 [UNREPLIED] src=224.0.0.5 dst=10.0.0.1 mark=0 use=1
nevím proč, ale vše ostatní je LAN subnet 10.11.12.0/28, takže pravidla fungují.


Re:NAT | Connection tracking | nftables
« Odpověď #10 kdy: 13. 09. 2023, 19:04:07 »
Citace
fib daddr type local accept - V zasade jenom rikas, ze spojeni na lokalni ipcka se taky maji trackovat
A proč je vlastně taky trackuju? Logoval jsem je a to jsou IP, které nemají s NATem nic společnýho ... přitom v conntrack -L -f ipv4 je nevidím (přitom je trackuju). Jak si to pravidlo jinak vysvětlit / přeložit?

Re:NAT | Connection tracking | nftables
« Odpověď #11 kdy: 14. 09. 2023, 09:50:24 »
fib daddr type local pozna ipcka na routeru, abys mohl psat pravidla pro chain input, ktera obvykle zacinaji necim jako
Kód: [Vybrat]
        chain input {
                type filter hook input priority 0; policy accept;
                ct state invalid drop
                ct state established,related accept

Re:NAT | Connection tracking | nftables
« Odpověď #12 kdy: 14. 09. 2023, 09:59:16 »
Perfektní moc jsi mi pomohl a ochytřil - velké D Í K Y !  :)

Re:NAT | Connection tracking | nftables
« Odpověď #13 kdy: 14. 09. 2023, 11:07:02 »
Doplňující otázky:


Díky

Re:NAT | Connection tracking | nftables
« Odpověď #14 kdy: 14. 09. 2023, 12:09:48 »
Kdybys mel misto 'table ip raw' 'table inet raw', tak to automaticky zafunguje i na IPv6.
Na nf_flowtable si zaloz novy dotaz. Ja ho nepouzivam a necekal bych, ze ostatni budou cist vsechny diskuze az do konce.