NAT

Linuxový conntrack je základem pro robustní implementaci NATu. NAT (Network Address Translation) řeší překlad provozu mezi dvěmi doménami adres toho samého protokolu a my se zaměříme na IPv4, kde se NAT masivně používá. Pro úplnost je třeba říci, že NAT je definován a také implementován i pro IPv6, ale k jeho použití s IPv6 je skutečně pádný důvod málokdy.

Nejběžnější použití NATu v Linuxu je svázáno s funkcí routeru, tedy že Linux stojí mezi dvěmi sítěmi, má ve směrovací tabulce vše potřebné, aby mohl komunikovat s adresami na obou stranách a má zapnutý forwarding pro daný protokol. Vyjděme z následujícího příkladu:

NAT scenario

NAT můžeme rozdělit na SNAT (Source-NAT) a DNAT (Destination-NAT). V obou případech řešíme problém, že na levé straně od routeru máme globální unicast adresy v Internetu a na pravé straně jsou adresy privátní (podle RFC1918, případně RFC6598), které nelze v Internetu routovat. Řešením je, že pro všechny stanice v Internetu budeme na Linuxovém routeru překládat adresy ze sítě vpravo na adresu, kterou má router na rozhraní eth1 vlevo, která je global unicast a naopak, když přijde packet z Internetu pro některou stanici v síti vpravo, přeložíme cílovou adresu na rozhraní eth1 na adresu skutečného cíle v síti vpravo. V obou případech to ale není snadná úloha, protože v principu mapujeme několik adres v síti vpravo (subnet 192.168.1.0/24 v našem případě) na jednu globální unicast adresu vlevo (84.42.173.26). Abychom to mohli udělat, potřebujeme conntrack, který si zapamatuje čtveřici (IP adresa cíle, IP adresa zdroje, cílový port, zdrojový port) před a po překladu adres a dokáže tak rozpoznat odpověď na packet k příslušné čtveřici po překladu a doplnit tak cílovou adresu a cílový port na pravé straně.