Dakle, IPSEC tunel preko Interneta sam uspostavio (kriptovan je samo tunel, spoljne adrese oba hosta nisu vezane IPSEC-om), pri tome sam koristio samo setkey i eventualno racoon (radi i bez njega, ručnim unošenjem u setkey), rute odradi sam kernel (mada se ne vide u ruting tabeli). Postavio sam NAT pravilo koje SNAT-uje unutrašnjom adresom linux rutera sve što se šalje kroz tunel na drugi host, i sve to radi.
iptables -t nat -I POSTROUTING -d 10.0.2.0/24 -j SNAT --to-source 10.0.1.1
Međutim, rezultat ovoga je da svaki kompjuter iz mreže 1 koji pristupa mreži 2 do tamo stiže pod adresom linux rutera koji drži tunel (10.0.1.1), što važi i u suprotnom smeru. To mi se ne sviđa. Mislio sam da je rešenje vrlo prosto, pa sam umesto gornjeg pravila postavio drugo:
iptables -t nat -I POSTROUTING -s $SPOLJNI_IP -d 10.0.2.0/24 -j SNAT --to-source 10.0.1.1
Pretvaranje spoljne adrese tog rutera u internu adresu bi služilo samo za slučajeve kada se baš sa tog linux rutera kontaktira udaljena mreža (preko interneta), dok sam za ostale (interne) adrese smatrao da nema potrebe za SNAT-ovanjem jer je tunel već uspostavljen među njima.
Međutim, tunel tada jednostavno ne radi. Tcpdump pokazuje da se ping šalje ali ne kroz tunel nego nazad na unutrašnji eternet interfejs kroz koji je ušao ping ali sa adresom spoljnog interfejsa!? Na drugoj strani ne stiže ništa. IPSEC jeste problematičan što se tiče tcpdumpa, ali kada tunel radi bar se vidi dolazni saobraćaj, dok se u ovom slučaju izmenjenog SNAT-a ne vidi ništa, tako da pretpostavljam da kroz tunel stvarno ništa i ne stiže.
primer: sa 10.0.1.50 pingujemo 10.0.2.60... tcpdump unutrašnjeg eterneta pokazuje otprilike:
ping 10.0.1.50 -> 10.0.2.60
ping $SPOLJNI_IP -> 10.0.2.60
ping $SPOLJNI_IP -> 10.0.2.60
(za svaki ulazni ping zaista se prikazuju dva pinga koji bi navodno trebalo da budu poslati kroz tunel ali su poslati nazad u unutrašnju mrežu, pa stoga nemaju kome da stignu niti ko može da odgovori na njih)
Zašto? Ne vidim razlog za takvo ponašanje, ja sam taj tunel između mreža posmatrao kao neku vrstu rutiranja koje radi kernel uz korišćenje IPSEC-a, s tim da se pravila rutiranja ne vide u ruting tabeli, međutim iz ovoga ispada da to ipak nije rutiranje već nešto drugo. Da je to obično rutiranje uz enkripciju, sve što se šalje sa mreže 10.0.1.0/24 bi trebalo da bude preko ruting tabele slato kroz tunel na mrežu 10.0.2.0/24 a odgovor iz druge mreže bi isto tako nalazio svoj put nazad kroz tunel, pa pretvaranje svih adresa iz mreže 10.0.1.0/24 u 10.0.1.1 ne bi bilo potebno. Tako sam ja to zamišljao, ali izgleda da nisam dobro zamišljao. Probao sam da dodam neke posebne rute baš za to što hoću, ali jednosavno nema efekta (paketi ne idu kroz tunel)
Dakle, zna li neko kako da nateram IPSEC tunel na kernelima 2.6+ da radi kao da je u pitanju obično rutiranje među mrežama?
[Ovu poruku je menjao pisac dana 09.11.2014. u 01:19 GMT+1]