ipipou: یوازې د نه کوډ شوي تونل څخه ډیر

موږ د IPv6 خدای ته څه وایو؟

ipipou: یوازې د نه کوډ شوي تونل څخه ډیر
دا سمه ده، موږ به نن د کوډ کولو خدای ته ورته ووایو.

دلته به موږ د یو نه کوډ شوي IPv4 تونل په اړه وغږیږو، مګر د "ګرم څراغ" په اړه نه، مګر د عصري "LED" په اړه. او دلته خام ساکټونه چمکۍ هم شتون لري، او د کاروونکي ځای کې د پیکټونو سره کار روان دی.

د هر خوند او رنګ لپاره د N تونل کولو پروتوکولونه شتون لري:

  • سجیلا، فیشني، ځوان د واير ګارډ
  • څو اړخیزه، لکه سویس چاقو، OpenVPN او SSH
  • زاړه او نه بد GRE
  • خورا ساده ، ګړندی ، په بشپړ ډول نه کوډ شوی IPIP
  • په فعاله توګه وده کوي جینیوا
  • ډیری نور.

مګر زه یو پروګرامر یم، نو زه به N یوازې د یوې برخې په واسطه زیات کړم، او د اصلي پروتوکولونو پراختیا د Kommersant پراختیا کونکو ته پریږدم.

په یو نا پیدا شوی مسودههغه څه چې زه یې اوس کوم له بهر څخه د NAT شاته کوربه ته رسیدل دي. د دې لپاره د بالغ کریپټوګرافي سره د پروتوکولونو په کارولو سره ، زه نشم کولی دا احساس مات کړم چې دا د تپ څخه د مرغیو ډزې کولو په څیر و. ځکه تونل د ډیری برخې لپاره یوازې په NAT-e کې سوراخ کولو لپاره کارول کیږي ، داخلي ترافیک معمولا کوډ شوی هم وي ، مګر دوی لاهم په HTTPS کې ډوبیږي.

پداسې حال کې چې د تونل کولو مختلف پروتوکولونو څیړنه کوي ، زما د داخلي کمال پوه پام د دې لږترلږه سر له امله بار بار IPIP ته راجلب شو. مګر دا زما د دندو لپاره یو نیم نیم مهم نیمګړتیاوې لري:

  • دا په دواړو خواوو کې عامه IPs ته اړتیا لري،
  • او ستاسو لپاره هیڅ تصدیق نشته.

له همدې امله، کمال پرست بیرته د کوپړۍ تیاره کونج ته وګرځول شو، یا چیرته چې هغه هلته ناست وي.

او بیا یوه ورځ، په داسې حال کې چې مقالې لوستل په اصلي توګه ملاتړ شوي تونلونه په لینکس کې زه د FOU (Foo-over-UDP) سره مخ شوم، د بیلګې په توګه. هر څه، په UDP کې پوښل شوي. تر اوسه پورې، یوازې IPIP او GUE (Generic UDP Encapsulation) ملاتړ کیږي.

"دلته د سپینو زرو ګولۍ ده! یو ساده IPIP زما لپاره کافي دی. - ما فکر وکړ.

په حقیقت کې، ګولۍ په بشپړه توګه د سپینو زرو نه وه. په UDP کې Encapsulation لومړۍ ستونزه حل کوي - تاسو کولی شئ د دمخه رامینځته شوي اتصال په کارولو سره له بهر څخه د NAT شاته پیرودونکو سره وصل شئ ، مګر دلته د IPIP راتلونکي نیمګړتیا په نوي ر lightا کې ګل کیږي - د شخصي شبکې څخه هرڅوک کولی شي د لید تر شا پټ کړي. عامه IP او د پیرودونکي بندر (په خالص IPIP کې دا ستونزه شتون نلري).

د دې نیمې ستونزې د حل لپاره، افادیت پیدا شو ipipou. دا د ریموټ کوربه تصدیق کولو لپاره کور جوړ شوی میکانیزم پلي کوي ، پرته لدې چې د کرنل FOU عملیات ګډوډ کړي ، کوم چې به په ګړندۍ او مؤثره توګه د کرنل ځای کې پاکټونه پروسس کړي.

موږ ستاسو سکریپټ ته اړتیا نلرو!

ښه، که تاسو د مراجعینو عامه بندر او IP پیژنئ (د مثال په توګه، هرڅوک د هغې شاته هیڅ ځای نه ځي، NAT هڅه کوي د 1-in-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 - سیمه ایز انٹرفیس چې د آی پی پی تونل به تړلی وي
  • 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 اساسی سند سره ورته والی په ذهن کې راځي) یا په ځانګړي ډول ډیزاین شوي ډیټا د شخصي کیلي سره لاسلیک شوي (د HTTP ډیجیسټ سند سره ورته یوازې قوي ، فعالیت وګورئ client_auth په کوډ کې).

په سرور کې (د عامه IP سره اړخ)، کله چې ipipou پیل شي، دا د nfqueue قطار هینډلر رامینځته کوي او د netfilter ترتیبوي ترڅو اړین پاکټونه ولیږل شي چیرې چې دوی باید وي: پاکټونه د nfqueue کتار سره اړیکه پیل کوي، او [تقریبا] پاتې ټول په مستقیم ډول اوریدونکي FOU ته ځي.

د هغو کسانو لپاره چې نه پوهیږي، nfqueue (یا NetfilterQueue) د شوقیانو لپاره یو ځانګړی شی دی چې نه پوهیږي چې څنګه د کرنل ماډلونه رامینځته کړي، کوم چې د netfilter (nftables/iptables) په کارولو سره تاسو ته اجازه درکوي د شبکې پاکټونه د کاروونکي ځای ته واستوئ او هلته یې پروسس کړئ. ابتدايي معنی په لاس کې: تعدیل (اختیاري) او دا بیرته داني ته ورکړئ، یا یې رد کړئ.

د ځینو پروګرامینګ ژبو لپاره د nfqueue سره کار کولو لپاره بندیزونه شتون لري، د باش لپاره هیڅ نه و (هې، حیرانتیا نه ده)، ما باید د python کارول: ipipou use د NetfilterQueue.

که فعالیت مهم نه وي، د دې شی په کارولو سره تاسو کولی شئ په نسبتا ټیټه کچه د پیکټو سره کار کولو لپاره په نسبتا چټکه او اسانۍ سره خپل منطق جوړ کړئ، د بیلګې په توګه، د تجربوي ډیټا لیږد پروتوکولونه جوړ کړئ، یا د غیر معیاري چلند سره محلي او لیرې خدمتونه ټرول کړئ.

خام ساکټونه د nfqueue سره لاس په لاس کار کوي، د بیلګې په توګه، کله چې تونل لا دمخه تنظیم شوی وي او FOU په مطلوب بندر کې اوریدل کیږي، تاسو به نشئ کولی په معمول ډول د ورته بندر څخه پیکټ ولیږئ - دا بوخت دی، مګر تاسو کولی شئ د خام ساکټ په کارولو سره په تصادفي ډول تولید شوي پاکټ مستقیم د شبکې انٹرفیس ته واستوئ ، که څه هم د داسې کڅوړې رامینځته کول به یو څه نور ټینکر کولو ته اړتیا ولري. دا څنګه په ipipou کې د تصدیق سره پاکټونه رامینځته کیږي.

څرنګه چې ipipou د اتصال څخه یوازې لومړۍ کڅوړې پروسس کوي (او هغه چې د پیوستون رامینځته کیدو دمخه په کتار کې د لیکیدو اداره کوي) ، فعالیت تقریبا زیان نلري.

هرڅومره ژر چې د ipipou سرور یو مستند شوی پاکټ ترلاسه کړي ، یو تونل رامینځته کیږي او په پیوستون کې ټول راتلونکي کڅوړې دمخه د کرنل لخوا پروسس شوي د nfqueue څخه تیریږي. که پیوستون ناکام شي ، نو د راتلونکي یو لومړی پاکټ به د ترتیباتو پراساس د nfqueue قطار ته واستول شي ، که دا د تصدیق سره پاکټ نه وي ، مګر د وروستي یاد شوي IP او پیرودونکي پورټ څخه ، دا یا هم تیریدلی شي. پر یا رد شوی. که چیرې یو مستند شوی پاکټ د نوي IP او بندر څخه راشي، تونل د دوی کارولو لپاره بیا تنظیم شوی.

معمول IPIP-over-FOU یوه بله ستونزه لري کله چې د NAT سره کار کوي - دا ناشونې ده چې دوه IPIP تونلونه چې په ورته IP سره UDP کې ځای پرځای شوي رامینځته کړي ، ځکه چې FOU او IPIP ماډلونه له یو بل څخه جلا دي. هغوی. د ورته عامه IP تر شا د پیرودونکو یوه جوړه به ونه شي کولی په ورته وخت کې ورته سرور سره وصل شي. په راتلونکي کې، ممکنه ده، دا به د کرنل په کچه حل شي ، مګر دا ډاډه نده. په ورته وخت کې ، د NAT ستونزې د NAT لخوا حل کیدی شي - که داسې پیښ شي چې د IP پتې یوه جوړه لا دمخه د بل تونل لخوا نیول شوې وي ، ipipou به NAT له عامه څخه بدیل خصوصي IP ته وکړي ، voila! - تاسو کولی شئ تونلونه جوړ کړئ تر هغه چې بندرونه پای ته ورسیږي.

ځکه په اتصال کې ټولې پاکټونه لاسلیک شوي ندي ، نو دا ساده محافظت د MITM لپاره زیان منونکی دی ، نو که چیرې د پیرودونکي او سرور ترمینځ په لاره کې یو کلیوال پټ وي څوک چې ترافیک ته غوږ نیسي او اداره کولی شي ، نو هغه کولی شي مستند شوي پاکټونه له لارې راستانه کړي. بل پته او د بې باوره کوربه څخه یو تونل جوړ کړئ.

که څوک د دې د حل کولو څرنګوالي په اړه نظرونه لري پداسې حال کې چې په اصلي کې د ترافیک ډیری برخه پریږدي ، د خبرو کولو څخه ډډه وکړئ.

په هرصورت، په UDP کې encapsulation ځان خورا ښه ثابت کړی. د IP په اړه د encapsulation په پرتله، دا د UDP سرلیک اضافي سر سره سره خورا ډیر مستحکم او ډیری وختونه ګړندی دی. دا د دې حقیقت له امله دی چې په انټرنیټ کې ډیری کوربه یوازې د دریو خورا مشهور پروتوکولونو سره ښه کار کوي: TCP، UDP، ICMP. د پام وړ برخه کولی شي په بشپړ ډول نور هرڅه له مینځه یوسي، یا یې په ورو ورو پروسس کړي، ځکه چې دا یوازې د دې دریو لپاره مطلوب دی.

د مثال په توګه، له همدې امله چټک، په کوم کې چې HTTP/3 پر بنسټ والړ دی، د UDP په سر کې جوړ شوی، نه د IP په سر کې.

ښه، کافي ټکي، دا وخت دی چې وګورئ دا څنګه په "ریښتینې نړۍ" کې کار کوي.

جګړه

د ریښتینې نړۍ تقلید لپاره کارول کیږي iperf3. حقیقت ته د نږدېوالي درجې په شرایطو کې ، دا نږدې په Minecraft کې د ریښتیني نړۍ تقلید ته ورته دی ، مګر د اوس لپاره به یې وکړي.

په سیالۍ کې ګډون کوونکي:

  • اصلي چینل ته مراجعه وکړئ
  • د دې مقالې اتل 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"

د تونل ترتیب

ipipou
سرور
/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 Mbps چینل

ipipou: یوازې د نه کوډ شوي تونل څخه ډیر

ipipou: یوازې د نه کوډ شوي تونل څخه ډیر

چینل په هر 1 خوشبین Gbps کې

ipipou: یوازې د نه کوډ شوي تونل څخه ډیر

ipipou: یوازې د نه کوډ شوي تونل څخه ډیر

په ټولو قضیو کې ، ipipou د بیس چینل ته په فعالیت کې خورا نږدې دی ، کوم چې عالي دی!

نه کوډ شوی اوپن وی پی این تونل په دواړو قضیو کې خورا عجیب چلند وکړ.

که څوک دا ازموینه وکړي، نو دا به د فیډبیک اوریدل په زړه پورې وي.

کیدای شي IPv6 او NetPricle زموږ سره وي!

سرچینه: www.habr.com

Add a comment