NAT v ramci jednoho stroje
Dan Lukes
dan at obluda.cz
Wed Jun 21 21:25:52 CEST 2006
Martin Balint napsal/wrote, On 06/21/06 19:07:
>> Mas tam pravidlo:
>> /sbin/ipfw add divert natd log all from any to any via fxp0
>>
>> A to presne znamena - divertovat vse, co prichazi pres fxp0
>>
> Tak to by odpovidalo, NATuje se vse, co projde kolem fxp0. Ja bych ale
> potreboval natovat pouze to, co leze z rl0 na fxp0, a odpoved spatky.
> Jde to nejak?
No, smerem "ven" to zas takovy problem neni - to se proste 'via fxp0'
zmeni na 'recv rl0 xmit fxp0'. Ale v opacnem smeru to nejde tak
jednoduse - uvedom si, ze ty pakety ven odchazeji s vnejsi adresou toho
fxp0 interface (tedy, predpokladam). A zpet tedy prichazeji s jeho
adresou - takovy paket na stroji take konci - nema nejmensiho duvodu
pokracovat smerem do rl0. Ledaze se prelozi a tim se cilova adresa zmeni.
Z toho je snad zrejme, ze na vstupu proste nelze NATu predkladat mene
nez vsechny pakety. To by, nicmene, nemelo vadit - pamatuju-li si to
spravne, pak natd paket, pro ktery nenajde zaznam v internich tabulkach
(coz je paket, ktery tedy patrne neni odpovedi na neco, co puvodne
vzeslo "zevnitr") neprelozi a vrati zpatky nezmeneny.
Takze rule, ktera by resila opacny smer by mohla koncit 'in fxp0',
pripadne, aby toho bylo jeste mene, tak 'to' by nebylo 'any' ale ta
adresa, ktera se pouziva pri prekladu.
MIsto jednoho 'divert' pravidla by tma tak byly dve, se shodnym divert
portem - jeden by natd predaval vstupni a druhy vystupni pakety. Pripadn
elze vyuzit toho, ze natd muze mit separatni socket pro vstupni a
separatni pro vystupni pakety a lze mu tedy pakety posilat na dva porty
(divert port by pak nebyl u obou pravidel stejny).
> Co je cilem:
>
> Na stroji, ktery bude pripojen k internetu, bude privatni 'podsit', ktera bude pristupna
> pouze pres OpenVPN. Tato podsit je bindovana na adapter rl0 a bezi v jailu 'iota'.
> Externi adapter (fxp0) posloucha na 1194/tcp a forwarduje na rl0 1194/tcp. Tam posloucha OpenVPN daemon.
> Aby jail 'iota' mohl na internet, bezi na fxp0 natd.
> Tohle vsechno funguje.
>
> Problem je, ze kdyz se pripojim s OpenVPN klientem do privatni site, nemuzu pingovat IP jailu.
> Rozsah pro OpenVPN klienty je 192.168.158.200-192.168.158.254.
To je velmi zvlastni rozsah. Jaka maska podsite se pouziva na "druhem"
konci tunelu, tedy u klienta ?
Well. IP jailu je 192.168.158.100 ...
Ja ty rady vezmu postupne, i kdyz bych asi hned nekolik prvnich z nich
mohl vynechat - problem se mi zda byt relativne jasny. Pro zjednoduseni
si take vyberu jednu IP adresu stanice - rekneme, ze to bude 192.168.158.200
Zacal bych tim, ze overim tcpdumpem na TAP0, ze ping od stanice vubec
prisel. MUj tip je, ze se ukaze, ze prisel. Mam-li pravdu, pak se z
routovaci tabulky uplatni zaznam ...
> 192.168.158.100/32 link#1 UC 0 0 rl0
... a paket by mel dorazit na misto urceni, tedy do jadra, a to by melo
odpovedet.
Odpoved bude mit zdrojovou adresu 192.168.158.100 a cilovou
192.168.158.200.
Pohledem na tabulku interfacu ...
> rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
> inet 192.168.158.100 netmask 0xffffffff broadcast 192.168.158.100
> fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
> inet 192.168.10.13 netmask 0xffffff00 broadcast 192.168.10.255
> inet 192.168.10.201 netmask 0xffffffff broadcast 192.168.10.201
> inet 192.168.10.202 netmask 0xffffffff broadcast 192.168.10.202
> inet 192.168.10.203 netmask 0xffffffff broadcast 192.168.10.203
> lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
> inet 127.0.0.1 netmask 0xff000000
> tap0: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
... zjistujeme, ze tato adresa neni lokalni pro zadny z techto interfacu.
V routovaci tabulce se pro tuto adresu nachazi jediny zaznam - default
gateway:
> default 192.168.10.1 UGS 0 56 fxp0
Ping-odpoved tedy, podle meho, odchazi pres fxp0 ven, coz by melo jit
take overit tcpdumpem. Pokud se nemylim, pak stanice, ktera ping poslala
nikdy nedostane odpoved.
> 4 192.168.158.100 iota.marbal.net /home/iota.marbal.net
...
> [root at epsilon: /home/mates]# cat /usr/local/etc/openvpn/openvpn.conf
...
> dev tap0
> server-bridge 192.168.158.100 255.255.255.0 192.168.158.201 192.168.158.254
...
> net.link.ether.bridge.config: rl0,tap0
Takze je zrejme, ze system nezna "cestu zpatky" - duvod, proc na sebe
mohou pingat klienti je pravdepodobne ten, ze to interne resi samo
OpenVPN - system k nim ale adresu nezna. Neni v routovaci tabulce a v
arp ...
> ? (192.168.10.1) at 00:0e:2e:3f:dd:31 on fxp0 [ethernet]
> ? (192.168.10.16) at 00:0d:61:39:fd:3d on fxp0 [ethernet]
> ? (192.168.10.201) at 00:11:11:0e:94:9f on fxp0 permanent [ethernet]
... take nenni zaznam tykajici se jedineho OpenVPN klienta.
No, tak to bychom meli analyzu, proc to nefunguje. A ted se asi ocekava
nejaka rada, jak to opravit.
Velice me to mrzi, ale nemhu slouzit. Tohle je prilis slozita
konfigurace na to, abych dokazal z fleku vyhodit, jak to udelat.
Tim "prilis slozita" myslim nejen, ze je slozita pozadavky - ale
zejmena mi pripada, ze je zbytecne slozita resenim.
A ja opravdu nedokazu rict, jestli je to, ze system nezna cesti k
vnejsim klientum je chyba OpenVPN (uz jsem tady psal, ze OpenVPN na TAP
jsme nikdy uspokojive nerozfungovali) nebo cela ta konfigurace se snazi
udelat neco, co je vnitrne rozporne a system to proste neumi.
Z meho hlediska konfiguraci neprimerene a navic celkem zbytecne
komplikuje ten bridge. Me by prirozenejsi pripadalo, kdyby OpenVPN a k
nemu prisluny tap byl jedna logicka IP sit. tap by mel svoji vlastni IP
adresu, zadny bridge by se nekonal, servery, na ktere se zkomunikuje by
byly uz v jine IP siti a pakety by se uplne bezne tam a zpet routuji.
Mozna ma tahle myslenka nejaky hacek, ktery mi unikl - tohle se opravdu
spatne stavi na papire ...
No, treba ti pomuze i ta samotna analyza, proc to nechodi a nejake
reseni uz najdes sam. Nebo nekdo jiny tady ...
Kazdopadne, v prekladu problem neni - ony 'pingaci' pakety vubec nemaji
co pres fxp0 prochazet.
Dan
--
Dan Lukes SISAL MFF UK
AKA: dan at obluda.cz, dan at freebsd.cz,dan at kolej.mff.cuni.cz
More information about the Users-l
mailing list