Tinèl VPN dirèk ant òdinatè atravè NAT founisè yo (san VPS, lè l sèvi avèk sèvè STUN ak Yandex.disk)

Ekstansyon atik sou fason mwen jere yo òganize yon tinèl VPN dirèk ant de òdinatè ki chita dèyè founisè NAT. Atik anvan an te dekri pwosesis la nan òganize yon koneksyon avèk èd nan yon twazyèm pati - yon entèmedyè (yon VPS lwe aji kòm yon bagay tankou yon sèvè STUN ak yon transmetè done ne pou koneksyon an). Nan atik sa a mwen pral di w kouman mwen jere san VPS, men entèmedyè yo te rete epi yo te sèvè STUN la ak Yandex.Disk...
Tinèl VPN dirèk ant òdinatè atravè founisè NAT (san VPS, lè l sèvi avèk sèvè STUN ak Yandex.disk)

Entwodiksyon

Apre ou fin li kòmantè yo nan pòs anvan an, mwen reyalize ke dezavantaj prensipal la nan aplikasyon an te itilize nan yon entèmedyè - yon twazyèm pati (VPS) ki endike paramèt aktyèl yo nan ne a, ki kote ak ki jan yo konekte. Lè nou konsidere rekòmandasyon yo pou itilize STUN sa a (ki genyen anpil) pou detèmine paramèt koneksyon aktyèl yo. Premye a tout, mwen deside sèvi ak TCPDump gade sa ki nan pake yo lè sèvè a STUN t ap travay ak kliyan epi li te resevwa kontni konplètman lizib. Googling pwotokòl mwen te rankontre atik ki dekri pwotokòl la. Mwen reyalize ke mwen pa t 'kapab aplike yon demann nan sèvè a STUN poukont mwen epi mete lide a nan yon "bwat byen lwen".

Teyori

Dènyèman mwen te oblije enstale STUN sèvè sou Debian soti nan pake a

# apt install stun-server

ak nan depandans yo mwen te wè pake a stun-client, men yon jan kanmenm mwen pa t 'peye atansyon sou li. Men, pita mwen sonje sou pake a stun-client ak deside konnen ki jan li fonksyone, apre googling ak rechèch nan Yandex mwen te resevwa:

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

Nan repons mwen te resevwa:

STUN kliyan vèsyon 0.97
Louvri pò 21234 ak fd 3
Louvri pò 21235 ak fd 4
Kodaj mesaj stun:
Kodaj Chanjman Demann: 0

Pou voye msj len 28 a 216.93.246.18:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 4

Pou voye msj len 28 a 216.93.246.18:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 2

Pou voye msj len 28 a 216.93.246.18:3478
Resevwa mesaj stun: 92 bytes
MappedAddress = <IP mwen an>:2885
Adrès Sous = 216.93.246.18:3478
Adrès Chanje = 216.93.246.17:3479
Enkoni atribi: 32800
ServerName = Vovida.org 0.98-CPC
Resevwa mesaj kalite 257 id=1
Kodaj mesaj stun:
Kodaj Chanjman Demann: 0

Pou voye msj len 28 a 216.93.246.17:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 4

Pou voye msj len 28 a 216.93.246.18:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 2

Pou voye msj len 28 a 216.93.246.18:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 0

Pou voye msj len 28 bay <IP mwen>:2885
Resevwa mesaj stun: 28 bytes
ChanjmanDemann = 0
Resevwa mesaj kalite 1 id=11
Kodaj mesaj stun:
Kodaj Chanjman Demann: 0

Pou voye msj len 28 a 216.93.246.17:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 4

Pou voye msj len 28 a 216.93.246.18:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 2

Pou voye msj len 28 a 216.93.246.18:3478
Resevwa mesaj stun: 92 bytes
MappedAddress = <IP mwen an>:2885
Adrès Sous = 216.93.246.17:3479
Adrès Chanje = 216.93.246.18:3478
Enkoni atribi: 32800
ServerName = Vovida.org 0.98-CPC
Resevwa mesaj kalite 257 id=10
Kodaj mesaj stun:
Kodaj Chanjman Demann: 4

Pou voye msj len 28 a 216.93.246.18:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 2

Pou voye msj len 28 a 216.93.246.18:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 4

Pou voye msj len 28 a 216.93.246.18:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 2

Pou voye msj len 28 a 216.93.246.18:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 4

Pou voye msj len 28 a 216.93.246.18:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 2

Pou voye msj len 28 a 216.93.246.18:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 4

Pou voye msj len 28 a 216.93.246.18:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 2

Pou voye msj len 28 a 216.93.246.18:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 4

Pou voye msj len 28 a 216.93.246.18:3478
Kodaj mesaj stun:
Kodaj Chanjman Demann: 2

Pou voye msj len 28 a 216.93.246.18:3478
tès I = 1
tès II = 0
tès III = 0
tès I(2) = 1
se nat = 1
kat IP menm = 1
epengl = 1
pò prezèvatè = 0
Prensipal: Kat Endepandan, Filtè Port Depandan, pò o aza, pral epengl
Valè retounen se 0x000006

Chaîne ak valè

MappedAddress = <IP mwen an>:2885

jis sa ou bezwen! Li te montre estati aktyèl la pou koneksyon an sou pò UDP lokal 21234. Men, sa a se sèlman mwatye batay la, kesyon an leve sou ki jan yo transfere done sa yo nan lame a aleka epi òganize yon koneksyon VPN. Sèvi ak pwotokòl lapòs la, oswa petèt Telegram?! Gen anpil opsyon epi mwen deside sèvi ak Yandex.disk, depi mwen te vin atravè atik sou travay Curl atravè WebDav ak Yandex.disk. Apre reflechi sou aplikasyon an, mwen te vini ak konplo sa a:

  1. Siyal ke nœuds yo pare yo etabli yon koneksyon pa prezans nan yon dosye espesifik ak yon timestamp sou Yandex.disk;
  2. Si nœuds yo pare, Lè sa a, resevwa paramèt aktyèl nan sèvè STUN la;
  3. Voye anviwònman aktyèl yo nan Yandex.disk;
  4. Tcheke prezans ak li paramèt yon ne aleka nan yon dosye sou Yandex.disk;
  5. Etabli yon koneksyon ak yon lame aleka lè l sèvi avèk OpenVPN.

Pratike

Apre reflechi yon ti kras, pran an kont eksperyans nan dènye atik la, mwen byen vit ekri yon script. Nou pral bezwen:

# apt install openvpn stun-client curl 

Script nan tèt li:

Premye vèsyon

# 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

Pou script la travay ou bezwen:

  1. Kopi nan clipboard epi kole nan editè, pou egzanp:
    # nano vpn8.sh 
  2. presize non itilizatè a ak modpas pou Yandex.disk.
  3. nan jaden an "—ifconfig 10.45.54.(1 oswa 2) 255.255.255.252" presize adrès IP entèn koòdone a
  4. kreye sekrè.kle kòmandman:
    # openvpn --genkey --secret secret.key 
  5. fè script la ègzekutabl:
    # chmod +x vpn8.sh
  6. kouri script la:
    # ./vpn8.sh nZbVGBuX5dtturD

    kote nZbVGBuX5dtturD se ID koneksyon ki pwodui isit la

Sou ne a aleka, fè tout bagay menm eksepte pou jenere sekrè.key ak ID koneksyon, yo dwe idantik.

Mizajou vèsyon (tan dwe senkronize pou operasyon kòrèk):

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

Pou script la travay ou bezwen:

  1. Kopi nan clipboard epi kole nan editè, pou egzanp:
    # nano vpn10.sh 
  2. endike koneksyon an (2yèm liy) ak modpas pou Yandex.disk (3yèm liy).
  3. presize adrès IP entèn tinèl la (4yèm liy).
  4. fè script la ègzekutabl:
    # chmod +x vpn10.sh
  5. kouri script la:
    # ./vpn10.sh nZbVGBuX5dtturD

    kote nZbVGBuX5dtturD se ID koneksyon ki pwodui isit la

Sou ne a aleka, fè menm bagay la, presize adrès IP entèn korespondan tinèl la ak ID koneksyon an.

Pou otorize script la lè yo limen, mwen sèvi ak lòd "nohup /<chemen script la>/vpn10.sh nZbVGBuX5dtturD> /var/log/vpn10.log 2>/dev/null &" ki nan fichye /etc/ rc.local

Konklizyon

Script la ap travay, teste sou Ubuntu (18.04, 19.10, 20.04) ak Debian 9. Ou ka itilize nenpòt lòt sèvis kòm yon transmetè, men pou eksperyans mwen te itilize Yandex.disk.
Pandan eksperyans yo, li te dekouvri ke kèk kalite founisè NAT pa pèmèt etabli yon koneksyon. Sitou soti nan operatè mobil kote torrent yo bloke.

Mwen planifye amelyore an tèm de:

  • Otomatik jenerasyon secret.key chak fwa ou kòmanse, ankripte ak kopye nan Yandex.disk pou transfere nan yon ne aleka (Pran an kont nan vèsyon an mete ajou)
  • Otomatik plasman nan adrès IP nan interfaces
  • Chide done anvan ou telechaje sou Yandex.disk
  • Optimizasyon Kòd

Se pou gen IPv6 nan chak kay!

Mizajou! Dènye dosye ak pake DEB isit la - yandex.disk

Sous: www.habr.com

Add nouvo kòmantè