Direkter VPN-Tunnel zwischen Computern über NATs von Anbietern (ohne VPS, mit STUN-Server und Yandex.disk)

Erweiterung Artikel darüber, wie ich es geschafft habe, einen direkten VPN-Tunnel zwischen zwei Computern zu organisieren, die sich hinter NAT-Anbietern befinden. Der vorherige Artikel beschrieb den Prozess der Organisation einer Verbindung mit Hilfe eines Dritten – eines Vermittlers (ein gemieteter VPS, der so etwas wie ein STUN-Server und ein Knotendatenübermittler für die Verbindung fungiert). In diesem Artikel erzähle ich Ihnen, wie ich ohne VPS ausgekommen bin, aber die Zwischenhändler blieben und es waren der STUN-Server und Yandex.Disk...
Direkter VPN-Tunnel zwischen Computern über Provider-NATs (ohne VPS, mit STUN-Server und Yandex.disk)

Einführung

Nachdem ich die Kommentare des vorherigen Beitrags gelesen hatte, wurde mir klar, dass der Hauptnachteil der Implementierung die Verwendung eines Vermittlers war – eines Dritten (VPS), der die aktuellen Parameter des Knotens sowie den Ort und die Art der Verbindung angab. Unter Berücksichtigung der Empfehlungen zur Verwendung dieses STUN (davon gibt es jede Menge), um die aktuellen Verbindungsparameter zu ermitteln. Zunächst habe ich mich entschieden, TCPDump zu verwenden, um den Inhalt der Pakete zu überprüfen, wenn der STUN-Server mit Clients zusammenarbeitete und völlig unleserliche Inhalte empfing. Beim Googeln des Protokolls bin ich darauf gestoßen Artikel, der das Protokoll beschreibt. Mir wurde klar, dass ich alleine eine Anfrage an den STUN-Server nicht umsetzen konnte und schob die Idee in eine „ferne Kiste“.

Теория

Kürzlich musste ich den STUN-Server unter Debian aus dem Paket installieren

# apt install stun-server

und in den Abhängigkeiten habe ich das Paket stun-client gesehen, aber irgendwie habe ich nicht darauf geachtet. Aber später erinnerte ich mich an das stun-client-Paket und beschloss, herauszufinden, wie es funktioniert. Nachdem ich gegoogelt und in Yandex gesucht hatte, bekam ich Folgendes:

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

Als Antwort erhielt ich:

STUN-Client-Version 0.97
Port 21234 mit fd 3 geöffnet
Port 21235 mit fd 4 geöffnet
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 0

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 4

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 2

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Betäubungsnachricht empfangen: 92 Bytes
MappedAddress = <Meine IP>:2885
Quelladresse = 216.93.246.18:3478
Geänderte Adresse = 216.93.246.17:3479
Unbekanntes Attribut: 32800
Servername = Vovida.org 0.98-CPC
Nachricht vom Typ 257 id=1 empfangen
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 0

Sende gerade eine Nachricht von Len 28 an 216.93.246.17:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 4

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 2

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 0

Sende gerade eine Nachricht von Len 28 an <Meine IP>:2885
Betäubungsnachricht empfangen: 28 Bytes
ChangeRequest = 0
Nachricht vom Typ 1 id=11 empfangen
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 0

Sende gerade eine Nachricht von Len 28 an 216.93.246.17:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 4

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 2

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Betäubungsnachricht empfangen: 92 Bytes
MappedAddress = <Meine IP>:2885
Quelladresse = 216.93.246.17:3479
Geänderte Adresse = 216.93.246.18:3478
Unbekanntes Attribut: 32800
Servername = Vovida.org 0.98-CPC
Nachricht vom Typ 257 id=10 empfangen
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 4

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 2

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 4

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 2

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 4

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 2

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 4

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 2

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 4

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Codierung der Betäubungsnachricht:
Codierung ChangeRequest: 2

Sende gerade eine Nachricht von Len 28 an 216.93.246.18:3478
Test I = 1
Test II = 0
Test III = 0
Test I(2) = 1
ist nat = 1
zugeordnete IP gleich = 1
Haarnadel = 1
Bewahrer-Port = 0
Primär: Unabhängige Zuordnung, portabhängiger Filter, zufälliger Port, Haarnadelkurve
Der Rückgabewert ist 0x000006

String mit Wert

MappedAddress = <Meine IP>:2885

genau das, was Sie brauchen! Es zeigte den aktuellen Status der Verbindung auf dem lokalen UDP-Port 21234 an. Doch das ist nur die halbe Miete, es stellte sich die Frage, wie man diese Daten an den Remote-Host übertragen und eine VPN-Verbindung organisieren kann. Mit dem Mail-Protokoll oder vielleicht Telegram?! Es gibt viele Möglichkeiten und ich habe mich für Yandex.disk entschieden, da ich darauf gestoßen bin Artikel über die Arbeit mit Curl über WebDav mit Yandex.disk. Nachdem ich über die Umsetzung nachgedacht hatte, kam ich auf folgendes Schema:

  1. Signalisieren Sie durch das Vorhandensein einer bestimmten Datei mit Zeitstempel auf Yandex.disk, dass Knoten bereit sind, eine Verbindung herzustellen.
  2. Wenn die Knoten bereit sind, erhalten Sie aktuelle Parameter vom STUN-Server.
  3. Aktuelle Einstellungen auf Yandex.disk hochladen;
  4. Überprüfen Sie das Vorhandensein und lesen Sie die Parameter eines Remote-Knotens aus einer Datei auf Yandex.disk.
  5. Herstellen einer Verbindung mit einem Remote-Host über OpenVPN.

Praxis

Nachdem ich ein wenig nachgedacht und die Erfahrungen des letzten Artikels berücksichtigt hatte, schrieb ich schnell ein Skript. Wir brauchen:

# apt install openvpn stun-client curl 

Das Skript selbst:

Erste Version

# 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

Damit das Skript funktioniert, benötigen Sie:

  1. In die Zwischenablage kopieren und in den Editor einfügen, zum Beispiel:
    # nano vpn8.sh 
  2. Geben Sie den Benutzernamen und das Passwort für Yandex.disk an.
  3. Geben Sie im Feld „—ifconfig 10.45.54.(1 or 2) 255.255.255.252“ die interne IP-Adresse der Schnittstelle an
  4. erstellen geheimer Schlüssel per Befehl:
    # openvpn --genkey --secret secret.key 
  5. Machen Sie das Skript ausführbar:
    # chmod +x vpn8.sh
  6. Führen Sie das Skript aus:
    # ./vpn8.sh nZbVGBuX5dtturD

    Dabei ist nZbVGBuX5dtturD die generierte Verbindungs-ID hier

Gehen Sie auf dem Remote-Knoten genauso vor, mit Ausnahme der Generierung von „secret.key“ und „Verbindungs-ID“. Diese müssen identisch sein.

Aktualisierte Version (Uhrzeit muss für korrekten Betrieb synchronisiert werden):

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

Damit das Skript funktioniert, benötigen Sie:

  1. In die Zwischenablage kopieren und in den Editor einfügen, zum Beispiel:
    # nano vpn10.sh 
  2. Geben Sie den Benutzernamen (2. Zeile) und das Passwort für Yandex.disk (3. Zeile) an.
  3. Geben Sie die interne IP-Adresse des Tunnels an (4. Zeile).
  4. Machen Sie das Skript ausführbar:
    # chmod +x vpn10.sh
  5. Führen Sie das Skript aus:
    # ./vpn10.sh nZbVGBuX5dtturD

    Dabei ist nZbVGBuX5dtturD die generierte Verbindungs-ID hier

Machen Sie auf dem Remote-Knoten dasselbe und geben Sie die entsprechende interne IP-Adresse des Tunnels und die Verbindungs-ID an.

Um das Skript beim Einschalten automatisch auszuführen, verwende ich den Befehl „nohup /<Pfad zum Skript>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &“, der in der Datei /etc/ enthalten ist. rc.local

Abschluss

Das Skript funktioniert, getestet unter Ubuntu (18.04, 19.10, 20.04) und Debian 9. Sie können jeden anderen Dienst als Sender verwenden, aber aus Erfahrungsgründen habe ich Yandex.disk verwendet.
Bei den Experimenten wurde festgestellt, dass einige Arten von NAT-Anbietern den Verbindungsaufbau nicht zulassen. Hauptsächlich von Mobilfunkanbietern, bei denen Torrents blockiert sind.

Ich habe vor, mich in Bezug auf Folgendes zu verbessern:

  • Automatische Generierung von Secret.key bei jedem Start, Verschlüsseln und Kopieren auf Yandex.disk zur Übertragung an einen Remote-Knoten (unter Berücksichtigung in der aktualisierten Version)
  • Automatische Zuweisung von IP-Adressen von Schnittstellen
  • Verschlüsseln von Daten vor dem Hochladen auf Yandex.disk
  • Codeoptimierung

Möge IPv6 in jedem Zuhause sein!

Aktualisiert! Aktuelle Dateien und DEB-Paket hier - yandex.disk

Source: habr.com

Kommentar hinzufügen