Firewall a NAT

NAT

SNAT / masquerade

Podívejme se nejprve na příklad SNATu (pro SNAT se také často používají jako synonyma "maškaráda", "masquerade" a nebo jen prostě NAT):

SNAT

Než se pustíme do vysvětlování, řekněme rovnou, že této funkce dosáhneme jedním jediným pravidlem, kterým určíme překlad adres pro první packet spojení. Všechny další packety v obou směrech se už přeloží automaticky správně podle informací v tabulce conntracku. To jedno pravidlo v iptables bude:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j SNAT --to 84.42.173.26

a nebo ekvivalentní pravidlo pro nftables:

table ip nat {
    chain POSTROUTING {
        type nat hook postrouting priority 100; policy accept;
        oifname "eth1" ip saddr 192.168.1.0/24 counter snat 84.42.173.26
    }
}

V tomto případě tedy stanice 192.168.1.101 posílá DNS dotaz na server 8.8.8.8 z portu 44251 na port 53. Přesně takto DNS dotaz odejde ze stanice vlevo dole a předpokládáme, že v routovací tabulce stanice máme default GW 192.168.1.1, takže packet je doručen na náš Linuxový router. Na routeru předpokládáme, že máme default GW, která vede přes rozhraní eth1 na nějaký next-hop na straně poskytovatele Internetového připojení, který už pro nás není podstatný. Důležité je, že na základě cílové adresy routing rozhodne, že výstupní rozhraní pro náš packet je eth1. Teprve teď se uplatní pro packet pravidlo v POSTROUTING řetězci, které pro náš packet má shodu v obou kritériích - zdrojová adresa je v určeném subnetu a odchozí rozhraní je eth1. Provede se tedy překlad zdrojové adresy (SNAT), takže se vymění adresa 192.168.1.101 za adresu 84.42.173.26 a takto se packet skutečně odešle. V obrázku jsem změněné políčka TCP a UDP hlavičky obarvil ze zelené na modro. Možná si říkáte proč je modrý i zdrojový port, když se nezměnil. Pointa je, že se změnit může v závislosti na nastavení pravidla a dalších okolnostech. A krom toho, že se tento packet vyšle do Internetu, tak se také udělá záznam v tabulce spojení:

root@r1:~# conntrack -L
conntrack v1.4.5 (conntrack-tools): 53 flow entries have been shown.
...
udp      17 28 src=192.168.1.101 dst=8.8.8.8 sport=44251 dport=53 src=8.8.8.8 dst=84.42.173.26 sport=53 dport=44251 mark=0 use=1

Tento záznam vlastně obsahuje všechno, co potřebujeme vědět. Pro packety vstupující ze směru ve kterém bylo navázáno spojení (u nás v obrázku zprava) je první čtveřice s adres a portů před překladem (v obrázku je naznačené hlavičce packetu vše zelené). Pravidlo, které určuje překlad, přeloží zdrojovou adresu a ev. zdrojový port tak, aby byly platné v Internetu (v obrázku proto zmodrají). Server následně odpoví packetem, kde bude zeleno-modrá čtveřice obráceně (ze zdrojů se stanou cíle a naopak). Cílovou adresou odpovědi je tedy teď adresa rozhraní eth1 našeho routeru, která zajišťuje, že internetem odpověď dorazí na náš router. Tak se uplatní druhá část záznamu v conntrack tabulce, která obsahuje čtveřici pro odpovědi, která umožní rozpoznání packetu z daného spojení a jeho zpětné přeložení na odpovídající cílovou adresu a port (což je v našem příkladě červená dvojice na pravé straně).

Zbývá nám otázka, jak se liší masquerade (maškaráda) od SNAT: Z hlediska toku packetů nijak. Jediný rozdíl je, že zatímco u SNATu jsme museli do pravidla explicitně napsat na jakou adresu se má zdrojová adresa prvního packetu našeho spojení přeložit, tedy museli jsme do pravidel explicitně uvést v našem příkladě adresu 84.42.173.26, tak masquerade zkrátka nastaví primární adresu rozhraní, kterým packet odchází. Prakticky se pravidla změní jen minimálně:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE

nebo pro nftables:

table ip nat {
    chain POSTROUTING {
        type nat hook postrouting priority 100; policy accept;
        oifname "eth1" ip saddr 192.168.1.0/24 counter masquerade
    }
}

V principu by SNAT stačil, ale nutil by člověka naskriptovat automatické změny SNAT pravidla v situaci, kdy se adresa na rozhraní směrem do Internetu může měnit, protože dynamicky přidělovaná protokolem DHCP, například. Naopak jen samotná akce masquerade by neumožnila ve složitějších scénářích volit jednu z více IP adres na kterou se má zdrojová adresa packetu přeložit a to je někdy potřeba, když se NATuje velká síť s mnoha uživateli.