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

Жалғастыру мақалалар NAT провайдерлерінің артында орналасқан екі компьютер арасында тікелей VPN туннелін қалай ұйымдастырғаным туралы. Алдыңғы мақалада үшінші тараптың – делдалдың (STUN сервері және қосылым үшін түйіндік деректер таратқышы сияқты әрекет ететін жалға алынған VPS) көмегімен қосылымды ұйымдастыру процесі сипатталған. Бұл мақалада мен VPSсіз қалай басқарғанымды айтамын, бірақ делдалдар қалды және олар STUN сервері және Yandex.Disk болды...
Провайдер NAT арқылы компьютерлер арасында тікелей VPN туннелі (VPSсіз, STUN сервері мен Yandex.disk арқылы)

Кіріспе

Алдыңғы жазбаның түсініктемелерін оқығаннан кейін, іске асырудың негізгі кемшілігі түйіннің ағымдағы параметрлерін, қайда және қалай қосылу керектігін көрсететін делдал - үшінші тарапты (VPS) пайдалану екенін түсіндім. Осы STUN пайдалану бойынша ұсыныстарды ескере отырып (оның ішінде өте көп) ағымдағы қосылым параметрлерін анықтау. Ең алдымен, мен STUN сервері клиенттермен жұмыс істеп, мүлдем оқылмайтын мазмұнды алған кезде пакеттердің мазмұнын қарау үшін TCPDump пайдалануды шештім. Мен кездестірген протоколды іздеу хаттаманы сипаттайтын мақала. Мен STUN серверіне сұрауды өз бетіммен орындай алмайтынымды түсіндім және идеяны «алыс қорапқа» саламын.

Теория

Жақында пакеттен Debian-ға STUN серверін орнатуға тура келді

# 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 арқылы ашылды
Таңқаларлық хабарды кодтау:
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
Өзгертілген мекенжай = 216.93.246.17:3479
Белгісіз төлсипат: 32800
Сервер атауы = Vovida.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 нөміріне лен 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
Өзгертілген мекенжай = 216.93.246.18:3478
Белгісіз төлсипат: 32800
Сервер атауы = Vovida.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. 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 – жасалған қосылым идентификаторы осында

Қашықтағы түйінде 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. Яндекс.дискінің логинін (2-жол) және парольді (3-жол) көрсетіңіз.
  3. туннельдің ішкі IP мекенжайын көрсетіңіз (4-жол).
  4. сценарийді орындалатын етіп жасаңыз:
    # chmod +x vpn10.sh
  5. сценарийді іске қосыңыз:
    # ./vpn10.sh nZbVGBuX5dtturD

    мұндағы nZbVGBuX5dtturD – жасалған қосылым идентификаторы осында

Қашықтағы түйінде де солай жасаңыз, туннельдің сәйкес ішкі 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 провайдерлерінің кейбір түрлері байланыс орнатуға мүмкіндік бермейтіні анықталды. Негізінен торрент бұғатталған ұялы байланыс операторларынан.

Мен жақсартуды жоспарлап отырмын:

  • Қашықтағы түйінге тасымалдау үшін Yandex.disk-ке әр іске қосқан сайын, шифрлап, көшірген сайын secret.key автоматты түрде генерациялау (жаңартылған нұсқада ескерілген)
  • Интерфейстердің IP мекенжайларын автоматты түрде тағайындау
  • Yandex.disk-ке жүктеп салу алдында деректерді шифрлау
  • Кодты оңтайландыру

Әр үйде IPv6 болсын!

Жаңартылды! Мұнда соңғы файлдар мен DEB бумасы - yandex.disk

Ақпарат көзі: www.habr.com

пікір қалдыру