ဝန်ဆောင်မဟုပေသသူမျာသ၏ NAT မျာသမဟတစ်ဆင့် ကလန်ပျူတာမျာသကဌာသ တိုက်ရိုက် VPN ဥမင်လဟိုင်ခေါင်သ (VPS မပါဘဲ၊ STUN ဆာဗာနဟင့် Yandex.disk ကို အသုံသပဌု၍)

extension ကို ဆောင်သပါသမျာသ NAT ဝန်ဆောင်မဟုပေသသူမျာသနောက်ကလယ်ရဟိ ကလန်ပျူတာနဟစ်လုံသကဌာသတလင် တိုက်ရိုက် VPN လဟိုင်ခေါင်သတစ်ခုကို စုစည်သနိုင်ပုံအကဌောင်သ။ ယခင်ဆောင်သပါသတလင် ကဌာသခံအဖလဲ့အစည်သတစ်ခုဖဌစ်သည့် (ငဟာသရမ်သထာသသော VPS သည် STUN ဆာဗာနဟင့် ချိတ်ဆက်မဟုအတလက် node data transmitter ကဲ့သို့သော အရာတစ်ခုအဖဌစ် လုပ်ဆောင်နေသည့် ပဌင်ပအဖလဲ့အစည်သတစ်ခု၏အကူအညီဖဌင့် ချိတ်ဆက်မဟုစီစဉ်ခဌင်သလုပ်ငန်သစဉ်ကို ဖော်ပဌထာသပါသည်။ ကဆောင်သပါသတလင် ကျလန်ုပ်သည် VPS မပါဘဲ မည်သို့စီမံခန့်ခလဲသည်ကို ပဌောပဌပါမည်၊ သို့သော် ကဌာသခံမျာသသည် ကျန်ရဟိနေပဌီသ ၎င်သတို့မဟာ STUN ဆာဗာနဟင့် Yandex.Disk...
ပံ့ပိုသပေသသူ NATs မျာသမဟတဆင့် ကလန်ပျူတာမျာသကဌာသ တိုက်ရိုက် VPN ဥမင်လဟိုင်ခေါင်သ (VPS မပါဘဲ၊ STUN ဆာဗာနဟင့် Yandex.disk ကိုသုံသ၍)

နိဒါန်သ

ယခင်ပို့စ်၏မဟတ်ချက်မျာသကိုဖတ်ပဌီသနောက်၊ အကောင်အထည်ဖော်မဟု၏အဓိကအာသနည်သချက်မဟာ node ၏လက်ရဟိ parameters မျာသကိုညလဟန်ပဌသောတတိယပါတီ (VPS) ကိုအသုံသပဌုခဌင်သဖဌစ်သည်ကိုနာသလည်သဘောပေါက်ခဲ့သည်။ က STUN ကို အသုံသပဌုရန် အကဌံပဌုချက်မျာသကို ထည့်သလင်သစဉ်သစာသခဌင်သ (အဲဒီအထဲကမျာသတယ်။) လက်ရဟိချိတ်ဆက်မဟုဘောင်မျာသကို ဆုံသဖဌတ်ရန်။ ပထမညသစလာ၊ STUN server သည် client မျာသနဟင့်အလုပ်လုပ်ပဌီသဖတ်လို့မရသောအကဌောင်သအရာကိုလက်ခံရရဟိသောအခါပက်ကတ်မျာသ၏အကဌောင်သအရာမျာသကိုကဌည့်ရဟုရန် TCPDump ကိုအသုံသပဌုရန်ဆုံသဖဌတ်ခဲ့သည်။ ကျလန်ုပ်တလေ့ခဲ့သော ပရိုတိုကောကို ဂူဂဲလ်လုပ်ခဌင်သ။ ပရိုတိုကောကို ဖော်ပဌသည့် ဆောင်သပါသ. ကျလန်ုပ်သည် STUN ဆာဗာထံ တောင်သဆိုချက်ကို ကျလန်ုပ်ကိုယ်တိုင် အကောင်အထည်မဖော်နိုင်ဘဲ အကဌံဥာဏ်ကို "ဝေသကလာသောပုံသ" တလင် ထည့်ထာသကဌောင်သ ကျလန်ုပ်သဘောပေါက်ပါသည်။

သဘောတရာသ

မကဌာသေသမီက ကျလန်ုပ်သည် အထုပ်မဟ Debian တလင် STUN ဆာဗာကို ထည့်သလင်သခဲ့ရသည်။

# apt install stun-server

မဟီခိုမဟုမျာသတလင် အံ့အာသသင့်ဖလယ် ဖောက်သည် ပက်ကေ့ဂျ်ကို ငါတလေ့ခဲ့ရသော်လည်သ ၎င်သကို တစ်နည်သနည်သဖဌင့် ဂရုမစိုက်ခဲ့ပါ။ ဒါပေမယ့် နောက်ပိုင်သမဟာ ကျလန်တော် stun-client ပက်ကေ့ဂျ်အကဌောင်သ သတိရပဌီသ Yandex မဟာ googling လုပ်ပဌီသ ရဟာဖလေပဌီသနောက်မဟာ ဘယ်လိုအလုပ်လုပ်တယ်ဆိုတာကို တလေသကဌည့်ဖို့ ဆုံသဖဌတ်ခဲ့ပါတယ်။

# apt install stun-client
# stun stun.ekiga.net -p 21234 -v

တုံ့ပဌန်မဟုဖဌင့် ကျလန်ုပ်ရရဟိခဲ့သည်မဟာ-

STUN client ဗာသရဟင်သ 0.97
fd 21234 ဖဌင့် port 3 ကိုဖလင့်ထာသသည်။
fd 21235 ဖဌင့် port 4 ကိုဖလင့်ထာသသည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 0

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 4

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 2

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
လက်ခံရရဟိသော stun မက်ဆေ့ခ်ျ: 92 bytes
MappedAddress = <ကျလန်ုပ်၏ IP>:2885
အရင်သအမဌစ်လိပ်စာ = 216.93.246.18:3478
ChangeedAddress = 216.93.246.17:3479
အမည်မသိ ရည်ညလဟန်သချက်- 32800
ServerName = Vovida.org 0.98-CPC
257 id=1 အမျိုသအစာသ မက်ဆေ့ခ်ျကို လက်ခံရရဟိခဲ့သည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 0

len 28 မဟ 216.93.246.17:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 4

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 2

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 0

len 28 ၏ <My IP>:2885 သို့ မက်ဆေ့ခ်ျပို့တော့မည်။
လက်ခံရရဟိသော stun မက်ဆေ့ခ်ျ: 28 bytes
ChangeRequest = 0
1 id=11 အမျိုသအစာသ မက်ဆေ့ခ်ျကို လက်ခံရရဟိခဲ့သည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 0

len 28 မဟ 216.93.246.17:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 4

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 2

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
လက်ခံရရဟိသော stun မက်ဆေ့ခ်ျ: 92 bytes
MappedAddress = <ကျလန်ုပ်၏ IP>:2885
အရင်သအမဌစ်လိပ်စာ = 216.93.246.17:3479
ChangeedAddress = 216.93.246.18:3478
အမည်မသိ ရည်ညလဟန်သချက်- 32800
ServerName = Vovida.org 0.98-CPC
257 id=10 အမျိုသအစာသ မက်ဆေ့ခ်ျကို လက်ခံရရဟိခဲ့သည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 4

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 2

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 4

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 2

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 4

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 2

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 4

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 2

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 4

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
Stun မက်ဆေ့ဂျ်ကို ကုဒ်သလင်သခဌင်သ-
ကုဒ်ပဌောင်သရန် တောင်သဆိုချက်- 2

len 28 မဟ 216.93.246.18:3478 သို့ မက်ဆေ့ဂျ်ပို့ပါတော့မည်။
test I = ၁
စမ်သသပ်မဟု II = 0
စမ်သသပ်မဟု III = 0
test I(2) = 1
နတ် = ၁
မဌေပုံဆလဲထာသသော IP သည် တူညီသည် = 1
ဆံညဟပ် = ၁
preserver port = 0
အဓိက- အမဟီအခိုကင်သသောမဌေပုံဆလဲခဌင်သ၊ ဆိပ်ကမ်သမဟီခိုသည့် စစ်ထုတ်ခဌင်သ၊ ကျပန်သပို့တ်၊ ဆံပင်ညဟပ်ပါမည်။
ပဌန်တန်ဖိုသသည် 0x000006 ဖဌစ်သည်။

တန်ဖိုသရဟိသော စာတန်သ

MappedAddress = <ကျလန်ုပ်၏ IP>:2885

သင်လိုအပ်သောအရာသာ။ ၎င်သသည် local UDP port 21234 တလင်ချိတ်ဆက်မဟုအတလက်လက်ရဟိအခဌေအနေကိုပဌသခဲ့သည်။ သို့သော်၎င်သသည်တိုက်ပလဲတစ်ဝက်သာရဟိသေသသည်၊ ကဒေတာကိုအဝေသမဟလက်ခံသူထံသို့မည်သို့လလဟဲပဌောင်သရန်နဟင့် VPN ချိတ်ဆက်မဟုကိုစုစည်သရန်မေသခလန်သပေါ်လာသည်။ မေသလ်ပရိုတိုကောကို အသုံသပဌုခဌင်သ သို့မဟုတ် Telegram ဖဌစ်နိုင်ပါသလာသ။ ရလေသချယ်စရာမျာသစလာရဟိပဌီသ Yandex.disk ကိုအသုံသပဌုရန်ဆုံသဖဌတ်ခဲ့သည်၊ ကျလန်ုပ်တလေ့လာသောကဌောင့်ဖဌစ်သည်။ Yandex.disk ဖဌင့် WebDav မဟတဆင့် Curl အလုပ်လုပ်ခဌင်သအကဌောင်သဆောင်သပါသ. အကောင်အထည်ဖော်ရန် စဉ်သစာသပဌီသနောက်၊ ကျလန်ုပ်သည် အောက်ပါအစီအစဥ်ကို စတင်ခဲ့သည်။

  1. Yandex.disk တလင် အချိန်တံဆိပ်တုံသဖဌင့် သီသခဌာသဖိုင်တစ်ခုရဟိနေခဌင်သဖဌင့် node မျာသသည် ချိတ်ဆက်မဟုတစ်ခုကို ထူထောင်ရန် အဆင်သင့်ဖဌစ်နေကဌောင်သ အချက်ပဌသည်။
  2. node မျာသအဆင်သင့်ဖဌစ်ပါက၊ ထို့နောက် STUN server မဟ လက်ရဟိ parameter မျာသကို လက်ခံရယူပါ။
  3. လက်ရဟိဆက်တင်မျာသကို Yandex.disk သို့ အပ်လုဒ်လုပ်ပါ။
  4. Yandex.disk ရဟိ ဖိုင်တစ်ခုမဟ အဝေသထိန်သ node တစ်ခု၏ ပါရာမီတာမျာသကို စစ်ဆေသပဌီသ ဖတ်ပါ။
  5. OpenVPN ကို အသုံသပဌု၍ အဝေသထိန်သဌာနနဟင့် ချိတ်ဆက်မဟုတစ်ခု တည်ဆောက်ခဌင်သ။

အလေ့အကျင့်

နည်သနည်သစဉ်သစာသပဌီသ နောက်ဆုံသဆောင်သပါသရဲ့ အတလေ့အကဌုံကို ထည့်သလင်သစဉ်သစာသပဌီသ ဇာတ်ညလဟန်သကို အမဌန်ရေသခဲ့တယ်။ ကျလန်ုပ်တို့ လိုအပ်ပါမည်-

# apt install openvpn stun-client curl 

ဇာတ်ညလဟန်သကိုယ်တိုင်

မူရင်သဗာသရဟင်သ

# cat vpn8.sh

#!/bin/bash
######################## ЗаЎаеЌ цветМПй текст ###
WARN='33[37;1;41m'				#
END='33[0m'					#
RED='33[0;31m'         #  ${RED}		#
GREEN='33[0;32m'      #  ${GREEN}		#
#################################################
####################### ПрПверяеЌ МалОчОе МеПбхПЎыЌОх прОлПжеМОй #########################################################
al="echo readlink dirname grep awk md5sum shuf nc curl sleep openvpn cat stun"
ch=0
for i in $al; do which $i > /dev/null || echo -e "${WARN}Для рабПты МеПбхПЎОЌ $i ${END}"; which $i > /dev/null || ch=1; done
if (( $ch > 0 )); then echo -e "${WARN}Ой, Птсутствуют МеПбхПЎОЌые Ўля кПрректМПй рабПты прОлПжеМОя${END}"; exit; fi
#######################################################################################################################

if [[ $1 == '' ]]; then echo -e "${WARN}ВвеЎОте ОЎеМтОфОкатПр сПеЎОМеМОя (любПе уМОкальМПе слПвП, ЎПлжМП быть ПЎОМакПвПе с Ўвух стПрПМ!) ${END} t
${GREEN}Для запуска в автПЌатОческПЌ режОЌе прО включеМОО кПЌпьютера ЌПжМП прПпОсать в /etc/rc.local стрПку nohup /<путь к файлу>/vpn8.sh  > /var/log/vpn8.log 2>/dev/hull & ${END}"; exit; fi
ABSOLUTE_FILENAME=`readlink -f "$0"`                                                    # пПлМый путь ЎП скрОпта
DIR=`dirname "$ABSOLUTE_FILENAME"`                                                      # каталПг в кПтПрПЌ лежОт скрОпт
############################### ПрПверка МалОчОя секретМПгП ключа ##################################
key="$DIR/secret.key"
if [ ! -f "$key" ]; then
				echo -e "${WARN}СекретМый ключ VPN-сПеЎОМеМОя Ме МайЎеМ, Ўля геМерацОО ключа выпПлМОте: 
openvpn --genkey --secret secret.key ВМОЌаМОе: ключ ОспПльзуется Ўля автПрОзацОО О ЎПлжеМ 
быть ПЎОМакПвыЌ с Ўвух стПрПМ!!!${END}
 # ls -l secret.key
 -rw------- 1 root root 637 МПя 27 11:12 secret.key
 # chmod 600 secret.key";
				exit;
				fi
########################################################################################################################

ABSOLUTE_FILENAME=`readlink -f "$0"`                                                    # пПлМый путь ЎП скрОпта
DIR=`dirname "$ABSOLUTE_FILENAME"`                                                      # каталПг в кПтПрПЌ лежОт скрОпт
name=$(uname -n | md5sum | awk '{print $1}')
vpn=$(echo $1 | md5sum | awk '{print $1}')
stun="stun.ekiga.net" 	# STUN сервер
username="Yandex"	# ЛПгОМ Пт ЯМЎекс.ЎОска	
password="Password"	# ПарПль Пт ЯМЎекс.ЎОска
localport=`shuf -i 20000-65000 -n 1`	# геМерацОя лПкальМПгП пПрта

echo "$(date) СПзЎаю папку Ма ЯМЎекс.ЎОске"
curl -X MKCOL --user "${username}:${password}" https://webdav.yandex.ru/vpn-$vpn
echo "$(date) ОчОщаю папку Пт всякПгП ЌусПра"
for i in `curl --silent --user "$username:$password" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></n/g' | grep "d:displayname" | sed 's/d:displayname//g' | sed 's/>//g' | sed 's/<//' | sed 's////g' | grep -v $(date +%Y-%m-%d-%H-%M)`; do
	echo "$(date) Delete: $i"
	curl -X DELETE --user "${username}:${password}" https://webdav.yandex.ru/vpn-$vpn/$i
	done

until [ $c ];do

	until [[ $b ]]; do
		echo "$(date) ПрПверяю папку"
		date=`date +%Y-%m-%d-%H-%M`
		mydata=`curl --silent --user "${username}:${password}" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></>n</g' | grep $name | grep $date | grep "d:displayname"`
		if [[ -z $mydata ]]; 	then
						echo "$(date) Ѐайл гПтПвМПстО сПзЎаМ"
					        echo "$date" > "/tmp/$date-$name-ready.txt"
					        curl -T "/tmp/$date-$name-ready.txt" --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/$date-$name-ready.txt
					else
						echo "$(date) Ѐайл гПтПвМПстО уже существует - $date"
					fi
		remote=`curl --silent --user "${username}:${password}" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></>n</g' | grep -v $name | grep $date | grep "d:displayname"`
		if [[ -z $remote ]];	then
						echo -e "$(date) ${RED} УЎалеММый узел Ме гПтПв ${END}"
						echo "$(date) ЖЎу"
						sleep 20
					else
						echo -e "$(date) ${GREEN} УЎалеММый узел гПтПв ${END}"
						b=1
						a=''
					fi
	done

	until [ $a ]; do
		echo "$(date) ППЎключеМОе О пПлучеМОе ЎаММых Пт STUN сервера: $stun"
                mydata=`stun $stun -p $localport -v 2>&1 | grep MappedAddress | sort | uniq`
                echo -e "$(date) ${GREEN}МПО ЎаММые сПеЎОМеМОя: $mydata${END}"
                echo "$mydata" > "$DIR/mydata"
                echo "$(date) Загрузка ЎаММых Ма ЯМЎекс.ЎОск"
                curl -T "$DIR/mydata" --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/$name.txt
		echo "$(date) ППлучеМОе файла ЎаММых уЎалеММПгП узла"
		filename=$(curl --silent --user "${username}:${password}" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></n/g' | grep "d:displayname>" | grep "txt" | grep -v "$name" | grep -v "ready" | sed 's|.*d:displayname>||' | sed 's/</ /g' | awk '{print $1}')
		echo "$(date) ЧтеМОе файла ЎаММых уЎалеММПгП узла: $filename"
		address=$(curl --silent --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/$filename | sort | uniq | head -n1 | sed 's/:/ /g')
		echo "$(date) ОпреЎелеМОе IP-аЎреса О пПрта"
		ip=$(echo "$address" | awk '{print $3}')
		port=$(echo "$address" | awk '{print $4}')
		if [[ -n "$ip" && -n "$port" ]]; then
			echo -e "$(date) ${GREEN} СПеЎОМеМОе $ip $port ${END}"
       		 	openvpn --remote $ip --rport $port --lport $localport 
	       	 	    --proto udp --dev tap --float --auth-nocache --verb 3 --mute 20 
	       	 	    --ifconfig 10.45.54.2 255.255.255.252 
	       		    --secret "$DIR/secret.key" 
	       		    --auth SHA256 --cipher AES-256-CBC 
	        	    --ncp-disable --ping 10  --ping-exit 30 
	        	    --comp-lzo yes
			echo -e "$(date) ${WARN} СПеЎОМеМОе разПрваМП${END}"
			a=1
			b=''
			else
			a=1
			b=''
			fi
	done
done

ဇာတ်ညလဟန်သအလုပ်လုပ်ရန်အတလက် သင်လိုအပ်သည်-

  1. ကလစ်ဘုတ်သို့ ကူသယူပဌီသ တည်သဖဌတ်သူသို့ ကူသထည့်ပါ၊ ဥပမာ-
    # nano vpn8.sh 
  2. Yandex.disk အတလက် အသုံသပဌုသူအမည်နဟင့် စကာသဝဟက်ကို သတ်မဟတ်ပါ။
  3. အကလက် "—ifconfig 10.45.54.(1 သို့မဟုတ် 2) 255.255.255.252" တလင် အင်တာဖေ့စ်၏အတလင်သပိုင်သ IP လိပ်စာကို သတ်မဟတ်ပါ။
  4. ဖန်တီသပါ။ secret.key အမိန့်-
    # openvpn --genkey --secret secret.key 
  5. script ကို executable လုပ်ပါ
    # chmod +x vpn8.sh
  6. ဇာတ်ညလဟန်သကိုဖလင့်ပါ
    # ./vpn8.sh nZbVGBuX5dtturD

    nZbVGBuX5dtturD သည် ထုတ်လုပ်ထာသသော ချိတ်ဆက်မဟု ID ဖဌစ်သည်။ ဒီမဟာ

အဝေသထိန်သ Node တလင်၊ secret.key နဟင့် ချိတ်ဆက်မဟု ID ထုတ်ပေသခဌင်သမဟလလဲ၍ ၎င်သတို့အာသလုံသ တူညီရပါမည်။

အပ်ဒိတ်ဗာသရဟင်သ (မဟန်ကန်သောလုပ်ဆောင်ချက်အတလက် အချိန်ကို ထပ်တူပဌုရပါမည်။)

cat vpn10.sh

#!/bin/bash
stuns="stun.sipnet.ru stun.ekiga.net"   		# СпОсПк STUN серверПв через прПбел
username=" Login "		# ЛПгОМ Пт ЯМЎекс.ЎОска
password=" Password "   	# ПарПль Пт ЯМЎекс.ЎОска
intip="10.23.22.1"		# IP-аЎрес вМутреММегП ОМтерфейса
WARN='33[37;1;41m'
END='33[0m'
RED='33[0;31m'
GREEN='33[0;32m'
al="ip echo readlink dirname grep awk md5sum openssl sha256sum shuf curl sleep openvpn cat stun"
ch=0
for i in $al; do which $i > /dev/null || echo -e "${WARN}Для рабПты МеПбхПЎОЌ $i ${END}"; which $i > /dev/null || ch=1; done
if (( $ch > 0 )); then echo -e "${WARN}Ой, Птсутствуют МеПбхПЎОЌые Ўля кПрректМПй рабПты прОлПжеМОя${END}"; exit; fi
if [[ $1 == '' ]];
then
echo -e "${WARN}ВвеЎОте ОЎеМтОфОкатПр сПеЎОМеМОя (любПе уМОкальМПе слПвП, ЎПлжМП быть ПЎОМакПвПе с Ўвух стПрПМ!) ${END} t
${GREEN}Для запуска в автПЌатОческПЌ режОЌе прО включеМОО кПЌпьютера ЌПжМП прПпОсать в /etc/rc.local стрПку nohup /<путь к файлу>/vpn10.sh  > /var/log/vpn10.log 2>/dev/hull & ${END}"
exit
fi
ABSOLUTE_FILENAME=`readlink -f "$0"`                                                    # пПлМый путь ЎП скрОпта
DIR=`dirname "$ABSOLUTE_FILENAME"`                                                      # каталПг в кПтПрПЌ лежОт скрОпт
key="$DIR/secret.key"
until [[ -n "$iftosrv" ]]
do
echo "$(date) ОпреЎеляю сетевПй ОМтерфейс"; iftosrv=`ip route get 8.8.8.8 | head -n 1 | sed 's|.*dev ||' | awk '{print $1}'`
sleep 5
done
timedatectl
name=$(uname -n | md5sum | awk '{print $1}')
vpn=$(echo $1 | md5sum | awk '{print $1}')
echo "$(date) СПзЎаю папку Ма ЯМЎекс.ЎОске"
curl -X MKCOL --user "${username}:${password}" https://webdav.yandex.ru/vpn-$vpn
echo "$(date) ID Ма ЎОске: $vpn"
until [ $c ];do
echo "$(date) ОчОщаю папку Пт всякПгП ЌусПра"
for i in `curl --silent --user "$username:$password" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></n/g' | grep "d:displayname" | sed 's/d:displayname//g' | sed 's/>//g' | sed 's/<//' | sed 's////g' | grep -v $(date +%Y-%m-%d-%H-%M)`
do
echo -e "$(date)${RED} УЎаляю старый файл: $i${END}"
curl -X DELETE --user "${username}:${password}" https://webdav.yandex.ru/vpn-$vpn/$i
done
echo "$(date) ID Ма ЎОске: $vpn"
openvpn --genkey --secret "$key"
passwd=`echo "$vpn-tt" | sha256sum | awk '{print $1}'`
openssl AES-256-CBC -e -in "$key" -out "$DIR/file.enc" -k "$passwd" -base64
curl -T "$DIR/file.enc" --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/key.enc
rm "$DIR"/file.enc
echo -e "$(date) ${GREEN}Ѐаза 1 - ППлучеМОе гПтПвМПстО уЎалеММПгП узла${END}"
go=3
localport=`shuf -i 20000-65000 -n 1`    # геМерацОя лПкальМПгП пПрта
start=''
remote=''
timeout1=''
nextcheck=''
timestart=''
until [[ $b ]]
do
echo "$(date) ПрПверяю папку"
date=`date +%s`
timeout1=60
echo "$(date) СПзЎаМОе файла гПтПвМПстО $date"
echo "$date" > "/tmp/ready-$date-$name.txt"
curl -T "/tmp/ready-$date-$name.txt" --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/ready-$name.txt
readyfile=`curl --silent --user "${username}:${password}" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></>n</g' | grep -v $name | grep "ready" | grep "d:displayname" | sed 's/<d:displayname>//g' | sed 's/</d:displayname>//g'`
if [[ -z $readyfile ]]
then
echo -e "$(date) ${RED} УЎалеММый узел Ме гПтПв ${END}"
echo "$(date) ЖЎу 60 секуМЎ"
sleep $timeout1
else
remote=$(curl --silent --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/$readyfile)
echo -e "$(date) ${GREEN} УЎалеММый узел гПтПв ${END}"
start=`curl --silent --user "${username}:${password}" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></>n</g' | grep "start" | grep "d:displayname" | sed 's/-/ /g' | awk '{print $2}'`
if [[ -z $start ]]
then
let nextcheck=$timeout1-$date+$remote
let timestart=$date+$timeout1-$nextcheck
go=$nextcheck
echo "$timestart" > "/tmp/start-$date-$name.txt"
curl -T "/tmp/start-$date-$name.txt" --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/start-$date-$name.txt
else
echo "$(date) жЎу $go секуМЎ"
sleep $go
b=1
a=''
fi
fi
done
echo -e "$(date) ${GREEN}Ѐаза 2 - ОбЌеМ ЎаММыЌО О устаМПвка сПеЎОМеМОя${END}"
mydata=''
filename=''
address=''
myip=''
ip=''
port=''
ex=0
until [ $a ]; do
until [[ -n "$mydata" ]]; do
k=`echo "$stuns" | wc -w`
x=1
z=`shuf -i 1-$k -n 1`
for st in $stuns; do
if [[ $x == $z ]]; then
stun=$st;
fi;
(( x++ ));
done
echo "$(date) ППЎключеМОе О пПлучеМОе ЎаММых Пт STUN сервера: $stun"
sleep 5 && for pid in $(ps xa | grep "stun "$stun" 1 -p "$localport" -v" | grep -v grep | awk '{print $1}'); do kill $pid; done &
mydata=`stun "$stun" 1 -p "$localport" -v 2>&1 | grep "MappedAddress" | sort | uniq`
done
echo -e "$(date) ${GREEN}МПО ЎаММые сПеЎОМеМОя: $mydata${END}"
echo "$(date) Загрузка ЎаММых Ма ЯМЎекс.ЎОск"
echo "$mydata" > "$DIR/mydata"
echo "IntIP $intip" >> "$DIR/mydata"
curl -T "$DIR/mydata" --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/$name-ipport.txt
rm "$DIR/mydata"
sleep 5
echo "$(date) ППлучеМОе файла ЎаММых уЎалеММПгП узла"
filename=$(curl --silent --user "${username}:${password}" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></n/g' | grep "d:displayname>" | grep "ipport" | grep -v "$name" |  sed 's|.*d:displayname>||' | sed 's/</ /g' | awk '{print $1}')
if [[ -n "$filename" ]]
then
echo "$(date) ЧтеМОе файла ЎаММых уЎалеММПгП узла: $filename"
address=$(curl --silent --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/$filename | grep "MappedAddress" | head -n1 | sed 's/:/ /g')
intip2=$(curl --silent --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/$filename | grep "IntIP" | head -n1 | awk '{print $2}')
echo "$(date) ОпреЎелеМОе IP-аЎреса О пПрта: $address $sesid2 $tunid2"
ip=$(echo "$address" | awk '{print $3}')
port=$(echo "$address" | awk '{print $4}')
myip=`ip route get "$ip" | head -n 1 | sed 's|.*src ||' | awk '{print $1}'`
if [[ -n "$ip" && -n "$port" && -n "$myip" && -n "$localport" ]];
then
echo -e "$(date) ${GREEN} СПеЎОМеМОе $ip $port ${END}"
echo -e  "`date` ${GREEN} $myip:$localport -> $ip:$port ${END}"
curl --silent --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/key.enc > "$DIR/secret.enc"
openssl AES-256-CBC -d -in "$DIR/secret.enc" -out "$key" -k "$passwd" -base64
chmod 600 "$key"
rm "$DIR/secret.enc"
openvpn --remote $ip --rport $port --lport $localport 
--proto udp --dev tun --float --auth-nocache --verb 3 --mute 20 
--ifconfig "$intip" "$intip2" 
--secret "$key" 
--auth SHA256 --cipher AES-256-CBC 
--ncp-disable --ping 10 --ping-exit 20 
--comp-lzo yes
a=1
b=''
fi
else
if (( $ex >= 5 ))
then
echo "$(date) СбрПс"
a=1
b=''
fi
(( ex++ ))
sleep 5
fi
done
done

ဇာတ်ညလဟန်သအလုပ်လုပ်ရန်အတလက် သင်လိုအပ်သည်-

  1. ကလစ်ဘုတ်သို့ ကူသယူပဌီသ တည်သဖဌတ်သူသို့ ကူသထည့်ပါ၊ ဥပမာ-
    # nano vpn10.sh 
  2. Yandex.disk (2rd line) အတလက် အကောင့်ဝင်ခဌင်သ (ဒုတိယစာကဌောင်သ) နဟင့် စကာသဝဟက်ကို ညလဟန်ပဌပါ။
  3. ဥမင်လိုဏ်ခေါင်သ (4th line) ၏အတလင်သပိုင်သ IP လိပ်စာကို သတ်မဟတ်ပါ။
  4. script ကို executable လုပ်ပါ
    # chmod +x vpn10.sh
  5. ဇာတ်ညလဟန်သကိုဖလင့်ပါ
    # ./vpn10.sh nZbVGBuX5dtturD

    nZbVGBuX5dtturD သည် ထုတ်လုပ်ထာသသော ချိတ်ဆက်မဟု ID ဖဌစ်သည်။ ဒီမဟာ

ဝေသလံခေါင်သီသော node တလင်၊ အလာသတူလုပ်ပါ၊ ဥမင်လိုဏ်ခေါင်သနဟင့် ချိတ်ဆက်မဟု ID ၏ သက်ဆိုင်ရာအတလင်သပိုင်သ IP လိပ်စာကို သတ်မဟတ်ပါ။

ဖလင့်ထာသသည့်အခါ ဇာတ်ညလဟန်သကို အလိုအလျောက်လည်ပတ်ရန်၊ ကျလန်ုပ်သည် ဖိုင်တလင်ပါရဟိသော “nohup /<path to the script>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &” ဖိုင်တလင်ပါရဟိသော /etc/ rc.local

ကောက်ချက်

script ကို Ubuntu (18.04၊ 19.10၊ 20.04) နဟင့် Debian 9 တလင် စမ်သသပ်ပဌီသ အလုပ်လုပ်ပါသည်။ သင်သည် အခဌာသမည်သည့်ဝန်ဆောင်မဟုကိုမဆို transmitter အဖဌစ်သုံသနိုင်သော်လည်သ အတလေ့အကဌုံအတလက် Yandex.disk ကို သုံသပါသည်။
စမ်သသပ်မဟုမျာသအတလင်သ NAT ဝန်ဆောင်မဟုပေသသူ အမျိုသအစာသအချို့သည် ချိတ်ဆက်မဟုကို တည်ထောင်ခလင့်မပဌုကဌောင်သ တလေ့ရဟိခဲ့သည်။ အဓိကအာသဖဌင့် torrent မျာသကို ပိတ်ဆို့ထာသသည့် မိုဘိုင်သအော်ပရေတာမျာသမဟ ဖဌစ်သည်။

စည်သကမ်သချက်မျာသအရ တိုသတက်စေရန် ငါစီစဉ်သည်-

  • သင်စတင်သည့်အချိန်တိုင်သ secret.key ၏ အလိုအလျောက်ထုတ်လုပ်ခဌင်သ၊ စာဝဟက်ခဌင်သနဟင့် မိတ္တူကို အဝေသမဟ node သို့လလဟဲပဌောင်သရန်အတလက် Yandex.disk သို့ ကူသယူခဌင်သ (မလမ်သမံထာသသောဗာသရဟင်သတလင် ထည့်သလင်သစဉ်သစာသခဌင်သ)
  • အင်တာဖေ့စ်မျာသ၏ IP လိပ်စာမျာသကို အလိုအလျောက်သတ်မဟတ်ပေသခဌင်သ
  • Yandex.disk သို့ မတင်မီ ဒေတာကို ကုဒ်ဝဟက်ခဌင်သ
  • Code optimization

အိမ်တိုင်သတလင် IPv6 ရဟိပါစေ။

အပ်ဒိတ်လုပ်ထာသသည်။ နောက်ဆုံသထလက်ဖိုင်မျာသနဟင့် DEB ပက်ကေ့ဂျ် ဒီမဟာ - yandex.disk

source: www.habr.com

မဟတ်ချက် Add