Directe VPN-tunnel tussen computers via NAT's van providers (zonder VPS, met behulp van STUN-server en Yandex.disk)

Uitbreiding Artikel over hoe ik erin slaagde een directe VPN-tunnel te organiseren tussen twee computers achter NAT-providers. In het vorige artikel werd het proces beschreven van het organiseren van een verbinding met de hulp van een derde partij - een tussenpersoon (een gehuurde VPS die fungeert als zoiets als een STUN-server en een knooppuntgegevenszender voor de verbinding). In dit artikel zal ik je vertellen hoe ik het zonder VPS heb gedaan, maar de tussenpersonen bleven bestaan ​​en dat waren de STUN-server en Yandex.Disk...
Directe VPN-tunnel tussen computers via NAT's van providers (zonder VPS, met behulp van STUN-server en Yandex.disk)

Introductie

Na het lezen van de opmerkingen van het vorige bericht, realiseerde ik me dat het belangrijkste nadeel van de implementatie het gebruik van een tussenpersoon was - een derde partij (VPS) die de huidige parameters van het knooppunt aangaf, waar en hoe verbinding moest worden gemaakt. Gezien de aanbevelingen om deze STUN te gebruiken (waarvan er veel zijn) om de huidige verbindingsparameters te bepalen. Allereerst besloot ik TCPDump te gebruiken om naar de inhoud van de pakketten te kijken wanneer de STUN-server met clients werkte en volledig onleesbare inhoud ontving. Googlen op het protocol kwam ik tegen artikel waarin het protocol wordt beschreven. Ik besefte dat ik een verzoek aan de STUN-server niet alleen kon implementeren en stopte het idee in een “verre doos”.

Теория

Onlangs moest ik STUN-server op Debian vanuit het pakket installeren

# apt install stun-server

en in de afhankelijkheden zag ik het stun-client-pakket, maar op de een of andere manier lette ik er niet op. Maar later herinnerde ik me het stun-client-pakket en besloot uit te zoeken hoe het werkt. Na googlen en zoeken in Yandex kreeg ik:

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

Als reactie ontving ik:

STUN-clientversie 0.97
Poort 21234 geopend met fd 3
Poort 21235 geopend met fd 4
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 0

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 4

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 2

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Ontvangen verdovingsbericht: 92 bytes
MappedAddress = <Mijn IP>:2885
Bronadres = 216.93.246.18:3478
Gewijzigd adres = 216.93.246.17:3479
Onbekend attribuut: 32800
Servernaam = Vovida.org 0.98-CPC
Ontvangen bericht van type 257 id=1
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 0

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.17:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 4

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 2

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 0

Staat op het punt een bericht van len 28 te verzenden naar <Mijn IP>:2885
Ontvangen verdovingsbericht: 28 bytes
Wijzigingsverzoek = 0
Ontvangen bericht van type 1 id=11
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 0

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.17:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 4

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 2

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Ontvangen verdovingsbericht: 92 bytes
MappedAddress = <Mijn IP>:2885
Bronadres = 216.93.246.17:3479
Gewijzigd adres = 216.93.246.18:3478
Onbekend attribuut: 32800
Servernaam = Vovida.org 0.98-CPC
Ontvangen bericht van type 257 id=10
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 4

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 2

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 4

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 2

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 4

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 2

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 4

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 2

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 4

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
Codering van het verdovingsbericht:
Coderingswijzigingsverzoek: 2

Staat op het punt een bericht van len 28 te sturen naar 216.93.246.18:3478
proef ik = 1
proef II = 0
proef III = 0
proef I(2) = 1
is nat = 1
toegewezen IP hetzelfde = 1
haarspeld = 1
Conservatorpoort = 0
Primair: Onafhankelijke mapping, poortafhankelijk filter, willekeurige poort, zal haarspeld worden
De retourwaarde is 0x000006

Tekenreeks met waarde

MappedAddress = <Mijn IP>:2885

precies wat je nodig hebt! Het toonde de huidige status van de verbinding op de lokale UDP-poort 21234. Maar dit is slechts het halve werk: de vraag rees hoe deze gegevens naar de externe host konden worden overgedragen en een VPN-verbinding kon worden georganiseerd. Via het mailprotocol, of misschien Telegram?! Er zijn veel opties en ik besloot Yandex.disk te gebruiken, aangezien ik het tegenkwam artikel over het werken met Curl via WebDav met Yandex.disk. Nadat ik over de implementatie had nagedacht, kwam ik op het volgende schema:

  1. Geef aan dat knooppunten klaar zijn om een ​​verbinding tot stand te brengen door de aanwezigheid van een specifiek bestand met een tijdstempel op Yandex.disk;
  2. Als de knooppunten gereed zijn, ontvang dan de huidige parameters van de STUN-server;
  3. Upload huidige instellingen naar Yandex.disk;
  4. Controleer de aanwezigheid en lees parameters van een extern knooppunt uit een bestand op Yandex.disk;
  5. Een verbinding tot stand brengen met een externe host met behulp van OpenVPN.

Praktijk

Na een beetje nadenken, rekening houdend met de ervaring van het laatste artikel, heb ik snel een script geschreven. Wij hebben nodig:

# apt install openvpn stun-client curl 

Het script zelf:

originele versie

# 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

Om het script te laten werken, heb je nodig:

  1. Kopieer naar klembord en plak in de editor, bijvoorbeeld:
    # nano vpn8.sh 
  2. geef de gebruikersnaam en het wachtwoord voor Yandex.disk op.
  3. in het veld "—ifconfig 10.45.54.(1 of 2) 255.255.255.252" specificeert u het interne IP-adres van de interface
  4. creëren geheime sleutel met het commando:
    # openvpn --genkey --secret secret.key 
  5. maak het script uitvoerbaar:
    # chmod +x vpn8.sh
  6. voer het script uit:
    # ./vpn8.sh nZbVGBuX5dtturD

    waarbij nZbVGBuX5dtturD de gegenereerde verbindings-ID is hier

Op het externe knooppunt doet u alles hetzelfde, behalve het genereren van secret.key en verbindings-ID. Deze moeten identiek zijn.

Bijgewerkte versie (de tijd moet worden gesynchroniseerd voor een correcte werking):

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

Om het script te laten werken, heb je nodig:

  1. Kopieer naar klembord en plak in de editor, bijvoorbeeld:
    # nano vpn10.sh 
  2. geef de login (2e regel) en wachtwoord voor Yandex.disk (3e regel) aan.
  3. specificeer het interne IP-adres van de tunnel (4e regel).
  4. maak het script uitvoerbaar:
    # chmod +x vpn10.sh
  5. voer het script uit:
    # ./vpn10.sh nZbVGBuX5dtturD

    waarbij nZbVGBuX5dtturD de gegenereerde verbindings-ID is hier

Doe hetzelfde op het externe knooppunt en geef het overeenkomstige interne IP-adres van de tunnel en de verbindings-ID op.

Om het script automatisch uit te voeren wanneer het is ingeschakeld, gebruik ik de opdracht “nohup /<pad naar het script>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &” in het bestand /etc/ rc.lokaal

Conclusie

Het script werkt, getest op Ubuntu (18.04, 19.10, 20.04) en Debian 9. Je kunt elke andere service als zender gebruiken, maar voor ervaring heb ik Yandex.disk gebruikt.
Tijdens de experimenten werd ontdekt dat sommige typen NAT-providers het tot stand brengen van een verbinding niet toestaan. Voornamelijk van mobiele operators waar torrents worden geblokkeerd.

Ik ben van plan om te verbeteren op het gebied van:

  • Automatisch genereren van secret.key elke keer dat u start, codeert en kopieert naar Yandex.disk voor overdracht naar een extern knooppunt (rekening houdend met de bijgewerkte versie)
  • Automatische toewijzing van IP-adressen van interfaces
  • Gegevens coderen voordat ze worden geüpload naar Yandex.disk
  • Code-optimalisatie

Zorg ervoor dat er IPv6 in elk huis is!

Bijgewerkt! Laatste bestanden en DEB-pakket hier - yandex.schijf

Bron: www.habr.com

Voeg een reactie