ipipou: plis pase yon tinèl ki pa kode

Kisa n ap di Bondye IPv6 la?

ipipou: plis pase yon tinèl ki pa kode
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è.

Gen N pwotokòl tinèl pou chak gou ak koulè:

  • élégance, alamòd, jèn WireGuard
  • multifonksyonèl, tankou kouto Swis, OpenVPN ak SSH
  • ansyen e pa move GRE
  • IPIP ki pi senp, ki pi rapid, ki pa kode nèt
  • devlope aktivman GENEVE
  • anpil lòt moun.

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

Tchp

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"

latansi ICMP

ping -c 10 SERVER_IP | tail -1

sou sèvè a (kouri ansanm ak kliyan an):

udp

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

Tchp

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

Konfigirasyon tinèl

ipipou
sèvè
/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

kliyan
/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 (pa gen okenn chifreman, ak otantifikasyon)
sèvè

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

kliyan

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 (ak chifreman, otantifikasyon, atravè UDP, tout bagay jan yo espere)
Konfigirasyon lè l sèvi avèk openvpn-jere

gad fil
sèvè
/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

kliyan
/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

Jwenn

Mouye siy lèd
Chaj CPU sèvè a pa trè indicatif, paske... Gen anpil lòt sèvis ki kouri la, pafwa yo manje resous:

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

Chanèl 20 Mbps

ipipou: plis pase yon tinèl ki pa kode

ipipou: plis pase yon tinèl ki pa kode

chanèl pou chak 1 Gbps optimis

ipipou: plis pase yon tinèl ki pa kode

ipipou: plis pase yon tinèl ki pa kode

Nan tout ka, ipipou se byen fèmen nan pèfòmans nan kanal la baz, ki se gwo!

Tinèl openvpn ki pa kode a te konpòte byen etranj nan tou de ka yo.

Si yon moun pral teste li, li pral enteresan pou tande fidbak.

Se pou IPv6 ak NetPrickle avèk nou!

Sous: www.habr.com

Add nouvo kòmantè