Tuneli i drejtpërdrejtë VPN midis kompjuterëve përmes NAT-ve të ofruesit (pa VPS, duke përdorur serverin STUN dhe Yandex.disk)

zgjerim Artikull se si arrita të organizoja një tunel të drejtpërdrejtë VPN midis dy kompjuterëve të vendosur prapa ofruesve të NAT. Artikulli i mëparshëm përshkruante procesin e organizimit të një lidhjeje me ndihmën e një pale të tretë - një ndërmjetës (një VPS me qira që vepron si një server STUN dhe një transmetues i të dhënave nyje për lidhjen). Në këtë artikull do t'ju tregoj se si ia dola pa VPS, por ndërmjetësit mbetën dhe ata ishin serveri STUN dhe Yandex.Disk...
Tuneli i drejtpërdrejtë VPN midis kompjuterëve përmes NAT-ve të ofruesit (pa VPS, duke përdorur serverin STUN dhe Yandex.disk)

Paraqitje

Pasi lexova komentet e postimit të mëparshëm, kuptova se pengesa kryesore e zbatimit ishte përdorimi i një ndërmjetësi - një palë e tretë (VPS) që tregonte parametrat aktualë të nyjes, ku dhe si të lidhej. Duke marrë parasysh rekomandimet për të përdorur këtë STUN (nga të cilat ka shumë) për të përcaktuar parametrat aktual të lidhjes. Para së gjithash, vendosa të përdor TCPDump për të parë përmbajtjen e paketave kur serveri STUN po punonte me klientët dhe merrte përmbajtje plotësisht të palexueshme. Duke kërkuar në google protokollin më ra artikull që përshkruan protokollin. Kuptova se nuk mund ta zbatoja vetë një kërkesë për serverin STUN dhe e vendosa idenë në një "kuti të largët".

teori

Kohët e fundit më duhej të instaloja serverin STUN në Debian nga paketa

# apt install stun-server

dhe në varësi pashë paketën stun-client, por disi nuk i kushtova vëmendje. Por më vonë m'u kujtua paketa stun-client dhe vendosa të kuptoj se si funksionon, pasi kërkova në "Yandex" mora:

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

Në përgjigje mora:

Versioni i klientit STUN 0.97
Porta e hapur 21234 me fd 3
Porta e hapur 21235 me fd 4
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 0

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 4

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 2

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Marrë mesazh stunues: 92 bajt
MappedAddress = <IP ime>:2885
Adresa e Burimit = 216.93.246.18:3478
Adresa e ndryshuar = 216.93.246.17:3479
Atribut i panjohur: 32800
Emri i Serverit = Vovida.org 0.98-CPC
Është marrë mesazh i tipit 257 id=1
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 0

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.17:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 4

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 2

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 0

Gati për të dërguar mesazhe të len 28 te <IP ime>:2885
Marrë mesazh stunues: 28 bajt
Kërkesa për ndryshim = 0
Është marrë mesazh i tipit 1 id=11
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 0

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.17:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 4

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 2

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Marrë mesazh stunues: 92 bajt
MappedAddress = <IP ime>:2885
Adresa e Burimit = 216.93.246.17:3479
Adresa e ndryshuar = 216.93.246.18:3478
Atribut i panjohur: 32800
Emri i Serverit = Vovida.org 0.98-CPC
Është marrë mesazh i tipit 257 id=10
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 4

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 2

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 4

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 2

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 4

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 2

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 4

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 2

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 4

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
Enkodimi i mesazhit të trullosjes:
Kërkesa për ndryshimin e kodimit: 2

Gati për të dërguar mesazhe të lenës 28 në 216.93.246.18:3478
testi I = 1
testi II = 0
testi III = 0
testi I(2) = 1
është nat = 1
IP e hartuar e njëjtë = 1
kapëse flokësh = 1
porta ruajtës = 0
Primar: Harta e pavarur, Filtri i varur nga porti, porta e rastësishme, do të rrisë flokësh
Vlera e kthimit është 0x000006

Varg me vlerë

MappedAddress = <IP ime>:2885

vetëm ajo që ju nevojitet! Ai shfaqi statusin aktual për lidhjen në portin lokal UDP 21234. Por kjo është vetëm gjysma e betejës; lindi pyetja se si t'i transferoni këto të dhëna në hostin në distancë dhe të organizoni një lidhje VPN. Duke përdorur protokollin e postës, apo ndoshta Telegramin?! Ka shumë opsione dhe vendosa të përdor Yandex.disk, që kur hasa artikull rreth punës së Curl përmes WebDav me Yandex.disk. Pasi mendova për zbatimin, dola me skemën e mëposhtme:

  1. Sinjalizoni që nyjet janë gati për të krijuar një lidhje me praninë e një skedari specifik me një vulë kohore në Yandex.disk;
  2. Nëse nyjet janë gati, atëherë merrni parametrat aktualë nga serveri STUN;
  3. Ngarko cilësimet aktuale në Yandex.disk;
  4. Kontrolloni praninë dhe lexoni parametrat e një nyje të largët nga një skedar në Yandex.disk;
  5. Krijimi i një lidhjeje me një host të largët duke përdorur OpenVPN.

Praktikë

Pasi u mendova pak, duke marrë parasysh përvojën e artikullit të fundit, shkrova shpejt një skenar. Do të na duhen:

# apt install openvpn stun-client curl 

Vetë skenari:

versioni origjinal

# 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

Që skenari të funksionojë ju duhet:

  1. Kopjo në clipboard dhe ngjit në redaktues, për shembull:
    # nano vpn8.sh 
  2. specifikoni emrin e përdoruesit dhe fjalëkalimin për Yandex.disk.
  3. në fushën "—ifconfig 10.45.54.(1 ose 2) 255.255.255.252" specifikoni adresën IP të brendshme të ndërfaqes
  4. krijojnë sekret.çelës me komandën:
    # openvpn --genkey --secret secret.key 
  5. bëje skriptin të ekzekutueshëm:
    # chmod +x vpn8.sh
  6. ekzekutoni skenarin:
    # ./vpn8.sh nZbVGBuX5dtturD

    ku nZbVGBuX5dtturD është ID-ja e lidhjes e krijuar këtu

Në nyjen e largët, bëni gjithçka njësoj, përveç gjenerimit të çelësit sekret dhe ID-së së lidhjes, ato duhet të jenë identike.

Versioni i përditësuar (koha duhet të sinkronizohet për funksionimin e duhur):

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

Që skenari të funksionojë ju duhet:

  1. Kopjo në clipboard dhe ngjit në redaktues, për shembull:
    # nano vpn10.sh 
  2. tregoni hyrjen (rreshti 2) dhe fjalëkalimin për Yandex.disk (rreshti i 3-të).
  3. specifikoni adresën IP të brendshme të tunelit (rreshti 4).
  4. bëje skriptin të ekzekutueshëm:
    # chmod +x vpn10.sh
  5. ekzekutoni skenarin:
    # ./vpn10.sh nZbVGBuX5dtturD

    ku nZbVGBuX5dtturD është ID-ja e lidhjes e krijuar këtu

Në nyjen e largët, bëni të njëjtën gjë, specifikoni adresën përkatëse IP të brendshme të tunelit dhe ID-në e lidhjes.

Për të aktivizuar automatikisht skriptin kur është i ndezur, përdor komandën "nohup /<rruga drejt skriptit>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &" që gjendet në skedarin /etc/ rc.vendore

Përfundim

Skripti funksionon, i testuar në Ubuntu (18.04, 19.10, 20.04) dhe Debian 9. Mund të përdorni çdo shërbim tjetër si transmetues, por për përvojë kam përdorur Yandex.disk.
Gjatë eksperimenteve, u zbulua se disa lloje ofruesish NAT nuk lejojnë krijimin e një lidhjeje. Kryesisht nga operatorët celularë ku bllokohen torrentët.

Kam në plan të përmirësohem në drejtim të:

  • Gjenerimi automatik i secret.key sa herë që filloni, kriptoni dhe kopjoni në Yandex.disk për transferim në një nyje të largët (Duke marrë parasysh në versionin e përditësuar)
  • Caktimi automatik i adresave IP të ndërfaqeve
  • Kriptimi i të dhënave para ngarkimit në Yandex.disk
  • Optimizimi i kodit

Le të ketë IPv6 në çdo shtëpi!

Përditësuar! Skedarët më të fundit dhe paketa DEB këtu - yandex.disk

Burimi: www.habr.com

Shto një koment