Átirányítás iptables-el

Sziasztok!

Tulajdonképpen csak segítséget szeretnék kérni megérteni az iptables működését.

Adott két gép a neten (statikus ip-vel, semmi belső háló vagy több hálókártya), és azt szerettem volna elérni, hogy
mondjuk az egyes számú gép 80-as portra beérkező összes forgalom irányítódjon át a 2-es számú gép 80-as portjára.

Rengeteg leírást találtam, magam lámaságával azt hittem, hogy meg is értettem az egészet, örültem is neki, hogy nem nehéz, stb. Az alábbi utasítást próbáltam alkalmazni:

iptables -t nat -A PREROUTING -p tcp -d egyes_gep_ip --dport 80 -j DNAT --to-destination kettes_gep_ip:80

Én a magam részéről azt gondoltam, hogy a tűzfal a fenti szabálynak megfelelő csomagokat elfogja, és máris továbbítja a megadott ip-re, majd az onnan visszaérkező választ küldi vissza a kliensnek. Azt hittem, hogy ez a láthatatlan proxyzás.

Sajnos így nem akart működni. Próbáltam elkapni a forgalmat a tshark nevű programmal, amelynek kimenete számomra sok rejtélyes dolgot tartalmazott, de annyit kivettem, hogy a két gép beszélgetett egymással, csak ez a kommunikáció vagy nem volt sikeres, vagy nem jutott vissza a kérést elindító klienshez.
Mikor böngészőből próbáltam tesztelni, az csak homokórázott, de egyéb semmi.

Mikor már 100 millió oldalt, fórumot, levelezést, miegymást átnéztem, tök véletlenül találtam egy érdekes dolgot, pont itt a hupon: két hálókártya közötti forgalom irányításánál nemcsak a PREROUTING, hanem a POSTROUTING-ot is beállították, SNAT céllal (remélem jól fogalmaztam). A különbség csak annyi, hogy belső ip címet írtak át külső ip-re.

Arra gondoltam, hogy talán nekem is állítanom kellene azt mert lehet hogy az elirányított csomagokra érkező válaszban a kettes gép ip-je van, amivel nem fog tudni mit kezdeni a kliens?

Az alábbiakat tettem:

iptables -t nat -A POSTROUTING -p tcp -j SNAT --to egyes_gep_ipje

És láss csodát, működik!
Igaz, hogy ezzel tulajdonképpen azok a csomagok is átíródnak, amelyek nem kerültek átirányításra (tök feleslegesen).

Tudna valaki segíteni nekem megmagyarázni ezt az egészet, miért is van így? Vagy mi is történik a háttérben? Egyáltalán jól gondoltam itt a vége felé, hogy a kettes gép ip-je van a csomagban, és azzal nem tud mit kezdeni a kliens (mert Ő az egyes géphez csatlakozott, aminek más az ip-je), vagy egészen más van a háttérben és csak malacom van? :)

Előre is köszönöm a választ!

Hozzászólások

Egy Apache + ReverseProxy párossal nem lenne egyszerűbb?
Bár, ha nem akarod nagyon terhelni az első gépet, akkor nyilván az iptables a jobb megoldás.

a forgalom mindig kétirányú, az első szabály csak a befelé jövő csomagokról rendelkezett, a kifelé menőkről nem. Azok a másik gép címével, mint feladóval mentek ki, ezért a kapcsolat kezdeményezője nem tudta összepárosítani az általa küldött csomagokat a rá kapott válaszokkal.

A második parancsot pontosíthatod azzal, hogy ne mindent snatoljon, csak a web szerverről kifelé menő forgalmat.

Köszönöm a linket, ez egy igen jó leírás.

Egyébként hiányos a leírásom, nem akartam fellengzős lenni, de tulajdonképpen minden olyan forgalmat, ami web, levelezés, mysql, svn akartam átirányítani, csupán a web volt az, amivel gyakorolgattam.

Azért volt erre szükség mert a kettes_gep valójában az egyes_gep helyén volt, csak fizikailag máshová került (másik szolgáltató), helyére pedig beraktam az egyes_gep-et, hogy amíg át nem veszik a névszerverek az új ip-t (a régi ip-re mennének a kliensek), addig se érezzen senki kiesést.

Látom, hogy tulajdonképpen minden PREROUTING-hoz kell egy POSTROUTING-ot is megadni, és így aztán senki nem veszi észre, mi is van a háttérben. Az FTP az egyetlen, ahol ez nem igazán akar működni. A 21-es portot még átirányítja, de
mikor mondjuk kiadom az ls -l utasítást, akkor már gond van, pedig a passzív portokat is megadtam az iptables-nek.

Ha fizikailag máshová került a gép, akkor ott gondot okozhat, hogy hogyan tolod vissza a forgalmat a régi helyen levő tűzfal felé, hogy a snatolás megtörténhessen...

Az ftp-vel az baj, hogy a vezérlő csatornán gyakran átmegy a gép ip címe, ahol az adatkapcsolat vége van. Ott a tcp forgalomba kellene belekavarni, hogy átbuheráld a vezérlő csatornát is. Erre külön conntrack modul van a kernelben. Icq, skype, irc, egy-két voip program is a hekkelendők listáján van.

Ez azt jelentené, hogy az eredeti, de új ip-s gépen is kellene tűzfal szabályt megadnom? Végül is működik a rendszer így is, mire gondolsz, mikor azt írod, hogy : hogyan tolod vissza a forgalmat a régi helyen levő tűzfal felé, hogy a snatolás megtörténhessen ?

A conntrack modul használatához elég csak betölteni a modulokat: ip_conntrack, ip_conntrack_ftp, ip_nat_ftp ?

Egy szösszenet idejéig rákerestem, de sehol nem találtam utalást különlegesebb iptables utasításokra, így azt szűrtem le, hogy a modulok betöltése és a 21-es sport átirányítása után ennek elméletileg működnie kell. Jól gondolom?

bocs, de nem látom át teljesen azt, hogy mit csináltál, ezért nem tudom rendesen indokolni az állításomat...
Ha mondjuk bent volt egy tonlányos címtartományon a gép és átkerült mondjuk egy iw-sbe, akkor ezzel a snatolással vannak gondjaim.
Ha maradt ugyanazon szolgáltató címtartományán belül, csak kapott egy másik ip címet, akkor valamivel egyszerűbb a kérdés.