Túnel VPN directe entre ordinadors mitjançant NAT dels proveïdors (sense VPS, utilitzant el servidor STUN i Yandex.disk)

Extensió Article sobre com vaig aconseguir organitzar un túnel VPN directe entre dos ordinadors situats darrere dels NAT ISP. L'últim article descrivia el procés d'organització d'una connexió amb l'ajuda d'un tercer: un intermediari (un VPS llogat que actua com un servidor STUN i un transmissor de dades de nodes per a la connexió). En aquest article us explicaré com em vaig gestionar sense VPS, però els intermediaris van romandre i eren el servidor STUN i Yandex.Disk ...
Túnel VPN directe entre ordinadors mitjançant NAT dels proveïdors (sense VPS, utilitzant el servidor STUN i Yandex.disk)

Introducció

Després de llegir els comentaris de l'última publicació, em vaig adonar que el principal inconvenient de la implementació era l'ús d'un intermediari: un tercer (VPS) que indicava els paràmetres actuals del node, on i com connectar-se. Tenint en compte les recomanacions per utilitzar un veritable STUN (dels quals n'hi ha molts) per determinar la configuració de connexió actual. En primer lloc, vaig decidir utilitzar TCPDump per mirar el contingut dels paquets quan el servidor STUN treballava amb clients i rebia continguts completament il·legibles. Google va trobar el protocol article que descriu el protocol. Em vaig adonar que no puc implementar una sol·licitud al servidor STUN pel meu compte i deixar la idea.

Теория

Recentment he hagut d'instal·lar un servidor STUN a Debian des del paquet

# apt install stun-server

i a les dependències vaig veure el paquet stun-client, però d'alguna manera no li vaig donar cap importància. Però més tard vaig recordar el paquet stun-client i vaig decidir esbrinar com funciona, buscant a Google i fent servir Yandex:

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

En resposta vaig rebre:

Versió del client STUN 0.97
Port obert 21234 amb fd 3
Port obert 21235 amb fd 4
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 0

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 4

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 2

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Missatge d'aturdiment rebut: 92 bytes
MappedAddress = <La meva IP>:2885
Adreça font = 216.93.246.18:3478
Adreça canviada = 216.93.246.17:3479
Atribut desconegut: 32800
ServerName=Vovida.org 0.98-CPC
Missatge rebut de tipus 257 id=1
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 0

A punt d'enviar el missatge de len 28 al 216.93.246.17:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 4

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 2

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 0

A punt d'enviar el missatge de len 28 a <La meva IP>:2885
Missatge d'aturdiment rebut: 28 bytes
Sol·licitud de canvi = 0
Missatge rebut de tipus 1 id=11
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 0

A punt d'enviar el missatge de len 28 al 216.93.246.17:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 4

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 2

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Missatge d'aturdiment rebut: 92 bytes
MappedAddress = <La meva IP>:2885
Adreça font = 216.93.246.17:3479
Adreça canviada = 216.93.246.18:3478
Atribut desconegut: 32800
ServerName=Vovida.org 0.98-CPC
Missatge rebut de tipus 257 id=10
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 4

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 2

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 4

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 2

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 4

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 2

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 4

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 2

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 4

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
Codificació del missatge d'aturdiment:
Sol·licitud de canvi de codificació: 2

A punt d'enviar el missatge de len 28 al 216.93.246.18:3478
prova I = 1
prova II = 0
prova III = 0
prova I(2) = 1
és nat = 1
IP assignada igual = 1
pinça de cabell = 1
port del preservador = 0
Principal: mapes independents, filtre depenent del port, port aleatori, forquilla
el valor de retorn és 0x000006

Cadena amb valor

MappedAddress = <La meva IP>:2885

just el que necessites! Va mostrar l'estat actual de la connexió al port UDP local 21234. Però aquesta és només la meitat de la batalla, va sorgir la pregunta de com transferir aquestes dades a un host remot i establir una connexió VPN. Utilitzant el protocol de correu, o potser Telegram?! Hi ha moltes opcions i vaig decidir utilitzar Yandex.disk, tal com em vaig trobar un article sobre el treball de Curl mitjançant WebDav amb Yandex.disk. Després de pensar en la implementació, em va ocórrer aquest esquema:

  1. Senyal que els nodes estan preparats per establir una connexió mitjançant la presència d'un fitxer específic amb una marca de temps a Yandex.disk;
  2. Si els nodes estan preparats, obteniu els paràmetres actuals del servidor STUN;
  3. Carregueu la configuració actual a Yandex.disk;
  4. Comproveu la presència i llegiu els paràmetres d'un host remot des d'un fitxer a Yandex.disk;
  5. Establiment d'una connexió amb un host remot mitjançant OpenVPN.

Pràctica

Després d'una mica de reflexió, tenint en compte l'experiència de l'últim article, vaig escriure un guió de pressa. Necessitarem:

# apt install openvpn stun-client curl 

De fet, el guió en si:

versió original

# 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

Perquè el guió funcioni, necessiteu:

  1. Copieu al porta-retalls i enganxeu-los a l'editor, per exemple:
    # nano vpn8.sh 
  2. especifiqueu l'inici de sessió i la contrasenya des de Yandex.disk.
  3. al camp "—ifconfig 10.45.54.(1 o 2) 255.255.255.252" especifiqueu l'adreça IP interna de la interfície
  4. crear clau secreta amb l'ordre:
    # openvpn --genkey --secret secret.key 
  5. fer que l'script sigui executable:
    # chmod +x vpn8.sh
  6. executa l'script:
    # ./vpn8.sh nZbVGBuX5dtturD

    on nZbVGBuX5dtturD és l'identificador de connexió generat aquí

A l'amfitrió remot, feu el mateix, excepte que generi el secret.key i l'identificador de connexió, han de ser idèntics.

Versió actualitzada (per a un treball correcte, s'ha de sincronitzar l'hora):

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

Perquè el guió funcioni, necessiteu:

  1. Copieu al porta-retalls i enganxeu-los a l'editor, per exemple:
    # nano vpn10.sh 
  2. especifiqueu l'inici de sessió (2a línia) i la contrasenya de Yandex.disk (3a línia).
  3. especifica l'adreça IP interna del túnel (4a línia).
  4. fer que l'script sigui executable:
    # chmod +x vpn10.sh
  5. executa l'script:
    # ./vpn10.sh nZbVGBuX5dtturD

    on nZbVGBuX5dtturD és l'identificador de connexió generat aquí

A l'amfitrió remot, feu el mateix, especifiqueu l'adreça IP del túnel intern i l'ID de connexió adequats.

Per executar automàticament l'script a l'inici, faig servir l'ordre "nohup /<camí a l'script>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &" que hi ha al fitxer /etc/rc .local

Conclusió

L'script funciona, provat a Ubuntu (18.04, 19.10, 20.04) i Debian 9. Podeu utilitzar qualsevol altre servei com a transmissor, però per l'experiència he utilitzat Yandex.disk.
Durant els experiments, es va trobar que alguns tipus de proveïdors de NAT no permeten establir una connexió. Majoritàriament d'operadors mòbils, on els torrents estan bloquejats.

Penso millorar en termes de:

  • Generació automàtica de secret.key cada vegada que inicieu, xifrant i copiant a Yandex.disk per a la transmissió a un host remot (considerat a la versió actualitzada)
  • Assignació automàtica d'adreces IP d'interfície
  • Xifratge de dades abans de pujar a Yandex.disk
  • Optimització del codi

Que hi hagi IPv6 a totes les llars!

Actualitzat Els últims fitxers i paquet DEB aquí - yandex.disk

Font: www.habr.com

Afegeix comentari