Přímý VPN tunel mezi počítači přes poskytovatele NAT (bez VPS, pomocí STUN serveru a Yandex.disk)

Prodloužení články o tom, jak se mi podařilo zorganizovat přímý VPN tunel mezi dvěma počítači umístěnými za poskytovateli NAT. Předchozí článek popisoval proces organizování spojení za pomoci třetí strany – zprostředkovatele (pronajaté VPS fungující jako něco jako STUN server a node datový vysílač pro spojení). V tomto článku vám řeknu, jak jsem si poradil bez VPS, ale prostředníci zůstali a byli to STUN server a Yandex.Disk...
Přímý VPN tunel mezi počítači přes poskytovatele NAT (bez VPS, pomocí STUN serveru a Yandex.disk)

úvod

Po přečtení komentářů k předchozímu příspěvku jsem si uvědomil, že hlavním nedostatkem implementace bylo použití prostředníka – třetí strany (VPS), která udávala aktuální parametry uzlu, kam a jak se připojit. S ohledem na doporučení používat tento STUN (kterých je hodně) k určení aktuálních parametrů připojení. Nejprve jsem se rozhodl použít TCPDump k prohlížení obsahu paketů, když STUN server pracoval s klienty a obdržel zcela nečitelný obsah. Googlil jsem protokol, na který jsem narazil článek popisující protokol. Uvědomil jsem si, že nemohu sám implementovat požadavek na server STUN a vložil myšlenku do „vzdálené krabice“.

Teorie

Nedávno jsem musel nainstalovat STUN server na Debian z balíčku

# apt install stun-server

a v závislostech jsem viděl balíček stun-client, ale nějak jsem tomu nevěnoval pozornost. Ale později jsem si vzpomněl na balíček stun-client a rozhodl jsem se zjistit, jak to funguje, po googlování a hledání v Yandexu jsem dostal:

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

Jako odpověď jsem obdržel:

Verze klienta STUN 0.97
Otevřený port 21234 s fd 3
Otevřený port 21235 s fd 4
Kódování omračující zprávy:
Požadavek na změnu kódování: 0

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 4

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 2

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Přijatá omračující zpráva: 92 bajtů
MappedAddress = <Moje IP>:2885
SourceAddress = 216.93.246.18:3478
Změněná adresa = 216.93.246.17:3479
Neznámý atribut: 32800
ServerName = Vovida.org 0.98-CPC
Přijatá zpráva typu 257 id=1
Kódování omračující zprávy:
Požadavek na změnu kódování: 0

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.17:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 4

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 2

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 0

Chystáte se odeslat zprávu len 28 na <Moje IP>:2885
Přijatá omračující zpráva: 28 bajtů
Požadavek na změnu = 0
Přijatá zpráva typu 1 id=11
Kódování omračující zprávy:
Požadavek na změnu kódování: 0

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.17:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 4

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 2

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Přijatá omračující zpráva: 92 bajtů
MappedAddress = <Moje IP>:2885
SourceAddress = 216.93.246.17:3479
Změněná adresa = 216.93.246.18:3478
Neznámý atribut: 32800
ServerName = Vovida.org 0.98-CPC
Přijatá zpráva typu 257 id=10
Kódování omračující zprávy:
Požadavek na změnu kódování: 4

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 2

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 4

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 2

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 4

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 2

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 4

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 2

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 4

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
Kódování omračující zprávy:
Požadavek na změnu kódování: 2

Chystáte se odeslat zprávu len 28 na číslo 216.93.246.18:3478
test I = 1
test II = 0
test III = 0
test I(2) = 1
je nat = 1
mapovaná IP stejná = 1
vlásenka = 1
port pro zachování = 0
Primární: Nezávislé mapování, filtr závislý na portu, náhodný port, bude vlásenka
Návratová hodnota je 0x000006

Řetězec s hodnotou

MappedAddress = <Moje IP>:2885

právě to, co potřebujete! Zobrazoval aktuální stav připojení na místním portu UDP 21234. To je ale jen polovina úspěchu, vyvstala otázka, jak tato data přenést na vzdálený hostitel a zorganizovat připojení VPN. Pomocí poštovního protokolu, nebo snad Telegramu?! Existuje mnoho možností a rozhodl jsem se použít Yandex.disk, protože jsem narazil článek o práci Curl přes WebDav s Yandex.disk. Po přemýšlení o implementaci jsem přišel s následujícím schématem:

  1. Signál, že uzly jsou připraveny navázat spojení, přítomností konkrétního souboru s časovým razítkem na Yandex.disk;
  2. Pokud jsou uzly připraveny, přijměte aktuální parametry ze serveru STUN;
  3. Nahrajte aktuální nastavení na Yandex.disk;
  4. Zkontrolujte přítomnost a čtěte parametry vzdáleného uzlu ze souboru na Yandex.disk;
  5. Navázání spojení se vzdáleným hostitelem pomocí OpenVPN.

Praxe

Po malém přemýšlení, s přihlédnutím ke zkušenostem z minulého článku, jsem rychle napsal scénář. Budeme potřebovat:

# apt install openvpn stun-client curl 

Samotný skript:

Počáteční verze

# 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

Aby skript fungoval, potřebujete:

  1. Zkopírujte do schránky a vložte do editoru, například:
    # nano vpn8.sh 
  2. zadejte uživatelské jméno a heslo pro Yandex.disk.
  3. v poli „—ifconfig 10.45.54.(1 nebo 2) 255.255.255.252“ zadejte interní IP adresu rozhraní
  4. vytvořit tajný klíč s příkazem:
    # openvpn --genkey --secret secret.key 
  5. udělat skript spustitelný:
    # chmod +x vpn8.sh
  6. spusťte skript:
    # ./vpn8.sh nZbVGBuX5dtturD

    kde nZbVGBuX5dtturD je vygenerované ID připojení zde

Na vzdáleném uzlu proveďte vše stejně kromě vygenerování tajného klíče a ID připojení, musí být totožné.

Aktualizovaná verze (pro správnou funkci musí být čas synchronizován):

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

Aby skript fungoval, potřebujete:

  1. Zkopírujte do schránky a vložte do editoru, například:
    # nano vpn10.sh 
  2. uveďte přihlašovací jméno (2. řádek) a heslo pro Yandex.disk (3. řádek).
  3. zadejte vnitřní IP adresu tunelu (4. řádek).
  4. udělat skript spustitelný:
    # chmod +x vpn10.sh
  5. spusťte skript:
    # ./vpn10.sh nZbVGBuX5dtturD

    kde nZbVGBuX5dtturD je vygenerované ID připojení zde

Na vzdáleném uzlu proveďte totéž, zadejte odpovídající interní IP adresu tunelu a ID připojení.

K automatickému spuštění skriptu, když je zapnutý, používám příkaz „nohup /<cesta ke skriptu>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &“ obsažený v souboru /etc/ rc.místní

Závěr

Skript funguje, testováno na Ubuntu (18.04, 19.10, 20.04) a Debianu 9. Jako vysílač můžete použít jakoukoli jinou službu, ale pro zkušenosti jsem použil Yandex.disk.
Během experimentů bylo zjištěno, že některé typy poskytovatelů NAT neumožňují navázání spojení. Hlavně od mobilních operátorů, kde jsou blokovány torrenty.

Plánuji se zlepšit z hlediska:

  • Automatické generování tajného klíče při každém spuštění, zašifrování a zkopírování na Yandex.disk pro přenos do vzdáleného uzlu (S ohledem na aktualizovanou verzi)
  • Automatické přidělování IP adres rozhraní
  • Šifrování dat před nahráním na Yandex.disk
  • Optimalizace kódu

Ať je IPv6 v každé domácnosti!

Aktualizováno! Nejnovější soubory a balíček DEB zde - yandex.disk

Zdroj: www.habr.com

Přidat komentář