ipipou: бештар аз як нақби рамзнашуда

Мо ба Худои IPv6 чӣ мегӯем?

ipipou: бештар аз як нақби рамзнашуда
Дуруст аст, мо имрӯз ба худои рамзгузорӣ ҳаминро хоҳем гуфт.

Дар ин ҷо мо дар бораи нақби шифрнашудаи IPv4 сӯҳбат хоҳем кард, аммо на дар бораи "чароғи гарм", балки дар бораи як "LED"-и муосир. Ва инчунин дар ин ҷо розеткаҳои хом дурахшиданд ва кор бо бастаҳо дар фазои корбар идома дорад.

Барои ҳар мазза ва ранг N протоколҳои нақбсозӣ мавҷуданд:

  • услубӣ, муд, ҷавонӣ Радиои Озодӣ
  • бисёрфунксионалӣ, ба монанди кордҳои швейтсарӣ, OpenVPN ва SSH
  • кӯҳна ва на бад GRE
  • соддатарин, зуд, комилан рамзнашуда IPIP
  • фаъолона инкишоф меёбанд ЖЕНЕВА
  • бисьёр дигарон.

Аммо ман барномасоз ҳастам, аз ин рӯ ман N-ро танҳо ба як қисм зиёд мекунам ва таҳияи протоколҳои воқеиро ба ихтиёри таҳиягарони Коммерсант мегузорам.

Дар як таваллуднашуда лоихаиОн чизе ки ман ҳоло мекунам, ин аст, ки аз берун ба ҳостҳо дар паси NAT расам. Барои ин бо истифода аз протоколҳо бо криптографияи калонсолон, ман ҳиссиёти онро ба ларза андохта наметавонистам, ки ин мисли тирандозӣ аз тӯп гунҷишкҳо буд. Зеро нақб ​​аксар вақт танҳо барои сӯрохҳо дар NAT-e истифода мешавад, трафики дохилӣ одатан рамзгузорӣ мешавад, аммо онҳо то ҳол дар HTTPS ғарқ мешаванд.

Ҳангоми таҳқиқи протоколҳои гуногуни нақбсозӣ, таваҷҷӯҳи перфекционисти ботинии ман бо сабаби ҳадди ақали ҳадди ақали он ба IPIP такроран ҷалб карда шуд. Аммо он барои вазифаҳои ман якуним камбудиҳои назаррас дорад:

  • он дар ҳарду ҷониб IP-ҳои ҷамъиятиро талаб мекунад,
  • ва ҳеҷ тасдиқи барои шумо.

Аз ин рӯ, идеалистро дубора ба кунҷи торикии косахонаи сар ва ё ҳар ҷое, ки дар он ҷо нишинад, ронданд.

Ва он гоҳ як рӯз, ҳангоми хондани мақолаҳо дар бораи нақбҳои аз ҷониби модарӣ дастгирӣшаванда дар Linux ман бо FOU (Foo-over-UDP) дучор омадам, яъне. ҳар чӣ, парпечшуда дар UDP. То ҳол, танҳо IPIP ва GUE (Generic UDP Encapsulation) дастгирӣ карда мешаванд.

«Инак тири нуқра! Барои ман як IPIP оддӣ басанда аст." — фикр кардам.

Дар асл, тир тамоман нуқра набудааст. Инкапсуляция дар UDP мушкилоти аввалро ҳал мекунад - шумо метавонед бо истифода аз пайвасти қаблан муқарраршуда ба мизоҷони паси NAT аз берун пайваст шавед, аммо дар ин ҷо нисфи нуқсони навбатии IPIP бо нури нав мешукуфад - ҳар касе аз шабакаи хусусӣ метавонад дар паси шабакаҳои намоён пинҳон шавад IP-и ҷамъиятӣ ва порти муштарӣ (дар IPIP холис ин мушкилот вуҷуд надорад).

Барои халли ин якуним масъала, коммуналй ба вучуд омад ипипу. Он механизми худсохти аутентификатсияи ҳости дурдастро бидуни халалдор кардани кори ядрои FOU амалӣ мекунад, ки бастаҳоро дар фазои ядро ​​зуд ва самаранок коркард мекунад.

Ба мо скрипти шумо лозим нест!

Хуб, агар шумо бандари ҷамъиятӣ ва IP-и муштариро медонед (масалан, ҳама дар паси он ба ҷое намераванд, NAT кӯшиш мекунад, ки портҳои 1-дар-1ро харита кунад), шумо метавонед нақби IPIP-over-FOU бо фармонҳои зерин, бе ягон скрипт.

дар сервер:

# Подгрузить модуль ядра 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

дар бораи муштарӣ:

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

ки

  • ipipou* — номи интерфейси шабакаи маҳаллии нақб
  • 203.0.113.1 — сервери ҷамъиятии IP
  • 198.51.100.2 — IP-и оммавии муштарӣ
  • 192.168.0.2 — IP мизоҷ ба интерфейси eth0 таъин шудааст
  • 10001 - порти муштарии маҳаллӣ барои FOU
  • 20001 - бандари муштарии ҷамъиятӣ барои FOU
  • 10000 - порти сервери ҷамъиятӣ барои FOU
  • encap-csum — имконоти илова кардани маблағи санҷиши UDP ба бастаҳои UDP-и капсулшуда; иваз кардан мумкин аст noencap-csum, ногуфта намонад, ки якпорчагӣ аллакай аз ҷониби қабати инкапсуляцияи берунӣ назорат карда мешавад (дар ҳоле ки баста дар дохили нақб аст)
  • eth0 — интерфейси маҳаллӣ, ки нақби ipip ба он пайваст мешавад
  • 172.28.0.1 — IP интерфейси нақби муштарӣ (хусусӣ)
  • 172.28.0.0 — Интерфейси сервери нақби IP (хусусӣ)

То он даме, ки пайвасти UDP зинда аст, нақб дар ҳолати корӣ хоҳад буд, аммо агар он канда шавад, шумо хушбахт мешавед - агар IP: порти муштарӣ бетағйир монад - он зинда мемонад, агар онҳо тағир диҳанд - он мешиканад.

Роҳи осонтарини баргардонидани ҳама чиз ин боркунии модулҳои ядро ​​мебошад: modprobe -r fou ipip

Ҳатто агар тасдиқи аутентификатсия талаб карда нашавад ҳам, IP ва порти муштарӣ на ҳамеша маълуманд ва аксар вақт пешгӯинашаванда ё тағйирёбанда мебошанд (вобаста ба намуди NAT). Агар тарк кунед encap-dport дар тарафи сервер, нақб кор нахоҳад кард, он аст, кофӣ интеллектуалӣ нест, барои гирифтани бандари пайвасти дурдаст. Дар ин ҳолат, ipipou низ метавонад кӯмак кунад, ё WireGuard ва дигарон мисли он метавонанд ба шумо кӯмак расонанд.

Чӣ тавр он кор мекунад?

Мизоҷ (ки одатан дар паси NAT ҷойгир аст) нақб мекушояд (ба монанди мисоли боло) ва бастаи аутентификатсияро ба сервер мефиристад, то он нақбро дар паҳлӯи худ танзим кунад. Вобаста аз танзимот, ин метавонад як бастаи холӣ бошад (танҳо барои он ки сервер IP-и умумиро бубинад: бандари пайвастшавӣ) ё бо маълумоте, ки сервер метавонад муштариро муайян кунад. Маълумот метавонад як ибораи оддӣ дар матни равшан бошад (шабеҳ бо HTTP Basic Auth ба хотир меояд) ё маълумоти махсус тарҳрезишуда, ки бо калиди хусусӣ имзо шудааст (монанд ба HTTP Digest Auth танҳо қавитар аст, ба функсия нигаред. client_auth дар код).

Дар сервер (тарафи IP-и ҷамъиятӣ), вақте ки ipipou оғоз меёбад, он коркардкунандаи навбати nfqueue эҷод мекунад ва филтрро танзим мекунад, то бастаҳои зарурӣ ба ҷое фиристода шаванд: бастаҳо пайвастшавиро ба навбати nfqueue оғоз мекунанд ва [қариб] хамаи бокимондааш рост ба шунаванда FOU меравад.

Барои онҳое, ки намедонанд, nfqueue (ё NetfilterQueue) як чизи махсус барои ҳаводороне мебошад, ки чӣ тавр сохтани модулҳои ядроиро намедонанд, ки бо истифода аз netfilter (nftables/iptables) ба шумо имкон медиҳад, ки бастаҳои шабакаро ба фазои корбар равона кунед ва онҳоро бо истифода аз он коркард кунед. воситаҳои ибтидоӣ дар даст: тағир диҳед (ихтиёрӣ) ва онро ба ядро ​​баргардонед ё онро партоед.

Барои баъзе забонҳои барномасозӣ ҳатмӣ барои кор бо nfqueue вуҷуд дорад, барои bash вуҷуд надошт (ҳа, тааҷҷубовар нест), ман маҷбур будам, ки python -ро истифода барам: ipipou истифода мебарад NetfilterQueue.

Агар иҷроиш муҳим набошад, бо истифода аз ин чиз шумо метавонед мантиқи шахсии худро барои кор бо пакетҳо дар сатҳи хеле паст созед, масалан, протоколҳои интиқоли маълумотро эҷод кунед ё хидматҳои маҳаллӣ ва дурдаст бо рафтори ғайристандартӣ трол кунед.

Розеткаҳои хом бо nfqueue даст ба ҳамдигар кор мекунанд, масалан, вақте ки нақб аллакай танзим шудааст ва FOU ба бандари дилхоҳ гӯш медиҳад, шумо наметавонед пакетро аз ҳамон порт ба таври муқаррарӣ фиристед - он банд аст, аммо шумо метавонед бастаи ба таври тасодуфӣ тавлидшударо бо истифода аз розеткаи хом мустақиман ба интерфейси шабака бигиред ва ирсол кунед, гарчанде тавлиди чунин баста каме корбурди бештарро талаб мекунад. Ҳамин тавр дар ipipou бастаҳо бо аутентификатсия сохта мешаванд.

Азбаски ipipou танҳо бастаҳои аввалро аз пайвастшавӣ коркард мекунад (ва онҳое, ки пеш аз таъсиси пайвастшавӣ тавонистаанд ба навбат ворид шаванд), иҷроиш қариб зарар намебинад.

Ҳамин ки сервери ipipou бастаи тасдиқшударо қабул мекунад, нақб сохта мешавад ва ҳамаи бастаҳои минбаъдаи пайваст аллакай тавассути ядро ​​​​бо гузашти nfqueue коркард мешаванд. Агар пайвастшавӣ ноком шавад, бастаи якуми навбатии навбатӣ вобаста ба танзимот ба навбати nfqueue фиристода мешавад, агар он бастаи дорои аутентификатсия набошад, балки аз охирин IP ва порти муштарӣ дар хотир дошта бошад, он метавонад ё интиқол дода шавад. дар бораи ё партофташуда. Агар бастаи тасдиқшуда аз IP ва порти нав ворид шавад, нақб барои истифодаи онҳо аз нав танзим карда мешавад.

IPIP-over-FOU-и маъмулӣ ҳангоми кор бо NAT як мушкили дигар дорад - эҷод кардани ду нақби IPIP, ки дар UDP бо ҳамон IP фаро гирифта шудаанд, ғайриимкон аст, зеро модулҳои FOU ва IPIP аз ҳамдигар комилан ҷудо шудаанд. Онхое. як ҷуфт муштарӣ дар паси ҳамон IP-и ҷамъиятӣ наметавонанд дар як вақт ба як сервер бо ин роҳ пайваст шаванд. Дар оянда, мумкин аст, он дар сатҳи ядро ​​ҳал карда мешавад, аммо ин аниқ нест. Дар ҳамин ҳол, мушкилоти NAT-ро тавассути NAT ҳал ​​кардан мумкин аст - агар он рӯй диҳад, ки як ҷуфт суроғаҳои IP аллакай дар нақби дигар ишғол карда шуда бошад, ipipou NAT-ро аз омма ба IP-и алтернативии хусусӣ иҷро мекунад, voila! - шумо метавонед нақбҳоро то тамом шудани бандарҳо созед.

Зеро На ҳама бастаҳои пайвастшавӣ имзо карда шудаанд, пас ин муҳофизати оддӣ ба MITM осебпазир аст, бинобар ин, агар дар роҳи байни муштарӣ ва сервер як бадкирдоре бошад, ки трафикро гӯш кунад ва онро идора кунад, ӯ метавонад бастаҳои тасдиқшударо тавассути MITM равона кунад. суроғаи дигар ва нақби мизбони беэътимод эҷод кунед.

Агар касе дар бораи чӣ гуна ислоҳ кардани ин масъала ҳангоми гузоштани қисми зиёди трафик дар асл андеша дошта бошад, аз гуфтан шарм надоред.

Дар омади гап, инкапсуляция дар UDP худро хеле хуб исбот кардааст. Дар муқоиса бо инкапсуляция тавассути IP, он сарфи назар аз сарлавҳаи иловагии сарлавҳаи UDP хеле устувортар ва тезтар аст. Ин ба он вобаста аст, ки аксари ҳостҳо дар Интернет танҳо бо се протоколи маъмултарин: TCP, UDP, ICMP хуб кор мекунанд. Қисми моддӣ метавонад ҳама чизи боқимондаро комилан партояд ё онро сусттар коркард кунад, зеро он танҳо барои ин се оптимизатсия карда шудааст.

Масалан, барои ҳамин QUICK, ки HTTP/3 бар он асос ёфтааст, дар болои UDP сохта шудааст, на дар болои IP.

Хуб, суханони кофӣ, вақти он расидааст, ки бубинем, ки он дар "ҷаҳони воқеӣ" чӣ гуна кор мекунад.

Ҷанг

Барои тақлид кардани ҷаҳони воқеӣ истифода мешавад iperf3. Аз нуқтаи назари дараҷаи наздикӣ ба воқеият, ин тақрибан ба тақлид кардани ҷаҳони воқеӣ дар Майнкрафт баробар аст, аммо ҳоло ин кор хоҳад кард.

Иштироккунандагони озмун:

  • истинод ба канали асосӣ
  • кахрамони ин макола ipipou аст
  • OpenVPN бо аутентификатсия, аммо рамзгузорӣ нест
  • OpenVPN дар ҳолати фарогир
  • WireGuard бе PresharedKey, бо MTU = 1440 (азбаски танҳо IPv4)

Маълумоти техникӣ барои Geeks
Метрикҳо бо фармонҳои зерин гирифта мешаванд:

дар бораи муштарӣ:

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

ping -c 10 SERVER_IP | tail -1

дар сервер (ҳамзамон бо муштарӣ кор мекунад):

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"

Конфигуратсияи туннел

ипипу
сервер
/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

мизоҷ
/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 (бе рамзгузорӣ, бо аутентификатсия)
сервер

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

мизоҷ

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 (бо рамзгузорӣ, аутентификатсия, тавассути UDP, ҳама чиз тавре ки интизор мерафт)
Бо истифода аз конфигуратсия openvpn-идора кунед

муҳофизаткунандаи сим
сервер
/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

мизоҷ
/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

натиҷаҳои

Аломати намии зишт
Сарбории CPU-и сервер чандон нишондиҳанда нест, зеро... Дар он ҷо хидматҳои зиёде мавҷуданд, ки баъзан онҳо захираҳоро мехӯранд:

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 Мбит / сония

ipipou: бештар аз як нақби рамзнашуда

ipipou: бештар аз як нақби рамзнашуда

канал барои 1 Gbps оптимистӣ

ipipou: бештар аз як нақби рамзнашуда

ipipou: бештар аз як нақби рамзнашуда

Дар ҳама ҳолатҳо, ipipou дар иҷрои канали асосӣ хеле наздик аст, ки ин олиҷаноб аст!

Тунели рамзнашудаи openvpn дар ҳарду ҳолат хеле аҷиб рафтор мекард.

Агар касе онро озмоиш кунад, шунидани фикру мулоҳизаҳо ҷолиб хоҳад буд.

Бигзор IPv6 ва NetPrickle бо мо бошанд!

Манбаъ: will.com

Илова Эзоҳ