Tiešs VPN tunelis starp datoriem, izmantojot pakalpojumu sniedzēja NAT (bez VPS, izmantojot STUN serveri un Yandex.disk)

Pagarināšana Raksts par to, kā man izdevās noorganizēt tiešu VPN tuneli starp diviem datoriem, kas atrodas aiz NAT nodrošinātājiem. Iepriekšējā rakstā tika aprakstīts savienojuma organizēšanas process ar trešās puses - starpnieka (īrēta VPS, kas darbojas kā STUN serveris un mezgla datu pārraidītājs savienojumam) palīdzību. Šajā rakstā es pastāstīšu, kā es iztiku bez VPS, bet starpnieki palika un tie bija STUN serveris un Yandex.Disk...
Tiešs VPN tunelis starp datoriem, izmantojot pakalpojumu sniedzēja NAT (bez VPS, izmantojot STUN serveri un Yandex.disk)

Ievads

Izlasot iepriekšējā ieraksta komentārus, sapratu, ka galvenais realizācijas trūkums bija starpnieka – trešās puses (VPS) izmantošana, kas norādīja mezgla pašreizējos parametrus, kur un kā pieslēgties. Ņemot vērā ieteikumus izmantot šo STUN (kuru ir daudz), lai noteiktu pašreizējos savienojuma parametrus. Pirmkārt, es nolēmu izmantot TCPDump, lai apskatītu pakešu saturu, kad STUN serveris strādāja ar klientiem un saņēma pilnīgi nelasāmu saturu. Googlē uzzināju protokolu pants, kurā aprakstīts protokols. Es sapratu, ka nevaru patstāvīgi īstenot pieprasījumu STUN serverim, un ieliku ideju "tālā kastē".

Теория

Nesen man bija jāinstalē STUN serveris uz Debian no pakotnes

# apt install stun-server

un atkarībās es redzēju apdullināšanas-klienta paketi, bet kaut kā nepievērsu tai uzmanību. Bet vēlāk es atcerējos par apdullināšanas klienta pakotni un nolēmu izdomāt, kā tas darbojas, pēc googlēšanas un meklēšanas Yandex es saņēmu:

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

Atbildē saņēmu:

STUN klienta versija 0.97
Atvērts ports 21234 ar fd 3
Atvērts ports 21235 ar fd 4
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 0

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 4

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 2

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Saņemtais apdullināšanas ziņojums: 92 baiti
MappedAddress = <Mans IP>:2885
Avota adrese = 216.93.246.18:3478
Mainīta adrese = 216.93.246.17:3479
Nezināms atribūts: 32800
Servera nosaukums = Vovida.org 0.98 CPC
Saņemts 257. tipa ziņojums id=1
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 0

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.17:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 4

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 2

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 0

Tiks nosūtīts īsziņas par len 28 uz <My IP>:2885
Saņemtais apdullināšanas ziņojums: 28 baiti
ChangeRequest = 0
Saņemts 1. tipa ziņojums id=11
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 0

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.17:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 4

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 2

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Saņemtais apdullināšanas ziņojums: 92 baiti
MappedAddress = <Mans IP>:2885
Avota adrese = 216.93.246.17:3479
Mainīta adrese = 216.93.246.18:3478
Nezināms atribūts: 32800
Servera nosaukums = Vovida.org 0.98 CPC
Saņemts 257. tipa ziņojums id=10
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 4

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 2

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 4

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 2

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 4

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 2

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 4

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 2

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 4

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
Apdullināšanas ziņojuma kodēšana:
Kodējums ChangeRequest: 2

Tiks nosūtīts īsziņas par len 28 uz 216.93.246.18:3478
tests I = 1
tests II = 0
III tests = 0
tests I(2) = 1
ir nat = 1
kartētā IP vienāda = 1
matadata = 1
konservatora ports = 0
Primārais: neatkarīga kartēšana, portatkarīgais filtrs, nejaušs ports, matadata
Atgriešanas vērtība ir 0x000006

Virkne ar vērtību

MappedAddress = <Mans IP>:2885

tieši tas, kas tev vajadzīgs! Tas rādīja pašreizējo savienojuma statusu vietējā UDP portā 21234. Bet tā ir tikai puse no kaujas; radās jautājums, kā pārsūtīt šos datus uz attālo resursdatoru un organizēt VPN savienojumu. Izmantojot pasta protokolu, vai varbūt Telegramu?! Ir daudz iespēju, un es nolēmu izmantot Yandex.disk, jo es saskāros raksts par Curl darbu, izmantojot WebDav, izmantojot Yandex.disk. Apdomājot ieviešanu, es nonācu pie šādas shēmas:

  1. Signāls, ka mezgli ir gatavi izveidot savienojumu, ja Yandex.disk ir konkrēts fails ar laika zīmogu;
  2. Ja mezgli ir gatavi, saņemiet pašreizējos parametrus no STUN servera;
  3. Augšupielādējiet pašreizējos iestatījumus vietnē Yandex.disk;
  4. Pārbaudiet attālā mezgla klātbūtni un nolasiet parametrus no faila vietnē Yandex.disk;
  5. Savienojuma izveide ar attālo resursdatoru, izmantojot OpenVPN.

Prakse

Nedaudz padomājot, ņemot vērā pēdējā raksta pieredzi, ātri uzrakstīju scenāriju. Mums būs nepieciešams:

# apt install openvpn stun-client curl 

Pats skripts:

oriģinālā versija

# 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

Lai skripts darbotos, jums ir nepieciešams:

  1. Kopējiet starpliktuvē un ielīmējiet redaktorā, piemēram:
    # nano vpn8.sh 
  2. norādiet Yandex.disk lietotājvārdu un paroli.
  3. laukā "—ifconfig 10.45.54.(1 or 2) 255.255.255.252" norādiet interfeisa iekšējo IP adresi.
  4. izveidot noslēpums.atslēga pēc komandas:
    # openvpn --genkey --secret secret.key 
  5. padarīt skriptu izpildāmu:
    # chmod +x vpn8.sh
  6. palaist skriptu:
    # ./vpn8.sh nZbVGBuX5dtturD

    kur nZbVGBuX5dtturD ir ģenerētais savienojuma ID šeit

Attālajā mezglā dariet visu tāpat, izņemot Secret.key un savienojuma ID ģenerēšanu, tiem ir jābūt identiskiem.

Atjaunināta versija (laikam jābūt sinhronizētam, lai darbotos pareizi):

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

Lai skripts darbotos, jums ir nepieciešams:

  1. Kopējiet starpliktuvē un ielīmējiet redaktorā, piemēram:
    # nano vpn10.sh 
  2. norādiet pieteikšanās vārdu (2. rinda) un paroli Yandex.disk (3. rinda).
  3. norādiet tuneļa iekšējo IP adresi (4. rinda).
  4. padarīt skriptu izpildāmu:
    # chmod +x vpn10.sh
  5. palaist skriptu:
    # ./vpn10.sh nZbVGBuX5dtturD

    kur nZbVGBuX5dtturD ir ģenerētais savienojuma ID šeit

Attālajā mezglā rīkojieties tāpat, norādiet atbilstošo tuneļa iekšējo IP adresi un savienojuma ID.

Lai automātiski palaistu skriptu, kad tas ir ieslēgts, es izmantoju komandu “nohup /<ceļš uz skriptu>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &”, kas atrodas failā /etc/ rc.local

Secinājums

Skripts darbojas, pārbaudīts uz Ubuntu (18.04, 19.10, 20.04) un Debian 9. Kā raidītāju varat izmantot jebkuru citu servisu, bet pieredzei izmantoju Yandex.disk.
Eksperimentu laikā tika atklāts, ka daži NAT nodrošinātāju veidi neļauj izveidot savienojumu. Galvenokārt no mobilo sakaru operatoriem, kur torrenti tiek bloķēti.

Es plānoju pilnveidoties šādos aspektos:

  • Automātiska secret.key ģenerēšana katru reizi, kad startējat, šifrējiet un kopējiet uz Yandex.disk pārsūtīšanai uz attālo mezglu (Ņemot vērā atjauninātajā versijā)
  • Automātiska saskarņu IP adrešu piešķiršana
  • Datu šifrēšana pirms augšupielādes vietnē Yandex.disk
  • Koda optimizācija

Lai katrā mājā ir IPv6!

Atjaunināts! Jaunākie faili un DEB pakotne šeit Sākot no yandex.disk

Avots: www.habr.com

Pievieno komentāru