سڌو VPN سرنگ ڪمپيوٽرن جي وچ ۾ مهيا ڪندڙ NATs جي ذريعي (وي پي ايس کان سواء، استعمال ڪندي STUN سرور ۽ Yandex.disk)

تسلسل مضمون انهي بابت ڪيئن مون منظم ڪيو سڌو وي پي اين سرنگ ٻن ڪمپيوٽرن جي وچ ۾ NAT فراهم ڪندڙن جي پويان واقع. پوئين مضمون ۾ ٽين ڌر جي مدد سان ڪنيڪشن کي منظم ڪرڻ جي عمل کي بيان ڪيو ويو آهي - هڪ وچولي (هڪ کرايه تي وي پي ايس ڪم ڪري رهيو آهي جهڙوڪ STUN سرور ۽ ڪنيڪشن لاءِ نوڊ ڊيٽا ٽرانسميٽر). هن آرٽيڪل ۾ آئون توهان کي ٻڌايان ٿو ته آئون بغير VPS جي انتظام ڪيئن ڪيان، پر وچولي رهي ٿي ۽ اهي STUN سرور ۽ Yandex.Disk هئا.
سڌو VPN سرنگ ڪمپيوٽرن جي وچ ۾ مهيا ڪندڙ NATs جي ذريعي (وي پي ايس کان سواء، استعمال ڪندي STUN سرور ۽ Yandex.disk)

تعارف

پوئين پوسٽ جي تبصرن کي پڙهڻ کان پوء، مون محسوس ڪيو ته عمل درآمد جي بنيادي خرابي هڪ وچولي جو استعمال هو - هڪ ٽئين پارٽي (VPS) جنهن کي اشارو ڪيو ويو آهي ته نوڊ جي موجوده پيٽرولن، ڪٿي ۽ ڪيئن ڳنڍڻ. هن STUN کي استعمال ڪرڻ جي سفارشن تي غور ڪندي (جن مان تمام گهڻا آهن) موجوده ڪنيڪشن جي پيٽرولن کي طئي ڪرڻ لاء. سڀ کان پهريان، مون پيڪٽس جي مواد کي ڏسڻ لاءِ TCPDump استعمال ڪرڻ جو فيصلو ڪيو جڏهن STUN سرور ڪلائنٽ سان ڪم ڪري رهيو هو ۽ مڪمل طور تي اڻ پڙهيل مواد حاصل ڪيو. پروٽوڪول گوگل ڪندي مون کي نظر آيو پروٽوڪول جي وضاحت ڪندي آرٽيڪل. مون محسوس ڪيو ته مان پنهنجي طرفان STUN سرور جي درخواست تي عمل نه ڪري سگهيو آهيان ۽ خيال کي ”دور خاني“ ۾ رکان ٿو.

اصول

تازو مون کي انسٽال ڪرڻو پيو STUN سرور Debian تي پيڪيج مان

# apt install stun-server

۽ انحصار ۾ مون ڏٺو ته اسٽن ڪلائنٽ پيڪيج، پر ڪنهن به طرح مون ان تي ڌيان نه ڏنو. پر بعد ۾ مون کي اسٽن ڪلائنٽ پيڪيج جي باري ۾ ياد آيو ۽ اهو معلوم ڪرڻ جو فيصلو ڪيو ته اهو ڪيئن ڪم ڪري ٿو، گوگل ڪرڻ ۽ Yandex ۾ ڳولڻ کان پوء مون کي مليو:

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

جواب ۾ مون کي مليو:

STUN ڪلائنٽ ورزن 0.97
کوليو پورٽ 21234 fd 3 سان
کوليو پورٽ 21235 fd 4 سان
انڪوڊنگ شاندار پيغام:
انڪوڊنگ تبديلي جي درخواست: 0

لين 28 جو پيغام موڪلڻ بابت 216.93.246.18:3478
انڪوڊنگ شاندار پيغام:
انڪوڊنگ تبديلي جي درخواست: 4

لين 28 جو پيغام موڪلڻ بابت 216.93.246.18:3478
انڪوڊنگ شاندار پيغام:
انڪوڊنگ تبديلي جي درخواست: 2

لين 28 جو پيغام موڪلڻ بابت 216.93.246.18:3478
موصول ٿيل شاندار پيغام: 92 بائيٽ
ميپڊ ايڊريس = <منهنجو IP>: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

لين 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 بائيٽ
ميپڊ ايڊريس = <منهنجو IP>: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 آهي
ماپ ٿيل IP ساڳي = 1
وار پن = 1
محافظ بندرگاهه = 0
پرائمري: آزاد ميپنگ، پورٽ تي منحصر فلٽر، بي ترتيب واري بندرگاهن، هيئر پن
واپسي جي قيمت 0x000006 آهي

قدر سان تار

ميپڊ ايڊريس = <منهنجو IP>:2885

بس توهان کي ڇا گهرجي! اهو مقامي UDP پورٽ 21234 تي ڪنيڪشن لاءِ موجوده صورتحال ڏيکاري ٿو. پر اها صرف اڌ جنگ آهي؛ سوال اهو پيدا ٿيو ته هن ڊيٽا کي ريموٽ ميزبان ڏانهن ڪيئن منتقل ڪيو وڃي ۽ هڪ وي پي اين ڪنيڪشن کي منظم ڪيو وڃي. ميل پروٽوڪول استعمال ڪندي، يا شايد ٽيليگرام؟! اتي ڪيترائي اختيار آھن ۽ مون Yandex.disk استعمال ڪرڻ جو فيصلو ڪيو، جڏھن کان مون وٽ آيو آھيان Yandex.disk سان WebDav ذريعي Curl ڪم ڪرڻ بابت آرٽيڪل. عملدرآمد جي باري ۾ سوچڻ کان پوء، مون هيٺ ڏنل اسڪيم سان آيو:

  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 (2rd لائن) لاءِ لاگ ان (3nd لائن) ۽ پاسورڊ ظاهر ڪريو.
  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

تبصرو شامل ڪريو