rhel7, DNAT a neocekavane chovani [trochu delsi]

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Úterý Leden 27 09:40:21 CET 2015


On Sun, 25 Jan 2015, "Zdeněk Kaminski" wrote:

> konfigurace firewallu na serveru A:
>
> iptables -t nat -A PREROUTING -p tcp -d 194.228.208.24 --dport https -j
> DNAT --to-destination 192.168.1.168:22
>
> Zadne jine dalsi pravidlo v nat tabulce neni. [...]
> Takze bych mel pridat pravidlo
>
> iptables -t nat -A POSTROUTING -p tcp -s 192.168.1.168 --sport 22 -j SNAT
> --to-source 194.228.208.24:443
>
> Jenze me to na serveru A funguje (dostanu se z Inetu na onen ssh port) i
> bez toho pravidla. A vubec se mi takove chovani nelibi.

To není chyba, to je vlastnost.

Tabulka "nat" je taková lehce magická.

Když do ní vleze paket, tak se jádro nejdřív podívá, zda patří
k existujícímu spojení ("spojení" ve smyslu toho, jak to chápe conntrack, 
což může zahrnovat i asociaci mezi dvěma UDP porty na nějakých adresách).

Pokud je to paket pro existující spojení, pak se podívá, zda pro toto 
spojení už by proveden nějaký překlad adres (ať už IP nebo portů). Pokud 
ano, tak ho aplikuje i na zpracovávaný paket, jinak paket nechá beze 
změny. Pak ho pošle dál a už ho dál nezkoumá.

Pouze v případě, že je paket pro nové spojení, jsou prohledávána pravidla 
v tabulce, aby zjistil, zda pro něj nemá dělat nějaký překlad. Což mj.
znamená, že čítače na tamních pravidlech se nebudou zvětšovat s každým 
paketem, ale jen s každým novým spojením.

A takhle to afaik funguje od samého začátku. Může to být trochu matoucí, 
ale má to svou logiku -- má-li překlad adres fungovat, pak je potřeba ho 
aplikovat konzistentně na všechny pakety patřící do jednoho spojení.

-- 
Pavel Kankovsky aka Peak                      "Que sais-je?"


Další informace o konferenci Linux