Direkte VPN-tunnel mellem computere gennem providerens NAT'er (uden VPS, ved hjælp af STUN-server og Yandex.disk)

Fortsættelse artikler om hvordan jeg lykkedes med at organisere en direkte VPN-tunnel mellem to computere bag NAT'er fra udbydere. I den tidligere artikel blev processen med at etablere forbindelsen gennem en tredjepart - en mellemmænd (lejet VPS som fungerede som en STUN-server og datatransmitter for forbindelsen) beskrevet. I denne artikel vil jeg fortælle, hvordan jeg klarede mig uden VPS, men mellemmændene var stadig der, og de var STUN-serveren og Yandex.Disk...
Direkte VPN-tunnel mellem computere gennem NAT'er fra udbydere (uden VPS, ved hjælp af STUN-server og Yandex.Disk)

Introduktion

Efter at have læst kommentarerne til det forrige indlæg indså jeg, at den største ulempe ved implementeringen var brugen af en mellemmænd - en tredjepart (VPS), der angav de aktuelle parametre for noden, hvor og hvordan man skulle oprette forbindelse. Tagende anbefalingerne om at bruge ægte STUN (som der er mange af) til at bestemme de aktuelle forbindelsesparametre. Først besluttede jeg at undersøge indholdet af pakkerne, mens STUN-serveren arbejdede med klienterne ved hjælp af TCPDump, og jeg fik et helt uforståeligt indhold. Da jeg googlede protokollen, stødte jeg på en artikel om protokollen. Jeg indså, at jeg ikke kunne implementere en forespørgsel til STUN-serveren selv og lagde ideen væk i 'fjerne kasser'.

Teori

For nylig måtte jeg installere en STUN-server på Debian fra pakken

# apt install stun-server

og i afhængighederne så jeg pakken stun-client, men jeg lagde ikke meget vægt på det på det tidspunkt. Men senere huskede jeg pakken stun-client og besluttede at finde ud af, hvordan det fungerede; efter at have googlet og yandexet fik jeg:

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

Jeg fik som svar:

STUN client version 0.97
Åbnede port 21234 med fd 3
Åbnede port 21235 med fd 4
Koder STUN-besked:
Koder ChangeRequest: 0

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Koder STUN-besked:
Koder ChangeRequest: 4

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Koder STUN-besked:
Koder ChangeRequest: 2

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Modtaget STUN-besked: 92 byte
MappedAddress = :2885
SourceAddress = 216.93.246.18:3478
ChangedAddress = 216.93.246.17:3479
Ukendt attribut: 32800
ServerName = Vovida.org 0.98-CPC
Modtaget besked af type 257 id=1
Koder STUN-besked:
Koder ChangeRequest: 0

Er ved at sende besked med længde 28 til 216.93.246.17:3478
Koder STUN-besked:
Koder ChangeRequest: 4

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Koder STUN-besked:
Koder ChangeRequest: 2

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Koder STUN-besked:
Koder ChangeRequest: 0

Er ved at sende besked med længde 28 til :2885
Modtaget STUN-besked: 28 byte
ChangeRequest = 0
Modtaget besked af type 1 id=11
Koder STUN-besked:
Koder ChangeRequest: 0

Er ved at sende besked med længde 28 til 216.93.246.17:3478
Koder STUN-besked:
Koder ChangeRequest: 4

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Koder STUN-besked:
Koder ChangeRequest: 2

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Modtaget STUN-besked: 92 byte
MappedAddress = :2885
SourceAddress = 216.93.246.17:3479
ChangedAddress = 216.93.246.18:3478
Ukendt attribut: 32800
ServerName = Vovida.org 0.98-CPC
Modtaget besked af type 257 id=10
Koder STUN-besked:
Koder ChangeRequest: 4

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Koder STUN-besked:
Koder ChangeRequest: 2

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Koder STUN-besked:
Koder ChangeRequest: 4

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Koder STUN-besked:
Koder ChangeRequest: 2

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Koder STUN-besked:
Koder ChangeRequest: 4

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Koder STUN-besked:
Koder ChangeRequest: 2

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Koder STUN-besked:
Koder ChangeRequest: 4

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Koder STUN-besked:
Koder ChangeRequest: 2

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Koder STUN-besked:
Koder ChangeRequest: 4

Er ved at sende besked med længde 28 til 216.93.246.18:3478
Koder STUN-besked:
Koder ChangeRequest: 2

Er ved at sende besked med længde 28 til 216.93.246.18:3478
test I = 1
test II = 0
test III = 0
test I(2) = 1
is nat = 1
mapped IP same = 1
hairpin = 1
preserver port = 0
Primær: Uafhængig mapping, portafhængig filter, tilfældig port, vil hairpin
Return value is 0x000006

Streng med værdien

MappedAddress = :2885

lige præcis det, der var brug for! Den viste den aktuelle tilstand for forbindelsen på den lokale UDP-port 21234. Men det var kun halvdelen af arbejdet, spørgsmålet var, hvordan man skulle overføre disse data til den eksterne enhed og etablere en VPN-forbindelse. Brug af en e-mailprotokol, eller måske Telegram?! Der er mange muligheder, og jeg besluttede at bruge Yandex.Disk, da jeg stødte på det. artikel om at arbejde med Curl via WebDav med Yandex.Disk. Efter at have tænkt over implementeringen kom jeg frem til denne plan:

  1. Signalere at noderne er klar til at etablere forbindelse ved at have en bestemt fil med et tidsstempel på Yandex.Disk;
  2. Hvis noderne er klar, så få de aktuelle parametre fra STUN-serveren;
  3. Uploade de aktuelle parametre til Yandex.Disk;
  4. Kontrollere for tilstedeværelsen af og læse parametre fra den eksterne enhed fra en fil på Yandex.Disk;
  5. Etablere forbindelse med den eksterne enhed ved hjælp af OpenVPN.

 

Praktik

Efter lidt betænkningstid, med erfaringen fra den tidligere artikel i tankerne, skrev jeg hurtigt et script. Vi får brug for:

# apt install openvpn stun-client curl 

Selve scriptet:

Den oprindelige version

# 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 scriptet kan fungere, skal du:

  1. Kopiere ind i udklipsholderen og indsætte det i en editor, for eksempel:
    # nano vpn8.sh 
  2. angive brugernavn og password for Yandex.Disk.
  3. i feltet «—ifconfig 10.45.54.(1 eller 2) 255.255.255.252» angive den interne IP-adresse for interfacet.
  4. oprette secret.key med kommandoen:
    # openvpn --genkey --secret secret.key 
  5. gøre scriptet eksekverbart:
    # chmod +x vpn8.sh
  6. køre scriptet:
    # ./vpn8.sh nZbVGBuX5dtturD

    hvor nZbVGBuX5dtturD er den genererede forbindelse ID. her

På den eksterne enhed gøre præcis det samme med undtagelse af at generere secret.key og forbindelse ID, de skal være identiske.

Den opdaterede version (for korrekt funktion skal tiden være synkroniseret):

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 scriptet kan fungere, skal du:

  1. Kopiere ind i udklipsholderen og indsætte det i en editor, for eksempel:
    # nano vpn10.sh 
  2. angive brugernavn (anden linje) og password for Yandex.Disk (tredje linje).
  3. angive den interne IP-adresse for tunnellen (fjerde linje).
  4. gøre scriptet eksekverbart:
    # chmod +x vpn10.sh
  5. køre scriptet:
    # ./vpn10.sh nZbVGBuX5dtturD

    hvor nZbVGBuX5dtturD er den genererede forbindelse ID. her

På den eksterne enhed gøre præcis det samme, angive den tilsvarende interne IP-adresse tunnel og forbindelse ID.

For at auto-starte scriptet ved opstart bruger jeg kommandoen «nohup //vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &» i filen /etc/rc.local

Konklusion

Scriptet fungerer, er testet på Ubuntu (18.04, 19.10, 20.04) og Debian 9. Enhver anden service kan bruges som transmitter, men til eksperimentet brugte jeg Yandex.Disk.
Under eksperimenterne blev det opdaget, at visse typer NAT fra udbydere ikke tillader etablering af forbindelse. Dette gælder hovedsageligt for mobiloperatører, hvor torrents er blokeret.

Jeg planlægger at forbedre det med hensyn til:

  • Automatisk generering af secret.key hver gang ved opstart, kryptering og kopi til Yandex.Disk for overførsel til en ekstern node (taget i betragtning i den opdaterede version)
  • Automatisk tildeling af IP-adresser til interfaces
  • Kryptering af data inden udførsel til Yandex.Disk
  • Optimering af kode

Lad IPv6 være til stede i hvert hjem!

Opdateret! Nyeste filer og DEB-pakke her — yandex.disk

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster