Suora VPN-tunneli tietokoneiden välillä palveluntarjoajien NAT:ien kautta (ilman VPS:ää, käyttämällä STUN-palvelinta ja Yandex.disk-levyä)

Laajentaminen Artikkeli siitä, kuinka onnistuin järjestämään suoran VPN-tunnelin kahden NAT-palveluntarjoajien takana sijaitsevan tietokoneen välille. Edellisessä artikkelissa kuvattiin yhteyden organisointiprosessia kolmannen osapuolen - välittäjän (vuokra-VPS, joka toimii jotenkin STUN-palvelimena ja yhteyden solmutietolähettimenä) avulla. Tässä artikkelissa kerron kuinka onnistuin ilman VPS:ää, mutta välittäjät säilyivät ja ne olivat STUN-palvelin ja Yandex.Disk...
Suora VPN-tunneli tietokoneiden välillä palveluntarjoajan NAT:ien kautta (ilman VPS:ää, käyttämällä STUN-palvelinta ja Yandex.disk-levyä)

Esittely

Luettuani edellisen viestin kommentit ymmärsin, että toteutuksen suurin haittapuoli oli välittäjän - kolmannen osapuolen (VPS) käyttö, joka ilmoitti solmun nykyiset parametrit, minne ja miten muodostaa yhteys. Ottaen huomioon suositukset tämän STUNin käyttämisestä (joita on paljon) määrittääksesi nykyiset yhteysparametrit. Ensinnäkin päätin tarkastella pakettien sisältöä TCPDumpilla, kun STUN-palvelin työskenteli asiakkaiden kanssa ja vastaanotti täysin lukukelvotonta sisältöä. Googlasin löytämäni protokollaa pöytäkirjaa kuvaava artikkeli. Tajusin, että en pystynyt toteuttamaan pyyntöä STUN-palvelimelle yksin ja laitoin idean "kaukaiseen laatikkoon".

teoria

Äskettäin minun piti asentaa STUN-palvelin Debianiin paketista

# apt install stun-server

ja riippuvuuksissa näin stun-client -paketin, mutta jotenkin en kiinnittänyt siihen huomiota. Mutta myöhemmin muistin stun-client-paketin ja päätin selvittää, miten se toimii, googlaamisen ja Yandexissä etsimisen jälkeen sain:

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

Vastauksena sain:

STUN-asiakasversio 0.97
Avattu portti 21234 fd 3:lla
Avattu portti 21235 fd 4:lla
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 0

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 4

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 2

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Vastaanotettu tainnutusviesti: 92 tavua
MappedAddress = <Oma IP>:2885
Lähdeosoite = 216.93.246.18:3478
Muutettu osoite = 216.93.246.17:3479
Tuntematon attribuutti: 32800
PalvelimenNimi = Vovida.org 0.98-CPC
Vastaanotettu viesti, jonka tyyppi on 257 id=1
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 0

Aikeissa lähettää viestin len 28 numeroon 216.93.246.17:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 4

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 2

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 0

Lähetetään viestiä len 28 osoitteeseen <Oma IP>:2885
Vastaanotettu tainnutusviesti: 28 tavua
Muutospyyntö = 0
Vastaanotettu viesti, jonka tyyppi on 1 id=11
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 0

Aikeissa lähettää viestin len 28 numeroon 216.93.246.17:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 4

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 2

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Vastaanotettu tainnutusviesti: 92 tavua
MappedAddress = <Oma IP>:2885
Lähdeosoite = 216.93.246.17:3479
Muutettu osoite = 216.93.246.18:3478
Tuntematon attribuutti: 32800
PalvelimenNimi = Vovida.org 0.98-CPC
Vastaanotettu viesti, jonka tyyppi on 257 id=10
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 4

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 2

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 4

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 2

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 4

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 2

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 4

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 2

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 4

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
Tainnutusviestin koodaus:
Koodaus ChangeRequest: 2

Aikeissa lähettää viestin len 28 numeroon 216.93.246.18:3478
testi I = 1
testi II = 0
testi III = 0
testi I(2) = 1
on nat = 1
kartoitettu IP sama = 1
hiusneula = 1
säilytysportti = 0
Ensisijainen: Itsenäinen kartoitus, porttiriippuvainen suodatin, satunnainen portti, hiusneula
Palautusarvo on 0x000006

Merkkijono arvolla

MappedAddress = <Oma IP>:2885

juuri mitä tarvitset! Se näytti yhteyden nykyisen tilan paikallisessa UDP-portissa 21234. Mutta tämä on vain puolet taistelusta; heräsi kysymys kuinka siirtää nämä tiedot etäisäntään ja järjestää VPN-yhteys. Käytätkö sähköpostiprotokollaa vai kenties Telegramia?! Vaihtoehtoja on monia, ja päätin käyttää Yandex.diskia, koska törmäsin artikkeli Curlin käyttämisestä WebDavin kautta Yandex.diskin kanssa. Toteutusta pohdittuani päädyin seuraavaan kaavioon:

  1. Signaali siitä, että solmut ovat valmiita muodostamaan yhteyden, kun Yandex.disk-sivustolla on tietty aikaleimalla varustettu tiedosto;
  2. Jos solmut ovat valmiita, vastaanota nykyiset parametrit STUN-palvelimelta;
  3. Lataa nykyiset asetukset Yandex.disk;
  4. Tarkista etäsolmun läsnäolo ja lue parametrit Yandex.disk-tiedostosta;
  5. Yhteyden muodostaminen etäisäntään OpenVPN:n avulla.

Käytäntö

Harkittuani hieman, ottaen huomioon edellisen artikkelin kokemuksen, kirjoitin nopeasti käsikirjoituksen. Tarvitsemme:

# apt install openvpn stun-client curl 

Itse käsikirjoitus:

alkuperäinen versio

# 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

Jotta skripti toimisi, tarvitset:

  1. Kopioi leikepöydälle ja liitä editoriin, esimerkiksi:
    # nano vpn8.sh 
  2. määritä Yandex.disk-käyttäjätunnus ja salasana.
  3. kentässä "—ifconfig 10.45.54.(1 or 2) 255.255.255.252" määritä liitännän sisäinen IP-osoite
  4. luoda salainen avain komennolla:
    # openvpn --genkey --secret secret.key 
  5. tee komentosarjasta suoritettava:
    # chmod +x vpn8.sh
  6. aja skripti:
    # ./vpn8.sh nZbVGBuX5dtturD

    jossa nZbVGBuX5dtturD on luotu yhteystunnus täällä

Tee kaikki etäsolmussa samoin paitsi salausavaimen ja yhteystunnuksen luominen. Niiden on oltava identtisiä.

Päivitetty versio (aika on synkronoitava, jotta se toimii oikein):

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

Jotta skripti toimisi, tarvitset:

  1. Kopioi leikepöydälle ja liitä editoriin, esimerkiksi:
    # nano vpn10.sh 
  2. ilmoita kirjautumistunnus (2. rivi) ja salasana Yandex.diskille (3. rivi).
  3. määritä tunnelin sisäinen IP-osoite (4. rivi).
  4. tee komentosarjasta suoritettava:
    # chmod +x vpn10.sh
  5. aja skripti:
    # ./vpn10.sh nZbVGBuX5dtturD

    jossa nZbVGBuX5dtturD on luotu yhteystunnus täällä

Tee sama etäsolmussa, määritä vastaava tunnelin sisäinen IP-osoite ja yhteystunnus.

Komentosarjan automaattiseen käynnistämiseen, kun se on päällä, käytän komentoa "nohup /<skriptin polku>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &", joka on tiedostossa /etc/ rc.local

Johtopäätös

Skripti toimii, testattu Ubuntulla (18.04, 19.10, 20.04) ja Debian 9:llä. Voit käyttää mitä tahansa muuta palvelua lähettimenä, mutta kokemuksen vuoksi käytin Yandex.disk-palvelua.
Kokeiden aikana havaittiin, että tietyntyyppiset NAT-palveluntarjoajat eivät salli yhteyden muodostamista. Pääasiassa matkapuhelinoperaattoreista, joissa torrentit estetään.

Aion kehittyä seuraavissa asioissa:

  • Secret.keyn automaattinen luominen joka kerta, kun käynnistät, salaa ja kopioi Yandex.disk-tiedostoon siirtämistä varten etäsolmuun (Ottaen huomioon päivitetyssä versiossa)
  • Liitäntöjen IP-osoitteiden automaattinen määritys
  • Tietojen salaus ennen lataamista Yandex.disk-sivustolle
  • Koodin optimointi

Olkoon IPv6 jokaisessa kodissa!

Päivitetty! Uusimmat tiedostot ja DEB-paketti täällä - yandex.disk

Lähde: will.com

Lisää kommentti