Rast e, em ê îro jî heman tiştî ji xwedayê şîfrekirinê re bibêjin.
Li vir em ê li ser tunelek IPv4 ya neşîfrekirî biaxivin, lê ne li ser "lampa germ", lê li ser "LED"ek nûjen. Û li vir soketên xav jî hene, û di cîhê bikarhêner de bi pakêtan re xebat didomin.
Ji bo her çêj û rengê N protokolên tunekirinê hene:
Lê ez bernamesaz im, ji ber vê yekê ez ê N tenê bi perçeyek zêde bikim, û pêşveçûna protokolên rastîn ji pêşdebirên Kommersant re bihêlim.
Di yek nedayik de pêşnûmeYa ku ez naha dikim ev e ku ez ji derve bigihîjim mêvandarên li pişt NAT. Bi karanîna protokolên bi şîfrekirina mezinan ji bo vê yekê, min nikarî hesta ku ew mîna gulebarana çivîkan ji topê dihejanda. Bo tunel bi piranî tenê ji bo vekirina kunên NAT-e tê bikar anîn, seyrûsefera hundurîn bi gelemperî jî şîfrekirî ye, lê ew dîsa jî di HTTPS de xeniqîne.
Dema ku li ser protokolên cihêreng ên tunekirinê lêkolîn dikir, bala kakilparêzê min ê hundurîn ji ber sermaya wê ya hindik car û car carek din kişand ser IPIP. Lê ji bo karên min yek û nîv kêmasiyên girîng hene:
ew ji her du aliyan ve IP-yên gelemperî hewce dike,
û ji bo we erêkirin tune.
Ji ber vê yekê, tekûzperest dîsa hate ajotin quncika tarî ya qorikê, an li ku derê rûniştî.
Û paşê rojekê, dema xwendina gotaran li ser tunelên xwemalî piştgirî kirin di Linuxê de ez rastî FOU (Foo-over-UDP) hatim, yanî. her çi be, di UDP de pêça. Heya nuha, tenê IPIP û GUE (Generic UDP Encapsulation) têne piştgirî kirin.
“Li vir guleya zîvîn e! IPIPek hêsan têra min dike.” - Ez difikirîm.
Bi rastî, gule ne bi tevahî zîv bû. Encapsulation di UDP de pirsgirêka yekem çareser dike - hûn dikarin bi xerîdarên li pişt NAT-ê ji derve ve bi karanîna pêwendiyek berê-sazkirî ve girêbidin, lê li vir nîvê kêmasiya din a IPIP-ê di ronahiyek nû de şîn dibe - her kes ji torgilokek taybet dikare li pişta xuyangê veşêre. IP-ya gelemperî û porta xerîdar (di IPIP-a paqij de ev pirsgirêk tune).
Ji bo çareserkirina vê pirsgirêkek yek û nîv, karûbar çêbû ipipou. Ew mekanîzmayek ji malê çêkirî pêk tîne ji bo rastkirina mêvandarek dûr, bêyî têkbirina xebata kernel FOU, ku dê bi lez û bez pakêtan li cîhê kernelê bişopîne.
Em ne hewceyî nivîsara te ne!
Ok, heke hûn porta giştî û IP-ya xerîdar zanibin (mînak, her kesê li pişt wê naçe cîhek, NAT hewl dide ku nexşeya portên 1-li-1-ê nexşîne), hûn dikarin tunelek IPIP-over-FOU bi emrên jêrîn, bêyî ku tîpan.
li ser server:
# Подгрузить модуль ядра 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
li ser xerîdar:
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
ko
ipipou* - navê navgîniya torê ya tunelê ya herêmî
203.0.113.1 - server IP-ya gelemperî
198.51.100.2 - IP-ya giştî ya xerîdar
192.168.0.2 - IP-ya muwekîlê ku ji navbeynkariya eth0 re hatî destnîşankirin
10001 - porta xerîdar a herêmî ji bo FOU
20001 - porta xerîdar a giştî ji bo FOU
10000 - porta servera giştî ji bo FOU
encap-csum - Vebijarka lê zêdekirina kontrolek UDP-ê li pakêtên UDP-ê yên dorpêçkirî; dikare bi şûna noencap-csum, nebêjin, yekrêzî jixwe ji hêla qata encapsulasyona derveyî ve tê kontrol kirin (dema ku pakêt di hundurê tunelê de ye)
eth0 - Navbera herêmî ya ku dê tunela ipip-ê pê ve were girêdan
172.28.0.1 - IP-ya navgîniya tunelê ya xerîdar (taybet)
172.28.0.0 - Navrûya servera tunelê IP (taybet)
Heya ku pêwendiya UDP sax be, tunel dê di rewşa xebatê de be, lê heke ew bişkê, hûn ê bi şens bin - ger IP-ya xerîdar: port heman bimîne - ew ê bijî, ger ew biguhezin - ew ê bişkîne.
Rêya herî hêsan ku meriv her tiştî paşde vegerîne ev e ku modulên kernel dakêşin: modprobe -r fou ipip
Tewra ku pejirandin ne hewce be jî, IP-ya giştî û porta xerîdar her gav nayên zanîn û bi gelemperî nepêşbînîkirî an guhêrbar in (li gorî celebê NAT-ê ve girêdayî ye). Heke hûn nehêlin encap-dport li aliyê serverê, tunel dê nexebite, ew ne bes e ku meriv porta girêdana dûr bigire. Di vê rewşê de, ipipou jî dikare bibe alîkar, an WireGuard û yên din ên mîna wê dikarin ji we re bibin alîkar.
Çawa dixebite?
Xerîdar (ku bi gelemperî li pişt NAT-ê ye) tunelekek vedike (wek mînaka jor), û pakêtek erêkirinê ji serverê re dişîne da ku ew tunelê li kêleka xwe mîheng bike. Bi mîhengan ve girêdayî, ev dikare pakêtek vala be (tenê da ku server bikaribe IP-ya giştî bibîne: porta girêdanê), an bi daneyên ku server dikare xerîdar nas bike. Dane dikare di nivîsa zelal de ravekek hêsan be (analojiya bi HTTP Basic Auth tê bîra me) an daneya taybetî hatî sêwirandin ku bi mifteyek taybet ve hatî îmze kirin (wek mîna HTTP Digest Auth tenê bihêztir e, fonksiyonê bibînin client_auth di kodê de).
Li ser serverê (aliyê bi IP-ya gelemperî), dema ku ipipou dest pê dike, ew rêvekerek rêza nfqueue diafirîne û netfilterê mîheng dike da ku pakêtên pêwîst li cihê ku lê bin werin şandin: pakêtên ku pêwendiya bi rêza nfqueue re dest pê dikin, û [hema hema] hemû yên mayî rasterast diçin cem guhdarê FOU.
Ji bo kesên ku nizanin, nfqueue (an NetfilterQueue) tiştek taybetî ye ji bo amatorên ku nizanin modulên kernel çawa pêşve bibin, ku bi karanîna netfilter (nftables / iptables) dihêle hûn pakêtên torê beralî cîhê bikarhêner bikin û wan li wir bi kar bînin. Wateya primitive li ber dest: biguhezîne (vebijarkî) û vegerîne kernelê, an jê bavêje.
Ji bo hin zimanên bernamesaziyê girêdanên ji bo xebata bi nfqueue re hene, ji bo bash tune bû (heh, ne ecêb e), min neçar ma ku python bikar bînim: ipipou bikar tîne NetfilterQueue.
Ger performans ne krîtîk e, bi karanîna vê tiştê hûn dikarin bi rengek zû û bi hêsanî mantiqa xwe ji bo xebata bi pakêtan re di astek kêm kêm de çêkin, mînakî, protokolên veguheztina daneya ceribandinê biafirînin, an karûbarên herêmî û dûr bi tevgerên ne-standard troll bikin.
Soketên xav bi nfqueue re bi hev re dixebitin, mînakî, dema ku tunel jixwe hatî mîheng kirin û FOU li porta xwestinê guhdarî dike, hûn ê nikaribin pakêtek ji heman portê bi awayê asayî bişînin - ew mijûl e, lê hûn dikarin pakêtek ku bi rengek rasthatî hatî hilberandin rasterast bi karanîna soketek xav ragirin û bişînin, her çend ji bo hilberîna pakêtek wusa pêdivî ye ku piçekî bêtir guheztinê hewce bike. Bi vî rengî pakêtên bi erêkirinê di ipipou de têne afirandin.
Ji ber ku ipipou tenê pakêtên yekem ên ji girêdanê pêvajoyê dike (û yên ku beriya ku pêwendiyê ava bikin karîbûn di dorê de biherikin), performans hema hema zirarê nade.
Hema ku servera ipipou pakêtek pejirandî werdigire, tunelek tê afirandin û hemî pakêtên paşîn ên di pêwendiyê de jixwe ji hêla kernel ve nfqueue derbas dibe têne hilberandin. Ger pêwendiyek têk neçe, wê hingê pakêta yekem a ya din dê ji rêza nfqueue re were şandin, li gorî mîhengan, heke ew ne pakêtek bi erêkirinê ye, lê ji IP-ya paşîn û porta xerîdar a ku tê bîra min, dikare were derbas kirin. li ser an avêtin. Ger pakêtek pejirandî ji IP û portek nû tê, tunel ji nû ve tê mîheng kirin ku wan bikar bîne.
IPIP-ser-FOU-ya adetî dema ku bi NAT-ê re dixebite pirsgirêkek din heye - ne gengaz e ku meriv du tunelên IPIP-ê yên ku di UDP-yê de bi heman IP-yê vegirtî têne çêkirin, ji ber ku modulên FOU û IPIP ji hevûdu veqetandî ne. Ewan. cotek xerîdar li pişt heman IP-ya gelemperî dê nikaribin bi vî rengî bi hevdemî bi heman serverê re têkildar bibin. Di pêşerojê de, dibe, ew ê di asta kernelê de were çareser kirin, lê ev ne diyar e. Di vê navberê de, pirsgirêkên NAT-ê dikarin ji hêla NAT-ê ve werin çareser kirin - heke çêbibe ku cotek navnîşanên IP-yê berê ji hêla tunelek din ve hatî dagir kirin, ipipou dê NAT-ê ji gelemperî bigire heya IP-ya taybet a alternatîf, voila! - Hûn dikarin tunelan biafirînin heya ku port biqedin.
Bo Hemî pakêtên di pêwendiyê de ne hatine îmze kirin, wê hingê ev parastina hêsan ji MITM-ê re xeternak e, ji ber vê yekê heke li ser riya di navbera xerîdar û serverê de xirabiyek hebe ku dikare guh bide seyrûseferê û wê manîpule bike, ew dikare pakêtên pejirandî beralî bike. navnîşanek din û ji mêvandarek nebawer tunelek çêbikin.
Ger kesek xwedî raman be ka meriv çawa vê yekê rast bike dema ku piraniya seyrûseferê di navgîniyê de dihêle, dudilî nebin ku biaxive.
Bi awayê, encapsulation di UDP de xwe pir baş îsbat kiriye. Li gorî encapsulasyona li ser IP-yê, ew tevî sernavê sernavê UDP-ê pir bi îstîqrar û pir caran zûtir e. Ev ji ber vê yekê ye ku piraniya mêvandarên li ser Înternetê tenê bi sê protokolên herî populer re baş dixebitin: TCP, UDP, ICMP. Beşa berbiçav dikare her tiştê din bi tevahî bavêje, an jî hêdîtir pêvajo bike, ji ber ku ew tenê ji bo van sêyan xweşbîn e.
Mînakî, ji ber vê yekê QUICK, ku HTTP/3 li ser bingeha wê ye, li ser UDP-ê, û ne li ser IP-yê hate afirandin.
Welê, peyvên bes, dem e ku hûn bibînin ka ew di "cîhana rast" de çawa dixebite.
Şer
Ji bo nimûnekirina cîhana rastîn tê bikar anîn iperf3. Di warê dereceya nêzîkbûna rastiyê de, ev hema hema heman emilandina cîhana rastîn li Minecraft e, lê heya niha ew ê bike.
Beşdarên pêşbirkê:
kanala sereke referansa
lehengê vê gotarê ipipou ye
OpenVPN bi verastkirin lê bê şîfrekirin
OpenVPN di moda tevdehev de
WireGuard bêyî PresharedKey, bi MTU=1440 (ji ber IPv4-tenê)
Daneyên teknîkî ji bo geeks Metrîk bi fermanên jêrîn têne girtin:
li ser xerîdar:
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", чтобы лишние пакеты не плодить и не портить производительность.
Nîşana zirav ya şil
Barkirina CPU ya serverê ne pir diyarker e, ji ber ku ... Gelek karûbarên din hene ku li wir dixebitin, carinan ew çavkaniyan dixwin:
proto bandwidth[Mbps] CPU_idle_client[%] CPU_idle_server[%]
# 20 Mbps канал с микрокомпьютера (4 core) до VPS (1 core) через Атлантику
# pure
UDP 20.4 99.80 93.34
TCP 19.2 99.67 96.68
ICMP latency min/avg/max/mdev = 198.838/198.997/199.360/0.372 ms
# ipipou
UDP 19.8 98.45 99.47
TCP 18.8 99.56 96.75
ICMP latency min/avg/max/mdev = 199.562/208.919/220.222/7.905 ms
# openvpn0 (auth only, no encryption)
UDP 19.3 99.89 72.90
TCP 16.1 95.95 88.46
ICMP latency min/avg/max/mdev = 191.631/193.538/198.724/2.520 ms
# openvpn (full encryption, auth, etc)
UDP 19.6 99.75 72.35
TCP 17.0 94.47 87.99
ICMP latency min/avg/max/mdev = 202.168/202.377/202.900/0.451 ms
# wireguard
UDP 19.3 91.60 94.78
TCP 17.2 96.76 92.87
ICMP latency min/avg/max/mdev = 217.925/223.601/230.696/3.266 ms
## около-1Gbps канал между VPS Европы и США (1 core)
# pure
UDP 729 73.40 39.93
TCP 363 96.95 90.40
ICMP latency min/avg/max/mdev = 106.867/106.994/107.126/0.066 ms
# ipipou
UDP 714 63.10 23.53
TCP 431 95.65 64.56
ICMP latency min/avg/max/mdev = 107.444/107.523/107.648/0.058 ms
# openvpn0 (auth only, no encryption)
UDP 193 17.51 1.62
TCP 12 95.45 92.80
ICMP latency min/avg/max/mdev = 107.191/107.334/107.559/0.116 ms
# wireguard
UDP 629 22.26 2.62
TCP 198 77.40 55.98
ICMP latency min/avg/max/mdev = 107.616/107.788/108.038/0.128 ms
Kanala 20 Mbps
kanala per 1 Gbps xweşbîn
Di hemî rewşan de, ipipou di performansê de ji kanala bingehîn re pir nêzîk e, ku pir xweş e!
Tunela openvpn ya neşîfrekirî di her du rewşan de jî ecêb tevdigeriya.
Ger kesek wê ceribandinê bike, dê balkêş be ku meriv bersivê bibihîze.