Tunnel VPN direct entre les ordinateurs via les NAT des fournisseurs (sans VPS, en utilisant le serveur STUN et Yandex.disk)

Extension articles sur la façon dont j'ai réussi à organiser un tunnel VPN direct entre deux ordinateurs situés derrière les fournisseurs NAT. L'article précédent décrivait le processus d'organisation d'une connexion avec l'aide d'un tiers - un intermédiaire (un VPS loué agissant comme quelque chose comme un serveur STUN et un émetteur de données de nœud pour la connexion). Dans cet article je vais vous raconter comment j'ai réussi sans VPS, mais les intermédiaires sont restés et c'étaient le serveur STUN et Yandex.Disk...
Tunnel VPN direct entre ordinateurs via les NAT du fournisseur (sans VPS, en utilisant le serveur STUN et Yandex.disk)

introduction

Après avoir lu les commentaires du post précédent, j'ai réalisé que le principal inconvénient de la mise en œuvre était l'utilisation d'un intermédiaire - un tiers (VPS) qui indiquait les paramètres actuels du nœud, où et comment se connecter. Compte tenu des recommandations d'utilisation de ce STUN (dont il y en a beaucoup) pour déterminer les paramètres de connexion actuels. Tout d'abord, j'ai décidé d'utiliser TCPDump pour examiner le contenu des paquets lorsque le serveur STUN travaillait avec des clients et recevait un contenu complètement illisible. En recherchant sur Google le protocole que j'ai rencontré article décrivant le protocole. J'ai réalisé que je ne pouvais pas implémenter moi-même une requête au serveur STUN et mettre l'idée dans une « boîte distante ».

Теория

Récemment, j'ai dû installer le serveur STUN sur Debian à partir du package

# apt install stun-server

et dans les dépendances, j'ai vu le package stun-client, mais d'une manière ou d'une autre, je n'y ai pas prêté attention. Mais plus tard, je me suis souvenu du package Stun-Client et j'ai décidé de comprendre comment cela fonctionnait. Après avoir cherché sur Google et recherché dans Yandex, j'ai obtenu :

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

En réponse j'ai reçu :

Client STUN version 0.97
Port ouvert 21234 avec fd 3
Port ouvert 21235 avec fd 4
Encodage du message paralysant :
Encodage ChangeRequest : 0

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Encodage du message paralysant :
Encodage ChangeRequest : 4

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Encodage du message paralysant :
Encodage ChangeRequest : 2

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Message paralysant reçu : 92 octets
MappedAddress = <Mon IP>:2885
AdresseSource = 216.93.246.18:3478
Adresse modifiée = 216.93.246.17:3479
Attribut inconnu : 32800
Nom du serveur = Vovida.org 0.98-CPC
Message reçu de type 257 id=1
Encodage du message paralysant :
Encodage ChangeRequest : 0

Sur le point d'envoyer le message de len 28 au 216.93.246.17:3478
Encodage du message paralysant :
Encodage ChangeRequest : 4

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Encodage du message paralysant :
Encodage ChangeRequest : 2

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Encodage du message paralysant :
Encodage ChangeRequest : 0

Sur le point d'envoyer le message de len 28 à <Mon IP> :2885
Message paralysant reçu : 28 octets
Demande de changement = 0
Message reçu de type 1 id=11
Encodage du message paralysant :
Encodage ChangeRequest : 0

Sur le point d'envoyer le message de len 28 au 216.93.246.17:3478
Encodage du message paralysant :
Encodage ChangeRequest : 4

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Encodage du message paralysant :
Encodage ChangeRequest : 2

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Message paralysant reçu : 92 octets
MappedAddress = <Mon IP>:2885
AdresseSource = 216.93.246.17:3479
Adresse modifiée = 216.93.246.18:3478
Attribut inconnu : 32800
Nom du serveur = Vovida.org 0.98-CPC
Message reçu de type 257 id=10
Encodage du message paralysant :
Encodage ChangeRequest : 4

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Encodage du message paralysant :
Encodage ChangeRequest : 2

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Encodage du message paralysant :
Encodage ChangeRequest : 4

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Encodage du message paralysant :
Encodage ChangeRequest : 2

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Encodage du message paralysant :
Encodage ChangeRequest : 4

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Encodage du message paralysant :
Encodage ChangeRequest : 2

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Encodage du message paralysant :
Encodage ChangeRequest : 4

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Encodage du message paralysant :
Encodage ChangeRequest : 2

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Encodage du message paralysant :
Encodage ChangeRequest : 4

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
Encodage du message paralysant :
Encodage ChangeRequest : 2

Sur le point d'envoyer le message de len 28 au 216.93.246.18:3478
essai I = 1
essai II = 0
essai III = 0
test I(2) = 1
est nat = 1
IP mappée identique = 1
épingle à cheveux = 1
port de préservation = 0
Primaire : cartographie indépendante, filtre dépendant du port, port aléatoire, épingle à cheveux
La valeur de retour est 0x000006

Chaîne avec valeur

MappedAddress = <Mon IP>:2885

juste ce dont vous avez besoin ! Il affichait l'état actuel de la connexion sur le port UDP local 21234. Mais ce n'est que la moitié de la bataille : la question s'est posée de savoir comment transférer ces données vers l'hôte distant et organiser une connexion VPN. En utilisant le protocole de messagerie, ou peut-être Telegram ?! Il existe de nombreuses options et j'ai décidé d'utiliser Yandex.disk, depuis que je suis tombé sur article sur le travail de Curl via WebDav avec Yandex.disk. Après réflexion sur la mise en œuvre, j'ai proposé le schéma suivant :

  1. Signalez que les nœuds sont prêts à établir une connexion par la présence d'un fichier spécifique avec un horodatage sur Yandex.disk ;
  2. Si les nœuds sont prêts, recevez les paramètres actuels du serveur STUN ;
  3. Téléchargez les paramètres actuels sur Yandex.disk ;
  4. Vérifiez la présence et lisez les paramètres d'un nœud distant à partir d'un fichier sur Yandex.disk ;
  5. Établir une connexion avec un hôte distant à l'aide d'OpenVPN.

Pratique

Après avoir réfléchi un peu, compte tenu de l'expérience du dernier article, j'ai rapidement écrit un scénario. Nous aurons besoin:

# apt install openvpn stun-client curl 

Le scénario lui-même :

version originale

# 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

Pour que le script fonctionne, vous avez besoin de :

  1. Copiez dans le presse-papiers et collez dans l'éditeur, par exemple :
    # nano vpn8.sh 
  2. spécifiez le nom d'utilisateur et le mot de passe pour Yandex.disk.
  3. dans le champ "—ifconfig 10.45.54.(1 ou 2) 255.255.255.252" précisez l'adresse IP interne de l'interface
  4. créer clef secrète par commande :
    # openvpn --genkey --secret secret.key 
  5. rendre le script exécutable :
    # chmod +x vpn8.sh
  6. exécutez le script :
    # ./vpn8.sh nZbVGBuX5dtturD

    où nZbVGBuX5dtturD est l'ID de connexion généré ici

Sur le nœud distant, faites tout de même sauf pour générer secret.key et ID de connexion, ils doivent être identiques.

Version mise à jour (l'heure doit être synchronisée pour un fonctionnement correct) :

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

Pour que le script fonctionne, vous avez besoin de :

  1. Copiez dans le presse-papiers et collez dans l'éditeur, par exemple :
    # nano vpn10.sh 
  2. indiquez le login (2ème ligne) et le mot de passe pour Yandex.disk (3ème ligne).
  3. précisez l'adresse IP interne du tunnel (4ème ligne).
  4. rendre le script exécutable :
    # chmod +x vpn10.sh
  5. exécutez le script :
    # ./vpn10.sh nZbVGBuX5dtturD

    où nZbVGBuX5dtturD est l'ID de connexion généré ici

Sur le nœud distant, faites de même, spécifiez l'adresse IP interne correspondante du tunnel et l'ID de connexion.

Pour exécuter automatiquement le script lorsqu'il est activé, j'utilise la commande « nohup /<chemin d'accès au script>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null & » contenue dans le fichier /etc/ rc.local

Conclusion

Le script fonctionne, testé sur Ubuntu (18.04, 19.10, 20.04) et Debian 9. Vous pouvez utiliser n'importe quel autre service comme émetteur, mais pour l'expérience, j'ai utilisé Yandex.disk.
Au cours des expérimentations, il a été découvert que certains types de fournisseurs NAT ne permettent pas d'établir une connexion. Principalement auprès des opérateurs mobiles où les torrents sont bloqués.

Je compte m'améliorer en termes de :

  • Génération automatique de secret.key à chaque démarrage, chiffrement et copie sur Yandex.disk pour transfert vers un nœud distant (prise en compte dans la version mise à jour)
  • Attribution automatique des adresses IP des interfaces
  • Cryptage des données avant de les télécharger sur Yandex.disk
  • Optimisation du code

Qu'il y ait IPv6 dans chaque foyer !

Mis à jour! Derniers fichiers et package DEB ici - yandex.disk

Source: habr.com

Ajouter un commentaire