Провайдерлердин NATлары аркылуу компьютерлердин ортосунда түз VPN туннели (VPSсиз, STUN серверин жана Yandex.diskти колдонуу менен)

узартуу макалалар NAT провайдерлеринин артында жайгашкан эки компьютердин ортосунда түз VPN туннелин кантип уюштурганым жөнүндө. Мурунку макалада үчүнчү тараптын жардамы менен байланышты уюштуруу процесси сүрөттөлгөн - ортомчу (ижарага алынган VPS, STUN сервери жана туташуу үчүн түйүн маалымат жөнөтүүчүсү сыяктуу). Бул макалада мен VPSсиз кантип башкарганымды айтып берем, бирок ортомчулар кала беришкен жана алар STUN сервери жана Yandex.Disk...
Провайдерлердин NATлары аркылуу компьютерлердин ортосунда түз VPN туннели (VPSсиз, STUN сервери жана Yandex.disk аркылуу)

тааныштыруу

Мурунку билдирүүнүн комментарийлерин окуп чыккандан кийин, мен ишке ашыруунун негизги кемчилиги ортомчу - үчүнчү тараптын (VPS) колдонуу экенин түшүндүм, ал түйүндүн учурдагы параметрлерин, кайда жана кантип туташтыруу керектигин көрсөткөн. Бул STUN колдонуу боюнча сунуштарды эске алуу менен (алардын ичинен көп) учурдагы байланыш параметрлерин аныктоо үчүн. Биринчиден, STUN сервери кардарлар менен иштеп, таптакыр окулбай турган мазмунду алган кезде пакеттердин мазмунун көрүү үчүн TCPDump колдонууну чечтим. Протоколду издеп таап алдым протоколду сүрөттөгөн макала. Мен STUN серверине суроо-талапты өз алдынча ишке ашыра албасымды түшүндүм жана идеяны "алыскы кутуга" салам.

теория

Жакында пакеттен Debianга STUN серверин орнотууга туура келди

# apt install stun-server

жана көз карандылыкта мен stun-клиент пакетин көрдүм, бирок эмнегедир мен ага көңүл бурган жокмун. Бирок кийинчерээк мен stun-client пакети жөнүндө эсиме түшүп, анын кантип иштээрин түшүнүүнү чечтим, Google менен издөө жана Яндексте издөөдөн кийин мен алдым:

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

Жооп катары мен алдым:

STUN кардар версиясы 0.97
21234 порту fd 3 менен ачылды
21235 порту fd 4 менен ачылды
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 0

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 4

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 2

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кабыл алынган кабар: 92 байт
MappedAddress = <Менин IP>:2885
SourceAddress = 216.93.246.18:3478
ChangedAddress = 216.93.246.17:3479
Белгисиз атрибуту: 32800
ServerName = Vvida.org 0.98-CPC
257 id=1 түрүндөгү билдирүү кабыл алынды
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 0

28:216.93.246.17 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 4

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 2

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 0

<Менин IP>:28 дарегине len 2885 билдирүү жөнөтүү жөнүндө
Кабыл алынган кабар: 28 байт
ChangeRequest = 0
1 id=11 түрүндөгү билдирүү кабыл алынды
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 0

28:216.93.246.17 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 4

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 2

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кабыл алынган кабар: 92 байт
MappedAddress = <Менин IP>:2885
SourceAddress = 216.93.246.17:3479
ChangedAddress = 216.93.246.18:3478
Белгисиз атрибуту: 32800
ServerName = Vvida.org 0.98-CPC
257 id=10 түрүндөгү билдирүү кабыл алынды
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 4

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 2

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 4

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 2

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 4

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 2

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 4

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 2

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 4

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
Кооптуу билдирүүнү коддоо:
ChangeRequest коддоосу: 2

28:216.93.246.18 номерине len 3478 билдирүү жөнөтүү жөнүндө
тест I = 1
II тест = 0
тест III = 0
тест I(2) = 1
nat = 1 болуп саналат
карталанган IP бирдей = 1
чач кычкач = 1
сактагыч порт = 0
Негизги: Көзкарандысыз карта түзүү, Портка көз каранды чыпка, туш келди порт, чач кычкач
Кайтаруу мааниси 0x000006

Маанилүү сап

MappedAddress = <Менин IP>:2885

сага эмне керек! Ал 21234 локалдык UDP портуна туташуу үчүн учурдагы абалды көрсөттү. Бирок бул күрөштүн жарымы гана, бул маалыматты алыскы хостко кантип өткөрүп берүү жана VPN туташуусун кантип уюштуруу керек деген суроо пайда болду. Почта протоколун колдонуу, же балким Telegram?! Көп варианттар бар жана мен Yandex.diskти колдонууну чечтим, анткени мен жолугуп калдым Curl менен WebDav аркылуу Yandex.disk менен иштөө жөнүндө макала. Ишке ашыруу жөнүндө ойлонуп, мен төмөнкү схемага келдим:

  1. Яндекс.дискте убакыт белгиси бар белгилүү бир файлдын болушу аркылуу түйүндөр байланыш түзүүгө даяр экендигин билдирет;
  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 жана туташуу идентификаторун түзүүдөн башкасынын баарын бирдей кылыңыз, алар бирдей болушу керек.

Жаңыланган версия (убакыт туура иштеши үчүн шайкештештирилиши керек):

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. туннелдин ички IP дарегин көрсөтүү (4-сап).
  4. скриптти аткарылуучу кылуу:
    # chmod +x vpn10.sh
  5. скрипт иштетүү:
    # ./vpn10.sh nZbVGBuX5dtturD

    мында nZbVGBuX5dtturD түзүлүүчү байланыш ID болуп саналат бул жерде

Алыскы түйүндө, дал ушундай кылыңыз, туннелдин тиешелүү ички IP дарегин жана байланыш идентификаторун көрсөтүңүз.

Күйгүзүлгөндө скриптти автоматтык түрдө иштетүү үчүн, мен /etc/ файлында камтылган “nohup /<скриптке жол>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &” буйругун колдоном. 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

Source: www.habr.com

Комментарий кошуу