ProHoster > Blog > Pangangasiwa > Direktang VPN tunnel sa pagitan ng mga computer sa pamamagitan ng provider NATs (nang walang VPS, gamit ang STUN server at Yandex.disk)
Direktang VPN tunnel sa pagitan ng mga computer sa pamamagitan ng provider NATs (nang walang VPS, gamit ang STUN server at Yandex.disk)
Karugtong Artikulo tungkol sa kung paano ko nagawang ayusin ang isang direktang VPN tunnel sa pagitan ng dalawang computer na matatagpuan sa likod ng mga provider ng NAT. Inilarawan ng nakaraang artikulo ang proseso ng pag-aayos ng isang koneksyon sa tulong ng isang third party - isang tagapamagitan (isang inuupahang VPS na kumikilos bilang isang bagay tulad ng isang STUN server at isang node data transmitter para sa koneksyon). Sa artikulong ito sasabihin ko sa iyo kung paano ako nakayanan nang walang VPS, ngunit nanatili ang mga tagapamagitan at sila ang STUN server at Yandex.Disk...
Pagpapakilala
Matapos basahin ang mga komento ng nakaraang post, napagtanto ko na ang pangunahing disbentaha ng pagpapatupad ay ang paggamit ng isang tagapamagitan - isang third party (VPS) na nagpapahiwatig ng kasalukuyang mga parameter ng node, kung saan at kung paano kumonekta. Isinasaalang-alang ang mga rekomendasyon para gamitin itong STUN (na kung saan ay marami) upang matukoy ang kasalukuyang mga parameter ng koneksyon. Una sa lahat, nagpasya akong gumamit ng TCPDump upang tingnan ang mga nilalaman ng mga packet kapag ang STUN server ay nagtatrabaho sa mga kliyente at nakatanggap ng ganap na hindi nababasang nilalaman. Nag-googling sa protocol na nadatnan ko artikulong naglalarawan sa protocol. Napagtanto ko na hindi ko maaaring ipatupad ang isang kahilingan sa STUN server sa aking sarili at ilagay ang ideya sa isang "malayong kahon".
Π’Π΅ΠΎΡΠΈΡ
Kamakailan ay kinailangan kong mag-install ng STUN server sa Debian mula sa package
# apt install stun-server
at sa mga dependency nakita ko ang stun-client package, ngunit kahit papaano ay hindi ko ito pinansin. Ngunit kalaunan ay naalala ko ang tungkol sa stun-client package at nagpasyang malaman kung paano ito gumagana, pagkatapos mag-googling at maghanap sa Yandex nakuha ko:
bersyon ng STUN client 0.97
Binuksan ang port 21234 na may fd 3
Binuksan ang port 21235 na may fd 4
Encoding stun message:
Encoding ChangeRequest: 0
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Encoding stun message:
Encoding ChangeRequest: 4
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Encoding stun message:
Encoding ChangeRequest: 2
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Nakatanggap ng stun message: 92 bytes
MappedAddress = <My IP>:2885
SourceAddress = 216.93.246.18:3478
ChangedAddress = 216.93.246.17:3479
Hindi kilalang katangian: 32800
ServerName = Vovida.org 0.98-CPC
Nakatanggap ng mensahe ng uri 257 id=1
Encoding stun message:
Encoding ChangeRequest: 0
Magpapadala na ng msg ni len 28 sa 216.93.246.17:3478
Encoding stun message:
Encoding ChangeRequest: 4
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Encoding stun message:
Encoding ChangeRequest: 2
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Encoding stun message:
Encoding ChangeRequest: 0
Malapit nang magpadala ng msg ni len 28 sa <My IP>:2885
Nakatanggap ng stun message: 28 bytes
ChangeRequest = 0
Nakatanggap ng mensahe ng uri 1 id=11
Encoding stun message:
Encoding ChangeRequest: 0
Magpapadala na ng msg ni len 28 sa 216.93.246.17:3478
Encoding stun message:
Encoding ChangeRequest: 4
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Encoding stun message:
Encoding ChangeRequest: 2
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Nakatanggap ng stun message: 92 bytes
MappedAddress = <My IP>:2885
SourceAddress = 216.93.246.17:3479
ChangedAddress = 216.93.246.18:3478
Hindi kilalang katangian: 32800
ServerName = Vovida.org 0.98-CPC
Nakatanggap ng mensahe ng uri 257 id=10
Encoding stun message:
Encoding ChangeRequest: 4
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Encoding stun message:
Encoding ChangeRequest: 2
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Encoding stun message:
Encoding ChangeRequest: 4
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Encoding stun message:
Encoding ChangeRequest: 2
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Encoding stun message:
Encoding ChangeRequest: 4
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Encoding stun message:
Encoding ChangeRequest: 2
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Encoding stun message:
Encoding ChangeRequest: 4
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Encoding stun message:
Encoding ChangeRequest: 2
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Encoding stun message:
Encoding ChangeRequest: 4
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
Encoding stun message:
Encoding ChangeRequest: 2
Magpapadala na ng msg ni len 28 sa 216.93.246.18:3478
pagsubok I = 1
pagsubok II = 0
pagsubok III = 0
pagsubok I(2) = 1
ay nat = 1
nakamapang IP pareho = 1
hairpin = 1
preserve port = 0
Pangunahin: Independent Mapping, Port Dependent Filter, random port, will hairpin
Ang return value ay 0x000006
String na may halaga
MappedAddress = <My IP>:2885
basta ang kailangan mo! Ipinakita nito ang kasalukuyang katayuan para sa koneksyon sa lokal na UDP port 21234. Ngunit ito ay kalahati lamang ng labanan, ang tanong ay lumitaw kung paano ilipat ang data na ito sa malayong host at ayusin ang isang koneksyon sa VPN. Gamit ang mail protocol, o baka Telegram?! Maraming mga pagpipilian at nagpasya akong gamitin ang Yandex.disk, dahil napunta ako artikulo tungkol sa pagtatrabaho ng Curl sa pamamagitan ng WebDav gamit ang Yandex.disk. Matapos isipin ang tungkol sa pagpapatupad, naisip ko ang sumusunod na pamamaraan:
Ipahiwatig na ang mga node ay handa nang magtatag ng isang koneksyon sa pamamagitan ng pagkakaroon ng isang partikular na file na may timestamp sa Yandex.disk;
Kung handa na ang mga node, pagkatapos ay tumanggap ng kasalukuyang mga parameter mula sa server ng STUN;
Mag-upload ng mga kasalukuyang setting sa Yandex.disk;
Suriin ang presensya at basahin ang mga parameter ng isang malayong node mula sa isang file sa Yandex.disk;
Pagtatatag ng koneksyon sa isang malayuang host gamit ang OpenVPN.
Pagsasanay
Matapos mag-isip ng kaunti, isinasaalang-alang ang karanasan ng huling artikulo, mabilis akong nagsulat ng isang script. Kakailanganin namin ang:
Kopyahin sa clipboard at i-paste sa editor, halimbawa:
# nano vpn10.sh
ipahiwatig ang login (2nd line) at password para sa Yandex.disk (3rd line).
tukuyin ang panloob na IP address ng tunnel (ika-4 na linya).
gawing executable ang script:
# chmod +x vpn10.sh
patakbuhin ang script:
# ./vpn10.sh nZbVGBuX5dtturD
kung saan ang nZbVGBuX5dtturD ay ang nabuong connection ID dito
Sa remote node, gawin ang parehong, tukuyin ang kaukulang panloob na IP address ng tunnel at connection ID.
Para i-autorun ang script kapag naka-on, ginagamit ko ang command na βnohup /<path to the script>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &β na nasa file /etc/ rc.lokal
Konklusyon
Gumagana ang script, nasubok sa Ubuntu (18.04, 19.10, 20.04) at Debian 9. Maaari mong gamitin ang anumang iba pang serbisyo bilang transmitter, ngunit para sa karanasan ginamit ko ang Yandex.disk.
Sa panahon ng mga eksperimento, natuklasan na ang ilang mga uri ng NAT provider ay hindi pinapayagan ang pagtatatag ng isang koneksyon. Pangunahin mula sa mga mobile operator kung saan naka-block ang mga torrents.
Plano kong pagbutihin sa mga tuntunin ng:
Awtomatikong pagbuo ng secret.key sa tuwing magsisimula ka, i-encrypt at kopyahin sa Yandex.disk para ilipat sa isang malayuang node (Isinasaalang-alang sa na-update na bersyon)
Awtomatikong pagtatalaga ng mga IP address ng mga interface
Pag-encrypt ng data bago i-upload sa Yandex.disk
Pag-optimize ng code
Hayaang magkaroon ng IPv6 sa bawat tahanan!
Nai-update! Pinakabagong mga file at DEB package dito - yandex.disk