Se vre, nou pral di menm bagay la ak bondye chifreman jodi a.
Isit la nou pral pale sou yon tinèl IPv4 ki pa chiffres, men se pa sou yon "lanp cho", men sou yon modèn "dirije". Epi gen tou priz anvan tout koreksyon k ap flache isit la, epi travay ap fèt ak pake nan espas itilizatè.
Men, mwen se yon pwogramè, kidonk mwen pral ogmante N sèlman pa yon fraksyon, epi kite devlopman nan pwotokòl reyèl bay devlopè Kommersant.
Nan yon sèl ki poko fèt bouyon anSa m ap fè kounye a se rive jwenn tout pouvwa dèyè NAT soti deyò. Sèvi ak pwotokòl ak kriptografi adilt pou sa a, mwen pa t 'kapab souke santi ke li te tankou tire zwazo soti nan yon kanon. Paske se tinèl la itilize pou pati ki pi sèlman nan pike twou nan NAT-e, se trafik entèn anjeneral tou chiffres, men yo toujou nwaye nan HTTPS.
Pandan y ap fè rechèch sou plizyè pwotokòl tinèl, yo te atire atansyon pèfeksyonist enteryè mwen an sou IPIP sou yo ak sou ankò akòz tèt li minim. Men, li gen yon sèl ak yon mwatye dezavantaj enpòtan pou travay mwen an:
li mande IP piblik sou tou de bò,
epi pa gen otantifikasyon pou ou.
Se poutèt sa, pèfeksyonis la te kondwi tounen nan kwen an nwa nan zo bwa tèt la, oswa nenpòt kote li chita la.
Lè sa a, yon jou, pandan y ap li atik sou tinèl ki sipòte natif natal nan Linux mwen te rankontre FOU (Foo-over-UDP), i.e. tou sa, vlope nan UDP. Jiskaprezan, se sèlman IPIP ak GUE (Encapsulation Jenerik UDP) ki sipòte.
"Men bal an ajan! Yon IPIP senp ase pou mwen." - M 'te panse.
An reyalite, bal la te tounen soti yo pa konplètman ajan. Ankapsulasyon nan UDP rezoud pwoblèm nan premye - ou ka konekte ak kliyan dèyè NAT soti nan deyò lè l sèvi avèk yon koneksyon pre-etabli, men isit la mwatye nan pwochen dezavantaj nan IPIP flè nan yon nouvo limyè - nenpòt moun ki soti nan yon rezo prive ka kache dèyè vizib la. IP piblik ak pò kliyan (nan IPIP pi pwoblèm sa a pa egziste).
Pou rezoud pwoblèm sa a yon sèl ak yon mwatye, sèvis piblik la te fèt ipipou. Li aplike yon mekanis ki fèt lakay pou otantifye yon lame aleka, san yo pa deranje operasyon FOU nwayo a, ki pral rapidman ak efikasman trete pake nan espas nwayo a.
Nou pa bezwen script ou a!
Ok, si ou konnen pò piblik la ak IP kliyan an (pa egzanp, tout moun dèyè li pa ale nenpòt kote, NAT eseye kat pò 1-an-1), ou ka kreye yon tinèl IPIP-sou-FOU ak la. kòmandman sa yo, san okenn scripts.
sou sèvè:
# Подгрузить модуль ядра 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
sou kliyan an:
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
kote
ipipou* — non koòdone rezo tinèl lokal la
203.0.113.1 — sèvè IP piblik
198.51.100.2 - IP piblik kliyan an
192.168.0.2 - IP kliyan asiyen nan koòdone eth0
10001 — pò kliyan lokal pou FOU
20001 — pò kliyan piblik pou FOU
10000 — pò sèvè piblik pou FOU
encap-csum — opsyon pou ajoute yon sòm chèk UDP nan pake UDP ankapsule; ka ranplase pa noencap-csum, nou pa mansyone, entegrite deja kontwole pa kouch ekstèn enkapsulasyon (pandan ke pake a andedan tinèl la)
eth0 — koòdone lokal kote tinèl ipip la pral mare
172.28.0.1 - IP koòdone tinèl kliyan an (prive)
172.28.0.0 - IP tinèl koòdone sèvè (prive)
Osi lontan ke koneksyon UDP a vivan, tinèl la pral nan lòd, men si li kraze, ou pral gen chans - si IP kliyan an: pò rete menm jan an - li pral viv, si yo chanje - li pral kraze.
Fason ki pi fasil pou vire tout bagay tounen se dechaje modil nwayo yo: modprobe -r fou ipip
Menm si otantifikasyon pa obligatwa, IP piblik kliyan an ak pò yo pa toujou konnen epi yo souvan enprevizib oswa varyab (selon kalite NAT). Si ou omite encap-dport sou bò sèvè, tinèl la pa pral travay, li pa entelijan ase yo pran pò a koneksyon aleka. Nan ka sa a, ipipou ka ede tou, oswa WireGuard ak lòt tankou li ka ede w.
Kouman li travay?
Kliyan an (ki se nòmalman dèyè NAT) ouvè yon tinèl (tankou nan egzanp ki anwo a), epi voye yon pake otantifikasyon nan sèvè a pou ke li configured tinèl la sou bò li yo. Tou depan de anviwònman yo, sa a ka yon pake vid (jis pou sèvè a ka wè IP piblik la: pò koneksyon), oswa ak done ki sèvi ak sèvè a ka idantifye kliyan an. Done yo ka yon fraz pas senp nan tèks klè (analoji ak HTTP Basic Auth vin nan tèt ou) oswa done ki fèt espesyalman siyen ak yon kle prive (menm jan ak HTTP Digest Auth sèlman pi fò, gade fonksyon client_auth nan kòd la).
Sou sèvè a (bò IP piblik la), lè ipipou kòmanse, li kreye yon moun kap okipe nfqueue keue epi li configure netfilter pou yo voye pakè ki nesesè yo kote yo ta dwe ye a: pake ki inisyalize koneksyon an nan keu nfqueue, ak [prèske] tout rès yo ale tou dwat nan koute a FOU.
Pou moun ki pa konnen, nfqueue (oswa NetfilterQueue) se yon bagay espesyal pou amatè ki pa konnen ki jan yo devlope modil nwayo, ki lè l sèvi avèk netfilter (nftables/iptables) pèmèt ou redireksyon pake rezo nan espas itilizatè epi trete yo la lè l sèvi avèk. primitif vle di nan men: modifye (si ou vle) epi remèt li nan nwayo a, oswa jete li.
Pou kèk lang pwogramasyon, gen lyezon pou travay ak nfqueue, pou bash pa te gen okenn (heh, pa etone), mwen te oblije itilize python: ipipou itilize NetfilterQueue.
Si pèfòmans pa kritik, lè l sèvi avèk bagay sa a ou ka relativman rapid ak fasil konkokte pwòp lojik ou pou travay ak pake nan yon nivo jistis ba, pou egzanp, kreye pwotokòl transfè done eksperimantal, oswa trol sèvis lokal ak aleka ak konpòtman ki pa estanda.
Sockets kri travay men nan men ak nfqueue, pa egzanp, lè tinèl la deja configuré ak FOU ap koute sou pò a vle, ou pa pral kapab voye yon pake soti nan menm pò a nan fason nòmal la - li okipe, men ou ka pran epi voye yon pake pwodwi owaza dirèkteman nan koòdone rezo a lè l sèvi avèk yon priz anvan tout koreksyon, byenke jenere yon pake sa a pral mande pou yon ti kras plis brikolaj. Men ki jan pake ak otantifikasyon yo kreye nan ipipou.
Depi ipipou trete sèlman premye pake ki soti nan koneksyon an (ak sa yo ki jere yo koule nan keu la anvan koneksyon an te etabli), pèfòmans prèske pa soufri.
Le pli vit ke sèvè a ipipou resevwa yon pake otantifye, yo kreye yon tinèl ak tout pake ki vin apre yo nan koneksyon an deja trete pa nwayo a bypassing nfqueue. Si koneksyon an echwe, Lè sa a, premye pake a nan pwochen an pral voye nan keu la nfqueue, tou depann de anviwònman yo, si li se pa yon pake ak otantifikasyon, men soti nan dènye IP sonje ak pò kliyan an, li ka swa dwe pase. sou oswa jete. Si yon pake otantifye soti nan yon nouvo IP ak pò, tinèl la rekonfigire pou sèvi ak yo.
IPIP-over-FOU abityèl la gen yon lòt pwoblèm lè w ap travay ak NAT - li enposib pou kreye de tinèl IPIP ki ankapsile nan UDP ak menm IP, paske modil FOU ak IPIP yo byen izole youn ak lòt. Moun sa yo. yon pè kliyan dèyè menm IP piblik la p ap kapab konekte ansanm ak menm sèvè a nan fason sa a. Nan lavni, petèt, li pral rezoud nan nivo nwayo a, men sa a se pa sèten. Nan entre-temps, pwoblèm NAT yo ka rezoud pa NAT - si li rive ke yon pè adrès IP deja okipe pa yon lòt tinèl, ipipou pral fè NAT soti nan piblik nan yon altènatif IP prive, vwala! - ou ka kreye tinèl jiskaske pò yo fini.
Paske Se pa tout pake ki nan koneksyon an siyen, Lè sa a, pwoteksyon senp sa a vilnerab a MITM, kidonk si gen yon mechan ki kache sou chemen ki genyen ant kliyan an ak sèvè a ki ka koute trafik la epi manipile li, li ka redireksyon pake otantifye atravè. yon lòt adrès epi kreye yon tinèl nan men yon lame ki pa fè konfyans.
Si yon moun gen lide sou kòman yo ranje sa a pandan y ap kite èstime nan trafik la nan nwayo a, pa ezite pale.
By wout la, enkapsulasyon nan UDP te pwouve tèt li trè byen. Konpare ak enkapsulasyon sou IP, li se pi plis ki estab e souvan pi vit malgre anlè anplis nan header UDP la. Sa a se akòz lefèt ke pifò lame sou entènèt la travay byen sèlman ak twa pwotokòl ki pi popilè yo: TCP, UDP, ICMP. Pati tanjib lan ka konplètman jete tout lòt bagay, oswa trete li pi dousman, paske li optimize sèlman pou twa sa yo.
Pou egzanp, se poutèt sa QUICK, sou ki HTTP/3 baze, te kreye sou tèt UDP, epi yo pa sou tèt IP.
Oke, ase mo, li lè yo wè ki jan li fonksyone nan "monn reyèl la".
Batay
Yo itilize pou imite mond reyèl la iperf3. An tèm de degre nan pwoksimite ak reyalite, sa a se apeprè menm jan ak imite mond reyèl la nan Minecraft, men pou kounye a li pral fè.
Patisipan nan konpetisyon an:
referans prensipal kanal
ewo atik sa a se ipipou
OpenVPN ak otantifikasyon men pa gen okenn chifreman
OpenVPN nan mòd tout enklizif
WireGuard san PresharedKey, ak MTU = 1440 (depi IPv4-sèlman)
Done teknik pou geeks Paramèt yo pran ak kòmandman sa yo:
sou kliyan an:
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", чтобы лишние пакеты не плодить и не портить производительность.