ipipou: leuwih ti ngan hiji torowongan unencrypted
Naon anu urang nyarioskeun ka Dewa IPv6?
Éta leres, urang bakal nyarios sami ka dewa énkripsi ayeuna.
Di dieu urang bakal ngobrol ngeunaan torowongan IPv4 anu henteu énkripsi, tapi sanés ngeunaan "lampu haneut", tapi ngeunaan "LED" modern. Sareng aya ogé sockets atah kedip-kedip di dieu, sareng padamelan dijalankeun sareng pakét dina rohangan pangguna.
Aya protokol tunneling N pikeun unggal rasa sareng warna:
Tapi Kami programmer a, jadi kuring baris ngaronjatkeun N ukur ku fraksi, sarta ninggalkeun ngembangkeun protokol nyata pamekar Kommersant.
Dina hiji unborn dijujutAnu kuring lakukeun ayeuna nyaéta pikeun ngahontal host di tukangeun NAT ti luar. Ngagunakeun protokol kalawan kriptografi sawawa pikeun ieu, Abdi teu bisa ngocok rarasaan yén éta kawas shooting sparrows kaluar tina mariem a. Sabab torowongan dipaké pikeun sabagéan ageung ngan pikeun nyodok liang di NAT-e, lalulintas internal biasana ogé énkripsi, tapi aranjeunna tetep ngalelepkeun dina HTTPS.
Nalika nalungtik rupa-rupa protokol tunneling, perhatian perfeksionis batin kuring ditarik ka IPIP deui-terusan kusabab overhead anu minimal. Tapi éta ngagaduhan hiji satengah kalemahan anu penting pikeun tugas kuring:
merlukeun IP umum dina dua sisi,
tur euweuh auténtikasi pikeun anjeun.
Ku alatan éta, perfectionist ieu disetir deui ka pojok poék tangkorak, atawa dimana wae anjeunna sits dinya.
Lajeng hiji poé, bari maca artikel on torowongan natively dirojong dina Linux abdi datang di sakuliah FOU (Foo-over-UDP), i.e. naon, dibungkus dina UDP. Sajauh ieu, ngan ukur IPIP sareng GUE (Generic UDP Encapsulation) anu dirojong.
“Ieu pélor pérak! IPIP basajan cukup pikeun kuring. - Teu sangka.
Kanyataanna, pélor tétéla teu sagemblengna pérak. Encapsulation di UDP ngarengsekeun masalah anu munggaran - anjeun tiasa nyambung ka klien di tukangeun NAT ti luar nganggo sambungan anu tos didamel, tapi di dieu satengahna kakurangan salajengna tina IPIP mekar dina lampu anyar - saha waé ti jaringan pribadi tiasa nyumput di tukangeun anu katingali. IP publik jeung port klien (dina IPIP murni masalah ieu teu aya).
Pikeun ngabéréskeun hiji satengah masalah ieu, utiliti lahir ipis. Ieu implements mékanisme home-dijieun pikeun auténtikasi hiji host jauh, tanpa disrupting operasi kernel FOU, nu bakal gancang jeung éfisién ngolah pakét dina spasi kernel.
Kami henteu peryogi naskah anjeun!
Ok, upami anjeun terang port umum sareng IP klien (contona, sadayana anu aya di tukangeun éta henteu kamana waé, NAT nyobian peta palabuhan 1-in-1), anjeun tiasa nyiptakeun torowongan IPIP-over-FOU sareng nuturkeun paréntah, tanpa skrip.
dina 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
dina 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
di mana
ipipou* - ngaran panganteur jaringan torowongan lokal
203.0.113.1 - server IP umum
198.51.100.2 - IP umum klien
192.168.0.2 - klien IP ditugaskeun ka panganteur eth0
10001 - port klien lokal pikeun FOU
20001 - port klien umum pikeun FOU
10000 - port server umum pikeun FOU
encap-csum - pilihan pikeun nambahkeun checksum UDP kana pakét UDP encapsulated; bisa diganti ku noencap-csum, teu nyebut, integritas geus dikawasa ku lapisan encapsulation luar (bari pakét aya di jero torowongan)
eth0 - panganteur lokal dimana torowongan ipip bakal kabeungkeut
172.28.0.1 - IP tina antarmuka torowongan klien (swasta)
172.28.0.0 - Antarmuka server torowongan IP (swasta)
Salami sambungan UDP masih hirup, torowongan bakal aya dina urutan gawé, tapi lamun megatkeun, anjeun bakal untung - lamun IP klien urang: port tetep sarua - eta bakal hirup, lamun maranéhna robah - bakal megatkeun.
Cara panggampangna pikeun balikkeun sadayana nyaéta ngabongkar modul kernel: modprobe -r fou ipip
Sanaos auténtikasi henteu diperyogikeun, IP umum sareng port klien henteu salawasna dipikanyaho sareng sering teu tiasa diprediksi atanapi variabel (gumantung kana jinis NAT). Upami anjeun ngaleungitkeun encap-dport di sisi server, torowongan moal jalan, teu cukup pinter nyandak port sambungan jauh. Dina hal ieu, ipipou ogé tiasa ngabantosan, atanapi WireGuard sareng anu sanésna tiasa ngabantosan anjeun.
Kumaha carana sangkan eta pagawean?
Klién (anu biasana aya di tukangeun NAT) muka torowongan (sapertos conto di luhur), sareng ngirim pakét auténtikasi ka server supados ngonpigurasikeun torowongan di sisina. Gumantung kana setélan, ieu tiasa janten pakét kosong (ngan supados server tiasa ningali IP umum: port sambungan), atanapi nganggo data dimana server tiasa ngaidentipikasi klien. Data tiasa janten frasa sandi saderhana dina téks anu jelas (analogi sareng HTTP Basic Auth muncul dina pikiran) atanapi data anu dirancang khusus ditandatanganan ku konci pribadi (sarupa sareng HTTP Digest Auth ngan langkung kuat, tingali fungsina. client_auth dina kode).
Dina server (sisi jeung IP publik), nalika ipipou dimimitian, nyiptakeun nfqueue antrian Handler na configures netfilter supados pakét perlu dikirim dimana aranjeunna kedah: pakét initializing sambungan kana antrian nfqueue, jeung [meh] kabéh sésana langsung ka pangdéngé FOU.
Pikeun anu henteu terang, nfqueue (atanapi NetfilterQueue) mangrupikeun hal anu khusus pikeun amatir anu henteu terang kumaha carana ngembangkeun modul kernel, anu nganggo netfilter (nftables / iptables) ngamungkinkeun anjeun alihan pakét jaringan ka rohangan pangguna sareng ngolahna di dinya nganggo. primitif hartina di leungeun: ngaropéa (opsional) sarta masihan deui ka kernel, atawa piceun eta.
Kanggo sababaraha basa pamrograman aya beungkeutan pikeun damel sareng nfqueue, pikeun bash teu aya (heh, henteu héran), kuring kedah nganggo python: ipipou nganggo NetfilterQueue.
Lamun kinerja teu kritis, ngagunakeun hal ieu anjeun bisa rélatif gancang sarta gampang concoct logika sorangan pikeun gawé bareng pakét dina tingkat cukup low, contona, nyieun protokol mindahkeun data ékspérimén, atawa troll jasa lokal jeung jauh jeung kabiasaan non-standar.
Sockets atah gawé bareng jeung nfqueue, contona, nalika torowongan geus ngonpigurasi sarta FOU ngadangukeun dina port nu dipikahoyong, anjeun moal bisa ngirim pakét ti port sarua dina cara biasa - éta sibuk, tapi anjeun tiasa nyandak sareng ngirim pakét anu dihasilkeun sacara acak langsung ka antarbeungeut jaringan nganggo stop kontak atah, sanaos ngahasilkeun pakét sapertos kitu peryogi sakedik tinkering. Ieu kumaha pakét sareng auténtikasi didamel dina ipipou.
Kusabab ipipou ngan ukur ngolah pakét anu munggaran tina sambungan (sareng anu junun bocor kana antrian sateuacan sambungan didirikeun), kinerja ampir henteu sangsara.
Pas server ipipou narima pakét dioténtikasi, torowongan dijieun tur sagala pakét saterusna dina sambungan nu geus diolah ku kernel bypassing nfqueue. Upami sambunganna gagal, maka pakét munggaran anu salajengna bakal dikirim ka antrian nfqueue, gumantung kana setélan, upami éta sanés pakét kalayan auténtikasi, tapi tina IP anu terakhir émut sareng port klien, éta tiasa disalurkeun. on atawa dipiceun. Upami pakét anu dioténtikasi asalna tina IP sareng port énggal, torowongan dikonfigurasi deui pikeun dianggo.
Biasana IPIP-over-FOU gaduh hiji deui masalah nalika damel sareng NAT - mustahil pikeun nyiptakeun dua torowongan IPIP anu dibungkus dina UDP sareng IP anu sami, sabab modul FOU sareng IPIP rada terasing. Jelema. sapasang klien balik IP publik sarua moal bisa sakaligus nyambung ka server sarua dina cara kieu. Dina mangsa nu bakal datang, nyaéta mungkin, éta bakal direngsekeun dina tingkat kernel, tapi ieu teu tangtu. Samentawis waktos, masalah NAT tiasa direngsekeun ku NAT - upami kajantenan sapasang alamat IP parantos dijajah ku torowongan anu sanés, ipipou bakal ngalakukeun NAT ti umum ka IP swasta alternatif, voila! - anjeun tiasa ngadamel torowongan dugi palabuhan béak.
Sabab Henteu sakabéh pakét dina sambungan nu ditandatanganan, mangka panyalindungan basajan ieu rentan ka MITM, jadi lamun aya penjahat lurking dina jalur antara klien tur server anu tiasa ngadangukeun lalulintas sarta ngamanipulasi eta, anjeunna tiasa alihan pakét dioténtikasi ngaliwatan. alamat sejen tur nyieun torowongan ti host untrusted.
Mun saha boga gagasan ngeunaan kumaha carana ngalereskeun ieu bari ninggalkeun bulk tina lalulintas di inti, ulah ragu nyarita nepi.
Ku jalan kitu, encapsulation dina UDP geus kabuktian sorangan kacida alusna. Dibandingkeun sareng enkapsulasi tina IP, éta langkung stabil sareng sering langkung gancang sanaos overhead tambahan tina lulugu UDP. Ieu alatan kanyataan yén sabagéan ageung host dina Internét tiasa dianggo ngan ukur nganggo tilu protokol anu pang populerna: TCP, UDP, ICMP. Bagian anu nyata tiasa ngaleungitkeun sadayana anu sanés, atanapi ngolahna langkung laun, sabab dioptimalkeun ngan pikeun tilu ieu.
Salaku conto, ieu naha CEPAT, anu dumasar kana HTTP / 3, didamel di luhur UDP, sanés di luhur IP.
Muhun, cukup kecap, éta waktu ningali kumaha gawéna di "dunya nyata".
perangna
Dipaké pikeun niru dunya nyata iperf3. Dina watesan darajat closeness kana kanyataanana, ieu kira sarua jeung emulating dunya nyata dina Minecraft, tapi pikeun ayeuna bakal ngalakukeun.
Pamilon dina kompetisi:
saluran utama rujukan
pahlawan artikel ieu téh ipipou
OpenVPN kalawan auténtikasi tapi euweuh enkripsi
OpenVPN dina modeu sadaya-inklusif
WireGuard tanpa PresharedKey, kalawan MTU = 1440 (saprak IPv4-hijina)
data teknis pikeun geeks Métrik dicandak nganggo paréntah di handap ieu:
dina 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", чтобы лишние пакеты не плодить и не портить производительность.
Dampal awon tanda
beban CPU server teu pisan indicative, sabab ... Aya seueur jasa sanés anu ngajalankeun di dinya, sakapeung aranjeunna ngahakan sumber daya:
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
saluran 20 Mbps
saluran per 1 Gbps optimistis
Dina sagala hal, ipipou rada caket dina pagelaran kana saluran dasar, anu saé!
Torowongan openvpn anu teu énkripsi kalakuanana rada anéh dina dua kasus.
Upami aya anu badé nguji, éta bakal pikaresepeun pikeun ngupingkeun tanggapan.