See on õige, me ütleme täna sama krüpteerimisjumalale.
Siin räägime krüptimata IPv4 tunnelist, kuid mitte "soojast lambist", vaid kaasaegsest "LED" tunnelist. Ja siin vilguvad ka toored pesad ja töö käib kasutajaruumis olevate pakettidega.
Iga maitse ja värvi jaoks on N tunneldamisprotokolli:
Kuid ma olen programmeerija, seega suurendan N-i vaid murdosa võrra ja jätan pärisprotokollide arendamise Kommersanti arendajatele.
Ühes sündimata projektiSee, mida ma praegu teen, on jõuda väljastpoolt NAT-i taga olevate hostideni. Kasutades selleks täiskasvanute krüptograafiaga protokolle, ei saanud ma lahti tundest, et see on nagu varblaste kahurist tulistamine. Sest tunnelit kasutatakse enamjaolt ainult NAT-e-sse aukude torkamiseks, siseliiklus on enamasti ka krüpteeritud, aga need upuvad ikka HTTPS-i ära.
Erinevaid tunneliprotokolle uurides pälvis minu sisemise perfektsionisti tähelepanu IPIP selle minimaalse üldkulu tõttu ikka ja jälle. Kuid sellel on minu ülesannete jaoks poolteist olulist puudust:
see nõuab mõlemalt poolt avalikke IP-sid,
ja teie jaoks pole autentimist.
Seetõttu aeti perfektsionist tagasi kolju tumedasse nurka või kuhu iganes ta seal istub.
Ja siis ühel päeval, lugedes artikleid algselt toetatud tunnelid Linuxis puutusin kokku FOU-ga (Foo-over-UDP), st. mis iganes, pakitud UDP-sse. Seni on toetatud ainult IPIP ja GUE (Generic UDP Encapsulation).
„Siin on hõbekuul! Minu jaoks piisab lihtsast IPIP-st. - Ma mõtlesin.
Tegelikult osutus kuul mitte täiesti hõbedaseks. Kapseldamine UDP-sse lahendab esimese probleemi – NAT-i taga olevate klientidega saab ühenduse luua väljastpoolt, kasutades eelnevalt loodud ühendust, kuid siin puhkeb pool IPIP-i järgmisest puudusest uues valguses – igaüks privaatvõrgust saab peituda nähtava taha. avalik IP ja kliendiport (puhta IPIP puhul seda probleemi ei esine).
Selle pooleteise probleemi lahendamiseks sündis utiliit ipipou. See rakendab kodus valmistatud mehhanismi kaughosti autentimiseks, häirimata tuuma FOU tööd, mis töötleb kiiresti ja tõhusalt pakette kerneli ruumis.
Me ei vaja teie skripti!
Ok, kui teate kliendi avalikku porti ja IP-d (näiteks kõik selle taga olevad inimesed ei lähe kuhugi, NAT proovib kaardistada porte 1-in-1), saate luua IPIP-over-FOU tunneli järgmised käsud, ilma skriptideta.
serveris:
# Подгрузить модуль ядра FOU
modprobe fou
# Создать IPIP туннель с инкапсуляцией в FOU.
# Модуль ipip подгрузится автоматически.
ip link add name ipipou0 type ipip
remote 198.51.100.2 local 203.0.113.1
encap fou encap-sport 10000 encap-dport 20001
mode ipip dev eth0
# Добавить порт на котором будет слушать FOU для этого туннеля
ip fou add port 10000 ipproto 4 local 203.0.113.1 dev eth0
# Назначить IP адрес туннелю
ip address add 172.28.0.0 peer 172.28.0.1 dev ipipou0
# Поднять туннель
ip link set ipipou0 up
kliendi kohta:
modprobe fou
ip link add name ipipou1 type ipip
remote 203.0.113.1 local 192.168.0.2
encap fou encap-sport 10001 encap-dport 10000 encap-csum
mode ipip dev eth0
# Опции local, peer, peer_port, dev могут не поддерживаться старыми ядрами, можно их опустить.
# peer и peer_port используются для создания соединения сразу при создании FOU-listener-а.
ip fou add port 10001 ipproto 4 local 192.168.0.2 peer 203.0.113.1 peer_port 10000 dev eth0
ip address add 172.28.0.1 peer 172.28.0.0 dev ipipou1
ip link set ipipou1 up
kus
ipipou* — kohaliku tunneli võrguliidese nimi
203.0.113.1 — avalik IP-server
198.51.100.2 — kliendi avalik IP
192.168.0.2 — liidesele eth0 määratud kliendi IP
10001 — FOU kohalik kliendiport
20001 — FOU avalik kliendiport
10000 — avalik serveriport FOU jaoks
encap-csum — võimalus lisada kapseldatud UDP-pakettidele UDP kontrollsumma; saab asendada noencap-csum, rääkimata sellest, terviklikkust kontrollib juba välimine kapselduskiht (kui pakett on tunnelis)
eth0 — kohalik liides, millega ipip-tunnel seotakse
172.28.0.1 — klienditunneli liidese IP (privaatne)
Kuni UDP ühendus on elus, on tunnel töökorras, aga kui see katki läheb, siis veab - kui kliendi IP: port jääb samaks - elab, kui vahetuvad - läheb katki.
Lihtsaim viis kõike tagasi pöörata on kerneli moodulite mahalaadimine: modprobe -r fou ipip
Isegi kui autentimine pole vajalik, ei ole kliendi avalik IP ja port alati teada ning need on sageli ettearvamatud või muutuvad (olenevalt NAT-i tüübist). Kui jätate vahele encap-dport serveri poolel tunnel ei tööta, pole piisavalt tark kaugühenduse porti võtta. Sel juhul saab aidata ka ipipou või WireGuard ja teised sarnased.
Kuidas see toimib?
Klient (mis on tavaliselt NAT-i taga) avab tunneli (nagu ülaltoodud näites) ja saadab serverile autentimispaketi, nii et see konfigureerib tunneli enda küljel. Olenevalt seadistustest võib see olla tühi pakett (just selleks, et server näeks avalikku IP: ühendusporti) või andmetega, mille järgi server saab klienti tuvastada. Andmed võivad olla lihtsa tekstiga paroolifraas (tuleb meelde analoogia HTTP põhiautentiga) või spetsiaalselt loodud andmed, mis on allkirjastatud privaatvõtmega (sarnaselt HTTP Digest Authiga on ainult tugevam, vt funktsiooni client_auth koodis).
Serveris (avaliku IP-ga pool) loob ipipou käivitumisel nfqueue järjekorra töötleja ja seadistab netfiltri nii, et vajalikud paketid saadetakse sinna, kus need olema peaksid: paketid, mis initsialiseerivad ühenduse nfqueue järjekorraga ja [peaaegu] kõik ülejäänud lähevad otse kuulajale FOU.
Neile, kes ei tea, on nfqueue (või NetfilterQueue) eriline asi amatööridele, kes ei tea, kuidas kerneli mooduleid arendada, mis netfiltri (nftables/iptables) abil võimaldab võrgupakette kasutajaruumi ümber suunata ja neid seal kasutades töödelda. primitiivne tähendab käepärast: muutke (valikuline ) ja andke see kernelile tagasi või visake see ära.
Mõne programmeerimiskeele jaoks on nfqueue-ga töötamiseks sidemeid, bashi jaoks neid polnud (heh, pole üllatav), pidin kasutama pythonit: ipipou kasutab NetfilterQueue.
Kui jõudlus pole kriitilise tähtsusega, saab seda asja kasutades suhteliselt kiiresti ja lihtsalt oma loogikat üsna madalal tasemel pakettidega töötamiseks välja mõelda, näiteks luua eksperimentaalseid andmeedastusprotokolle või trollida ebastandardse käitumisega kohalikke ja kaugteenuseid.
Toorpesad töötavad käsikäes nfqueue-ga, näiteks kui tunnel on juba konfigureeritud ja FOU kuulab soovitud pordis, ei saa te samast pordist tavapärasel viisil paketti saata - see on hõivatud, kuid Juhuslikult genereeritud paketi saab võtta ja saata otse võrguliidesesse, kasutades töötlemata pesa, kuigi sellise paketi genereerimine nõuab veidi rohkem nokitsemist. Nii luuakse ipipous autentimisega pakette.
Kuna ipipou töötleb ühendusest ainult esimesi pakette (ja neid, millel õnnestus järjekorda lekkida enne ühenduse loomist), ei kannata jõudlus peaaegu üldse.
Niipea, kui ipipou server saab autentitud paketi, luuakse tunnel ja kõik järgnevad ühenduses olevad paketid on juba töödeldud kerneli poolt nfqueue'st mööda minnes. Kui ühenduse loomine ebaõnnestub, siis saadetakse järgmise paketi esimene pakett olenevalt seadistustest nfqueue järjekorda, kui tegemist pole autentimisega paketiga, vaid viimati meelde jäänud IP-st ja kliendipordist, saab selle kas edasi anda sisse või ära visatud. Kui autentitud pakett pärineb uuest IP-st ja pordist, konfigureeritakse tunnel nende kasutamiseks ümber.
Tavalisel IPIP-over-FOU-l on NAT-iga töötamisel veel üks probleem - kaht UDP-sse kapseldatud IPIP tunnelit sama IP-ga ei saa luua, kuna FOU ja IPIP moodulid on üksteisest üsna isoleeritud. Need. sama avaliku IP-aadressi taga olevad kliendid ei saa sel viisil samaaegselt sama serveriga ühendust luua. Tulevikus, ehk, lahendatakse see kerneli tasemel, kuid see pole kindel. Seniks saab NAT-i probleeme lahendada NAT-iga – kui juhtub, et IP-aadresside paar on juba mõne teise tunneli poolt hõivatud, teeb ipipou NAT-i avalikust alternatiivsele privaatsele IP-le, voilaa! - saate luua tunneleid, kuni pordid saavad otsa.
Sest Kõik ühenduses olevad paketid pole allkirjastatud, siis on see lihtne kaitse MITM-i suhtes haavatav, nii et kui kliendi ja serveri vahelisel teel varitseb kaabakas, kes saab liiklust kuulata ja sellega manipuleerida, saab ta autentitud pakette ümber suunata. teise aadressi ja looge tunnel ebausaldusväärsest hostist.
Kui kellelgi on ideid, kuidas seda parandada, jättes suurema osa liiklusest tuumikusse, siis ärge kõhelge sellest rääkima.
Muide, UDP-sse kapseldamine on end väga hästi tõestanud. Võrreldes IP kapseldamisega, on see palju stabiilsem ja sageli ka kiirem, hoolimata UDP päise lisakulust. Selle põhjuseks on asjaolu, et enamik Interneti-hoste töötab hästi ainult kolme populaarseima protokolliga: TCP, UDP, ICMP. Käegakatsutav osa võib kõigest muust täielikult loobuda või seda aeglasemalt töödelda, kuna see on optimeeritud ainult nende kolme jaoks.
Näiteks seepärast loodi QUICK, millel HTTP/3 põhineb, UDP peale, mitte IP peale.
Noh, piisavalt sõnu, on aeg näha, kuidas see "pärismaailmas" töötab.
Lahing
Kasutatakse reaalse maailma jäljendamiseks iperf3. Reaalsuse läheduse osas on see ligikaudu sama, mis Minecraftis reaalse maailma jäljendamine, kuid praegu läheb see korda.
Konkursil osalejad:
viide põhikanalile
selle artikli kangelane on ipipou
OpenVPN autentimisega, kuid ilma krüptimiseta
OpenVPN kõikehõlmavas režiimis
WireGuard ilma eeljagatud võtmeta, MTU=1440 (alates ainult IPv4-st)
Tehnilised andmed nohikutele Mõõdikud võetakse järgmiste käskudega:
kliendi kohta:
UDP
CPULOG=NAME.udp.cpu.log; sar 10 6 >"$CPULOG" & iperf3 -c SERVER_IP -4 -t 60 -f m -i 10 -B LOCAL_IP -P 2 -u -b 12M; tail -1 "$CPULOG"
# Где "-b 12M" это пропускная способность основного канала, делённая на число потоков "-P", чтобы лишние пакеты не плодить и не портить производительность.