LAN-seadme esitamine lüüsi ühel oma tunneliaadressil nõuab ühte rida NAT-i. Ühendus siiski ebaõnnestub, sest vastav seade ei tea, et kliendi aadress on selle lüüsi kaudu kättesaadav. Jälgi paketti kliendist sissepoole, seejärel jälgi vastust tagasi väljapoole, ja puuduv pool muutub ilmsiks.

Alusta kliendi vaatenurgast

Selle näite klient asub VPN-kogus 10.62.0.0/24 ja ühendub aadressiga 10.62.0.1 pordil 8080. See aadress kuulub lüüsile endale, nii et pakett jõuab lüüsi tuuma, mitte teise võrdväärsesse. Lüüsi taga on LAN 172.21.4.0/24. Lüüs hoiab 172.21.4.10 ja seade, mis tegelikult HTTP-d teenindab, on 172.21.4.40.

Teisele VPN-võrdväärsele kuuluv aadress ei ole lüüsi teenuseaadressiga vahetatav. Kui klient ühendub võrdväärse aadressiga, ei ole ükski lüüsi reegel üldse mängus ja kogu see käik on vale.

Piira sihtkoha tõlget teadlikult

Kitsas versioon esitab ühe pordi ja kirjutab ümber ainult sihtkoha. Pakett säilitab oma protokolli ja allika, ja just see teeb ülejäänud käigu huvitavaks.

iptables -t nat -A PREROUTING -i tun0 -s 10.62.0.0/24 -d 10.62.0.1 -p tcp --dport 8080 -j DNAT --to-destination 172.21.4.40:80

Reegel ilma protokolli ja pordi kriteeriumiteta on lai versioon: see säilitab ükskõik millise pordi, mille klient valis, muutes ainult aadressi. See on õigustatud, kui kavatsetakse esitada kogu hosti, ja vale, kui kavatsus oli üks teenus. Loe reegel tagasi ja kinnita liidese nimi. Vale liidese DNAT-reegel ei vasta millelegi, mis tekitab sama ajalõpu nagu puuduv reegel ja raiskab tund aega seadme vaatamisele.

Lase edasisaatmise piiril nõustuda

Tõlge muudab päist, see ei anna luba. Vaikimisi langetamise poliitika korral vajab edasisaadetud voog oma luba ja tagasisuund vajab kehtestatud ühenduse reeglit, mis sinu poliitikal tõenäoliselt juba on.

iptables -A FORWARD -i tun0 -o lan0 -d 172.21.4.40 -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Iga DNAT-voogu tingimusteta lubamine on sellest kavandist laiem ja lubab ka hiljem kellegi teise lisatud vastendusi. Nimeta sihtkoht ja port ning jäta ülejäänu suletuks. Kui edasisaatmise reegli loendurid jäävad nulli, samal ajal kui NAT-i loendurid kasvavad, visatakse pakett enne sinu reeglit ära. Loe ahelate järjekorda, selle asemel et lisada teine koopia.

Seade peab kuidagi vastama

Pärast tõlget näeb seade allikat 10.62.0.0/24 sees. Selle vastus läheb vaikimisi lüüsile, milleks on LAN-ruuter, mitte VPN-lüüs, kui miski ei ütle teisiti. Kaks lahendust seda parandavad ja need ei ole samaväärsed. Marsruut seadmes või LAN-ruuteris saadab 10.62.0.0/24 aadressile 172.21.4.10 ja säilitab kliendi allika. Piiratud allika tõlge peidab kliendi hoopis lüüsi LAN-aadressi taha.

ip route add 10.62.0.0/24 via 172.21.4.10 dev eth1
iptables -t nat -A POSTROUTING -s 10.62.0.0/24 -d 172.21.4.40 -o lan0 -p tcp --dport 80 -j SNAT --to-source 172.21.4.10

Vali selle järgi, mida teenus vajab. Kliendipõhine poliitika ja sisukad logid tahavad marsruuditud kuju; seade, millele ei saa marsruuti anda, või teenus, mis lihtsalt peab nägema LAN-aadressi, osutavad tõlgitud kujule. Ära haara globaalse masquerade-reegli järele, et üks vastus töötaks. See peidab iga kliendi iga sihtkoha eest ja rikub vaikselt poliitikad, mis sõltuvad allika-aadressidest.

Ära testi lüüsist endast

Lüüsil aadressile 10.62.0.1 loodud päring väljub OUTPUT-ahela kaudu, mitte sissetuleva PREROUTING-i kaudu. Selle ebaõnnestumine või õnnestumine ei ütle midagi kliendile suunatud reegli kohta ja nii jõuavad inimesed järeldusele, et töötav reegel on katki.

conntrack -L | grep 172.21.4.40
tcpdump -ni any 'port 8080 or port 80'

Käivita tõeline kliendipäring ja loe mõlemat. conntrack-kirje näitab rakendatud tõlget ja püügid näitavad, kas päring läks LAN-i ja kas vastus tuli tunneli poole tagasi. Kasuta reeglite muutmise järel uut ühendust, sest olemasolev olek hoiab oma varasemat vastendust ja ebaõnnestub edasi vanaviisi. Seejärel kinnita kogu vestlus: seadme aadress, edasisaatmise luba ja vastuse marsruut kirjeldavad kõik sama voogu.

Seotud artiklid