በ NAT አቅራቢዎች (ያለ VPS፣ STUN አገልጋይ እና Yandex.disk በመጠቀም) በኮምፒውተሮች መካከል ቀጥተኛ የቪፒኤን ዋሻ

ይቀጥል መጣጥፎች ከአይኤስፒ ኤንኤቲዎች ጀርባ በሚገኙት በሁለት ኮምፒውተሮች መካከል የቀጥታ የቪፒኤን ዋሻ እንዴት ማደራጀት እንደቻልኩ ነው። የመጨረሻው መጣጥፍ በሶስተኛ ወገን እገዛ ግንኙነትን የማደራጀት ሂደትን ገልጿል - መካከለኛ (የተከራየ VPS እንደ STUN አገልጋይ እና ለግንኙነት መስቀለኛ ዳታ አስተላላፊ)። በዚህ ጽሑፍ ውስጥ ያለ VPS እንዴት እንደማስተዳደር እነግርዎታለሁ ፣ ግን አማላጆቹ ቀሩ እና እነሱ የ STUN አገልጋይ እና Yandex.Disk ነበሩ ...
በ NAT አቅራቢዎች (ያለ VPS፣ STUN አገልጋይ እና Yandex.disk በመጠቀም) በኮምፒውተሮች መካከል ቀጥተኛ የቪፒኤን ዋሻ

መግቢያ

የመጨረሻውን ልጥፍ አስተያየቶችን ካነበብኩ በኋላ ፣ የአተገባበሩ ዋነኛው መሰናክል መካከለኛ መጠቀሚያ መሆኑን ተገነዘብኩ - የሶስተኛ ወገን (VPS) የመስቀለኛ ክፍልን የአሁኑን መለኪያዎች ፣ የት እና እንዴት እንደሚገናኙ ። እውነተኛ STUN ለመጠቀም ምክሮችን ከሰጠን (ከእነዚህ ውስጥ ብዙ አሉ) የአሁኑን የግንኙነት መቼቶች ለመወሰን. በመጀመሪያ የ STUN አገልጋይ ከደንበኞች ጋር ሲሰራ እና ሙሉ በሙሉ የማይነበብ ይዘቶችን ሲቀበል የጥቅሶቹን ይዘት ለመመልከት TCPDump ን ለመጠቀም ወሰንኩ። ፕሮቶኮሉን ማጉላት መጣ ፕሮቶኮሉን የሚገልጽ ጽሑፍ. የ STUN አገልጋይ ጥያቄን በራሴ መተግበር እንደማልችል ተገነዘብኩ እና ሀሳቡን አስቀምጠው።

ቲዮሪ

በቅርቡ ከጥቅሉ ላይ የ STUN አገልጋይን በዲቢያን ላይ መጫን ነበረብኝ

# apt install stun-server

እና በጥገኛዎቹ ውስጥ የስታንት-ደንበኛ ጥቅልን አየሁ ፣ ግን በሆነ መንገድ ለዚህ ምንም አስፈላጊነት አላያያዝም። በኋላ ግን የደንበኛ ጥቅሉን አስታወስኩኝ እና እንዴት እንደሚሰራ ለማወቅ ወሰንኩኝ ፣ በጉግል እና Yandex ገባኝ-

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

በምላሹ ደረሰኝ፡-

የ STUN ደንበኛ ስሪት 0.97
ወደብ 21234 ከኤፍዲ 3 ጋር ተከፍቷል።
ወደብ 21235 ከኤፍዲ 4 ጋር ተከፍቷል።
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 0

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 4

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 2

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የደረሰው የማደናቀፍ መልእክት፡ 92 ባይት
MappedAddress = <የእኔ IP>:2885
ምንጭ አድራሻ = 216.93.246.18:3478
የተለወጠ አድራሻ = 216.93.246.17:3479
ያልታወቀ መለያ: 32800
የአገልጋይ ስም=Vovida.org 0.98-ሲፒሲ
የደረሰው መልእክት አይነት 257 id=1
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 0

የሌን 28 መልእክት ወደ 216.93.246.17:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 4

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 2

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 0

የሌንስ 28 መልእክት ወደ <My IP>:2885 ስለመላክ
የደረሰው የማደናቀፍ መልእክት፡ 28 ባይት
የለውጥ ጥያቄ = 0
የደረሰው መልእክት አይነት 1 id=11
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 0

የሌን 28 መልእክት ወደ 216.93.246.17:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 4

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 2

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የደረሰው የማደናቀፍ መልእክት፡ 92 ባይት
MappedAddress = <የእኔ IP>:2885
ምንጭ አድራሻ = 216.93.246.17:3479
የተለወጠ አድራሻ = 216.93.246.18:3478
ያልታወቀ መለያ: 32800
የአገልጋይ ስም=Vovida.org 0.98-ሲፒሲ
የደረሰው መልእክት አይነት 257 id=10
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 4

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 2

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 4

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 2

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 4

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 2

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 4

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 2

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 4

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
የአስደናቂ መልእክትን በኮድ ማድረግ፡-
የመቀየሪያ ጥያቄ፡ 2

የሌን 28 መልእክት ወደ 216.93.246.18:3478 ስለመላክ
ሙከራ I = 1
ሙከራ II = 0
ሙከራ III = 0
ሙከራ I (2) = 1
ናት = 1
በካርታ የተሰራ አይፒ ተመሳሳይ = 1
የፀጉር ፒን = 1
የማቆያ ወደብ = 0
ዋና፡ ገለልተኛ የካርታ ስራ፣ የወደብ ጥገኛ ማጣሪያ፣ የዘፈቀደ ወደብ፣ ፀጉር ይቆማል
የመመለሻ ዋጋ 0x000006 ነው

ከዋጋ ጋር ሕብረቁምፊ

MappedAddress = <የእኔ IP>:2885

የሚፈልጉትን ብቻ! በአካባቢው UDP ወደብ 21234 ያለውን ግንኙነት አሁን ያለውን ሁኔታ አሳይቷል. ነገር ግን ይህ ውጊያው ግማሽ ብቻ ነው, ይህን ውሂብ ወደ የርቀት አስተናጋጅ እንዴት ማስተላለፍ እና የ VPN ግንኙነት መመስረት እንደሚቻል ጥያቄው ተነሳ. የፖስታ ፕሮቶኮሉን መጠቀም ወይም ቴሌግራም ሊሆን ይችላል?! ብዙ አማራጮች አሉ እና እኔ እንዳገኘሁት Yandex.disk ለመጠቀም ወሰንኩ Curl በ WebDav በኩል ከ Yandex.disk ጋር ስለ መሥራት ጽሑፍ. ስለ አተገባበሩ ካሰብኩ በኋላ ይህንን እቅድ አወጣሁ፡-

  1. በ Yandex.disk ላይ የጊዜ ማህተም ያለው የተወሰነ ፋይል በመኖሩ አንጓዎች ግንኙነት ለመመስረት ዝግጁ መሆናቸውን የሚገልጽ ምልክት;
  2. መስቀለኛ መንገዶቹ ዝግጁ ከሆኑ, ከ STUN አገልጋይ የአሁኑን መለኪያዎች ያግኙ;
  3. የአሁኑን ቅንብሮች ወደ Yandex.disk ይስቀሉ;
  4. መኖሩን ያረጋግጡ እና በ Yandex.disk ላይ ካለው ፋይል የርቀት አስተናጋጅ መለኪያዎችን ያንብቡ;
  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" የበይነገጽን ውስጣዊ አይፒ አድራሻ ይግለጹ
  4. መፍጠር ሚስጥራዊ ቁልፍ ትዕዛዝ፡-
    # openvpn --genkey --secret secret.key 
  5. ስክሪፕቱን እንዲተገበር ማድረግ፡-
    # chmod +x vpn8.sh
  6. አሂድ ስክሪፕት፡
    # ./vpn8.sh nZbVGBuX5dtturD

    nZbVGBuX5dtturD የግንኙነት-መታወቂያው በሚፈጠርበት እዚህ

የርቀት አስተናጋጁ ላይ የምስጢር ቁልፍ እና የግንኙነት መታወቂያ ከማመንጨት በስተቀር ተመሳሳይ ነገር ያድርጉ።

የዘመነው ስሪት (ለትክክለኛው ስራ ሰዓቱ መመሳሰል አለበት)

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. የመግቢያ (2 ኛ መስመር) እና የይለፍ ቃል ከ Yandex.disk (3 ኛ መስመር) ይግለጹ.
  3. የዋሻው ውስጣዊ አይፒ አድራሻን ይግለጹ (4 ኛ መስመር)።
  4. ስክሪፕቱን እንዲተገበር ማድረግ፡-
    # chmod +x vpn10.sh
  5. አሂድ ስክሪፕት፡
    # ./vpn10.sh nZbVGBuX5dtturD

    nZbVGBuX5dtturD የግንኙነት-መታወቂያው በሚፈጠርበት እዚህ

በርቀት አስተናጋጅ ላይ, ተመሳሳይ ነገር ያድርጉ, ተገቢውን የውስጥ ዋሻ IP አድራሻ እና የግንኙነት መታወቂያ ይጥቀሱ.

በሚነሳበት ጊዜ ስክሪፕቱን በራስ-ሰር ለማስኬድ ፣ በፋይሉ ውስጥ የሚገኘውን “nohup /<ዱካ ወደ ስክሪፕቱ>/vpn10.sh nZbVGBuX5dtturD> /var/log/vpn10.log 2>/dev/null &” የሚለውን ትዕዛዝ እጠቀማለሁ። .አካባቢያዊ

መደምደሚያ

ስክሪፕቱ ይሰራል በኡቡንቱ (18.04, 19.10, 20.04) እና በዴቢያን 9 ላይ ተፈትኗል. ማንኛውንም ሌላ አገልግሎት እንደ ማስተላለፊያ መጠቀም ይችላሉ, ነገር ግን ለተሞክሮ Yandex.disk ተጠቀምኩ.
በሙከራዎቹ ወቅት አንዳንድ የ NAT አቅራቢዎች ግንኙነት ለመመስረት እንደማይፈቅዱ ተረጋግጧል። በአብዛኛው ከሞባይል ኦፕሬተሮች፣ ጅረቶች የሚታገዱበት።

ከዚህ አንፃር ለማሻሻል እቅድ አለኝ፡-

  • በሚስጥር.ቁልፉ በራስ ሰር ማመንጨት በጀመሩ ቁጥር ኢንክሪፕት በማድረግ እና ወደ Yandex.disk በመገልበጥ ወደ የርቀት አስተናጋጅ ለማስተላለፍ (በተዘመነው ስሪት ውስጥ ግምት ውስጥ ይገባል)
  • የበይነገጽ አይፒ አድራሻዎችን በራስ ሰር መመደብ
  • ወደ Yandex.disk ከመጫንዎ በፊት የውሂብ ምስጠራ
  • ኮድ ማመቻቸት

በእያንዳንዱ ቤት ውስጥ IPv6 ይኑር!

ተዘምኗል! የቅርብ ጊዜ ፋይሎች እና የDEB ጥቅል እዚህ - yandex.ዲስክ

ምንጭ: hab.com

አስተያየት ያክሉ