Direkte VPN-tunnel mellom datamaskiner gjennom NAT-er fra leverandører (uten VPS, ved hjelp av STUN-server og Yandex.disk)

Extension artikler om hvordan jeg klarte å organisere en direkte VPN-tunnel mellom to datamaskiner plassert bak NAT-leverandører. Den forrige artikkelen beskrev prosessen med å organisere en forbindelse ved hjelp av en tredjepart - en mellommann (en leid VPS som fungerer som noe som en STUN-server og en nodedatasender for forbindelsen). I denne artikkelen vil jeg fortelle deg hvordan jeg klarte meg uten VPS, men mellomleddene ble igjen og de var STUN-serveren og Yandex.Disk...
Direkte VPN-tunnel mellom datamaskiner gjennom leverandør-NAT-er (uten VPS, ved hjelp av STUN-server og Yandex.disk)

Innledning

Etter å ha lest kommentarene til forrige innlegg, innså jeg at den største ulempen med implementeringen var bruken av en mellommann - en tredjepart (VPS) som indikerte de nåværende parameterne til noden, hvor og hvordan du kobler til. Vurderer anbefalingene for å bruke denne STUN (som det er mange av) for å bestemme gjeldende tilkoblingsparametere. Først og fremst bestemte jeg meg for å bruke TCPDump for å se på innholdet i pakkene når STUN-serveren jobbet med klienter og mottok fullstendig uleselig innhold. Googlet protokollen jeg kom over artikkel som beskriver protokollen. Jeg innså at jeg ikke kunne implementere en forespørsel til STUN-serveren på egen hånd og la ideen i en "fjern boks".

Теория

Nylig måtte jeg installere STUN-server på Debian fra pakken

# apt install stun-server

og i avhengighetene så jeg stun-client-pakken, men på en eller annen måte tok jeg ikke hensyn til den. Men senere husket jeg stun-client-pakken og bestemte meg for å finne ut hvordan den fungerer, etter å ha googlet og søkt i Yandex fikk jeg:

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

Som svar fikk jeg:

STUN-klientversjon 0.97
Åpnet port 21234 med fd 3
Åpnet port 21235 med fd 4
Koding bedøvende melding:
Encoding ChangeRequest: 0

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Koding bedøvende melding:
Encoding ChangeRequest: 4

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Koding bedøvende melding:
Encoding ChangeRequest: 2

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Mottatt overveldende melding: 92 byte
MappedAddress = <Min IP>:2885
Kildeadresse = 216.93.246.18:3478
Endret adresse = 216.93.246.17:3479
Ukjent attributt: 32800
ServerName = Vovida.org 0.98-CPC
Mottatt melding av type 257 id=1
Koding bedøvende melding:
Encoding ChangeRequest: 0

Er i ferd med å sende melding fra len 28 til 216.93.246.17:3478
Koding bedøvende melding:
Encoding ChangeRequest: 4

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Koding bedøvende melding:
Encoding ChangeRequest: 2

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Koding bedøvende melding:
Encoding ChangeRequest: 0

Er i ferd med å sende melding fra len 28 til <Min IP>:2885
Mottatt overveldende melding: 28 byte
ChangeRequest = 0
Mottatt melding av type 1 id=11
Koding bedøvende melding:
Encoding ChangeRequest: 0

Er i ferd med å sende melding fra len 28 til 216.93.246.17:3478
Koding bedøvende melding:
Encoding ChangeRequest: 4

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Koding bedøvende melding:
Encoding ChangeRequest: 2

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Mottatt overveldende melding: 92 byte
MappedAddress = <Min IP>:2885
Kildeadresse = 216.93.246.17:3479
Endret adresse = 216.93.246.18:3478
Ukjent attributt: 32800
ServerName = Vovida.org 0.98-CPC
Mottatt melding av type 257 id=10
Koding bedøvende melding:
Encoding ChangeRequest: 4

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Koding bedøvende melding:
Encoding ChangeRequest: 2

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Koding bedøvende melding:
Encoding ChangeRequest: 4

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Koding bedøvende melding:
Encoding ChangeRequest: 2

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Koding bedøvende melding:
Encoding ChangeRequest: 4

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Koding bedøvende melding:
Encoding ChangeRequest: 2

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Koding bedøvende melding:
Encoding ChangeRequest: 4

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Koding bedøvende melding:
Encoding ChangeRequest: 2

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Koding bedøvende melding:
Encoding ChangeRequest: 4

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
Koding bedøvende melding:
Encoding ChangeRequest: 2

Er i ferd med å sende melding fra len 28 til 216.93.246.18:3478
test I = 1
test II = 0
test III = 0
test I(2) = 1
er nat = 1
tilordnet IP samme = 1
hårnål = 1
bevaringsport = 0
Primær: Uavhengig kartlegging, portavhengig filter, tilfeldig port, vil hårnåle
Returverdi er 0x000006

String med verdi

MappedAddress = <Min IP>:2885

akkurat det du trenger! Den viste gjeldende status for tilkoblingen på lokal UDP-port 21234. Men dette er bare halve kampen, spørsmålet oppsto om hvordan du overfører disse dataene til den eksterne verten og organiserer en VPN-tilkobling. Bruke postprotokollen, eller kanskje Telegram?! Det er mange alternativer, og jeg bestemte meg for å bruke Yandex.disk, siden jeg kom over artikkel om å jobbe med Curl via WebDav med Yandex.disk. Etter å ha tenkt på implementeringen, kom jeg opp med følgende opplegg:

  1. Signal om at noder er klare til å etablere en tilkobling ved tilstedeværelsen av en spesifikk fil med et tidsstempel på Yandex.disk;
  2. Hvis nodene er klare, motta gjeldende parametere fra STUN-serveren;
  3. Last opp gjeldende innstillinger til Yandex.disk;
  4. Sjekk tilstedeværelsen og les parametere til en ekstern node fra en fil på Yandex.disk;
  5. Etablere en forbindelse med en ekstern vert ved hjelp av OpenVPN.

Praksis

Etter å ha tenkt litt, tatt i betraktning opplevelsen av den siste artikkelen, skrev jeg raskt et manus. Vi trenger:

# apt install openvpn stun-client curl 

Selve manuset:

original versjon

# 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

For at skriptet skal fungere trenger du:

  1. Kopier til utklippstavlen og lim inn i redigeringsprogrammet, for eksempel:
    # nano vpn8.sh 
  2. spesifiser brukernavnet og passordet for Yandex.disk.
  3. i feltet "—ifconfig 10.45.54.(1 eller 2) 255.255.255.252" spesifiser den interne IP-adressen til grensesnittet
  4. skape hemmelig.nøkkel kommando:
    # openvpn --genkey --secret secret.key 
  5. gjør skriptet kjørbart:
    # chmod +x vpn8.sh
  6. kjør skriptet:
    # ./vpn8.sh nZbVGBuX5dtturD

    der nZbVGBuX5dtturD er tilkoblings-IDen som genereres her

På den eksterne noden, gjør alt det samme bortsett fra å generere secret.key og tilkoblings-ID, de må være identiske.

Oppdatert versjon (tiden må synkroniseres for korrekt drift):

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

For at skriptet skal fungere trenger du:

  1. Kopier til utklippstavlen og lim inn i redigeringsprogrammet, for eksempel:
    # nano vpn10.sh 
  2. angi pålogging (2. linje) og passord for Yandex.disk (3. linje).
  3. spesifiser den interne IP-adressen til tunnelen (fjerde linje).
  4. gjør skriptet kjørbart:
    # chmod +x vpn10.sh
  5. kjør skriptet:
    # ./vpn10.sh nZbVGBuX5dtturD

    der nZbVGBuX5dtturD er tilkoblings-IDen som genereres her

Gjør det samme på den eksterne noden, spesifiser den tilsvarende interne IP-adressen til tunnelen og tilkoblings-ID.

For å kjøre skriptet automatisk når det er slått på, bruker jeg kommandoen "nohup /<bane til skriptet>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &" i filen /etc/ rc.local

Konklusjon

Skriptet fungerer, testet på Ubuntu (18.04, 19.10, 20.04) og Debian 9. Du kan bruke hvilken som helst annen tjeneste som sender, men av erfaring brukte jeg Yandex.disk.
Under eksperimentene ble det oppdaget at noen typer NAT-leverandører ikke tillater etablering av en tilkobling. Hovedsakelig fra mobiloperatører der torrenter er blokkert.

Jeg planlegger å forbedre meg når det gjelder:

  • Automatisk generering av secret.key hver gang du starter, krypter og kopier til Yandex.disk for overføring til en ekstern node (med hensyn til i den oppdaterte versjonen)
  • Automatisk tildeling av IP-adresser til grensesnitt
  • Kryptering av data før opplasting til Yandex.disk
  • Kodeoptimalisering

La det være IPv6 i alle hjem!

Oppdatert! Siste filer og DEB-pakke her - yandex.disk

Kilde: www.habr.com

Legg til en kommentar