فراہم کنندہ NATs کے ذریعے کمپیوٹرز کے درمیان براہ راست VPN ٹنل (VPS کے بغیر، STUN سرور اور Yandex.disk کا استعمال کرتے ہوئے)

تسلسل مضامین اس بارے میں کہ میں NAT فراہم کنندگان کے پیچھے واقع دو کمپیوٹرز کے درمیان براہ راست VPN سرنگ کو کیسے منظم کرنے میں کامیاب ہوا۔ پچھلے مضمون میں کسی تیسرے فریق کی مدد سے کنکشن کو منظم کرنے کے عمل کو بیان کیا گیا تھا - ایک بیچوان (کرائے پر لیا ہوا VPS جو STUN سرور اور کنکشن کے لیے ایک نوڈ ڈیٹا ٹرانسمیٹر کی طرح کام کرتا ہے)۔ اس مضمون میں میں آپ کو بتاؤں گا کہ میں نے VPS کے بغیر کیسے انتظام کیا، لیکن بیچوان باقی رہے اور وہ STUN سرور اور Yandex.Disk...
فراہم کنندہ NATs کے ذریعے کمپیوٹرز کے درمیان براہ راست VPN ٹنل (VPS کے بغیر، STUN سرور اور Yandex.disk کا استعمال کرتے ہوئے)

تعارف

پچھلی پوسٹ کے تبصروں کو پڑھنے کے بعد، میں نے محسوس کیا کہ عمل درآمد کی بنیادی خرابی ایک بیچوان کا استعمال تھا - ایک تیسری پارٹی (VPS) جس نے نوڈ کے موجودہ پیرامیٹرز کی نشاندہی کی، کہاں اور کیسے جڑنا ہے۔ اس STUN کو استعمال کرنے کی سفارشات پر غور کرتے ہوئے (جن میں سے بہت کچھ ہیں) موجودہ کنکشن کے پیرامیٹرز کا تعین کرنے کے لیے۔ سب سے پہلے، میں نے پیکٹ کے مواد کو دیکھنے کے لیے TCPDump استعمال کرنے کا فیصلہ کیا جب STUN سرور کلائنٹس کے ساتھ کام کر رہا تھا اور مکمل طور پر ناقابل پڑھے جانے والا مواد موصول ہوا۔ پروٹوکول گوگل کر رہا ہوں جو میں نے دیکھا پروٹوکول کی وضاحت کرنے والا مضمون. میں نے محسوس کیا کہ میں خود سے STUN سرور کی درخواست پر عمل درآمد نہیں کر سکتا اور خیال کو "دور خانہ" میں رکھ سکتا ہوں۔

Теория

حال ہی میں مجھے پیکیج سے ڈیبین پر STUN سرور انسٹال کرنا پڑا

# apt install stun-server

اور انحصار میں میں نے شاندار کلائنٹ پیکج دیکھا، لیکن کسی نہ کسی طرح میں نے اس پر توجہ نہیں دی۔ لیکن بعد میں مجھے سٹن کلائنٹ پیکیج کے بارے میں یاد آیا اور مجھے یہ معلوم کرنے کا فیصلہ کیا کہ یہ کیسے کام کرتا ہے، گوگل کرنے اور Yandex میں تلاش کرنے کے بعد مجھے ملا:

# 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

len 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 بائٹس
میپڈ ایڈریس = <میرا آئی پی>: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
nat = 1 ہے۔
میپ شدہ IP ایک ہی = 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. بنانا secret.key کمانڈ:
    # openvpn --genkey --secret secret.key 
  5. اسکرپٹ کو قابل عمل بنائیں:
    # chmod +x vpn8.sh
  6. سکرپٹ چلائیں:
    # ./vpn8.sh nZbVGBuX5dtturD

    جہاں nZbVGBuX5dtturD پیدا کردہ کنکشن ID ہے۔ یہاں

ریموٹ نوڈ پر، 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 (تیسری لائن) کے لیے لاگ ان (دوسری لائن) اور پاس ورڈ کی نشاندہی کریں۔
  3. سرنگ کے اندرونی IP ایڈریس کی وضاحت کریں (چوتھی لائن)۔
  4. اسکرپٹ کو قابل عمل بنائیں:
    # chmod +x vpn10.sh
  5. سکرپٹ چلائیں:
    # ./vpn10.sh nZbVGBuX5dtturD

    جہاں nZbVGBuX5dtturD پیدا کردہ کنکشن ID ہے۔ یہاں

ریموٹ نوڈ پر، ایسا ہی کریں، سرنگ اور کنکشن ID کے متعلقہ اندرونی IP ایڈریس کی وضاحت کریں۔

اسکرپٹ کو آن ہونے پر آٹورن کرنے کے لیے، میں کمانڈ استعمال کرتا ہوں "nohup /<path to the script>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &" فائل میں موجود /etc/ rc.local

حاصل يہ ہوا

اسکرپٹ کام کرتا ہے، Ubuntu (18.04, 19.10, 20.04) اور Debian 9 پر تجربہ کیا گیا ہے۔ آپ کسی بھی دوسری سروس کو بطور ٹرانسمیٹر استعمال کر سکتے ہیں، لیکن تجربے کے لیے میں نے Yandex.disk کا استعمال کیا۔
تجربات کے دوران، یہ پتہ چلا کہ کچھ قسم کے NAT فراہم کنندہ کنکشن قائم کرنے کی اجازت نہیں دیتے ہیں۔ بنیادی طور پر موبائل آپریٹرز سے جہاں ٹورینٹ بلاک ہوتے ہیں۔

میں ان شرائط میں بہتری لانے کا ارادہ رکھتا ہوں:

  • جب بھی آپ ریموٹ نوڈ میں منتقلی کے لیے secret.key کی خودکار جنریشن شروع کریں، انکرپٹ کریں اور Yandex.disk پر کاپی کریں (اپ ڈیٹ شدہ ورژن کو مدنظر رکھتے ہوئے)
  • انٹرفیس کے IP پتوں کی خودکار تفویض
  • Yandex.disk پر اپ لوڈ کرنے سے پہلے ڈیٹا کو خفیہ کرنا
  • کوڈ کی اصلاح

ہر گھر میں IPv6 ہونے دو!

تازہ کاری! تازہ ترین فائلیں اور DEB پیکیج یہاں - yandex.disk

ماخذ: www.habr.com

نیا تبصرہ شامل کریں