Direktan VPN tunel između računara preko NAT-ova provajdera (bez VPS-a, koristeći STUN server i Yandex.disk)

Nastavak članci o tome kako sam uspio organizirati direktan VPN tunel između dva kompjutera smještena iza NAT provajdera. U prethodnom članku opisan je proces organizacije veze uz pomoć treće strane - posrednika (iznajmljeni VPS koji djeluje kao STUN server i čvorni predajnik podataka za vezu). U ovom članku ću vam reći kako sam se snašao bez VPS-a, ali su posrednici ostali a to su bili STUN server i Yandex.Disk...
Direktan VPN tunel između računara preko NAT-ova provajdera (bez VPS-a, koristeći STUN server 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 povezati. Uzimajući u obzir preporuke za korištenje ovog STUN (kojih ima dosta) za određivanje trenutnih parametara veze. Pre svega, odlučio sam da koristim TCPDump da pogledam sadržaj paketa kada STUN server radi sa klijentima i dobija potpuno nečitljiv sadržaj. Guglam protokol na koji sam naišao članak koji opisuje protokol. Shvatio sam da ne mogu sam implementirati zahtjev na STUN server i stavio sam ideju u „udaljenu kutiju“.

Teorija

Nedavno sam iz paketa morao instalirati STUN server na Debian

# apt install stun-server

a u zavisnostima sam vidio paket stun-client, ali nekako nisam obraćao pažnju na njega. Ali kasnije sam se sjetio paketa stun-client i odlučio da shvatim kako funkcionira, nakon guglanja i pretraživanja u 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 sa fd 3
Otvoren port 21235 sa fd 4
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 0

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 4

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 2

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Primljena omamljujuća poruka: 92 bajta
Mapirana adresa = <Moj IP>:2885
SourceAddress = 216.93.246.18:3478
Promijenjena Adresa = 216.93.246.17:3479
Nepoznati atribut: 32800
Ime servera = Vovida.org 0.98-CPC
Primljena poruka tipa 257 id=1
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 0

Spremam se za slanje poruke od len 28 na 216.93.246.17:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 4

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 2

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 0

Sprema se slanje poruke od len 28 na <Moj IP>:2885
Primljena omamljujuća poruka: 28 bajta
Zahtjev za promjenu = 0
Primljena poruka tipa 1 id=11
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 0

Spremam se za slanje poruke od len 28 na 216.93.246.17:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 4

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 2

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Primljena omamljujuća poruka: 92 bajta
Mapirana adresa = <Moj IP>:2885
SourceAddress = 216.93.246.17:3479
Promijenjena Adresa = 216.93.246.18:3478
Nepoznati atribut: 32800
Ime servera = Vovida.org 0.98-CPC
Primljena poruka tipa 257 id=10
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 4

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 2

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 4

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 2

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 4

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 2

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 4

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 2

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 4

Spremam se za slanje poruke od len 28 na 216.93.246.18:3478
Kodiranje ošamućene poruke:
Zahtjev za promjenu kodiranja: 2

Spremam se za slanje poruke 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 za čuvanje = 0
Primarno: Nezavisno mapiranje, Filter zavisan od porta, nasumični port, ukosnica
Povratna vrijednost je 0x000006

String sa vrijednošću

Mapirana adresa = <Moj IP>:2885

upravo ono što ti treba! Prikazao je trenutni status veze na lokalnom UDP portu 21234. Ali ovo je samo pola bitke, postavlja se pitanje kako prenijeti te podatke na udaljeni host i organizirati VPN vezu. Koristeći mail protokol, ili možda Telegram?! Postoji mnogo opcija i odlučio sam da koristim Yandex.disk, pošto sam naišao članak o radu Curl putem WebDav-a s Yandex.disk. Nakon razmišljanja o implementaciji, došao sam do sljedeće šeme:

  1. Signalizirajte da su čvorovi spremni za uspostavljanje veze prisustvom određene datoteke sa vremenskom oznakom na Yandex.disk;
  2. Ako su čvorovi spremni, primajte trenutne parametre od STUN servera;
  3. Otpremite trenutne postavke na Yandex.disk;
  4. Provjerite prisutnost i pročitajte parametre udaljenog čvora iz datoteke na Yandex.disk;
  5. Uspostavljanje veze sa udaljenim hostom koristeći OpenVPN.

Praksa

Nakon malo razmišljanja, uzimajući u obzir iskustvo iz prošlog članka, brzo sam napisao scenarij. trebat će nam:

# 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 funkcionisala potrebno vam je:

  1. Kopirajte u međuspremnik i zalijepite u editor, 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 interfejsa
  4. stvoriti tajni.ključ po komandi:
    # openvpn --genkey --secret secret.key 
  5. učinite skriptu izvršnom:
    # chmod +x vpn8.sh
  6. pokrenite skriptu:
    # ./vpn8.sh nZbVGBuX5dtturD

    gdje je nZbVGBuX5dtturD generirani ID veze ovdje

Na udaljenom čvoru uradite sve isto osim generisanja secret.key-a i ID-a veze, oni moraju biti identični.

Ažurirana verzija (vrijeme mora biti sinhronizirano 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 funkcionisala potrebno vam je:

  1. Kopirajte u međuspremnik i zalijepite u editor, 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činite skriptu izvršnom:
    # chmod +x vpn10.sh
  5. pokrenite skriptu:
    # ./vpn10.sh nZbVGBuX5dtturD

    gdje je nZbVGBuX5dtturD generirani ID veze ovdje

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

Za automatsko pokretanje skripte kada je uključen, koristim naredbu “nohup /<put do skripte>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &” sadržanu u datoteci /etc/ rc.local

zaključak

Skripta radi, testirana 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.
Tokom eksperimenata je otkriveno da neki tipovi NAT provajdera ne dozvoljavaju uspostavljanje veze. Uglavnom od mobilnih operatera kod kojih su torrenti blokirani.

Planiram da se poboljšam u smislu:

  • Automatsko generiranje secret.key svaki put kada pokrenete, šifrirajte i kopirajte na Yandex.disk za prijenos na udaljeni čvor (uzimajući u obzir u ažuriranoj verziji)
  • Automatsko dodeljivanje IP adresa interfejsima
  • Šifriranje podataka prije učitavanja na Yandex.disk
  • Optimizacija koda

Neka IPv6 bude u svakom domu!

Ažurirano! Najnoviji fajlovi i DEB paket ovdje - yandex.disk

izvor: www.habr.com

Dodajte komentar