Otse VPN-tunnel arvutite vahel läbi teenusepakkujate NAT’ideta (ilma VPS-ta, STUN-serveri ja Yandex.Disk'i abil)

Jätk artikkel kuidas ma suutsin korraldada otse VPN-tunneli kahe arvuti vahel, mis asuvad teenusepakkujate NAT-ide taga. Eelmises artiklis kirjeldati ühenduse loomise protsessi kolmanda poole — vahendaja (renditud VPS töötades mingisuguse STUN-serveri ja andmeedastuspunktina). Selles artiklis räägin, kuidas ma hakkama sain ilma VPS-ita, kuid vahendajad jäid ja need olid STUN-server ja Yandex.Disk…
Otse VPN-tunnel arvutite vahel läbi teenusepakkujate NAT'ide (ilma VPS-ta, kasutades STUN-serverit ja Yandex.disk'i)

Sissejuhatus

Eelmise postituse kommentaare lugedes sain aru, et peamine puudus teostuses oli vahendaja — kolmas osalise (VPS), mis näitas praeguseid sõlme parameetreid, kuhu ja kuidas ühenduda. Arvestades soovitusi kasutada päris STUN (milleid on väga palju) praeguste ühendamise parameetrite määramiseks. Esmalt otsustasin vaadata TCPDump abil STUN-serveri ja klientide vaheliste paketide sisu ning sain täiesti loetamatut sisu. Otsides Google'ist leidsin artikli protokolli kirjeldamisega. Mulle sai selgeks, et ma ei saa iseseisvalt STUN-serveri päringut realiseerida ja panin mõtte "kaugesse sahtlisse".

Teooria

Hiljuti pidin Debianile installima STUN-serveri paketist

# apt install stun-server

ja sõltuvuste hulgas nägin paketti stun-client, kuid ei pööranud sellele tähelepanu. Hiljem aga meenutasin stun-clienti paketti ja otsustasin uurida, kuidas see töötab, otsides Google’ist ja Yandex’ist sain teada:

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

Vastuseks sain:

STUN kliendi versioon 0.97
Avasin portaali 21234 fd 3-ga
Avasin portaali 21235 fd 4-ga
Koodin stun-sõnumi:
Koodin ChangeRequest: 0

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 4

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 2

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Saadud stun-sõnum: 92 baiti
MappedAddress = :2885
SourceAddress = 216.93.246.18:3478
ChangedAddress = 216.93.246.17:3479
Tundmatu atribuut: 32800
ServerName = Vovida.org 0.98-CPC
Saadud sõnum tüübilt 257 id=1
Koodin stun-sõnumi:
Koodin ChangeRequest: 0

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.17:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 4

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 2

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 0

Valmistan saatma sõnumit pikkusega 28 aadressile :2885
Saadud stun-sõnum: 28 baiti
ChangeRequest = 0
Saadud sõnum tüübilt 1 id=11
Koodin stun-sõnumi:
Koodin ChangeRequest: 0

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.17:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 4

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 2

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Saadud stun-sõnum: 92 baiti
MappedAddress = :2885
SourceAddress = 216.93.246.17:3479
ChangedAddress = 216.93.246.18:3478
Tundmatu atribuut: 32800
ServerName = Vovida.org 0.98-CPC
Saadud sõnum tüübilt 257 id=10
Koodin stun-sõnumi:
Koodin ChangeRequest: 4

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 2

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 4

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 2

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 4

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 2

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 4

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 2

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 4

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
Koodin stun-sõnumi:
Koodin ChangeRequest: 2

Valmistan saatma sõnumit pikkusega 28 aadressile 216.93.246.18:3478
test I = 1
test II = 0
test III = 0
test I(2) = 1
on nat = 1
mapped IP sama = 1
hairpin = 1
preserver port = 0
Põhi: Iseseisev kaardistus, pordist sõltuv filter, juhuslik port, juuksepin
Tagastamisväärtus on 0x000006

String väärtusega

MappedAddress = :2885

see just what you need! It displayed the current state for the connection on local UDP port 21234. But that’s just half the job; the question arose on how to transmit this data to a remote node and organize a VPN connection. Using the mail protocol, or maybe Telegram?! There are many options, and I decided to use Yandex.Disk because I came across it. an article about working with Curl through WebDav and Yandex.Disk.. After thinking about the implementation, I came up with the following scheme:

  1. Signal readiness of nodes to establish a connection by the presence of a specific timestamped file on Yandex.Disk;
  2. If the nodes are ready, then receive current parameters from the STUN server;
  3. Upload current parameters to Yandex.Disk;
  4. Check for the presence of and read parameters from the file on Yandex.Disk for the remote node;
  5. Establish a connection with the remote node using OpenVPN.

 

Praktika

After a bit of thought, considering the experience from the previous article, I quickly wrote a script. We will need:

# apt install openvpn stun-client curl 

Tegelik skript:

Initial option

# 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

To run the script, you need to:

  1. Copy to the clipboard and paste it into an editor, for example:
    # nano vpn8.sh 
  2. indicate your Yandex.Disk login and password.
  3. väljas „ifconfig 10.45.54.(1 või 2) 255.255.255.252“ määrata liidese sisemine IP-aadress
  4. luua secret.key käsklusega:
    # openvpn --genkey --secret secret.key 
  5. teha skript täidetavaks:
    # chmod +x vpn8.sh
  6. käivitada skript:
    # ./vpn8.sh nZbVGBuX5dtturD

    kus nZbVGBuX5dtturD — genereeritud ühenduse ID siin

Kaugmasinas teostada kõik sama, välja arvatud secret.key ja ühenduse ID genereerimine, need peavad olema identsed.

Uuendatud versioon (korrektseks tööks peab aeg olema sünkroonitud):

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

To run the script, you need to:

  1. Copy to the clipboard and paste it into an editor, for example:
    # nano vpn10.sh 
  2. anda Yandex.Diski logi (2. rida) ja parool (3. rida).
  3. anda tunnelikasutuse sisemine IP-aadress (4. rida).
  4. teha skript täidetavaks:
    # chmod +x vpn10.sh
  5. käivitada skript:
    # ./vpn10.sh nZbVGBuX5dtturD

    kus nZbVGBuX5dtturD — genereeritud ühenduse ID siin

Kaugmasinas teostada kõik sama, näidates vastavat sisemist IP-aadress tunnelit ja ühenduse ID-d.

Skripti automaatseks käivitamiseks sisse lülitamisel kasutan käsku „nohup //vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &”, mis on failis /etc/rc.local

Kokkuvõte

Skript töötab, on testitud Ubuntu (18.04, 19.10, 20.04) ja Debian 9. Edastajana võib kasutada mis tahes muud teenust, kuid katsetamiseks kasutasin Yandex.Diski.
Eksperimentide käigus leiti, et mõned NAT-pakkujate tüübid ei luba ühenduse loomist. Eelkõige mobiilsete operaatorite puhul, kus torrentid on blokeeritud.

Plaanin täiendada järgmist:

  • Secret.key automaatne genereerimine igal käivitamisel, andmete krüptimine ja kopeerimine Yandex.disk'i edasiviimiseks kaugserverisse (arvestatud värskendatud versioonis)
  • IP-aadresside automaatne määramine liidestele
  • Andmete krüptimine enne Yandex.disk'ile eksportimist
  • Koodi optimeerimine

Olgu IPv6 igas kodus!

Uuendatud! Viimased failid ja DEB-pakett siinyandex.disk

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster