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

Extension Artikel om, hvordan det lykkedes mig at organisere en direkte VPN-tunnel mellem to computere placeret bag NAT-udbydere. Den tidligere artikel beskrev processen med at organisere en forbindelse ved hjælp af en tredjepart - en mellemmand (en lejet VPS, der fungerer som noget i retning af en STUN-server og en node-datatransmitter for forbindelsen). I denne artikel vil jeg fortælle dig, hvordan jeg klarede mig uden VPS, men mellemmændene forblev, og de var STUN-serveren og Yandex.Disk...
Direkte VPN-tunnel mellem computere gennem udbyder-NAT'er (uden VPS, ved hjælp af STUN-server og Yandex.disk)

Indledning

Efter at have læst kommentarerne til det forrige indlæg indså jeg, at den største ulempe ved implementeringen var brugen af ​​en mellemmand - en tredjepart (VPS), der indikerede de aktuelle parametre for noden, hvor og hvordan man forbinder. I betragtning af anbefalingerne om at bruge denne STUN (som der er mange af) for at bestemme de aktuelle forbindelsesparametre. Først og fremmest besluttede jeg mig for at bruge TCDPump til at se på indholdet af pakkerne, når STUN-serveren arbejdede med klienter og modtog fuldstændigt ulæseligt indhold. Googlede protokollen jeg stødte på artikel, der beskriver protokollen. Jeg indså, at jeg ikke kunne implementere en anmodning til STUN-serveren på egen hånd og lagde ideen i en "fjern boks".

Теория

For nylig var jeg nødt til at installere STUN-serveren på Debian fra pakken

# apt install stun-server

og i afhængighederne så jeg stun-client-pakken, men på en eller anden måde var jeg ikke opmærksom på den. Men senere huskede jeg om bedøvelsesklient-pakken og besluttede at finde ud af, hvordan den virker, efter at have googlet og søgt i Yandex fik jeg:

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

Som svar fik jeg:

STUN-klientversion 0.97
Åbnede port 21234 med fd 3
Åbnede port 21235 med fd 4
Encoding bedøvende besked:
Encoding ChangeRequest: 0

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 4

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 2

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Modtaget stun-besked: 92 bytes
MappedAddress = <Min IP>:2885
Kildeadresse = 216.93.246.18:3478
Ændret adresse = 216.93.246.17:3479
Ukendt egenskab: 32800
Servernavn = Vovida.org 0.98-CPC
Modtaget besked af typen 257 id=1
Encoding bedøvende besked:
Encoding ChangeRequest: 0

Er ved at sende besked fra len 28 til 216.93.246.17:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 4

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 2

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 0

Er ved at sende besked fra len 28 til <Min IP>:2885
Modtaget stun-besked: 28 bytes
ChangeRequest = 0
Modtaget besked af typen 1 id=11
Encoding bedøvende besked:
Encoding ChangeRequest: 0

Er ved at sende besked fra len 28 til 216.93.246.17:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 4

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 2

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Modtaget stun-besked: 92 bytes
MappedAddress = <Min IP>:2885
Kildeadresse = 216.93.246.17:3479
Ændret adresse = 216.93.246.18:3478
Ukendt egenskab: 32800
Servernavn = Vovida.org 0.98-CPC
Modtaget besked af typen 257 id=10
Encoding bedøvende besked:
Encoding ChangeRequest: 4

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 2

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 4

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 2

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 4

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 2

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 4

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 2

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 4

Er ved at sende besked fra len 28 til 216.93.246.18:3478
Encoding bedøvende besked:
Encoding ChangeRequest: 2

Er ved at sende besked 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
tilknyttede IP samme = 1
hårnål = 1
bevaringsport = 0
Primær: Uafhængig kortlægning, portafhængigt filter, tilfældig port, vil hårnåle
Returværdi er 0x000006

String med værdi

MappedAddress = <Min IP>:2885

lige hvad du har brug for! Den viste den aktuelle status for forbindelsen på den lokale UDP-port 21234. Men dette er kun halvdelen af ​​kampen, spørgsmålet opstod om, hvordan man overfører disse data til fjernværten og organiserer en VPN-forbindelse. Brug af mail-protokollen, 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 følgende skema:

  1. Signal om, at noder er klar til at etablere en forbindelse ved tilstedeværelsen af ​​en specifik fil med et tidsstempel på Yandex.disk;
  2. Hvis noderne er klar, så modtag aktuelle parametre fra STUN-serveren;
  3. Upload aktuelle indstillinger til Yandex.disk;
  4. Kontroller tilstedeværelsen og læs parametrene for en fjernknude fra en fil på Yandex.disk;
  5. Etablering af en forbindelse med en fjernvært ved hjælp af OpenVPN.

Praksis

Efter at have tænkt lidt, under hensyntagen til oplevelsen af ​​den sidste artikel, skrev jeg hurtigt et manuskript. Vi skal bruge:

# apt install openvpn stun-client curl 

Selve scriptet:

Indledende 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 skal virke, skal du bruge:

  1. Kopier til udklipsholder og indsæt i editor, for eksempel:
    # nano vpn8.sh 
  2. angiv brugernavn og adgangskode til Yandex.disk.
  3. i feltet "—ifconfig 10.45.54.(1 eller 2) 255.255.255.252" angiv den interne IP-adresse for grænsefladen
  4. skab hemmelig.nøgle med kommandoen:
    # openvpn --genkey --secret secret.key 
  5. gør scriptet eksekverbart:
    # chmod +x vpn8.sh
  6. kør scriptet:
    # ./vpn8.sh nZbVGBuX5dtturD

    hvor nZbVGBuX5dtturD er det genererede forbindelses-id her

Gør alt det samme på fjernknuden, bortset fra at generere secret.key og forbindelses-id, de skal være identiske.

Opdateret version (tiden skal 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 scriptet skal virke, skal du bruge:

  1. Kopier til udklipsholder og indsæt i editor, for eksempel:
    # nano vpn10.sh 
  2. angiv login (2. linje) og adgangskode for Yandex.disk (3. linje).
  3. angiv den interne IP-adresse for tunnelen (4. linje).
  4. gør scriptet eksekverbart:
    # chmod +x vpn10.sh
  5. kør scriptet:
    # ./vpn10.sh nZbVGBuX5dtturD

    hvor nZbVGBuX5dtturD er det genererede forbindelses-id her

Gør det samme på den eksterne node, angiv den tilsvarende interne IP-adresse for tunnelen og forbindelses-id.

For at køre scriptet automatisk, når det er slået til, bruger jeg kommandoen “nohup /<sti til scriptet>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &” indeholdt i filen /etc/ rc.lokal

Konklusion

Scriptet virker, testet på Ubuntu (18.04, 19.10, 20.04) og Debian 9. Du kan bruge en hvilken som helst anden tjeneste som sender, men af ​​erfaring brugte jeg Yandex.disk.
Under eksperimenterne blev det opdaget, at nogle typer NAT-udbydere ikke tillader etablering af en forbindelse. Hovedsageligt fra mobiloperatører, hvor torrents er blokeret.

Jeg planlægger at forbedre mig i forhold til:

  • Automatisk generering af secret.key hver gang du starter, krypter og kopier til Yandex.disk for overførsel til en ekstern node (under hensyntagen til den opdaterede version)
  • Automatisk tildeling af IP-adresser på grænseflader
  • Kryptering af data før upload til Yandex.disk
  • Kode optimering

Lad der være IPv6 i alle hjem!

Opdateret! Seneste filer og DEB-pakke heryandex.disk

Kilde: www.habr.com

Tilføj en kommentar