ipipou: aktar minn sempliċi mina mhux kriptata

X'qed ngħidu lil Alla tal-IPv6?

ipipou: aktar minn sempliċi mina mhux kriptata
Dak hu, aħna se ngħidu l-istess lill-alla tal-kriptaġġ illum.

Hawnhekk se nitkellmu dwar mina IPv4 mhux kriptata, iżda mhux dwar waħda "bozza sħuna", iżda dwar waħda moderna "LED". U hemm ukoll sokits mhux maħduma jteptep hawn, u għaddej xogħol b'pakketti fl-ispazju tal-utent.

Hemm N protokolli ta' tunneling għal kull togħma u kulur:

  • stylish, moda, żgħażagħ WireGuard
  • multifunzjonali, bħal skieken Żvizzeri, OpenVPN u SSH
  • GRE qodma u mhux ħażin
  • l-aktar IPIP sempliċi, veloċi, kompletament mhux kriptat
  • jiżviluppaw b'mod attiv ĠINEVRA
  • ħafna oħrajn.

Imma jien programmatur, għalhekk se nżid N biss bi frazzjoni, u nħalli l-iżvilupp ta 'protokolli reali lill-iżviluppaturi Kommersant.

F'wieħed mhux imwieled proġettDak li qed nagħmel issa huwa li nilħaq hosts wara NAT minn barra. Bl-użu ta 'protokolli bi kriptografija għall-adulti għal dan, ma stajtx inħawwad is-sensazzjoni li kienet qisha sparaws sparrows minn kanun. Għax il-mina hija użata fil-biċċa l-kbira biss biex toqob f'NAT-e, it-traffiku intern ġeneralment ikun ukoll encrypted, iżda xorta jegħrqu f'HTTPS.

Waqt ir-riċerka dwar diversi protokolli ta' tunneling, l-attenzjoni tal-perfezzjonista ta 'ġewwa tiegħi nġibdet l-IPIP għal darb'oħra minħabba l-overhead minimu tagħha. Iżda għandu żvantaġġ sinifikanti wieħed u nofs għall-kompiti tiegħi:

  • teħtieġ IPs pubbliċi fuq iż-żewġ naħat,
  • u l-ebda awtentikazzjoni għalik.

Għalhekk, il-perfezzjonista ġie misjuq lura fil-kantuniera mudlama tal-kranju, jew kull fejn joqgħod hemm.

U mbagħad jum wieħed, waqt li taqra artikli fuq mini appoġġjati nattivament fil-Linux iltqajt ma' FOU (Foo-over-UDP), i.e. tkun xi tkun, imgeżwer f'UDP. S'issa, IPIP u GUE (Inkapsulazzjoni Ġenerika UDP) biss huma appoġġjati.

“Hawn il-balal tal-fidda! IPIP sempliċi huwa biżżejjed għalija.” - Ħsibt.

Fil-fatt, il-bullet irriżulta li ma kienx kompletament fidda. L-inkapsulament f'UDP issolvi l-ewwel problema - tista 'tikkonnettja mal-klijenti wara NAT minn barra billi tuża konnessjoni stabbilita minn qabel, iżda hawn nofs l-iżvantaġġ li jmiss ta' IPIP jiffjorixxi f'dawl ġdid - kull min minn netwerk privat jista 'jinħeba wara l-viżibbli. IP pubbliku u port tal-klijent (fl-IPIP pur din il-problema ma teżistix).

Biex issolvi din il-problema waħda u nofs, twieldet l-utilità ipipou. Hija timplimenta mekkaniżmu magħmul mid-dar għall-awtentikazzjoni ta 'host remot, mingħajr ma jfixkel l-operat tal-kernel FOU, li se jipproċessa malajr u b'mod effiċjenti pakketti fl-ispazju tal-kernel.

M'għandniex bżonn l-iskript tiegħek!

Ok, jekk taf il-port pubbliku u l-IP tal-klijent (per eżempju, kulħadd warajh ma jmur imkien, NAT jipprova jimmappa portijiet 1-in-1), tista 'toħloq mina IPIP-over-FOU bil- kmandi li ġejjin, mingħajr ebda skripts.

fuq is-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

fuq il-klijent:

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

fejn

  • ipipou* — isem l-interface tan-netwerk lokali tal-mina
  • 203.0.113.1 — server IP pubbliku
  • 198.51.100.2 — IP pubbliku tal-klijent
  • 192.168.0.2 — l-IP tal-klijent assenjat għall-interface eth0
  • 10001 — port tal-klijent lokali għall-FOU
  • 20001 — port pubbliku tal-klijenti għall-FOU
  • 10000 — port ta' server pubbliku għall-FOU
  • encap-csum — għażla li żżid checksum UDP ma' pakketti UDP inkapsulati; jistgħu jiġu sostitwiti minn noencap-csum, biex ma nsemmux, l-integrità hija diġà kkontrollata mis-saff ta 'inkapsulament ta' barra (filwaqt li l-pakkett ikun ġewwa l-mina)
  • eth0 — interface lokali li magħha se tkun marbuta l-ipip tunnel
  • 172.28.0.1 — IP tal-interface tal-mina tal-klijent (privata)
  • 172.28.0.0 — Interfaċċja tas-server tal-mini IP (privata)

Sakemm il-konnessjoni UDP tkun ħajja, il-mina tkun f'kondizzjoni li taħdem, imma jekk tinkiser, tkun xortik tajba - jekk l-IP tal-klijent: port jibqa 'l-istess - se tgħix, jekk tinbidel - tinkiser.

L-eħfef mod biex iddawwar kollox lura huwa li tħott il-moduli tal-qalba: modprobe -r fou ipip

Anke jekk l-awtentikazzjoni mhix meħtieġa, l-IP pubbliku u l-port tal-klijent mhux dejjem ikunu magħrufa u ħafna drabi huma imprevedibbli jew varjabbli (skond it-tip NAT). Jekk tħalli barra encap-dport fuq in-naħa tas-server, il-mina mhux se taħdem, mhix intelliġenti biżżejjed biex tieħu l-port tal-konnessjoni remota. F'dan il-każ, ipipou jista 'jgħin ukoll, jew WireGuard u oħrajn bħalu jistgħu jgħinuk.

Kif taħdem?

Il-klijent (li normalment ikun wara NAT) jiftaħ mina (bħal fl-eżempju ta 'hawn fuq), u jibgħat pakkett ta' awtentikazzjoni lis-server sabiex jikkonfigura l-mina fuq in-naħa tiegħu. Skont is-settings, dan jista 'jkun pakkett vojt (biss biex is-server ikun jista' jara l-IP pubbliku: port ta 'konnessjoni), jew b'dejta li biha s-server jista' jidentifika l-klijent. Id-dejta tista' tkun passphrase sempliċi f'test ċar (jiġi f'moħħna l-analoġija ma' HTTP Basic Auth) jew data ddisinjata apposta ffirmata b'ċavetta privata (simili għal HTTP Digest Auth biss aktar b'saħħitha, ara l-funzjoni client_auth fil-kodiċi).

Fuq is-server (in-naħa bl-IP pubbliku), meta jibda ipipou, joħloq nfqueue queue handler u jikkonfigura netfilter sabiex il-pakketti meħtieġa jintbagħtu fejn għandhom ikunu: pakketti li inizjalizzaw il-konnessjoni mal-kju nfqueue, u [kważi] il-kumplament kollu jmur dritt għand is-semmiegħ FOU.

Għal dawk li mhumiex jafu, nfqueue (jew NetfilterQueue) hija ħaġa speċjali għad-dilettanti li ma jafux kif jiżviluppaw moduli tal-kernel, li bl-użu ta 'netfilter (nftables/iptables) jippermettilek li terġa' tidderieġi pakketti tan-netwerk għall-ispazju tal-utent u tipproċessahom hemmhekk billi tuża mezzi primittivi fil-idejn: immodifika (mhux obbligatorju) u agħtiha lura lill-qalba, jew armiha.

Għal xi lingwi ta 'programmar hemm rbit biex taħdem ma' nfqueue, għal bash ma kien hemm xejn (heh, mhux sorprendenti), kelli nuża python: ipipou juża NetfilterQueue.

Jekk il-prestazzjoni mhix kritika, billi tuża din il-ħaġa tista 'tagħmel relattivament malajr u faċilment il-loġika tiegħek stess biex taħdem ma' pakketti f'livell pjuttost baxx, pereżempju, toħloq protokolli ta 'trasferiment ta' data sperimentali, jew troll servizzi lokali u remoti b'imġieba mhux standard.

Is-sokits mhux maħduma jaħdmu id f'id ma 'nfqueue, pereżempju, meta l-mina tkun diġà kkonfigurata u FOU tkun qed tisma' fuq il-port mixtieq, ma tkunx tista' tibgħat pakkett mill-istess port bil-mod tas-soltu - huwa okkupat, iżda tista 'tieħu u tibgħat pakkett iġġenerat bl-addoċċ direttament lill-interface tan-netwerk billi tuża sokit mhux maħdum, għalkemm il-ġenerazzjoni ta' pakkett bħal dan se teħtieġ ftit aktar tbagħbis. Hekk jinħolqu pakketti bl-awtentikazzjoni f'ipipou.

Peress li ipipou tipproċessa biss l-ewwel pakketti mill-konnessjoni (u dawk li rnexxielhom jnixxu fil-kju qabel ma ġiet stabbilita l-konnessjoni), il-prestazzjoni kważi ma tbatix.

Hekk kif is-server ipipou jirċievi pakkett awtentikat, tinħoloq mina u l-pakketti sussegwenti kollha fil-konnessjoni huma diġà pproċessati mill-kernel li jinjora nfqueue. Jekk il-konnessjoni tonqos, allura l-ewwel pakkett ta 'dak li jmiss jintbagħat lill-kju nfqueue, skond is-settings, jekk ma jkunx pakkett bl-awtentikazzjoni, iżda mill-aħħar IP mfakkar u port tal-klijent, jista' jew jiġi mgħoddi fuq jew mormija. Jekk pakkett awtentikat jiġi minn IP u port ġodda, il-mina tiġi kkonfigurata mill-ġdid biex tużahom.

L-IPIP-over-FOU tas-soltu għandha problema oħra meta taħdem man-NAT - huwa impossibbli li jinħolqu żewġ mini IPIP inkapsulati f'UDP bl-istess IP, minħabba li l-moduli FOU u IPIP huma pjuttost iżolati minn xulxin. Dawk. par ta 'klijenti wara l-istess IP pubbliku ma jkunux jistgħu jgħaqqdu fl-istess ħin mal-istess server b'dan il-mod. Fil-futur, forsi, se tiġi solvuta fil-livell tal-qalba, iżda dan mhux ċert. Sadanittant, il-problemi tan-NAT jistgħu jiġu solvuti permezz tan-NAT - jekk jiġri li par ta' indirizzi IP huwa diġà okkupat minn mina oħra, ipipou se jagħmel NAT minn IP pubbliku għal IP privat alternattiv, voila! - tista' toħloq mini sakemm jispiċċaw il-portijiet.

Għax Mhux il-pakketti kollha fil-konnessjoni huma ffirmati, allura din il-protezzjoni sempliċi hija vulnerabbli għall-MITM, allura jekk ikun hemm villain lurking fuq il-mogħdija bejn il-klijent u s-server li jista 'jisma' t-traffiku u jimmanipulah, jista 'jidderieġi mill-ġdid pakketti awtentikati permezz indirizz ieħor u oħloq mina minn host mhux fdat.

Jekk xi ħadd għandu ideat dwar kif jirranġa dan filwaqt li jħalli l-biċċa l-kbira tat-traffiku fil-qalba, toqgħodx lura milli titkellem.

Mill-mod, l-inkapsulament fl-UDP wera ruħu tajjeb ħafna. Meta mqabbel ma 'inkapsulament fuq IP, huwa ħafna aktar stabbli u ħafna drabi aktar mgħaġġel minkejja l-overhead addizzjonali tal-header UDP. Dan huwa dovut għall-fatt li ħafna hosts fuq l-Internet jaħdmu tajjeb biss bit-tliet protokolli l-aktar popolari: TCP, UDP, ICMP. Il-parti tanġibbli tista' tarmi kompletament kull ħaġa oħra, jew tipproċessaha aktar bil-mod, minħabba li hija ottimizzata biss għal dawn it-tlieta.

Pereżempju, huwa għalhekk li QUICK, li fuqu huwa bbażat HTTP/3, inħoloq fuq UDP, u mhux fuq IP.

Ukoll, kliem biżżejjed, wasal iż-żmien biex tara kif taħdem fid-"dinja reali".

Battalja

Użat biex jimita d-dinja reali iperf3. F'termini tal-grad ta 'qrubija għar-realtà, dan huwa bejn wieħed u ieħor l-istess bħall-emulazzjoni tad-dinja reali f'Minecraft, iżda għalissa se tagħmel.

Parteċipanti fil-kompetizzjoni:

  • kanal ewlieni ta' referenza
  • l-eroj ta' dan l-artiklu huwa ipipou
  • OpenVPN b'awtentikazzjoni iżda mingħajr kriptaġġ
  • OpenVPN fil-mod li jinkludi kollox
  • WireGuard mingħajr PresharedKey, b'MTU=1440 (minn IPv4 biss)

Dejta teknika għal geeks
Il-metriċi jittieħdu bil-kmandi li ġejjin:

fuq il-klijent:

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", чтобы лишние пакеты не плодить и не портить производительность.

TCP

CPULOG=NAME.tcp.cpu.log; sar 10 6 >"$CPULOG" & iperf3 -c SERVER_IP -4 -t 60 -f m -i 10 -B LOCAL_IP -P 2; tail -1 "$CPULOG"

Latency ICMP

ping -c 10 SERVER_IP | tail -1

fuq is-server (jimxi fl-istess ħin mal-klijent):

UDP

CPULOG=NAME.udp.cpu.log; sar 10 6 >"$CPULOG" & iperf3 -s -i 10 -f m -1; tail -1 "$CPULOG"

TCP

CPULOG=NAME.tcp.cpu.log; sar 10 6 >"$CPULOG" & iperf3 -s -i 10 -f m -1; tail -1 "$CPULOG"

Konfigurazzjoni tal-mina

ipipou
server
/etc/ipipou/server.conf:

server
number 0
fou-dev eth0
fou-local-port 10000
tunl-ip 172.28.0.0
auth-remote-pubkey-b64 eQYNhD/Xwl6Zaq+z3QXDzNI77x8CEKqY1n5kt9bKeEI=
auth-secret topsecret
auth-lifetime 3600
reply-on-auth-ok
verb 3

systemctl start ipipou@server

klijent
/etc/ipipou/client.conf:

client
number 0
fou-local @eth0
fou-remote SERVER_IP:10000
tunl-ip 172.28.0.1
# pubkey of auth-key-b64: eQYNhD/Xwl6Zaq+z3QXDzNI77x8CEKqY1n5kt9bKeEI=
auth-key-b64 RuBZkT23na2Q4QH1xfmZCfRgSgPt5s362UPAFbecTso=
auth-secret topsecret
keepalive 27
verb 3

systemctl start ipipou@client

openvpn (l-ebda encryption, bl-awtentikazzjoni)
server

openvpn --genkey --secret ovpn.key  # Затем надо передать ovpn.key клиенту
openvpn --dev tun1 --local SERVER_IP --port 2000 --ifconfig 172.16.17.1 172.16.17.2 --cipher none --auth SHA1 --ncp-disable --secret ovpn.key

klijent

openvpn --dev tun1 --local LOCAL_IP --remote SERVER_IP --port 2000 --ifconfig 172.16.17.2 172.16.17.1 --cipher none --auth SHA1 --ncp-disable --secret ovpn.key

openvpn (b'kriptaġġ, awtentikazzjoni, permezz ta' UDP, kollox kif mistenni)
Ikkonfigurat bl-użu openvpn-manage

gwardja tal-wajer
server
/etc/wireguard/server.conf:

[Interface]
Address=172.31.192.1/18
ListenPort=51820
PrivateKey=aMAG31yjt85zsVC5hn5jMskuFdF8C/LFSRYnhRGSKUQ=
MTU=1440

[Peer]
PublicKey=LyhhEIjVQPVmr/sJNdSRqTjxibsfDZ15sDuhvAQ3hVM=
AllowedIPs=172.31.192.2/32

systemctl start wg-quick@server

klijent
/etc/wireguard/client.conf:

[Interface]
Address=172.31.192.2/18
PrivateKey=uCluH7q2Hip5lLRSsVHc38nGKUGpZIUwGO/7k+6Ye3I=
MTU=1440

[Peer]
PublicKey=DjJRmGvhl6DWuSf1fldxNRBvqa701c0Sc7OpRr4gPXk=
AllowedIPs=172.31.192.1/32
Endpoint=SERVER_IP:51820

systemctl start wg-quick@client

Sejbiet

Sinjal ikrah niedja
It-tagħbija tas-CPU tas-server mhix indikattiva ħafna, għax... Hemm ħafna servizzi oħra li jaħdmu hemm, xi drabi jieklu riżorsi:

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

Kanal ta' 20 Mbps

ipipou: aktar minn sempliċi mina mhux kriptata

ipipou: aktar minn sempliċi mina mhux kriptata

kanal għal kull Gbps ottimista

ipipou: aktar minn sempliċi mina mhux kriptata

ipipou: aktar minn sempliċi mina mhux kriptata

Fil-każijiet kollha, ipipou huwa pjuttost qrib fil-prestazzjoni tal-kanal bażi, li huwa kbir!

Il-mina openvpn mhux ikkodifikata ġabet ruħha pjuttost stramba fiż-żewġ każijiet.

Jekk xi ħadd se jittestjah, ikun interessanti li jisma' rispons.

Jalla l-IPv6 u NetPrickle ikunu magħna!

Sors: www.habr.com

Żid kumment