Sing bener, kita bakal ngomong sing padha karo dewa enkripsi saiki.
Ing kene kita bakal ngomong babagan terowongan IPv4 sing ora dienkripsi, nanging ora babagan "lampu anget", nanging babagan "LED" modern. Lan ana uga soket mentah sing sumunar ing kene, lan kerjane ditindakake kanthi paket ing ruang pangguna.
Ana N protokol tunneling kanggo saben rasa lan werna:
Nanging aku programmer, aku bakal nambah N mung bagian sekedhik, lan ninggalake pangembangan protokol nyata kanggo pangembang Kommersant.
Ing siji durung lair proyekSing daklakoni saiki yaiku nggayuh host ing mburi NAT saka njaba. Nggunakake protokol karo kriptografi diwasa kanggo iki, Aku ora bisa goyangake koyo sing kaya njupuk sparrows metu saka mriem. Amarga trowongan digunakake kanggo sisih paling mung kanggo poke bolongan ing NAT-e, lalu lintas internal biasane uga ndhelik, nanging isih drown ing HTTPS.
Nalika nliti macem-macem protokol tunneling, manungsa waé perfeksionis batin saya ditarik menyang IPIP bola-bali amarga overhead sing minimal. Nanging ana siji lan setengah kekurangan sing signifikan kanggo tugasku:
mbutuhake IP umum ing loro-lorone,
lan ora ana bukti asli kanggo sampeyan.
Mulane, perfeksionis digawa bali menyang pojok peteng tengkorak, utawa ing ngendi wae dheweke lungguh ing kono.
Lan ing sawijining dina, nalika maca artikel ing terowongan sing didhukung asli ing Linux aku ketemu FOU (Foo-over-UDP), i.e. apa wae, kebungkus ing UDP. Nganti saiki, mung IPIP lan GUE (Generic UDP Encapsulation) sing didhukung.
“Iki peluru perak! IPIP sing prasaja cukup kanggoku." - Aku panginten.
Nyatane, peluru kasebut ora kabeh perak. Enkapsulasi ing UDP ngrampungake masalah pisanan - sampeyan bisa nyambung menyang klien ing mburi NAT saka njaba nggunakake sambungan sing wis ditemtokake, nanging ing kene setengah saka kekurangan IPIP sabanjure mekar kanthi cahya anyar - sapa wae saka jaringan pribadi bisa ndhelikake ing mburi sing katon. IP umum lan port klien (ing IPIP murni masalah iki ora ana).
Kanggo ngatasi masalah siji lan setengah iki, sarana lair ipik. Iku ngleksanakake mekanisme ngarep-digawe kanggo otentikasi host remot, tanpa ngganggu operasi saka kernel FOU, kang bakal cepet lan efisien proses paket ing ruang kernel.
Kita ora butuh skrip sampeyan!
Oke, yen sampeyan ngerti port umum lan IP klien (contone, kabeh wong sing ana ing mburi ora menyang ngendi wae, NAT nyoba map port 1-in-1), sampeyan bisa nggawe terowongan IPIP-over-FOU nganggo nderek printah, tanpa skrip.
ing 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
ing klien:
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
ngendi
ipipou* - jeneng antarmuka jaringan trowongan lokal
203.0.113.1 - server IP umum
198.51.100.2 - IP umum klien
192.168.0.2 - IP klien ditugasake kanggo antarmuka eth0
10001 - port klien lokal kanggo FOU
20001 - port klien umum kanggo FOU
10000 - port server umum kanggo FOU
encap-csum - pilihan kanggo nambah checksum UDP menyang paket UDP encapsulated; bisa diganti dening noencap-csum, ora kanggo sebutno, integritas wis dikontrol dening lapisan enkapsulasi njaba (nalika paket kasebut ana ing jero trowongan)
eth0 - antarmuka lokal sing bakal kaiket trowongan ipip
172.28.0.1 - IP antarmuka terowongan klien (pribadi)
172.28.0.0 - Antarmuka server tunnel IP (pribadi)
Anggere sambungan UDP urip, trowongan bakal bisa digunakake, nanging yen rusak, sampeyan bakal begja - yen IP klien: port tetep padha - bakal urip, yen padha ngganti - bakal break.
Cara paling gampang kanggo ngowahi kabeh yaiku mbongkar modul kernel: modprobe -r fou ipip
Sanajan otentikasi ora dibutuhake, IP umum lan port klien ora mesthi dikenal lan asring ora bisa diprediksi utawa variabel (gumantung saka jinis NAT). Yen sampeyan ngilangi encap-dport ing sisih server, trowongan ora bisa, iku ora cukup pinter kanggo njupuk port sambungan remot. Ing kasus iki, ipipou uga bisa mbantu, utawa WireGuard lan liya-liyane bisa mbantu sampeyan.
Carane ora iku bisa?
Klien (sing biasane ana ing mburi NAT) mbukak trowongan (kaya ing conto ing ndhuwur), lan ngirim paket otentikasi menyang server supaya bisa ngatur trowongan ing sisihe. Gumantung ing setelan, iki bisa dadi paket kosong (mung supaya server bisa ndeleng IP umum: port sambungan), utawa karo data sing server bisa ngenali klien. Data kasebut bisa dadi frase sandhi sing prasaja ing teks sing cetha (analogi karo HTTP Basic Auth dadi dipikir) utawa data sing dirancang khusus sing ditandatangani nganggo kunci pribadi (padha karo HTTP Digest Auth mung luwih kuwat, deleng fungsi. client_auth ing kode).
Ing server (sisih karo IP umum), nalika ipipou diwiwiti, nggawe pawang antrian nfqueue lan ngatur netfilter supaya paket sing dibutuhake dikirim menyang ngendi wae: paket miwiti sambungan menyang antrian nfqueue, lan [meh] kabeh liyane langsung menyang FOU pamireng.
Kanggo sing ora ngerti, nfqueue (utawa NetfilterQueue) minangka perkara khusus kanggo amatir sing ora ngerti carane ngembangake modul kernel, sing nggunakake netfilter (nftables/iptables) ngidini sampeyan ngarahake paket jaringan menyang ruang pangguna lan ngolah ing kana nggunakake. tegese primitif ing tangan: ngowahi (opsional) lan menehi bali menyang kernel, utawa discard.
Kanggo sawetara basa pemrograman ana ikatan kanggo nggarap nfqueue, kanggo bash ora ana (heh, ora nggumunake), aku kudu nggunakake python: ipipou nggunakake NetfilterQueue.
Yen kinerja ora kritis, nggunakake bab iki sampeyan bisa relatif cepet lan gampang concoct logika dhewe kanggo nggarap paket ing tingkat cukup kurang, contone, nggawe protokol transfer data eksperimen, utawa troll layanan lokal lan remot karo prilaku non-standar.
Sockets mentahan bisa tangan ing tangan karo nfqueue, contone, nalika trowongan wis diatur lan FOU ngrungokake ing port dikarepake, sampeyan ora bakal bisa kanggo ngirim paket saka port padha ing cara biasanipun - iku sibuk, nanging sampeyan bisa njupuk lan ngirim paket kui acak langsung menyang antarmuka jaringan nggunakake soket mentahan, sanajan ngasilaken paket kuwi bakal mbutuhake tinkering sethitik liyane. Iki carane paket karo otentikasi digawe ing ipipou.
Wiwit ipipou ngolah mung paket pisanan saka sambungan kasebut (lan sing bisa bocor menyang antrian sadurunge sambungan digawe), kinerja meh ora nandhang sangsara.
Sanalika server ipipou nampa paket asli, trowongan digawe lan kabeh paket sakteruse ing sambungan wis diproses dening kernel bypassing nfqueue. Yen sambungan gagal, paket pisanan sabanjure bakal dikirim menyang antrian nfqueue, gumantung saka setelan, yen dudu paket kanthi otentikasi, nanging saka IP lan port klien sing eling pungkasan, bisa uga dilewati. ing utawa dibuwak. Yen paket asli asalé saka IP lan port anyar, trowongan reconfigured kanggo nggunakake.
IPIP-over-FOU sing biasa duwe masalah liyane nalika nggarap NAT - ora mungkin nggawe rong terowongan IPIP sing dibungkus ing UDP kanthi IP sing padha, amarga modul FOU lan IPIP cukup terisolasi saka siji liyane. Sing. pasangan klien konco IP umum padha ora bakal bisa bebarengan nyambung menyang server padha ing cara iki. Ing mangsa ngarep, bisa wae, bakal ditanggulangi ing tingkat kernel, nanging iki ora tartamtu. Ing sawetoro wektu, masalah NAT bisa ditanggulangi dening NAT - yen kedadeyan yen sepasang alamat IP wis dikuwasani dening trowongan liyane, ipipou bakal nindakake NAT saka umum menyang IP pribadi alternatif, voila! - sampeyan bisa nggawe trowongan nganti port entek.
Amarga Ora kabeh paket ing sambungan wis mlebu, banjur pangayoman prasaja iki ngrugekke kanggo MITM, supaya yen ana wong jahat lurking ing path antarane klien lan server sing bisa ngrungokake lalu lintas lan ngapusi iku, kang bisa pangalihan paket asli liwat. alamat liyane lan nggawe trowongan saka host sing ora dipercaya.
Yen ana sing duwe gagasan babagan carane ndandani iki nalika ninggalake akeh lalu lintas ing inti, aja ragu-ragu ngomong.
Miturut cara, enkapsulasi ing UDP wis kabukten kanthi apik. Dibandhingake enkapsulasi liwat IP, iku luwih stabil lan asring luwih cepet senadyan overhead tambahan saka header UDP. Iki amarga kasunyatan sing paling sarwa dumadi ing Internet mung dianggo karo telung protokol paling populer: TCP, UDP, ICMP. Bagean nyata bisa ngilangi kabeh liyane, utawa ngolah kanthi luwih alon, amarga dioptimalake mung kanggo telu kasebut.
Contone, iki sebabe CEPAT, sing adhedhasar HTTP / 3, digawe ing ndhuwur UDP, lan ora ing ndhuwur IP.
Inggih, cukup tembung, iku wektu kanggo ndeleng cara kerjane ing "donya nyata".
perang
Digunakake kanggo niru donya nyata iperf3. Ing babagan tingkat cedhak karo kasunyatan, iki kira-kira padha karo niru jagad nyata ing Minecraft, nanging saiki bakal ditindakake.
Peserta lomba:
saluran utama referensi
pahlawan artikel iki ipipou
OpenVPN kanthi otentikasi nanging ora ana enkripsi
OpenVPN ing mode kabeh-kalebu
WireGuard tanpa PresharedKey, kanthi MTU=1440 (wiwit mung IPv4)
Data teknis kanggo geeks Metrik dijupuk nganggo printah ing ngisor iki:
ing klien:
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", чтобы лишние пакеты не плодить и не портить производительность.