সরবরাহকারীদের NAT-এর মাধ্যমে কম্পিউটারের মধ্যে সরাসরি VPN টানেল (VPS ছাড়া, STUN সার্ভার এবং Yandex.disk ব্যবহার করে)

প্রসার প্রবন্ধ আমি কিভাবে ISP NAT-এর পিছনে অবস্থিত দুটি কম্পিউটারের মধ্যে একটি সরাসরি VPN টানেল সংগঠিত করতে পেরেছি সে সম্পর্কে। শেষ নিবন্ধটি তৃতীয় পক্ষের সাহায্যে একটি সংযোগ সংগঠিত করার প্রক্রিয়া বর্ণনা করেছে - একটি মধ্যস্থতাকারী (একটি ভাড়া করা VPS একটি STUN সার্ভারের মতো কিছু হিসাবে কাজ করে এবং সংযোগের জন্য একটি নোড ডেটা ট্রান্সমিটার)। এই নিবন্ধে আমি আপনাকে বলব কিভাবে আমি VPS ছাড়াই পরিচালনা করেছি, কিন্তু মধ্যস্থতাকারীরা রয়ে গেছে এবং তারা ছিল STUN সার্ভার এবং Yandex.Disk ...
সরবরাহকারীদের NAT-এর মাধ্যমে কম্পিউটারের মধ্যে সরাসরি VPN টানেল (VPS ছাড়া, STUN সার্ভার এবং Yandex.disk ব্যবহার করে)

ভূমিকা

শেষ পোস্টের মন্তব্যগুলি পড়ার পরে, আমি বুঝতে পেরেছিলাম যে বাস্তবায়নের প্রধান ত্রুটি ছিল একটি মধ্যস্থতাকারীর ব্যবহার - একটি তৃতীয় পক্ষ (ভিপিএস) যা নোডের বর্তমান পরামিতিগুলি, কোথায় এবং কীভাবে সংযোগ করতে হবে তা নির্দেশ করে। একটি বাস্তব STUN ব্যবহার করার জন্য সুপারিশ দেওয়া হয়েছে (যার মধ্যে অনেক আছে) বর্তমান সংযোগ সেটিংস নির্ধারণ করতে। প্রথমত, যখন STUN সার্ভার ক্লায়েন্টদের সাথে কাজ করছিল এবং সম্পূর্ণ অপঠিত বিষয়বস্তু পেয়েছি তখন প্যাকেটগুলির বিষয়বস্তু দেখার জন্য আমি TCPDump ব্যবহার করার সিদ্ধান্ত নিয়েছি। গুগল করলেই প্রটোকল জুড়ে আসে প্রোটোকল বর্ণনাকারী নিবন্ধ. আমি বুঝতে পেরেছি যে আমি নিজে থেকে STUN সার্ভারে একটি অনুরোধ বাস্তবায়ন করতে পারি না এবং ধারণাটিকে দূরে সরিয়ে দিতে পারি।

তত্ত্ব

আমাকে সম্প্রতি প্যাকেজ থেকে ডেবিয়ানে একটি STUN সার্ভার ইনস্টল করতে হয়েছিল

# apt install stun-server

এবং নির্ভরতাগুলিতে আমি স্টান-ক্লায়েন্ট প্যাকেজটি দেখেছি, তবে কোনওভাবে এটিতে কোনও গুরুত্ব দেয়নি। কিন্তু পরে আমি স্টান-ক্লায়েন্ট প্যাকেজটি মনে রেখেছিলাম এবং গুগলিং এবং ইয়ানডেক্স ব্যবহার করে এটি কীভাবে কাজ করে তা নির্ধারণ করার সিদ্ধান্ত নিয়েছিলাম:

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

উত্তরে আমি পেয়েছি:

STUN ক্লায়েন্ট সংস্করণ 0.97
fd 21234 সহ পোর্ট 3 খোলা হয়েছে
fd 21235 সহ পোর্ট 4 খোলা হয়েছে
এনকোডিং স্তব্ধ বার্তা:
এনকোডিং পরিবর্তনের অনুরোধ: 0

28:216.93.246.18-এ লেন 3478-এর বার্তা পাঠাতে চলেছে
এনকোডিং স্তব্ধ বার্তা:
এনকোডিং পরিবর্তনের অনুরোধ: 4

28:216.93.246.18-এ লেন 3478-এর বার্তা পাঠাতে চলেছে
এনকোডিং স্তব্ধ বার্তা:
এনকোডিং পরিবর্তনের অনুরোধ: 2

28:216.93.246.18-এ লেন 3478-এর বার্তা পাঠাতে চলেছে
প্রাপ্ত স্তব্ধ বার্তা: 92 বাইট
ম্যাপ করা ঠিকানা = <আমার আইপি>:2885
উৎস ঠিকানা = 216.93.246.18:3478
পরিবর্তিত ঠিকানা = 216.93.246.17:3479
অজানা বৈশিষ্ট্য: 32800
সার্ভারনেম=Vovida.org 0.98-CPC
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

<My IP>:28-এ লেন 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 বাইট
ম্যাপ করা ঠিকানা = <আমার আইপি>:2885
উৎস ঠিকানা = 216.93.246.17:3479
পরিবর্তিত ঠিকানা = 216.93.246.18:3478
অজানা বৈশিষ্ট্য: 32800
সার্ভারনেম=Vovida.org 0.98-CPC
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

মান সহ স্ট্রিং

ম্যাপ করা ঠিকানা = <আমার আইপি>:2885

শুধু আপনার কি প্রয়োজন! এটি স্থানীয় UDP পোর্ট 21234-এ সংযোগের জন্য বর্তমান অবস্থা প্রদর্শন করেছে। কিন্তু এটি শুধুমাত্র অর্ধেক যুদ্ধ, প্রশ্ন উঠেছে কিভাবে এই তথ্যটি দূরবর্তী হোস্টে স্থানান্তর করা যায় এবং একটি VPN সংযোগ স্থাপন করা যায়। মেইল প্রোটোকল ব্যবহার করে, নাকি টেলিগ্রাম?! অনেক অপশন আছে এবং আমি Yandex.disk ব্যবহার করার সিদ্ধান্ত নিয়েছি, কারণ আমি জুড়ে এসেছি Yandex.disk-এর সাথে WebDav-এর মাধ্যমে কার্ল কাজ করার বিষয়ে একটি নিবন্ধ. বাস্তবায়ন সম্পর্কে চিন্তা করার পরে, আমি এই স্কিমটি নিয়ে এসেছি:

  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" ইন্টারফেসের অভ্যন্তরীণ IP ঠিকানা নির্দিষ্ট করুন
  4. সৃষ্টি গোপন চাবি কমান্ড সহ:
    # openvpn --genkey --secret secret.key 
  5. স্ক্রিপ্ট এক্সিকিউটেবল করুন:
    # chmod +x vpn8.sh
  6. স্ক্রিপ্ট চালান:
    # ./vpn8.sh nZbVGBuX5dtturD

    যেখানে nZbVGBuX5dtturD হল সংযোগ-আইডি তৈরি করা এখানে

দূরবর্তী হোস্টে, secret.key এবং সংযোগ আইডি জেনারেট করা ছাড়া একই কাজ করুন, সেগুলি অবশ্যই অভিন্ন হতে হবে৷

আপডেট করা সংস্করণ (সঠিক কাজের জন্য, সময়টি অবশ্যই সিঙ্ক্রোনাইজ করা উচিত):

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 (2য় লাইন) থেকে লগইন (3য় লাইন) এবং পাসওয়ার্ড উল্লেখ করুন।
  3. টানেলের অভ্যন্তরীণ আইপি ঠিকানা নির্দিষ্ট করুন (৪র্থ লাইন)।
  4. স্ক্রিপ্ট এক্সিকিউটেবল করুন:
    # chmod +x vpn10.sh
  5. স্ক্রিপ্ট চালান:
    # ./vpn10.sh nZbVGBuX5dtturD

    যেখানে nZbVGBuX5dtturD হল সংযোগ-আইডি তৈরি করা এখানে

দূরবর্তী হোস্টে, একই কাজ করুন, উপযুক্ত অভ্যন্তরীণ টানেলের আইপি ঠিকানা এবং সংযোগ আইডি নির্দিষ্ট করুন৷

স্টার্টআপে স্ক্রিপ্টটি অটোরান করতে, আমি /etc/rc ফাইলে থাকা "nohup //vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &" কমান্ডটি ব্যবহার করি .স্থানীয়

উপসংহার

স্ক্রিপ্টটি কাজ করে, উবুন্টু (18.04, 19.10, 20.04) এবং ডেবিয়ান 9-এ পরীক্ষিত। আপনি ট্রান্সমিটার হিসাবে অন্য কোনও পরিষেবা ব্যবহার করতে পারেন, তবে অভিজ্ঞতার জন্য আমি Yandex.disk ব্যবহার করেছি।
পরীক্ষার সময়, এটি পাওয়া গেছে যে কিছু ধরণের NAT প্রদানকারী আপনাকে সংযোগ স্থাপনের অনুমতি দেয় না। বেশিরভাগ মোবাইল অপারেটর থেকে, যেখানে টরেন্ট ব্লক করা হয়।

আমি শর্তাবলী উন্নত করার পরিকল্পনা:

  • secret.key-এর স্বয়ংক্রিয় জেনারেশন প্রতিবার আপনি যখনই শুরু করেন, এনক্রিপ্ট করা এবং Yandex.disk-এ কপি করে রিমোট হোস্টে ট্রান্সমিশনের জন্য (আপডেট সংস্করণে বিবেচনা করা হয়)
  • ইন্টারফেস আইপি ঠিকানাগুলির স্বয়ংক্রিয় নিয়োগ
  • Yandex.disk এ আপলোড করার আগে ডেটা এনক্রিপশন
  • কোড অপ্টিমাইজেশান

প্রতিটি বাড়িতে IPv6 থাকতে দিন!

আপডেট করা হয়েছে! সর্বশেষ ফাইল এবং DEB প্যাকেজ এখানে - yandex.disk

উত্স: www.habr.com

একটি মন্তব্য জুড়ুন