Tiesioginis VPN tunelis tarp kompiuterių per tiekėjų NAT (be VPS, naudojant STUN serverį ir Yandex.disk)

Pratęsimas Straipsnis apie tai, kaip man pavyko organizuoti tiesioginį VPN tunelį tarp dviejų kompiuterių, esančių už NAT tiekėjų. Ankstesniame straipsnyje buvo aprašytas ryšio organizavimo procesas, pasitelkiant trečiąją šalį – tarpininką (nuomojamą VPS, veikiantį kaip kažkas panašaus į STUN serverį ir mazgo duomenų siųstuvą ryšiui). Šiame straipsnyje papasakosiu, kaip aš išsiverčiau be VPS, tačiau tarpininkai liko ir tai buvo STUN serveris ir Yandex.Disk...
Tiesioginis VPN tunelis tarp kompiuterių per teikėjo NAT (be VPS, naudojant STUN serverį ir Yandex.disk)

įvedimas

Perskaičiusi ankstesnio įrašo komentarus, supratau, kad pagrindinis diegimo trūkumas buvo tarpininko - trečiosios šalies (VPS) naudojimas, kuris nurodė esamus mazgo parametrus, kur ir kaip prisijungti. Atsižvelgiant į rekomendacijas naudoti šį STUN (kurių yra daug), norėdami nustatyti esamus ryšio parametrus. Visų pirma nusprendžiau naudoti TCPDump, kad galėčiau peržiūrėti paketų turinį, kai STUN serveris dirbo su klientais ir gavo visiškai neįskaitomą turinį. Googlavau protokolą, kurį radau protokolą aprašantis straipsnis. Supratau, kad negaliu savarankiškai įgyvendinti užklausos STUN serveriui ir sudėjau idėją į „tolimą dėžutę“.

Теория

Neseniai turėjau įdiegti STUN serverį Debian'e iš paketo

# apt install stun-server

ir priklausomybėse mačiau stun-client paketą, bet kažkaip nekreipiau į tai dėmesio. Tačiau vėliau prisiminiau apie apsvaiginimo kliento paketą ir nusprendžiau išsiaiškinti, kaip jis veikia, paieškojęs „Yandex“ ir paieškojęs „Yandex“ gavau:

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

Atsakydama gavau:

STUN kliento versija 0.97
Atidarytas prievadas 21234 su fd 3
Atidarytas prievadas 21235 su fd 4
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 0

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 4

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 2

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Gautas apsvaiginimo pranešimas: 92 baitai
MappedAddress = <Mano IP>:2885
Šaltinio adresas = 216.93.246.18:3478
Pakeistas Adresas = 216.93.246.17:3479
Nežinomas atributas: 32800
Serverio pavadinimas = Vovida.org 0.98-CPC
Gautas 257 tipo pranešimas id=1
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 0

Ketinate išsiųsti len 28 pranešimą į 216.93.246.17:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 4

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 2

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 0

Ketinate siųsti pranešimą apie len 28 į <My IP>:2885
Gautas apsvaiginimo pranešimas: 28 baitai
ChangeRequest = 0
Gautas 1 tipo pranešimas id=11
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 0

Ketinate išsiųsti len 28 pranešimą į 216.93.246.17:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 4

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 2

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Gautas apsvaiginimo pranešimas: 92 baitai
MappedAddress = <Mano IP>:2885
Šaltinio adresas = 216.93.246.17:3479
Pakeistas Adresas = 216.93.246.18:3478
Nežinomas atributas: 32800
Serverio pavadinimas = Vovida.org 0.98-CPC
Gautas 257 tipo pranešimas id=10
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 4

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 2

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 4

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 2

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 4

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 2

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 4

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 2

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 4

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
Užkoduotas apsvaiginimo pranešimas:
Kodavimas ChangeRequest: 2

Ketinate išsiųsti len 28 pranešimą į 216.93.246.18:3478
I testas = 1
II testas = 0
III testas = 0
testas I(2) = 1
yra nat = 1
susietas IP tas pats = 1
plaukų segtukas = 1
konservatoriaus prievadas = 0
Pagrindinis: nepriklausomas atvaizdavimas, prievado priklausomas filtras, atsitiktinis prievadas, segtukas
Grąžinama vertė yra 0x000006

Styga su verte

MappedAddress = <Mano IP>:2885

kaip tik ko tau reikia! Jis rodė esamą ryšio būseną vietiniame UDP prievade 21234. Bet tai tik pusė darbo, iškilo klausimas, kaip perkelti šiuos duomenis į nuotolinį pagrindinį kompiuterį ir organizuoti VPN ryšį. Naudojant pašto protokolą, o gal Telegramą?! Yra daug variantų ir aš nusprendžiau naudoti Yandex.disk, nes susidūriau straipsnis apie „Curl“ darbą naudojant „WebDav“ su Yandex.disk. Pagalvojęs apie įgyvendinimą, sugalvojau tokią schemą:

  1. Signalas, kad mazgai yra pasirengę užmegzti ryšį, esant tam tikram failui su laiko žyma Yandex.disk;
  2. Jei mazgai yra paruošti, gaukite esamus parametrus iš STUN serverio;
  3. Įkelti dabartinius nustatymus į Yandex.disk;
  4. Patikrinkite nuotolinio mazgo buvimą ir nuskaitykite parametrus iš failo Yandex.disk;
  5. Ryšio su nuotoliniu kompiuteriu užmezgimas naudojant OpenVPN.

Praktika

Šiek tiek pagalvojęs, atsižvelgdamas į paskutinio straipsnio patirtį, greitai parašiau scenarijų. Mums reikės:

# apt install openvpn stun-client curl 

Pats scenarijus:

originali versija

# 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

Kad scenarijus veiktų, jums reikia:

  1. Nukopijuokite į mainų sritį ir įklijuokite į redaktorių, pavyzdžiui:
    # nano vpn8.sh 
  2. nurodykite Yandex.disk vartotojo vardą ir slaptažodį.
  3. lauke „—ifconfig 10.45.54.(1 or 2) 255.255.255.252“ nurodykite vidinį sąsajos IP adresą
  4. sukurti slaptas.raktas pagal komandą:
    # openvpn --genkey --secret secret.key 
  5. padarykite scenarijų vykdomą:
    # chmod +x vpn8.sh
  6. paleiskite scenarijų:
    # ./vpn8.sh nZbVGBuX5dtturD

    kur nZbVGBuX5dtturD yra sugeneruotas ryšio ID čia

Nuotoliniame mazge darykite viską taip pat, išskyrus slaptojo rakto ir ryšio ID generavimą, jie turi būti identiški.

Atnaujinta versija (tinkamam veikimui laikas turi būti sinchronizuotas):

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

Kad scenarijus veiktų, jums reikia:

  1. Nukopijuokite į mainų sritį ir įklijuokite į redaktorių, pavyzdžiui:
    # nano vpn10.sh 
  2. nurodykite prisijungimo vardą (2 eilutė) ir slaptažodį Yandex.disk (3 eilutė).
  3. nurodykite tunelio vidinį IP adresą (4 eilutė).
  4. padarykite scenarijų vykdomą:
    # chmod +x vpn10.sh
  5. paleiskite scenarijų:
    # ./vpn10.sh nZbVGBuX5dtturD

    kur nZbVGBuX5dtturD yra sugeneruotas ryšio ID čia

Nuotoliniame mazge atlikite tą patį, nurodykite atitinkamą vidinį tunelio IP adresą ir ryšio ID.

Norėdami automatiškai paleisti scenarijų, kai jis įjungtas, naudoju komandą „nohup /<skripto kelias>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &“, esančią faile /etc/ rc.local

išvada

Scenarijus veikia, išbandytas Ubuntu (18.04, 19.10, 20.04) ir Debian 9. Galite naudoti bet kurią kitą paslaugą kaip siųstuvą, bet dėl ​​patirties naudojau Yandex.disk.
Eksperimentų metu buvo nustatyta, kad kai kurių tipų NAT teikėjai neleidžia užmegzti ryšio. Daugiausia iš mobiliojo ryšio operatorių, kur torrentai blokuojami.

Planuoju tobulėti:

  • Automatinis slaptojo rakto generavimas kiekvieną kartą paleidus, užšifruokite ir nukopijuokite į Yandex.disk, kad galėtumėte perkelti į nuotolinį mazgą (atsižvelgiama į atnaujintą versiją)
  • Automatinis sąsajų IP adresų priskyrimas
  • Duomenų šifravimas prieš įkeliant į Yandex.disk
  • Kodo optimizavimas

Tegul IPv6 būna kiekvienuose namuose!

Atnaujinta! Naujausi failai ir DEB paketas čia - yandex.disk

Šaltinis: www.habr.com

Добавить комментарий