Provayderlarning NATlari orqali kompyuterlar o'rtasida to'g'ridan-to'g'ri VPN tuneli (VPSsiz, STUN serveri va Yandex.disk yordamida)

kengaytmasi maqolalar NAT provayderlari orqasida joylashgan ikkita kompyuter o'rtasida to'g'ridan-to'g'ri VPN tunnelini qanday tashkil etishga muvaffaq bo'lganim haqida. Oldingi maqolada uchinchi tomon - vositachi (ijaraga olingan VPS, STUN serveri va ulanish uchun tugun ma'lumotlar uzatuvchisi) yordamida ulanishni tashkil qilish jarayoni tasvirlangan. Ushbu maqolada men VPSsiz qanday boshqarganimni aytib beraman, lekin vositachilar qoldi va ular STUN serveri va Yandex.Disk edi...
Provayder NATlari orqali kompyuterlar o'rtasida to'g'ridan-to'g'ri VPN tunnel (VPS holda, STUN serveri va Yandex.disk yordamida)

kirish

Oldingi xabarning sharhlarini o'qib chiqqandan so'ng, men amalga oshirishning asosiy kamchiligi vositachi - uchinchi tomon (VPS) dan foydalanish ekanligini angladim, bu tugunning joriy parametrlarini, qayerda va qanday ulanishni ko'rsatadi. Ushbu STUN dan foydalanish bo'yicha tavsiyalarni hisobga olgan holda (ulardan juda ko'p) joriy ulanish parametrlarini aniqlash uchun. Avvalo, STUN serveri mijozlar bilan ishlayotgan va butunlay o‘qib bo‘lmaydigan kontentni olganida paketlar mazmunini ko‘rib chiqish uchun TCPDump’dan foydalanishga qaror qildim. Men duch kelgan protokolni Google orqali qidirib topdim protokolni tavsiflovchi maqola. Men STUN serveriga so'rovni o'zim amalga oshira olmasligimni angladim va g'oyani "uzoq quti" ga qo'yaman.

Nazariya

Yaqinda paketdan Debian-ga STUN serverini o'rnatishim kerak edi

# apt install stun-server

va bog'liqliklarda men stun-client paketini ko'rdim, lekin qandaydir tarzda men bunga e'tibor bermadim. Ammo keyinroq men stun-client to'plami haqida esladim va uning qanday ishlashini aniqlashga qaror qildim, Google-da qidirish va Yandex-da qidirishdan keyin men oldim:

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

Bunga javoban men oldim:

STUN mijoz versiyasi 0.97
fd 21234 bilan ochilgan port 3
fd 21235 bilan ochilgan port 4
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 0

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 4

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 2

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Qabul qilingan hayratlanarli xabar: 92 bayt
MappedAddress = <Mening IPim>:2885
Manba manzili = 216.93.246.18:3478
ChangedAddress = 216.93.246.17:3479
Noma'lum atribut: 32800
ServerName = Vvida.org 0.98-CPC
257 id=1 turidagi xabar qabul qilindi
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 0

28:216.93.246.17 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 4

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 2

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 0

<Mening IPim>:28 raqamiga len 2885 xabarini yuborish haqida
Qabul qilingan hayratlanarli xabar: 28 bayt
ChangeRequest = 0
1 id=11 turidagi xabar qabul qilindi
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 0

28:216.93.246.17 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 4

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 2

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Qabul qilingan hayratlanarli xabar: 92 bayt
MappedAddress = <Mening IPim>:2885
Manba manzili = 216.93.246.17:3479
ChangedAddress = 216.93.246.18:3478
Noma'lum atribut: 32800
ServerName = Vvida.org 0.98-CPC
257 id=10 turidagi xabar qabul qilindi
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 4

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 2

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 4

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 2

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 4

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 2

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 4

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 2

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 4

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
Ajablanadigan xabarni kodlash:
O'zgartirish so'rovini kodlash: 2

28:216.93.246.18 raqamiga len 3478 xabarini yuborish haqida
test I = 1
test II = 0
test III = 0
test I(2) = 1
nat = 1
xaritalangan IP bir xil = 1
soch tolasi = 1
himoya porti = 0
Birlamchi: Mustaqil xaritalash, Portga bog'liq filtr, tasodifiy port, soch turmagi
Qaytish qiymati 0x000006

Qiymatli qator

MappedAddress = <Mening IPim>:2885

faqat sizga kerak bo'lgan narsa! U 21234 mahalliy UDP portidagi ulanishning joriy holatini ko'rsatdi. Ammo bu kurashning yarmi, bu ma'lumotlarni masofaviy xostga qanday o'tkazish va VPN ulanishini tashkil qilish haqida savol tug'ildi. Pochta protokolidan yoki Telegramdan foydalanish mumkinmi? Ko'p variantlar mavjud va men Yandex.disk-dan foydalanishga qaror qildim, chunki men duch kelganman Yandex.disk bilan WebDav orqali Curl bilan ishlash haqida maqola. Amalga oshirish haqida o'ylab, men quyidagi sxemaga keldim:

  1. Yandex.diskda vaqt tamg'asi bo'lgan ma'lum bir fayl mavjudligi bilan tugunlar ulanishni o'rnatishga tayyorligini bildiradi;
  2. Agar tugunlar tayyor bo'lsa, STUN serveridan joriy parametrlarni oling;
  3. joriy sozlamalarni Yandex.disk-ga yuklang;
  4. Yandex.diskdagi fayldan masofaviy tugunning mavjudligini va parametrlarini o'qishni tekshiring;
  5. OpenVPN yordamida masofaviy xost bilan aloqa o'rnatish.

Amaliyot

Bir oz o'ylab, so'nggi maqoladagi tajribani inobatga olib, tezda ssenariy yozdim. Bizga kerak bo'ladi:

# apt install openvpn stun-client curl 

Skriptning o'zi:

original versiya

# 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

Skript ishlashi uchun sizga kerak bo'ladi:

  1. Buferga nusxa oling va muharrirga joylashtiring, masalan:
    # nano vpn8.sh 
  2. Yandex.disk uchun foydalanuvchi nomi va parolni belgilang.
  3. "—ifconfig 10.45.54.(1 yoki 2) 255.255.255.252" maydonida interfeysning ichki IP manzilini ko'rsating.
  4. yaratmoq maxfiy.kalit buyruq bilan:
    # openvpn --genkey --secret secret.key 
  5. skriptni bajariladigan qilib qo'ying:
    # chmod +x vpn8.sh
  6. skriptni ishga tushiring:
    # ./vpn8.sh nZbVGBuX5dtturD

    bu erda nZbVGBuX5dtturD - yaratilgan ulanish identifikatori shu yerda

Masofaviy tugunda secret.key va ulanish identifikatorini yaratishdan tashqari hamma narsani bir xil bajaring, ular bir xil bo'lishi kerak.

Yangilangan versiya (to'g'ri ishlashi uchun vaqt sinxronlashtirilishi kerak):

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

Skript ishlashi uchun sizga kerak bo'ladi:

  1. Buferga nusxa oling va muharrirga joylashtiring, masalan:
    # nano vpn10.sh 
  2. Yandex.disk uchun login (2-qator) va parolni (3-qator) ko'rsating.
  3. tunnelning ichki IP-manzilini belgilang (4-qator).
  4. skriptni bajariladigan qilib qo'ying:
    # chmod +x vpn10.sh
  5. skriptni ishga tushiring:
    # ./vpn10.sh nZbVGBuX5dtturD

    bu erda nZbVGBuX5dtturD - yaratilgan ulanish identifikatori shu yerda

Masofaviy tugunda xuddi shunday qiling, tunnelning tegishli ichki IP-manzilini va ulanish identifikatorini belgilang.

Yoqilganda skriptni avtomatik ishga tushirish uchun men /etc/ faylida joylashgan “nohup /<skriptga yoʻl>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &” buyrugʻidan foydalanaman. rc.local

xulosa

Skript ishlaydi, Ubuntu (18.04, 19.10, 20.04) va Debian 9 da sinovdan o'tkazildi. Transmitter sifatida boshqa har qanday xizmatdan foydalanishingiz mumkin, ammo tajriba uchun men Yandex.diskdan foydalandim.
Tajribalar davomida NAT provayderlarining ayrim turlari ulanishni o'rnatishga imkon bermasligi aniqlandi. Asosan torrentlar bloklangan uyali aloqa operatorlaridan.

Men quyidagi jihatlarni yaxshilashni rejalashtirmoqdaman:

  • Secret.key-ni har safar ishga tushirganingizda avtomatik yaratish, shifrlash va masofaviy tugunga o'tkazish uchun Yandex.disk-ga nusxalash (yangilangan versiyada hisobga olingan holda)
  • Interfeyslarning IP manzillarini avtomatik belgilash
  • Yandex.diskga yuklashdan oldin ma'lumotlarni shifrlash
  • Kodni optimallashtirish

Har bir uyda IPv6 bo'lsin!

Yangilangan! Eng so'nggi fayllar va DEB to'plami bu yerda - yandex.disk

Manba: www.habr.com

a Izoh qo'shish