نفق VPN مباشر بين أجهزة الكمبيوتر من خلال NATs لمقدمي الخدمة (بدون VPS ، باستخدام خادم STUN و Yandex.disk)

تمديد مقالات حول كيفية تنظيم نفق VPN مباشر بين جهازي كمبيوتر موجودين خلف ISP NATs. وصفت المقالة الأخيرة عملية تنظيم الاتصال بمساعدة طرف ثالث - وسيط (خادم VPS مستأجر يعمل كشيء مثل خادم STUN وجهاز إرسال بيانات العقدة للاتصال). في هذه المقالة سوف أخبرك كيف تمكنت من العمل بدون VPS ، لكن الوسطاء ظلوا وهم خادم STUN و Yandex.Disk ...
نفق VPN مباشر بين أجهزة الكمبيوتر من خلال NATs لمقدمي الخدمة (بدون VPS ، باستخدام خادم STUN و Yandex.disk)

مقدمة

بعد قراءة تعليقات المنشور الأخير ، أدركت أن العيب الرئيسي في التنفيذ هو استخدام وسيط - طرف ثالث (VPS) يشير إلى المعلمات الحالية للعقدة ، وأين وكيف يتم الاتصال. بالنظر إلى التوصيات لاستخدام صاعقة حقيقية (التي يوجد منها الكثير) لتحديد إعدادات الاتصال الحالية. بادئ ذي بدء ، قررت استخدام TCPDump للنظر في محتويات الحزم عندما كان خادم STUN يعمل مع العملاء وتلقى محتويات غير قابلة للقراءة تمامًا. جوجلينغ جاء البروتوكول عبر مقالة تصف البروتوكول. أدركت أنه لا يمكنني تنفيذ طلب إلى خادم STUN بمفردي وتركت الفكرة بعيدًا.

نظرية

اضطررت مؤخرًا إلى تثبيت خادم STUN على دبيان من الحزمة

# apt install stun-server

وفي التبعيات رأيت حزمة stun-client ، لكن بطريقة ما لم تعلق أي أهمية على ذلك. لكن في وقت لاحق تذكرت حزمة stun-client وقررت معرفة كيفية عملها ، من خلال googling واستخدام Yandex حصلت على:

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

ردا على ذلك تلقيت:

إصدار عميل STUN 0.97
المنفذ المفتوح 21234 مع fd 3
المنفذ المفتوح 21235 مع fd 4
ترميز رسالة صاعقة:
طلب تغيير الترميز: 0

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 4

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 2

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
تلقي رسالة صاعقة: 92 بايت
MappedAddress = <عنوان IP الخاص بي>: 2885
عنوان المصدر = 216.93.246.18:3478
تم تغيير العنوان = 216.93.246.17:3479
سمة غير معروفة: 32800
اسم الخادم = Vovida.org 0.98-CPC
تم استلام رسالة من النوع 257 معرف = 1
ترميز رسالة صاعقة:
طلب تغيير الترميز: 0

على وشك إرسال رسالة من len 28 إلى 216.93.246.17:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 4

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 2

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 0

على وشك إرسال رسالة len 28 إلى <My IP>: 2885
تلقي رسالة صاعقة: 28 بايت
طلب التغيير = 0
تم استلام رسالة من النوع 1 معرف = 11
ترميز رسالة صاعقة:
طلب تغيير الترميز: 0

على وشك إرسال رسالة من len 28 إلى 216.93.246.17:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 4

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 2

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
تلقي رسالة صاعقة: 92 بايت
MappedAddress = <عنوان IP الخاص بي>: 2885
عنوان المصدر = 216.93.246.17:3479
تم تغيير العنوان = 216.93.246.18:3478
سمة غير معروفة: 32800
اسم الخادم = Vovida.org 0.98-CPC
تم استلام رسالة من النوع 257 معرف = 10
ترميز رسالة صاعقة:
طلب تغيير الترميز: 4

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 2

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 4

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 2

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 4

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 2

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 4

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 2

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 4

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
ترميز رسالة صاعقة:
طلب تغيير الترميز: 2

على وشك إرسال رسالة من len 28 إلى 216.93.246.18:3478
اختبار أنا = 1
اختبار II = 0
الاختبار الثالث = 0
الاختبار الأول (2) = 1
هو نات = 1
عنوان IP المعين نفسه = 1
دبوس الشعر = 1
منفذ الحافظ = 0
أساسي: رسم الخرائط المستقل ، المرشح المعتمد على المنفذ ، المنفذ العشوائي ، سوف ينكسر
القيمة المرجعة هي 0x000006

سلسلة ذات قيمة

MappedAddress = <عنوان IP الخاص بي>: 2885

فقط ما تحتاجه! عرض الحالة الحالية للاتصال على منفذ UDP المحلي 21234. ولكن هذا نصف المعركة فقط ، نشأ السؤال حول كيفية نقل هذه البيانات إلى مضيف بعيد وإنشاء اتصال VPN. باستخدام بروتوكول البريد ، أو ربما Telegram ؟! هناك العديد من الخيارات وقررت استخدام Yandex.disk ، كما صادفت مقال حول عمل Curl عبر WebDav مع Yandex.disk. بعد التفكير في التنفيذ ، توصلت إلى هذا المخطط:

  1. إشارة إلى أن العقد جاهزة لإنشاء اتصال من خلال وجود ملف معين بطابع زمني على Yandex.disk ؛
  2. إذا كانت العقد جاهزة ، فاحصل على المعلمات الحالية من خادم STUN ؛
  3. تحميل الإعدادات الحالية إلى Yandex.disk ؛
  4. تحقق من التواجد واقرأ معلمات مضيف بعيد من ملف على Yandex.disk ؛
  5. إنشاء اتصال بمضيف بعيد باستخدام OpenVPN.

ممارسة

بعد قليل من التفكير ، مع الأخذ في الاعتبار تجربة المقال الأخير ، كتبت سيناريو على عجل. سنحتاج:

# apt install openvpn stun-client curl 

في الواقع النص نفسه:

نسخة أولية

# 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

لكي يعمل البرنامج النصي ، فأنت بحاجة إلى:

  1. انسخ إلى الحافظة والصقها في المحرر ، على سبيل المثال:
    # nano vpn8.sh 
  2. حدد تسجيل الدخول وكلمة المرور من Yandex.disk.
  3. في الحقل "—ifconfig 10.45.54. (1 أو 2) 255.255.255.252" حدد عنوان IP الداخلي للواجهة
  4. يخلق المفتاح السري بالأمر:
    # openvpn --genkey --secret secret.key 
  5. اجعل النص قابلاً للتنفيذ:
    # chmod +x vpn8.sh
  6. النصي تشغيل:
    # ./vpn8.sh nZbVGBuX5dtturD

    حيث nZbVGBuX5dtturD هو معرف الاتصال الذي تم إنشاؤه هنا

على المضيف البعيد ، افعل الشيء نفسه باستثناء إنشاء مفتاح secret.key ومعرف الاتصال ، يجب أن يكونا متطابقين.

نسخة محدثة (للعمل الصحيح ، يجب مزامنة الوقت):

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

لكي يعمل البرنامج النصي ، فأنت بحاجة إلى:

  1. انسخ إلى الحافظة والصقها في المحرر ، على سبيل المثال:
    # nano vpn10.sh 
  2. حدد تسجيل الدخول (السطر الثاني) وكلمة المرور من Yandex.disk (السطر الثالث).
  3. حدد عنوان IP الداخلي للنفق (السطر الرابع).
  4. اجعل النص قابلاً للتنفيذ:
    # chmod +x vpn10.sh
  5. النصي تشغيل:
    # ./vpn10.sh nZbVGBuX5dtturD

    حيث nZbVGBuX5dtturD هو معرف الاتصال الذي تم إنشاؤه هنا

على المضيف البعيد ، افعل الشيء نفسه ، وحدد عنوان IP الداخلي للنفق ومعرف الاتصال المناسبين.

لتشغيل البرنامج النصي تلقائيًا عند بدء التشغيل ، استخدم الأمر "nohup / <path to the script> /vpn10.sh nZbVGBuX5dtturD> /var/log/vpn10.log 2> / dev / null &" الموجود في الملف / etc / rc .محلي

اختتام

يعمل البرنامج النصي ، وتم اختباره على Ubuntu (18.04 و 19.10 و 20.04) و Debian 9. يمكنك استخدام أي خدمة أخرى كجهاز إرسال ، ولكن للتجربة التي استخدمتها Yandex.disk.
أثناء التجارب ، وجد أن بعض أنواع موفري NAT لا تسمح لك بإنشاء اتصال. في الغالب من مشغلي شبكات الهاتف المحمول ، حيث يتم حظر السيول.

أخطط للتحسين من حيث:

  • الإنشاء التلقائي لـ secret.key في كل مرة تبدأ فيها ، وتشفير ونسخ إلى Yandex.disk للإرسال إلى مضيف بعيد (تم اعتباره في الإصدار المحدث)
  • التخصيص التلقائي لعناوين IP للواجهة
  • تشفير البيانات قبل التحميل على Yandex.disk
  • تحسين الكود

يجب ألا يكون هناك IPv6 في كل منزل!

محدث! أحدث الملفات وحزمة DEB هنا - yandex.disk

المصدر: www.habr.com

إضافة تعليق