ipipou: leuwih ti ngan hiji torowongan unencrypted

Naon anu urang nyarioskeun ka Dewa IPv6?

ipipou: leuwih ti ngan hiji torowongan unencrypted
É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:

  • stylish, fashionable, nonoman WireGuard
  • multifungsi, kawas knives Swiss, OpenVPN jeung SSH
  • heubeul teu jahat GRE
  • paling basajan, gancang, IPIP lengkep unencrypted
  • aktip ngamekarkeun GENEVE
  • loba batur.

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

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

dina server (ngajalankeun sakaligus sareng klien):

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"

Konfigurasi torowongan

ipis
sérver
/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

konsumén
/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 (henteu énkripsi, kalayan auténtikasi)
sérver

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

konsumén

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 (kalayan enkripsi, auténtikasi, via UDP, sagalana saperti nu diharapkeun)
Dikonpigurasi ngagunakeun openvpn-ngatur

penjaga kawat
sérver
/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

konsumén
/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

Hasil

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

ipipou: leuwih ti ngan hiji torowongan unencrypted

ipipou: leuwih ti ngan hiji torowongan unencrypted

saluran per 1 Gbps optimistis

ipipou: leuwih ti ngan hiji torowongan unencrypted

ipipou: leuwih ti ngan hiji torowongan unencrypted

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.

Muga IPv6 sareng NetPrickle aya sareng kami!

sumber: www.habr.com

Tambahkeun komentar