Tunel VPN direct între computere prin NAT-urile furnizorilor (fără VPS, folosind un server STUN și Yandex.Disk)

Continuare recomandările sunt aplicabile coronavirusurilor în general și COVID-19 în particular. Așadar, recomand să descărcați și să printați articolul (pentru cei interesați de acest subiect). despre cum am reușit să organizez un tunel direct VPN- între două computere aflate în spatele NAT-urilor providerilor. În articolul precedent am descris procesul de stabilire a unei conexiuni folosind o terță parte - un intermediar (închiriat VPS care îndeplinea rolul de STUN server și transmițător de date pentru conectare). În acest articol voi povesti cum am reușit fără VPS, dar intermediarii au rămas, fiind STUN server și Yandex.Disk…
Tunel VPN direct între computere prin NAT-urile providerilor (fără VPS, folosind un server STUN și Yandex.Disk)

Introducere

Citind comentariile postării anterioare, am realizat că principalul dezavantaj al implementării a fost utilizarea intermediarului - a treții părți (VPS) care indica parametrii curenți ai nodului, unde și cum să ne conectăm. Având în vedere recomandările de a utiliza un adevărat STUN (care sunt foarte multe) pentru a determina parametrii curenți ai conexiunii. În primul rând, am decis să privesc cu ajutorul TCPDump conținutul pachetelor în timpul funcționării STUN server-ului cu clienții și am obținut un conținut complet ilizibil. Căutând pe Google protocolul, m-am lovit de un articol cu descrierea protocolului. Am realizat că nu pot realiza singur o solicitare către STUN server și am pus ideea într-o „cutie îndepărtată”.

Teorie

Recent, a trebuit să instalez STUN server pe Debian din pachet

# apt install stun-server

și în dependențe am văzut pachetul stun-client, dar nu i-am acordat importanță. Dar mai târziu mi-am amintit despre pachetul stun-client și am decis să înțeleg cum funcționează, căutând pe Google și Yandex am obținut:

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

Ca răspuns am primit:

Versiunea clientului STUN 0.97
Portul 21234 a fost deschis cu fd 3
Portul 21235 a fost deschis cu fd 4
Codificarea mesajului stun:
Codificarea ChangeRequest: 0

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 4

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 2

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Mesajul stun primit: 92 bytes
MappedAddress = :2885
SourceAddress = 216.93.246.18:3478
ChangedAddress = 216.93.246.17:3479
Atribut necunoscut: 32800
ServerName = Vovida.org 0.98-CPC
Mesaj primit de tip 257 id=1
Codificarea mesajului stun:
Codificarea ChangeRequest: 0

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.17:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 4

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 2

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 0

Pe cale să trimit mesaj cu lungimea 28 la :2885
Mesajul stun primit: 28 bytes
ChangeRequest = 0
Mesaj primit de tip 1 id=11
Codificarea mesajului stun:
Codificarea ChangeRequest: 0

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.17:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 4

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 2

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Mesajul stun primit: 92 bytes
MappedAddress = :2885
SourceAddress = 216.93.246.17:3479
ChangedAddress = 216.93.246.18:3478
Atribut necunoscut: 32800
ServerName = Vovida.org 0.98-CPC
Mesaj primit de tip 257 id=10
Codificarea mesajului stun:
Codificarea ChangeRequest: 4

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 2

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 4

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 2

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 4

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 2

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 4

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 2

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 4

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
Codificarea mesajului stun:
Codificarea ChangeRequest: 2

Pe cale să trimit mesaj cu lungimea 28 la 216.93.246.18:3478
test I = 1
test II = 0
test III = 0
test I(2) = 1
este nat = 1
IP-ul mapat la fel = 1
hairpin = 1
portul păstrat = 0
Primary: Independent Mapping, Port Dependent Filter, random port, will hairpin
Valoarea de returnare este 0x000006

Linia cu valoarea

MappedAddress = :2885

este exact ce trebuie! Aceasta reflecta starea curentă pentru conexiunea pe portul UDP local 21234. Dar aceasta este doar jumătate din problemă, a apărut întrebarea cum să transmit aceste date către nodul îndepărtat și să organizez o conexiune VPN. Folosirea unui protocol de poștă, sau poate Telegram?! Sunt multe opțiuni și am decis să folosesc Yandex.Disk, deoarece am dat peste el. articol despre utilizarea Curl prin WebDav cu Yandex.Disk. Gândindu-mă la implementare, am ajuns la următoarea schemă:

  1. A semnaliza disponibilitatea nodurilor pentru stabilirea unei conexiuni prin prezența unui anumit fișier cu un marcaj temporal pe Yandex.Disk;
  2. Dacă nodurile sunt pregătite, obțineți parametrii curenți de la serverul STUN;
  3. Încărcați parametrii curenți pe Yandex.Disk;
  4. Verificați prezența și citiți parametrii nodului remote din fișierul de pe Yandex.Disk;
  5. Stabilirea conexiunii cu nodul remote folosind OpenVPN.

 

Practică

După o mică gândire, având în vedere experiența articolului anterior, am scris rapid un script. Ne va trebui:

# apt install openvpn stun-client curl 

Iată scriptul:

Varianta inițială

# 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

Pentru ca scriptul să funcționeze, trebuie:

  1. Să copiați în clipboard și să lipiți în editor, de exemplu:
    # nano vpn8.sh 
  2. să indicați numele de utilizator și parola de la Yandex.Disk.
  3. în câmpul „—ifconfig 10.45.54.(1 sau 2) 255.255.255.252” să specificați adresa IP internă a interfeței
  4. să creați secret.key cu comanda:
    # openvpn --genkey --secret secret.key 
  5. să faceți scriptul executabil:
    # chmod +x vpn8.sh
  6. să rulați scriptul:
    # ./vpn8.sh nZbVGBuX5dtturD

    unde nZbVGBuX5dtturD — ID-ul conectării generat aici

Pe nodul remote, efectuați tot la fel, cu excepția generării secret.key și ID-ului de conectare, acestea trebuie să fie identice.

Varianta actualizată (pentru funcționarea corectă timpul trebuie să fie sincronizat):

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

Pentru ca scriptul să funcționeze, trebuie:

  1. Să copiați în clipboard și să lipiți în editor, de exemplu:
    # nano vpn10.sh 
  2. să indicați numele de utilizator (linia 2) și parola de la Yandex.Disk (linia 3).
  3. să specificați adresa IP internă a tunelului (linia 4).
  4. să faceți scriptul executabil:
    # chmod +x vpn10.sh
  5. să rulați scriptul:
    # ./vpn10.sh nZbVGBuX5dtturD

    unde nZbVGBuX5dtturD — ID-ul conectării generat aici

Pe nodul remote, efectuați tot la fel, specificând adresa internă corespunzătoare Adresă IP a tunelului și ID-ul de conectare.

Pentru autostartul scriptului la pornire, folosesc comanda „nohup //vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &” conținută în fișierul /etc/rc.local

Concluzie

Scriptul funcționează, testat pe Ubuntu (18.04, 19.10, 20.04) și Debian 9. Ca transmisie, se poate folosi orice alt serviciu, dar pentru experiment am folosit Yandex.Disk.
În cadrul experimentelor, s-a descoperit că unele tipuri de NAT ale providerilor nu permit stabilirea unei conexiuni. În principal, în rândul operatorilor de telefonie mobilă, unde torrenturile sunt blocate.

Plănuiesc să lucrez la:

  • Generarea automată a secret.key de fiecare dată la pornire, criptarea și copierea pe Yandex.Disk pentru transmiterea la nodul remote (luat în considerare în varianta actualizată)
  • Atribuirea automată a adreselor IP ale interfețelor
  • Criptarea datelor înainte de a le încărca pe Yandex.Disk
  • Optimizarea codului

Să fie IPv6 în fiecare casă!

Actualizat! Ultimele fișiere și pachetul DEB aici — yandex.disk

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster