Neposredni tunel VPN med računalniki prek NAT ponudnika (brez VPS, z uporabo strežnika STUN in Yandex.disk)

Podaljšanje Člen o tem, kako mi je uspelo organizirati neposredni VPN tunel med dvema računalnikoma, ki se nahajata za NAT ponudniki. V prejšnjem članku je bil opisan postopek organizacije povezave s pomočjo tretje osebe - posrednika (najetega VPS-a, ki deluje kot nekaj podobnega STUN strežniku in prenosniku podatkov vozlišča za povezavo). V tem članku vam bom povedal, kako mi je uspelo brez VPS, posredniki pa so ostali in sta bila strežnik STUN in Yandex.Disk ...
Neposredni tunel VPN med računalniki prek NAT ponudnika (brez VPS, z uporabo strežnika STUN in Yandex.disk)

Predstavitev

Ko sem prebral komentarje prejšnje objave, sem ugotovil, da je glavna pomanjkljivost implementacije uporaba posrednika - tretje osebe (VPS), ki je nakazal trenutne parametre vozlišča, kje in kako se povezati. Ob upoštevanju priporočil za uporabo tega STUN (ki jih je ogromno), da določite trenutne parametre povezave. Najprej sem se odločil uporabiti TCPDump za ogled vsebine paketov, ko je strežnik STUN delal z odjemalci in prejel popolnoma neberljivo vsebino. Googlanje protokola, na katerega sem naletel članek, ki opisuje protokol. Ugotovil sem, da sam ne morem izvesti zahteve do strežnika STUN in idejo pospravil v "oddaljeno škatlo".

Teorija

Pred kratkim sem moral namestiti strežnik STUN na Debian iz paketa

# apt install stun-server

in v odvisnostih sem videl paket stun-client, vendar nekako nisem bil pozoren na to. Kasneje pa sem se spomnil paketa stun-client in se odločil ugotoviti, kako deluje, po googlanju in iskanju v Yandexu sem dobil:

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

V odgovor sem prejel:

Odjemalec STUN različica 0.97
Odprta vrata 21234 s fd 3
Odprta vrata 21235 s fd 4
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 0

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 4

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 2

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Prejeto sporočilo o omamljanju: 92 bajtov
MappedAddress = <Moj IP>:2885
Izvorni naslov = 216.93.246.18:3478
Spremenjeni naslov = 216.93.246.17:3479
Neznan atribut: 32800
Ime strežnika = Vovida.org 0.98-CPC
Prejeto sporočilo tipa 257 id=1
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 0

Poslati bom sporočilo len 28 na 216.93.246.17:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 4

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 2

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 0

Poslati bom sporočilo len 28 na <Moj IP>:2885
Prejeto sporočilo o omamljanju: 28 bajtov
ChangeRequest = 0
Prejeto sporočilo tipa 1 id=11
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 0

Poslati bom sporočilo len 28 na 216.93.246.17:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 4

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 2

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Prejeto sporočilo o omamljanju: 92 bajtov
MappedAddress = <Moj IP>:2885
Izvorni naslov = 216.93.246.17:3479
Spremenjeni naslov = 216.93.246.18:3478
Neznan atribut: 32800
Ime strežnika = Vovida.org 0.98-CPC
Prejeto sporočilo tipa 257 id=10
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 4

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 2

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 4

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 2

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 4

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 2

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 4

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 2

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 4

Poslati bom sporočilo len 28 na 216.93.246.18:3478
Kodiranje omamljenega sporočila:
Encoding ChangeRequest: 2

Poslati bom sporočilo len 28 na 216.93.246.18:3478
test I = 1
test II = 0
test III = 0
test I(2) = 1
je nat = 1
preslikan IP enak = 1
lasnica = 1
vrata za ohranjanje = 0
Primarno: neodvisno preslikavo, filter, odvisen od vrat, naključna vrata, bo pripeta
Povratna vrednost je 0x000006

Niz z vrednostjo

MappedAddress = <Moj IP>:2885

ravno to, kar potrebujete! Prikazal je trenutno stanje povezave na lokalnih vratih UDP 21234. Toda to je le polovica bitke, pojavilo se je vprašanje, kako te podatke prenesti na oddaljenega gostitelja in organizirati povezavo VPN. Uporaba poštnega protokola ali morda Telegrama?! Obstaja veliko možnosti in odločil sem se za uporabo Yandex.disk, saj sem naletel članek o delu Curl prek WebDav z Yandex.disk. Po razmišljanju o izvedbi sem prišel do naslednje sheme:

  1. Signalizirajte, da so vozlišča pripravljena za vzpostavitev povezave s prisotnostjo določene datoteke s časovnim žigom na Yandex.disku;
  2. Če so vozlišča pripravljena, prejmite trenutne parametre s strežnika STUN;
  3. Prenesite trenutne nastavitve na Yandex.disk;
  4. Preverite prisotnost in preberite parametre oddaljenega vozlišča iz datoteke na Yandex.disku;
  5. Vzpostavitev povezave z oddaljenim gostiteljem z uporabo OpenVPN.

Practice

Po kratkem premisleku, ob upoštevanju izkušnje zadnjega članka, sem hitro napisal scenarij. Potrebovali bomo:

# apt install openvpn stun-client curl 

Sam scenarij:

originalna različica

# 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

Za delovanje skripte potrebujete:

  1. Kopirajte v odložišče in prilepite v urejevalnik, na primer:
    # nano vpn8.sh 
  2. določite uporabniško ime in geslo za Yandex.disk.
  3. v polju "—ifconfig 10.45.54.(1 ali 2) 255.255.255.252" določite interni naslov IP vmesnika
  4. ustvariti skrivnost.ključ z ukazom:
    # openvpn --genkey --secret secret.key 
  5. naredite skript izvršljiv:
    # chmod +x vpn8.sh
  6. zaženi skript:
    # ./vpn8.sh nZbVGBuX5dtturD

    kjer je nZbVGBuX5dtturD ustvarjeni ID povezave tukaj

Na oddaljenem vozlišču naredite vse enako, razen generiranja secret.key in ID-ja povezave, morata biti enaka.

Posodobljena različica (čas mora biti sinhroniziran za pravilno delovanje):

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

Za delovanje skripte potrebujete:

  1. Kopirajte v odložišče in prilepite v urejevalnik, na primer:
    # nano vpn10.sh 
  2. navedite prijavo (2. vrstica) in geslo za Yandex.disk (3. vrstica).
  3. določite notranji naslov IP tunela (4. vrstica).
  4. naredite skript izvršljiv:
    # chmod +x vpn10.sh
  5. zaženi skript:
    # ./vpn10.sh nZbVGBuX5dtturD

    kjer je nZbVGBuX5dtturD ustvarjeni ID povezave tukaj

Na oddaljenem vozlišču storite enako, podajte ustrezen interni naslov IP tunela in ID povezave.

Za samodejni zagon skripta, ko je vklopljen, uporabim ukaz “nohup /<pot do skripta>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &” v datoteki /etc/ rc.local

Zaključek

Skript deluje, preizkušeno na Ubuntu (18.04, 19.10, 20.04) in Debian 9. Kot oddajnik lahko uporabite katero koli drugo storitev, za izkušnje pa sem uporabil Yandex.disk.
Med poskusi je bilo ugotovljeno, da nekatere vrste ponudnikov NAT ne omogočajo vzpostavitve povezave. Predvsem pri mobilnih operaterjih, kjer so torrenti blokirani.

Načrtujem izboljšave v smislu:

  • Samodejno ustvarjanje secret.key vsakič, ko zaženete, šifrirate in kopirate na Yandex.disk za prenos v oddaljeno vozlišče (upoštevano v posodobljeni različici)
  • Samodejno dodeljevanje IP naslovov vmesnikov
  • Šifriranje podatkov pred nalaganjem na Yandex.disk
  • Optimizacija kode

Naj bo IPv6 v vsakem domu!

Posodobljeno! Najnovejše datoteke in paket DEB tukaj - yandex.disk

Vir: www.habr.com

Dodaj komentar