Izravni VPN tunel između računala putem NAT-ova pružatelja (bez VPS-a, koristeći STUN poslužitelj i Yandex.disk)

Nastavak Članak o tome kako sam uspio organizirati izravni VPN tunel između dva računala smještena iza NAT providera. U prethodnom članku opisan je proces organiziranja veze uz pomoć treće strane - posrednika (iznajmljeni VPS koji djeluje kao nešto poput STUN servera i node data transmitera za vezu). U ovom članku ću vam reći kako sam uspio bez VPS-a, ali posrednici su ostali i to su STUN server i Yandex.Disk...
Izravni VPN tunel između računala putem NAT-ova pružatelja (bez VPS-a, koristeći STUN poslužitelj i Yandex.disk)

Uvod

Nakon što sam pročitao komentare prethodnog posta, shvatio sam da je glavni nedostatak implementacije korištenje posrednika - treće strane (VPS) koji je ukazivao na trenutne parametre čvora, gdje i kako se spojiti. Uzimajući u obzir preporuke za korištenje ovog STUN-a (kojih ima jako puno) za određivanje trenutnih parametara veze. Prije svega, odlučio sam koristiti TCPDump za pregled sadržaja paketa kada je STUN poslužitelj radio s klijentima i primio potpuno nečitljiv sadržaj. Guglajući protokol na koji sam naišao članak koji opisuje protokol. Shvatio sam da ne mogu sam implementirati zahtjev prema STUN serveru i stavio sam ideju u "daleku kutiju".

teorija

Nedavno sam morao instalirati STUN poslužitelj na Debianu iz paketa

# apt install stun-server

i u ovisnostima sam vidio paket stun-client, ali nekako nisam obraćao pozornost na njega. Ali kasnije sam se sjetio paketa stun-client i odlučio shvatiti kako funkcionira, nakon guglanja i pretraživanja na Yandexu dobio sam:

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

Kao odgovor dobio sam:

STUN klijent verzija 0.97
Otvoren port 21234 s fd 3
Otvoren port 21235 s fd 4
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 0

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 4

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 2

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Primljena poruka o omamljivanju: 92 bajta
MappedAddress = <Moj IP>:2885
Izvorna adresa = 216.93.246.18:3478
Promijenjena adresa = 216.93.246.17:3479
Nepoznati atribut: 32800
Naziv poslužitelja = Vovida.org 0.98-CPC
Primljena poruka tipa 257 id=1
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 0

Upravo ću poslati poruku od len 28 na 216.93.246.17:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 4

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 2

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 0

Upravo ću poslati poruku len 28 na <My IP>:2885
Primljena poruka o omamljivanju: 28 bajta
Zahtjev za promjenu = 0
Primljena poruka tipa 1 id=11
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 0

Upravo ću poslati poruku od len 28 na 216.93.246.17:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 4

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 2

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Primljena poruka o omamljivanju: 92 bajta
MappedAddress = <Moj IP>:2885
Izvorna adresa = 216.93.246.17:3479
Promijenjena adresa = 216.93.246.18:3478
Nepoznati atribut: 32800
Naziv poslužitelja = Vovida.org 0.98-CPC
Primljena poruka tipa 257 id=10
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 4

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 2

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 4

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 2

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 4

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 2

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 4

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 2

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 4

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Encoding ChangeRequest: 2

Upravo ću poslati poruku od len 28 na 216.93.246.18:3478
test I = 1
test II = 0
test III = 0
test I(2) = 1
je nat = 1
mapirani IP isti = 1
ukosnica = 1
port čuvara = 0
Primarno: neovisno mapiranje, filtar ovisan o portu, nasumični port, bit će ukosnica
Povratna vrijednost je 0x000006

Niz s vrijednošću

MappedAddress = <Moj IP>:2885

upravo ono što vam treba! Prikazivao je trenutni status veze na lokalnom UDP portu 21234. Ali to je samo pola bitke, postavilo se pitanje kako te podatke prenijeti na udaljeni host i organizirati VPN vezu. Koristeći mail protokol, ili možda Telegram?! Postoji mnogo opcija i odlučio sam koristiti Yandex.disk, budući da sam naišao članak o radu Curla putem WebDava s Yandex.diskom. Nakon razmišljanja o implementaciji, došao sam do sljedeće sheme:

  1. Signalizirajte da su čvorovi spremni uspostaviti vezu prisutnošću određene datoteke s vremenskom oznakom na Yandex.disku;
  2. Ako su čvorovi spremni, tada primajte trenutne parametre sa STUN poslužitelja;
  3. Prenesite trenutne postavke na Yandex.disk;
  4. Provjerite prisutnost i očitajte parametre udaljenog čvora iz datoteke na Yandex.disku;
  5. Uspostavljanje veze s udaljenim hostom pomoću OpenVPN-a.

Praksa

Nakon malo razmišljanja, uzimajući u obzir iskustvo prošlog članka, brzo sam napisao scenarij. Mi ćemo trebati:

# apt install openvpn stun-client curl 

Sama skripta:

Originalna verzija

# 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

Da bi skripta radila potrebno vam je:

  1. Kopirajte u međuspremnik i zalijepite u uređivač, na primjer:
    # nano vpn8.sh 
  2. navedite korisničko ime i lozinku za Yandex.disk.
  3. u polju "—ifconfig 10.45.54.(1 ili 2) 255.255.255.252" navedite internu IP adresu sučelja
  4. stvoriti tajna.ključ sa naredbom:
    # openvpn --genkey --secret secret.key 
  5. učiniti skriptu izvršnom:
    # chmod +x vpn8.sh
  6. pokreni skriptu:
    # ./vpn8.sh nZbVGBuX5dtturD

    gdje je nZbVGBuX5dtturD generirani ID veze ovdje

Na udaljenom čvoru učinite sve isto osim generiranja secret.key i ID veze, oni moraju biti identični.

Ažurirana verzija (vrijeme mora biti sinkronizirano za ispravan rad):

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

Da bi skripta radila potrebno vam je:

  1. Kopirajte u međuspremnik i zalijepite u uređivač, na primjer:
    # nano vpn10.sh 
  2. navedite prijavu (2. red) i lozinku za Yandex.disk (3. red).
  3. navedite internu IP adresu tunela (4. red).
  4. učiniti skriptu izvršnom:
    # chmod +x vpn10.sh
  5. pokreni skriptu:
    # ./vpn10.sh nZbVGBuX5dtturD

    gdje je nZbVGBuX5dtturD generirani ID veze ovdje

Na udaljenom čvoru učinite isto, navedite odgovarajuću internu IP adresu tunela i ID veze.

Za automatsko pokretanje skripte kada je uključena, koristim naredbu “nohup /<put do skripte>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &” koja se nalazi u datoteci /etc/ rc.lokalni

Zaključak

Skripta radi, testirano na Ubuntu (18.04, 19.10, 20.04) i Debianu 9. Možete koristiti bilo koji drugi servis kao odašiljač, ali za iskustvo sam koristio Yandex.disk.
Tijekom eksperimenata otkriveno je da neke vrste NAT providera ne dopuštaju uspostavljanje veze. Uglavnom od mobilnih operatera kod kojih su torrenti blokirani.

Planiram se poboljšati u smislu:

  • Automatsko generiranje secret.key svaki put kada pokrenete, šifrirate i kopirate na Yandex.disk za prijenos na udaljeni čvor (uzeti u obzir u ažuriranoj verziji)
  • Automatsko dodjeljivanje IP adresa sučelja
  • Šifriranje podataka prije učitavanja na Yandex.disk
  • Optimizacija koda

Neka IPv6 bude u svakom domu!

Ažurirano! Najnovije datoteke i DEB paket ovdje - yandex.disk

Izvor: www.habr.com

Dodajte komentar