Тунели мустақими VPN байни компютерҳо тавассути провайдери NAT (бе VPS, бо истифода аз сервери STUN ва Yandex.disk)

Идома ... мақолаҳо дар бораи он ки чӣ гуна ман тавонистам нақби мустақими VPN-ро байни ду компютере, ки дар паси провайдерҳои NAT ҷойгиранд, ташкил кунам. Дар мақолаи қаблӣ раванди ташкили пайвастшавӣ бо кӯмаки шахси сеюм - миёнарав (VPS-и ба иҷора гирифташуда ҳамчун сервери STUN ва интиқолдиҳандаи маълумот барои пайвастшавӣ) тавсиф карда шудааст. Дар ин мақола ман ба шумо мегӯям, ки чӣ тавр ман бе VPS идора кардам, аммо миёнаравҳо боқӣ монданд ва онҳо сервери STUN ва Yandex.Disk буданд...
Тунели мустақими VPN байни компютерҳо тавассути провайдери NAT (бе VPS, бо истифода аз сервери STUN ва Yandex.disk)

Муқаддима

Пас аз хондани шарҳҳои пости қаблӣ, ман фаҳмидам, ки камбудии асосии татбиқ ин истифодаи миёнарав - шахси сеюм (VPS) мебошад, ки параметрҳои ҷории гиреҳ, дар куҷо ва чӣ гуна пайваст шуданро нишон дод. Бо назардошти тавсияҳо оид ба истифодаи ин STUN (ки аз онхо бисьёранд) барои муайян кардани параметрҳои пайвастшавии ҷорӣ. Пеш аз ҳама, ман тасмим гирифтам, ки TCPDump-ро барои дидани мундариҷаи бастаҳо истифода барам, вақте ки сервери STUN бо муштариён кор мекард ва мундариҷаи комилан хонданашавандаро гирифтааст. Гугл кардани протоколе, ки ман дучор шудам мақолае, ки протоколро тавсиф мекунад. Ман фаҳмидам, ки ман наметавонам дархостро ба сервери STUN мустақилона иҷро кунам ва идеяро дар "қуттии дур" гузорам.

Теория

Ба наздикӣ ман маҷбур шудам, ки сервери STUN-ро дар Debian аз баста насб кунам

# apt install stun-server

ва дар вобастагӣ ман бастаи stun-client-ро дидам, аммо гӯё ба он аҳамият надодам. Аммо баъдтар ман дар бораи бастаи stun-client ба ёд овардам ва қарор додам, ки чӣ тавр кор мекунад, пас аз Google ва ҷустуҷӯ дар Яндекс ман гирифтам:

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

Дар ҷавоб ман гирифтам:

Версияи муштарии STUN 0.97
Порти 21234 бо fd 3 кушода шуд
Порти 21235 бо fd 4 кушода шуд
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 0

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 4

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 2

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Паёми ҳайратангез гирифта шуд: 92 байт
MappedAddress = <IP-и ман>: 2885
SourceAddress = 216.93.246.18:3478
Суроғаи тағирёфта = 216.93.246.17:3479
Хусусияти номаълум: 32800
Номи сервер = Vvida.org 0.98-CPC
Паёми навъи 257 id=1 гирифта шуд
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 0

Дар бораи фиристодани паёми len 28 ба 216.93.246.17:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 4

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 2

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 0

Дар бораи фиристодани паёми len 28 ба <IP-и ман>:2885
Паёми ҳайратангез гирифта шуд: 28 байт
Тағйир додани дархост = 0
Паёми навъи 1 id=11 гирифта шуд
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 0

Дар бораи фиристодани паёми len 28 ба 216.93.246.17:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 4

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 2

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Паёми ҳайратангез гирифта шуд: 92 байт
MappedAddress = <IP-и ман>: 2885
SourceAddress = 216.93.246.17:3479
Суроғаи тағирёфта = 216.93.246.18:3478
Хусусияти номаълум: 32800
Номи сервер = Vvida.org 0.98-CPC
Паёми навъи 257 id=10 гирифта шуд
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 4

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 2

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 4

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 2

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 4

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 2

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 4

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 2

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 4

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
Рамзгузорӣ кардани паёми ҳайратангез:
Рамзгузории тағир додани дархост: 2

Дар бораи фиристодани паёми len 28 ба 216.93.246.18:3478
санҷиш I = 1
санҷиш II = 0
санҷиш III = 0
санҷиш I(2) = 1
nat = 1 аст
IP-и хариташуда ҳамон = 1
мӯйсафед = 1
порти ҳифз = 0
Ибтидоӣ: Харитасозии мустақил, Филтри вобаста ба порт, бандари тасодуфӣ, мӯяшро хоҳад кард
Арзиши бозгашт 0x000006 аст

Сатр бо арзиш

MappedAddress = <IP-и ман>: 2885

танҳо он чизе ки ба шумо лозим аст! Он ҳолати кунунии пайвастшавӣ дар порти маҳаллии UDP 21234-ро нишон дод. Аммо ин танҳо нисфи мубориза аст, саволе ба миён омад, ки чӣ гуна ин маълумотро ба ҳости дурдаст интиқол додан ва пайвасти VPN-ро ташкил кардан мумкин аст. Бо истифода аз протоколи почта, ё шояд Telegram?! Имкониятҳои зиёде мавҷуданд ва ман қарор додам, ки 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" суроғаи IP-и дохилии интерфейсро муайян кунед
  4. эҷод махфӣ.калиди бо фармон:
    # 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. логин (сатри 2) ва паролро барои Yandex.disk (сатри 3) нишон диҳед.
  3. суроғаи IP-и дохилии нақбро муайян кунед (хати 4).
  4. скриптро иҷрошаванда созед:
    # chmod +x vpn10.sh
  5. скриптро иҷро кунед:
    # ./vpn10.sh nZbVGBuX5dtturD

    ки nZbVGBuX5dtturD ID пайвасти тавлидшуда аст дар ин ҷо

Дар гиреҳи дурдаст, ҳамин корро кунед, суроғаи IP-и дохилии нақб ва ID пайвастро муайян кунед.

Барои худкор иҷро кардани скрипт ҳангоми фурӯзон, ман фармони "nohup /<роҳ ба скрипт>/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

Манбаъ: will.com

Илова Эзоҳ