ipipou: labaw pa sa usa ka unencrypted tunnel

Unsa ang atong gisulti sa Dios sa IPv6?

ipipou: labaw pa sa usa ka unencrypted tunnel
Husto kana, parehas ang among isulti sa diyos sa pag-encrypt karon.

Dinhi kita maghisgot mahitungod sa usa ka unencrypted IPv4 tunnel, apan dili mahitungod sa usa ka "mainit nga lampara", apan mahitungod sa usa ka modernong "LED" nga usa. Ug adunay usab mga hilaw nga socket nga nagkidlap dinhi, ug ang trabaho nagpadayon uban ang mga pakete sa wanang sa tiggamit.

Adunay N tunneling protocol alang sa matag lami ug kolor:

  • estilo, uso, kabatan-onan WireGuard
  • multifunctional, sama sa Swiss kutsilyo, OpenVPN ug SSH
  • tigulang ug dili daotan nga GRE
  • ang labing yano, paspas, hingpit nga wala ma-encrypt nga IPIP
  • aktibo nga nag-uswag GENEVE
  • daghan pang uban.

Apan ako usa ka programmer, mao nga akong dugangan ang N sa usa ka tipik lamang, ug ibilin ang pag-uswag sa tinuod nga mga protocol sa mga developer sa Kommersant.

Sa usa ka wala pa matawo ang draftAng akong gibuhat karon mao ang pagkab-ot sa mga host luyo sa NAT gikan sa gawas. Gigamit ang mga protocol nga adunay hamtong nga cryptography alang niini, dili nako matay-og ang pagbati nga kini sama sa pagpamusil sa mga goryon gikan sa usa ka kanyon. Kay ang tunnel gigamit sa kadaghanan nga bahin lamang sa pagbuak sa mga lungag sa NAT-e, ang internal nga trapiko kasagaran usab nga gi-encrypt, apan sila malumos gihapon sa HTTPS.

Samtang nag-research sa lain-laing mga tunneling protocol, ang akong inner perfectionist nadani sa IPIP balik-balik tungod sa gamay nga overhead niini. Apan kini adunay usa ug tunga nga hinungdanon nga mga kakulangan alang sa akong mga buluhaton:

  • nanginahanglan kini og mga publikong IP sa duha ka kilid,
  • ug walay panghimatuod alang kanimo.

Busa, ang perpeksiyonista giabog balik ngadto sa mangitngit nga suok sa kalabera, o bisan asa siya naglingkod didto.

Ug unya usa ka adlaw, samtang nagbasa sa mga artikulo sa natively nga gisuportahan tunnels sa Linux nakit-an nako ang FOU (Foo-over-UDP), i.e. bisan unsa, giputos sa UDP. Sa pagkakaron, IPIP ug GUE (Generic UDP Encapsulation) lang ang gisuportahan.

“Ania ang pilak nga bala! Ang usa ka yano nga IPIP igo na alang kanako. ” - Naghunahuna ko.

Sa pagkatinuod, ang bala nahimo nga dili hingpit nga pilak. Ang encapsulation sa UDP nakasulbad sa unang problema - mahimo ka nga makonektar sa mga kliyente sa luyo sa NAT gikan sa gawas gamit ang usa ka pre-established nga koneksyon, apan dinhi ang katunga sa sunod nga disbentaha sa IPIP blossoms sa usa ka bag-ong kahayag - luyo sa makita nga publiko nga IP ug kliyente port bisan kinsa gikan sa. ang usa ka pribadong network mahimong makatago (sa lunsay nga IPIP kini nga problema wala maglungtad).

Aron masulbad kining usa ug tunga nga problema, natawo ang utility ipipou. Nagpatuman kini og mekanismo nga hinimo sa balay alang sa pag-authenticate sa usa ka hilit nga host, nga wala makabalda sa operasyon sa kernel FOU, nga dali ug epektibo nga magproseso sa mga pakete sa luna sa kernel.

Wala namo kinahanglana ang imong script!

Ok, kung nahibal-an nimo ang publiko nga pantalan ug IP sa kliyente (pananglitan, ang tanan sa luyo niini dili moadto bisan diin, gisulayan sa NAT nga mapa ang mga pantalan nga 1-in-1), mahimo ka maghimo usa ka IPIP-over-FOU tunnel nga adunay pagsunod sa mga sugo, nga walay bisan unsang script.

sa 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

sa kliyente:

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

diin

  • ipipou* — ngalan sa lokal nga tunnel network interface
  • 203.0.113.1 - publiko nga IP server
  • 198.51.100.2 - publiko nga IP sa kliyente
  • 192.168.0.2 — kliyente IP nga gi-assign sa interface eth0
  • 10001 — lokal nga pantalan sa kliyente alang sa FOU
  • 20001 — publikong pantalan sa kliyente alang sa FOU
  • 10000 — public server port para sa FOU
  • encap-csum - kapilian sa pagdugang sa usa ka UDP checksum sa encapsulated UDP packet; mahimong pulihan sa noencap-csum, wala pay labot, ang integridad kontrolado na sa gawas nga encapsulation layer (samtang ang pakete anaa sa sulod sa tunel)
  • eth0 — lokal nga interface diin ang ipip tunnel igapos
  • 172.28.0.1 - IP sa interface sa tunel sa kliyente (pribado)
  • 172.28.0.0 - Interface sa IP tunnel server (pribado)

Hangtud nga ang koneksyon sa UDP buhi, ang tunel anaa sa kahusay, apan kung kini maguba, swerte ka - kung ang IP sa kliyente: port nagpabilin nga pareho - kini mabuhi, kung sila magbag-o - kini mabuak.

Ang labing kadali nga paagi aron mabalik ang tanan mao ang pagdiskarga sa mga module sa kernel: modprobe -r fou ipip

Bisan kung wala kinahanglana ang pag-authenticate, ang publiko nga IP ug pantalan sa kliyente dili kanunay nahibal-an ug kanunay dili matag-an o variable (depende sa tipo sa NAT). Kung imong laktawan encap-dport sa kilid sa server, ang tunel dili molihok, dili kini igo nga kaalam sa pagkuha sa hilit nga pantalan sa koneksyon. Sa kini nga kaso, ang ipipou makatabang usab, o ang WireGuard ug uban pa nga sama niini makatabang kanimo.

Unsang paagi kini sa trabaho?

Ang kliyente (nga kasagaran sa luyo sa NAT) nag-abli sa usa ka tunel (sama sa panig-ingnan sa ibabaw), ug nagpadala usa ka pakete sa pag-authenticate sa server aron ma-configure ang tunel sa kilid niini. Depende sa mga setting, kini mahimong usa ka walay sulod nga pakete (aron ang server makakita sa publiko nga IP: koneksyon port), o uban sa data diin ang server makaila sa kliyente. Ang datos mahimo nga usa ka yano nga passphrase sa tin-aw nga teksto (ang analohiya sa HTTP Basic Auth moabut sa hunahuna) o espesyal nga gidisenyo nga datos nga gipirmahan gamit ang usa ka pribado nga yawe (sama sa HTTP Digest Auth nga labi ka kusgan, tan-awa ang function. client_auth sa code).

Sa server (sa kilid sa publiko nga IP), sa diha nga ang ipipou magsugod, kini nagmugna sa usa ka nfqueue queue handler ug nag-configure sa netfilter aron ang gikinahanglan nga mga pakete ipadala kung asa sila kinahanglan: mga pakete nga nagsugod sa koneksyon sa nfqueue queue, ug [halos] ang tanan diretso sa tigpaminaw nga FOU.

Alang niadtong wala mahibalo, ang nfqueue (o NetfilterQueue) usa ka espesyal nga butang alang sa mga amateur nga wala mahibalo kon unsaon pag-ugmad ang kernel modules, nga gamit ang netfilter (nftables/iptables) nagtugot kanimo sa pag-redirect sa mga network packet ngadto sa user space ug pagproseso niini didto gamit ang primitive nga paagi sa kamot: usba (opsyonal ) ug ibalik kini sa kernel, o ilabay kini.

Alang sa pipila ka mga programming language adunay mga pagbugkos alang sa pagtrabaho sa nfqueue, alang sa bash wala (heh, dili ikatingala), kinahanglan nako nga mogamit sa python: gigamit ang ipipou NetfilterQueue.

Kung ang pasundayag dili kritikal, gamita kini nga butang mahimo nimo nga dali ug dali nga makahimo sa imong kaugalingon nga lohika alang sa pagtrabaho sa mga pakete sa usa ka medyo ubos nga lebel, pananglitan, paghimo mga eksperimento nga mga protocol sa pagbalhin sa datos, o pag-troll sa lokal ug hilit nga mga serbisyo nga adunay dili standard nga pamatasan.

Ang mga hilaw nga socket nagtrabaho sa kamot sa nfqueue, pananglitan, kung ang tunel na-configure na ug ang FOU naminaw sa gusto nga pantalan, dili ka makapadala usa ka pakete gikan sa parehas nga pantalan sa naandan nga paagi - busy kini, apan mahimo nimong kuhaon ug ipadala ang usa ka random nga namugna nga pakete direkta sa interface sa network gamit ang usa ka hilaw nga socket, bisan kung ang paghimo sa ingon nga usa ka pakete magkinahanglan usa ka gamay nga pag-tinker. Kini ang paagi nga ang mga pakete nga adunay panghimatuud gihimo sa ipipou.

Tungod kay ang ipipou nagproseso lamang sa unang mga pakete gikan sa koneksyon (ug kadtong nakahimo sa pagtulo sa pila sa wala pa matukod ang koneksyon), ang pasundayag halos dili mag-antus.

Sa diha nga ang ipipou server makadawat sa usa ka authenticated packet, usa ka tunnel ang gihimo ug ang tanan nga sunod nga mga pakete sa koneksyon giproseso na sa kernel nga nag-bypass sa nfqueue. Kung mapakyas ang koneksyon, nan ang una nga pakete sa sunod ipadala sa nfqueue queue, depende sa mga setting, kung dili kini usa ka pakete nga adunay panghimatuud, apan gikan sa katapusan nga nahinumduman nga IP ug port sa kliyente, mahimo kini ipasa. sa o gilabay. Kung ang usa ka authenticated packet gikan sa usa ka bag-ong IP ug port, ang tunel gi-reconfigure aron magamit kini.

Ang naandan nga IPIP-over-FOU adunay usa pa nga problema kung nagtrabaho kauban ang NAT - imposible nga makahimo og duha ka IPIP tunnels nga gi-encapsulated sa UDP nga adunay parehas nga IP, tungod kay ang FOU ug IPIP modules medyo nahimulag sa usag usa. Mga. ang usa ka parisan sa mga kliyente luyo sa parehas nga publikong IP dili makahimo sa dungan nga pagkonektar sa parehas nga server sa niini nga paagi. Sa umaabot, lagmit, masulbad kini sa lebel sa kernel, apan dili kini sigurado. Sa kasamtangan, ang mga problema sa NAT mahimong masulbad sa NAT - kung mahitabo nga ang usa ka parisan sa mga IP address giokupar na sa laing tunel, ang ipipou mobuhat sa NAT gikan sa publiko ngadto sa alternatibong pribadong IP, voila! - makahimo ka ug tunnel hangtod mahurot ang mga pantalan.

Kay Dili tanan nga mga pakete sa koneksyon gipirmahan, nan kini nga yano nga proteksyon huyang sa MITM, mao nga kung adunay usa ka kontrabida nga nagtago sa agianan tali sa kliyente ug sa server nga makapamati sa trapiko ug makamaniobra niini, mahimo niyang i-redirect ang mga napamatud-an nga pakete pinaagi sa laing adres ug paghimo ug tunel gikan sa dili kasaligang host .

Kung adunay adunay mga ideya kung giunsa kini ayohon samtang gibiyaan ang kadaghanan sa trapiko sa kinauyokan, ayaw pagpanuko sa pagsulti.

Pinaagi sa dalan, ang encapsulation sa UDP napamatud-an pag-ayo. Kung itandi sa encapsulation sa IP, kini mas lig-on ug kasagaran mas paspas bisan pa sa dugang nga overhead sa UDP header. Kini tungod sa kamatuoran nga kadaghanan sa mga host sa Internet nagtrabaho nga maayo lamang sa tulo ka labing popular nga mga protocol: TCP, UDP, ICMP. Ang mahikap nga bahin mahimong hingpit nga isalikway ang tanan, o iproseso kini nga labi ka hinay, tungod kay kini gi-optimize alang lamang sa tulo.

Pananglitan, mao kini ang hinungdan nga ang QUICK, diin gibase ang HTTP/3, gihimo sa ibabaw sa UDP, ug dili sa ibabaw sa IP.

Aw, igo nga mga pulong, panahon na aron makita kung giunsa kini molihok sa "tinuod nga kalibutan".

Gubat

Gigamit sa pagsundog sa tinuod nga kalibutan iperf3. Sa termino sa ang-ang sa pagkasuod sa kamatuoran, kini mao ang gibana-bana nga sama sa pagsundog sa tinuod nga kalibutan sa Minecraft, apan sa pagkakaron kini mahitabo.

Mga partisipante sa kompetisyon:

  • reference main channel
  • ang bayani niini nga artikulo mao si ipipou
  • OpenVPN nga adunay authentication apan walay encryption
  • OpenVPN sa all-inclusive mode
  • WireGuard nga walay PresharedKey, nga adunay MTU=1440 (sukad IPv4-only)

Teknikal nga datos alang sa mga geeks
Ang mga sukatan gikuha gamit ang mosunod nga mga sugo:

sa kliyente:

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"

ICMP latency

ping -c 10 SERVER_IP | tail -1

sa server (nagdagan dungan sa kliyente):

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"

Pag-configure sa tunel

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

kliyente
/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 (walay encryption, nga adunay authentication)
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

kliyente

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 (nga adunay encryption, authentication, pinaagi sa UDP, tanan nga gipaabut)
Gi-configure gamit openvpn-pagdumala

bantayan
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

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

Результаты

Damp ugly sign
Ang pagkarga sa CPU sa server dili kaayo timailhan, tungod kay ... Adunay daghang uban pang mga serbisyo nga nagdagan didto, usahay sila mokaon sa mga kapanguhaan:

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

20 Mbps nga channel

ipipou: labaw pa sa usa ka unencrypted tunnel

ipipou: labaw pa sa usa ka unencrypted tunnel

channel kada 1 malaumon nga Gbps

ipipou: labaw pa sa usa ka unencrypted tunnel

ipipou: labaw pa sa usa ka unencrypted tunnel

Sa tanan nga mga kaso, ang ipipou hapit sa pasundayag sa base channel, nga maayo!

Ang wala ma-encrypt nga openvpn tunnel naglihok nga katingad-an sa parehas nga mga kaso.

Kung adunay mosulay niini, makapaikag nga madungog ang feedback.

Hinaut nga ang IPv6 ug NetPrickle mag-uban kanamo!

Source: www.habr.com

Idugang sa usa ka comment