Rekta VPN-tunelo inter komputiloj per NAT-oj de provizantoj (sen VPS, uzante STUN-servilon kaj Yandex.disk)

Daŭrigo artikoloj pri kiel mi sukcesis organizi rektan VPN-tunelon inter du komputiloj situantaj malantaŭ NAT-provizantoj. La antaŭa artikolo priskribis la procezon de organizado de konekto kun la helpo de tria partio - peranto (luata VPS aganta kiel io kiel STUN-servilo kaj noda datumsendilo por la konekto). En ĉi tiu artikolo mi rakontos al vi kiel mi sukcesis sen VPS, sed la perantoj restis kaj ili estis la STUN-servilo kaj Yandex.Disk...
Rekta VPN-tunelo inter komputiloj per provizantaj NAT-oj (sen VPS, uzante STUN-servilon kaj Yandex.disk)

Enkonduko

Post legi la komentojn de la antaŭa afiŝo, mi rimarkis, ke la ĉefa malavantaĝo de la efektivigo estis la uzo de peranto - tria partio (VPS), kiu indikis la aktualajn parametrojn de la nodo, kie kaj kiel konekti. Konsiderante la rekomendojn por uzi ĉi tiun STUN (el kiuj estas multaj) por determini la nunajn konektajn parametrojn. Antaŭ ĉio, mi decidis uzi TCPDump por rigardi la enhavon de la pakaĵoj kiam la STUN-servilo laboris kun klientoj kaj ricevis tute nelegeblan enhavon. Gugligante la protokolon, kiun mi renkontis artikolo priskribanta la protokolon. Mi rimarkis, ke mi ne povas efektivigi peton al la STUN-servilo memstare kaj meti la ideon en "malproksiman skatolon".

Teorio

Lastatempe mi devis instali STUN-servilon sur Debian de la pakaĵo

# apt install stun-server

kaj en la dependecoj mi vidis la stun-client-pakaĵon, sed iel mi ne atentis ĝin. Sed poste mi rememoris pri la stun-kliento-pakaĵo kaj decidis ekscii kiel ĝi funkcias, post guglo kaj serĉado en Yandex mi ricevis:

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

Responde mi ricevis:

STUN-klienta versio 0.97
Malfermita haveno 21234 kun fd 3
Malfermita haveno 21235 kun fd 4
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 0

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 4

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 2

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Ricevita miregiga mesaĝo: 92 bajtoj
MappedAddress = <Mia IP>:2885
Fontadreso = 216.93.246.18:3478
Ŝanĝita Adreso = 216.93.246.17:3479
Nekonata atributo: 32800
ServerName = Vovida.org 0.98-CPC
Ricevita mesaĝo de tipo 257 id=1
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 0

Sendonta mesaĝon de len 28 al 216.93.246.17:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 4

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 2

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 0

Sendonta mesaĝon de len 28 al <Mia IP>:2885
Ricevita miregiga mesaĝo: 28 bajtoj
Ŝanĝpeto = 0
Ricevita mesaĝo de tipo 1 id=11
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 0

Sendonta mesaĝon de len 28 al 216.93.246.17:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 4

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 2

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Ricevita miregiga mesaĝo: 92 bajtoj
MappedAddress = <Mia IP>:2885
Fontadreso = 216.93.246.17:3479
Ŝanĝita Adreso = 216.93.246.18:3478
Nekonata atributo: 32800
ServerName = Vovida.org 0.98-CPC
Ricevita mesaĝo de tipo 257 id=10
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 4

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 2

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 4

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 2

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 4

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 2

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 4

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 2

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 4

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
Kodigado de sturdmesaĝo:
Kodigo de Ŝanĝo-Peto: 2

Sendonta mesaĝon de len 28 al 216.93.246.18:3478
testo I = 1
testo II = 0
provo III = 0
testo I(2) = 1
estas nat = 1
mapita IP sama = 1
harpinglo = 1
konserva haveno = 0
Ĉefa: Sendependa Mapo, Haveno Dependa Filtrilo, hazarda haveno, harpinglo
Revenvaloro estas 0x000006

Ŝnuro kun valoro

MappedAddress = <Mia IP>:2885

ĝuste kion vi bezonas! Ĝi montris la nunan staton por la konekto sur loka UDP-haveno 21234. Sed ĉi tio estas nur duono de la batalo, la demando ekestis kiel transdoni ĉi tiujn datumojn al la fora gastiganto kaj organizi VPN-konekton. Uzante la poŝtan protokolon, aŭ eble Telegramon?! Estas multaj ebloj kaj mi decidis uzi Yandex.disk, ĉar mi trovis artikolo pri laborado de Buklo per WebDav kun Yandex.disk. Pensinte pri la efektivigo, mi elpensis la jenan skemon:

  1. Signalu, ke nodoj pretas establi konekton per la ĉeesto de specifa dosiero kun tempomarko sur Yandex.disk;
  2. Se la nodoj estas pretaj, tiam ricevu aktualajn parametrojn de la STUN-servilo;
  3. Alŝutu aktualajn agordojn al Yandex.disk;
  4. Kontrolu la ĉeeston kaj legu parametrojn de fora nodo de dosiero sur Yandex.disk;
  5. Establi konekton kun fora gastiganto uzante OpenVPN.

Praktiko

Pensinte iomete, konsiderante la sperton de la lasta artikolo, mi rapide verkis skripton. Ni bezonos:

# apt install openvpn stun-client curl 

La skripto mem:

originala 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

Por ke la skripto funkciu, vi bezonas:

  1. Kopiu al tondujo kaj algluu en redaktilon, ekzemple:
    # nano vpn8.sh 
  2. specifu la uzantnomon kaj pasvorton por Yandex.disk.
  3. en la kampo "—ifconfig 10.45.54.(1 aŭ 2) 255.255.255.252" specifu la internan IP-adreson de la interfaco
  4. krei sekreta.ŝlosilo kun la komando:
    # openvpn --genkey --secret secret.key 
  5. faru la skripton plenumebla:
    # chmod +x vpn8.sh
  6. rulu la skripton:
    # ./vpn8.sh nZbVGBuX5dtturD

    kie nZbVGBuX5dtturD estas la generita konekto-ID tie

Sur la fora nodo, faru ĉion same krom generi secret.key kaj connect ID, ili devas esti identaj.

Ĝisdatigita versio (tempo devas esti sinkronigita por ĝusta funkciado):

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

Por ke la skripto funkciu, vi bezonas:

  1. Kopiu al tondujo kaj algluu en redaktilon, ekzemple:
    # nano vpn10.sh 
  2. indiku la ensaluton (2a linio) kaj pasvorton por Yandex.disk (3a linio).
  3. specifu la internan IP-adreson de la tunelo (4-a linio).
  4. faru la skripton plenumebla:
    # chmod +x vpn10.sh
  5. rulu la skripton:
    # ./vpn10.sh nZbVGBuX5dtturD

    kie nZbVGBuX5dtturD estas la generita konekto-ID tie

Sur la fora nodo, faru la samon, specifu la respondan internan IP-adreson de la tunelo kaj konektan ID.

Por aŭtomate ruli la skripton kiam ĝi estas ŝaltita, mi uzas la komandon "nohup /<vojo al la skripto>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &" enhavita en la dosiero /etc/ rc.loka

konkludo

La skripto funkcias, provita ĉe Ubuntu (18.04, 19.10, 20.04) kaj Debian 9. Vi povas uzi ajnan alian servon kiel dissendilon, sed por sperto mi uzis Yandex.disk.
Dum la eksperimentoj, oni malkovris, ke iuj specoj de NAT-provizantoj ne permesas establi konekton. Ĉefe de moveblaj telefonistoj, kie torentoj estas blokitaj.

Mi planas plibonigi koncerne:

  • Aŭtomata generacio de secret.key ĉiufoje kiam vi komencas, ĉifri kaj kopiu al Yandex.disk por translokigo al fora nodo (Konsiderante en la ĝisdatigita versio)
  • Aŭtomata atribuo de IP-adresoj de interfacoj
  • Ĉifrado de datumoj antaŭ alŝuto al Yandex.disk
  • Optimumigo de kodo

Estu IPv6 en ĉiu hejmo!

Ĝisdatigita! Plej novaj dosieroj kaj DEB-pakaĵo ĉi tie - yandex.disko

fonto: www.habr.com

Aldoni komenton