Doseči oddaljeni /24 skozi tunel: NETMAP, DNAT ali pot?
Preslikajte celotno predpono z NETMAP, dodajte pravila DNAT za vsakega gostitelja ali usmerite resnični obseg, in odločite se glede na to, kaj mora videti oddaljena stran in kdo lahko začne promet.
Do podomrežja za končno točko tunela lahko pridete na tri načine, in minuta zbiranja dejstev običajno izloči dva. Dejstva so, ali morajo tamkajšnji strežniki razlikovati uporabnike, ali se bo kdo od tam kdaj povezal proti vašemu obsegu, in kdo lahko ureja usmerjevalnik na oddaljeni strani. Odgovorite na te tri in zasnova se izbere sama. Preostanek predpostavlja, da upravljate končno točko in lahko urejate njen požarni zid.
Tri možnosti in kaj vsaka resnično spremeni
Preslikava predpone, DNAT na gostitelja in usmerjena predpona vsi premikajo pakete med istima dvema obsegoma, a spreminjajo različne stvari. Preslikava si izmisli obseg vzdevkov in med letom aritmetično prepiše naslove. Pravila na gostitelja tudi prepisujejo, le da je vsak cilj imenovan ročno. Usmerjena predpona ne prepiše ničesar: paketi obdržijo resnične naslove in oba konca se strinjata, kje ti naslovi živijo.
| What the far side needs | Prefix mapping | Per-host DNAT | Routed prefix |
|---|---|---|---|
| Users visible to its logs | Only without source NAT | Same condition | Yes, unchanged |
| To start a connection toward you | No, alias is local | No, same reason | Yes, both ends route |
| To absorb a new host | Yes, arithmetic only | No, one rule per address | Yes, it simply routes |
| To require no config change | Yes, with source NAT | Yes, same condition | No, it needs a route back |
Izločanje začnite na oddaljeni strani, kjer je omejitve najtežje spremeniti. Če strežnik tam zapisuje naslove odjemalcev v dnevnike, jih preverja na seznamu dovoljenih ali jih preda drugemu sistemu, prevajanje vira uniči njegov edini identifikator. Če se mora oddaljena stran tudi povezovati navznoter, je prevajanje popolnoma izključeno, ker tam nihče ne ve, da vzdevek obstaja. Šele ko se oddaljena stran le odziva na zahteve, postanejo cenejše možnosti varne.
Pari predpon in zakaj se morajo velikosti ujemati
NETMAP je cilj tabele nat, ki deluje na paru predpon enake dolžine. V notranjosti nima tabele za vsak naslov: odstrani predpono, obdrži bite gostitelja in jih ponovno pripne na novo predpono, zato se /24 preslika na /24 in nikoli na /25. Položaj določa smer: ujemanje cilja v PREROUTING prepiše, kam paket gre, ujemanje vira v POSTROUTING pa prepiše, od kod je prišel.
Gostitelj na 192.168.2.17 se vašim odjemalcem prikaže kot 10.50.1.17, zadnji oktet pa ni okras — to je ista številka na obeh straneh. Jutri dodajte gostitelja na 192.168.2.40 in njegov vzdevek je 10.50.1.40, brez pravila za urejanje.
Odjemalci še vedno potrebujejo pot za obseg vzdevkov, ki kaže na vašo škatlo, razen če vzdevek pade v podomrežje, ki ga že dosežejo. Prehod ne potrebuje poti za vzdevek, ker se prevajanje cilja izvaja v PREROUTING, pred iskanjem poti. Tudi posredovanje mora biti vklopljeno, sicer jedro paket po prepisu zavrže. Trije ukazi spodaj so cela konfiguracija na prehodu v slogu Debiana z odjemalci na br0, vzdevkom na 10.50.1.0/24 in tunelom na tun0.
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -i br0 -d 10.50.1.0/24 -j NETMAP --to 192.168.2.0/24
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADEOdgovor si mora sam najti pot nazaj
Prepis cilja odloči le, kam bo paket dostavljen. Oddaljeni strežnik se mora še vedno odzvati na naslov, ki ga doseže, in to je mogoče urediti na dva načina. Prevedite vir, da se odgovori vrnejo na vašo škatlo, ali pustite vir in dajte oddaljeni strani pot za obseg odjemalcev.
Masquerade na izhodu je krajša pot: eno pravilo v POSTROUTING in oddaljena stran vidi naslov vašega tunela, zato ne potrebuje lastne poti. Cena je, da se vsak uporabnik zloži v en naslov, dnevniki po uporabnikih pa izgubijo pomen. Če vir pustite nedotaknjen, se informacija ohrani, a potem mora oddaljena stran pošiljati odgovore za obseg odjemalcev nazaj skozi tunel.OpenVPN strežniku je to potisnjeno push "route 10.50.9.0 255.255.255.0", plus route 192.168.2.0 255.255.255.0 vrstica.
Draga napaka je narediti polovico vsakega. Če maskirate del prometa, medtem ko oddaljena stran nosi tudi povratno pot za drug promet, odgovori pridejo na vmesnik, kjer vnos sledenja povezave ni bil nikoli viden. Odjemalec poroča o časovni omejitvi za zahtevo, ki jo je strežnik zabeležil kot oskrbljeno. Obe smeri toka morata prečkati isto instanco netfilter: en prehod prevaja, ne dva požarna zidova zaporedno.
conntrack -L -d 10.50.1.17
iptables -t nat -L PREROUTING -v -nVnos preberite v obeh smereh: izvirni tuple obdrži vaš vzdevek na cilju, medtem ko tuple odgovora nosi resnični naslov. Če tuple odgovora manjka, je problem povratna pot, ne pravilo. Če se števci PREROUTING nikoli niso premaknili, paket ni nikoli dosegel tega hooka.
Trki in iskanje, ki se izvede prvo
Dva različna obsega lahko trčita in oba neuspeha izgledata kot pokvarjen tunel, ne kot slabo pravilo. Vzdevek, ki si ga izmislite, mora biti neuporabljen vzdolž celotne poti, resnični oddaljeni obseg pa ne sme že obstajati v vašem omrežju. Dvojnik povzroča občasni promet do napačnega gostitelja, kar je težje diagnosticirati kot zavrnjeno povezavo. Preden dodate pravilo, vprašajte usmerjevalno tabelo.
Na prehodu, ip route get 192.168.2.17 bi moralo navesti napravo tunela; lokalni bridge pomeni, da je oddaljeni obseg zasenčen in nobeno nat pravilo tega ne popravi. Če vaše omrežje že uporablja 192.168.2.0/24, preštevilčite oddaljeno mesto, namesto da bi kopičili preslikavo na trku.
Preizkušanje s pravega odjemalca in nato ohranitev
Preizkusite s stroja, ki bo vzdevek resnično uporabljal, ne s prehoda, ker lokalno ustvarjen promet nikoli ne prečka PREROUTING na enak način. Odprite povezavo do enega gostitelja z vzdevkom in opazujte, kako se števci in vnos conntrack pojavijo skupaj, nato jo zaprite in potrdite, da vnos izgine. Zastarel vnos kaže na napol odprto povezavo, kar običajno pomeni, da se odgovor ni nikoli vrnil.
curl -sv http://10.50.1.17/ -o /dev/null
ss -tn dst 10.50.1.17
conntrack -L -d 10.50.1.17Dve ali tri uspešne povezave dokažejo aritmetiko, a ne povedo nič o trajnosti ali o naslednjem inženirju. Pravila shranite tam, kjer jih bere zagonski proces, kar v Debianu in Ubuntu pomeni iptables-save > /etc/iptables/rules.v4 z omogočenim netfilter-persistent. Preslikava, ki po ponovnem zagonu izgine, je slabša od nobene, ker izpad pride brez nedavne spremembe, ki bi jo lahko krivili.
Ob pravilih pustite opombo: obseg vzdevkov, resnični obseg, razlog za par in katera stran lahko začne. Ta opomba loči zasnovo od kupa pravil, ki si jih nihče ne upa izbrisati. Reši tudi poznejše vprašanje, ko oddaljeno mesto doda gostitelja in naslov, ki ga nihče ni nastavil, že odgovarja. Če opomba pravi, da oddaljena stran potrebuje povratno pot, naslednja oseba ve, da odstranitev pravila masquerade prekine povezljivost. Dokumentacija je tu poceni; ponovno odkrivanje odvisnosti od NAT ob treh zjutraj ni.