Direkte VPN-tunnel tusken kompjûters fia provider NAT's (sûnder VPS, mei STUN-tsjinner en Yandex.disk)

Continuation artikels oer hoe't ik it slagge om in direkte VPN-tunnel te organisearjen tusken twa kompjûters efter NAT-oanbieders. It foarige artikel beskreau it proses fan it organisearjen fan in ferbining mei help fan in tredde partij - in tuskenpersoan (in ferhierd VPS dy't fungearret as in STUN-tsjinner en in node-gegevensstjoerder foar de ferbining). Yn dit artikel sil ik jo fertelle hoe't ik sûnder VPS slagge, mar de tuskenpersoanen bleaunen en se wiene de STUN-tsjinner en Yandex.Disk ...
Direkte VPN-tunnel tusken kompjûters fia provider NAT's (sûnder VPS, mei STUN-tsjinner en Yandex.disk)

Ynlieding

Nei it lêzen fan 'e opmerkings fan' e foarige post, realisearre ik dat it wichtichste nadeel fan 'e ymplemintaasje it gebrûk fan in tuskenpersoan wie - in tredde partij (VPS) dy't de hjoeddeistige parameters fan' e knooppunt oanjûn, wêr en hoe't jo ferbine. Sjoen de oanbefellings om dizze STUN te brûken (dêr't der in protte fan binne) om de hjoeddeistige ferbiningsparameters te bepalen. Alderearst haw ik besletten om TCPDump te brûken om de ynhâld fan 'e pakketten te sjen doe't de STUN-tsjinner mei kliïnten wurke en folslein ûnlêsbere ynhâld krige. It googlejen fan it protokol kaam ik tsjin artikel dat it protokol beskriuwt. Ik realisearre dat ik koe net útfiere in fersyk oan de STUN tsjinner op myn eigen en sette it idee yn in "fiere doaze".

Teory

Koartlyn moast ik STUN-tsjinner op Debian ynstallearje fanút it pakket

# apt install stun-server

en yn 'e ôfhinklikens seach ik it stun-client-pakket, mar op ien of oare manier joech ik der gjin oandacht oan. Mar letter herinnerde ik my oan it stun-client-pakket en besleat ik út te finen hoe't it wurket, nei googelen en sykjen yn Yandex krige ik:

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

As antwurd krige ik:

STUN-kliïntferzje 0.97
Poarte 21234 iepene mei fd 3
Poarte 21235 iepene mei fd 4
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 0

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 4

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 2

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Untfongen stun berjocht: 92 bytes
MappedAddress = <Myn IP>:2885
Boarneadres = 216.93.246.18:3478
Feroare Adres = 216.93.246.17:3479
Unbekend attribút: 32800
ServerName = Vovida.org 0.98-CPC
Untfongen berjocht fan type 257 id=1
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 0

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.17:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 4

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 2

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 0

Oer it stjoeren fan berjocht fan len 28 nei <Myn IP>:2885
Untfongen stun berjocht: 28 bytes
ChangeRequest = 0
Untfongen berjocht fan type 1 id=11
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 0

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.17:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 4

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 2

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Untfongen stun berjocht: 92 bytes
MappedAddress = <Myn IP>:2885
Boarneadres = 216.93.246.17:3479
Feroare Adres = 216.93.246.18:3478
Unbekend attribút: 32800
ServerName = Vovida.org 0.98-CPC
Untfongen berjocht fan type 257 id=10
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 4

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 2

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 4

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 2

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 4

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 2

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 4

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 2

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 4

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
Kodearjen stun berjocht:
Fersyk foar feroaring fan kodearring: 2

Oer it ferstjoeren fan berjocht fan len 28 nei 216.93.246.18:3478
test I = 1
test II = 0
test III = 0
test I(2) = 1
is nat = 1
mapd IP itselde = 1
haarspeld = 1
preserver poarte = 0
Primêr: Independent Mapping, Port Dependent Filter, willekeurich haven, sil hairpin
Return wearde is 0x000006

String mei wearde

MappedAddress = <Myn IP>:2885

krekt wat jo nedich hawwe! It toant de aktuele status foar de ferbining op lokale UDP-poarte 21234. Mar dit is mar de helte fan 'e slach; de fraach ûntstie fan hoe't jo dizze gegevens oerdrage nei de host op ôfstân en in VPN-ferbining organisearje. It e-postprotokol brûke, of miskien Telegram?! D'r binne in protte opsjes en ik besleat Yandex.disk te brûken, om't ik tsjinkaam artikel oer wurkjen Curl fia WebDav mei Yandex.disk. Nei it tinken oer de ymplemintaasje kaam ik mei it folgjende skema:

  1. Sinjaal dat knopen klear binne om in ferbining te meitsjen troch de oanwêzigens fan in spesifike triem mei in tiidstempel op Yandex.disk;
  2. As de knopen klear binne, ûntfange aktuele parameters fan 'e STUN-tsjinner;
  3. Upload aktuele ynstellings nei Yandex.disk;
  4. Kontrolearje de oanwêzigens en lês parameters fan in knooppunt op ôfstân fan in bestân op Yandex.disk;
  5. In ferbining meitsje mei in host op ôfstân mei OpenVPN.

Praktyk

Nei in bytsje tinken, rekken hâldend mei de ûnderfining fan it lêste artikel, skreau ik gau in skript. Wy sille nedich:

# apt install openvpn stun-client curl 

It skript sels:

orizjinele ferzje

# 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

Foar it skript om te wurkjen hawwe jo nedich:

  1. Kopiearje nei klamboerd en plakke yn bewurker, bygelyks:
    # nano vpn8.sh 
  2. spesifisearje de brûkersnamme en wachtwurd foar Yandex.disk.
  3. yn it fjild "—ifconfig 10.45.54.(1 of 2) 255.255.255.252" spesifisearje it ynterne IP-adres fan 'e ynterface
  4. meitsje geheime.kaai befel:
    # openvpn --genkey --secret secret.key 
  5. meitsje it skript útfierber:
    # chmod +x vpn8.sh
  6. útfiere it skript:
    # ./vpn8.sh nZbVGBuX5dtturD

    dêr't nZbVGBuX5dtturD is de oanmakke ferbining ID hjir

Op it knooppunt op ôfstân, dogge alles itselde útsein foar it generearjen fan secret.key en ferbinings-ID, se moatte identyk wêze.

Bywurke ferzje (tiid moat syngronisearre wurde foar juste operaasje):

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

Foar it skript om te wurkjen hawwe jo nedich:

  1. Kopiearje nei klamboerd en plakke yn bewurker, bygelyks:
    # nano vpn10.sh 
  2. oanjaan de oanmelding (2e rigel) en wachtwurd foar Yandex.disk (3e rigel).
  3. spesifisearje it ynterne IP-adres fan 'e tunnel (4e rigel).
  4. meitsje it skript útfierber:
    # chmod +x vpn10.sh
  5. útfiere it skript:
    # ./vpn10.sh nZbVGBuX5dtturD

    dêr't nZbVGBuX5dtturD is de oanmakke ferbining ID hjir

Doch itselde op it knooppunt op ôfstân, spesifisearje it oerienkommende ynterne IP-adres fan 'e tunnel en ferbinings-ID.

Om it skript automatysk út te fieren as it ynskeakele is, brûk ik it kommando "nohup /<paad nei it skript>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &" yn it bestân /etc/ rc.local

konklúzje

It skript wurket, testen op Ubuntu (18.04, 19.10, 20.04) en Debian 9. Jo kinne elke oare tsjinst brûke as stjoerder, mar foar ûnderfining haw ik Yandex.disk brûkt.
Tidens de eksperiminten waard ûntdutsen dat guon soarten NAT-providers gjin ferbining meitsje kinne. Benammen fan mobile operators wêr't torrents wurde blokkearre.

Ik plan te ferbetterjen yn termen fan:

  • Automatyske generaasje fan secret.key elke kear as jo begjinne, fersiferje en kopiearje nei Yandex.disk foar oerdracht nei in knooppunt op ôfstân (Rekening mei de bywurke ferzje)
  • Automatyske tawizing fan IP-adressen fan ynterfaces
  • Gegevens fersiferje foardat jo oplade nei Yandex.disk
  • Koade optimalisaasje

Lit d'r IPv6 wêze yn elk hûs!

Bywurke! Lêste bestannen en DEB-pakket hjir - yandex.disk

Boarne: www.habr.com

Add a comment