Sağlayıcı NAT'ları aracılığıyla bilgisayarlar arasında doğrudan VPN tüneli (VPS olmadan, STUN sunucusu ve Yandex.disk kullanılarak)

Uzatma makaleler NAT sağlayıcılarının arkasında bulunan iki bilgisayar arasında doğrudan bir VPN tüneli düzenlemeyi nasıl başardığım hakkında. Önceki makale, üçüncü bir tarafın - bir aracının (bir STUN sunucusu gibi davranan kiralanmış bir VPS ve bağlantı için bir düğüm veri vericisi gibi davranan) yardımıyla bir bağlantı düzenleme sürecini anlattı. Bu yazıda size VPS olmadan nasıl başardığımı anlatacağım, ancak aracılar kaldı ve onlar STUN sunucusu ve Yandex.Disk'ti...
Sağlayıcı NAT'ları aracılığıyla bilgisayarlar arasında doğrudan VPN tüneli (VPS olmadan, STUN sunucusu ve Yandex.disk kullanılarak)

Giriş

Önceki yazının yorumlarını okuduktan sonra, uygulamanın ana dezavantajının bir aracının - düğümün mevcut parametrelerini, nereye ve nasıl bağlanacağını gösteren bir üçüncü tarafın (VPS) kullanılması olduğunu fark ettim. Bu STUN'u kullanma önerileri dikkate alındığında (bunlardan çok var) geçerli bağlantı parametrelerini belirlemek için. Öncelikle STUN sunucusu istemcilerle çalışırken ve tamamen okunamayan içerik alırken paketlerin içeriğine bakmak için TCPDump'ı kullanmaya karar verdim. Karşılaştığım protokolü Google'da araştırıyorum protokolü açıklayan makale. STUN sunucusuna tek başıma bir istek uygulayamayacağımı fark ettim ve bu fikri “uzak bir kutuya” koydum.

Теория

Son zamanlarda STUN sunucusunu Debian'a paketten kurmak zorunda kaldım

# apt install stun-server

ve bağımlılıklarda stun-client paketini gördüm ama bir şekilde buna dikkat etmedim. Ancak daha sonra stun-client paketini hatırladım ve nasıl çalıştığını anlamaya karar verdim, Google'da arama yapıp Yandex'de arama yaptıktan sonra şunu elde ettim:

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

Cevap olarak şunu aldım:

STUN istemci sürümü 0.97
Fd 21234 ile 3 numaralı bağlantı noktasını açtım
Fd 21235 ile 4 numaralı bağlantı noktasını açtım
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 0

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 4

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 2

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajı alındı: 92 bayt
EşlenenAdres = <IP'm>:2885
KaynakAdresi = 216.93.246.18:3478
Değiştirilen Adres = 216.93.246.17:3479
Bilinmeyen özellik: 32800
SunucuAdı = Vovida.org 0.98-CPC
257 id=1 türünde mesaj alındı
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 0

28:216.93.246.17'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 4

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 2

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 0

<My IP>:28'e len 2885 mesajı gönderilmek üzere
Sersemletme mesajı alındı: 28 bayt
Değişiklik İsteği = 0
1 id=11 türünde mesaj alındı
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 0

28:216.93.246.17'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 4

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 2

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajı alındı: 92 bayt
EşlenenAdres = <IP'm>:2885
KaynakAdresi = 216.93.246.17:3479
Değiştirilen Adres = 216.93.246.18:3478
Bilinmeyen özellik: 32800
SunucuAdı = Vovida.org 0.98-CPC
257 id=10 türünde mesaj alındı
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 4

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 2

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 4

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 2

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 4

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 2

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 4

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 2

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 4

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
Sersemletme mesajını kodlama:
Kodlama Değişiklik İsteği: 2

28:216.93.246.18'e len 3478 mesajı gönderilmek üzere
test ben = 1
test II = 0
test III = 0
test I(2) = 1
nat = 1
eşlenen IP aynı = 1
saç tokası = 1
koruyucu bağlantı noktası = 0
Birincil: Bağımsız Haritalama, Bağlantı Noktasına Bağlı Filtre, rastgele bağlantı noktası, keskin bir şekilde sabitlenir
Dönüş değeri 0x000006

Değer içeren dize

EşlenenAdres = <IP'm>:2885

tam da ihtiyacın olan şey! Yerel UDP bağlantı noktası 21234'teki bağlantının mevcut durumunu gösterdi. Ancak bu, savaşın yalnızca yarısıdır, bu verilerin uzak ana bilgisayara nasıl aktarılacağı ve bir VPN bağlantısının nasıl organize edileceği sorusu ortaya çıktı. Posta protokolünü veya Telegram'ı mı kullanıyorsunuz?! Pek çok seçenek var ve karşılaştığım için Yandex.disk'i kullanmaya karar verdim. Curl'ün WebDav aracılığıyla Yandex.disk ile çalıştırılmasına ilişkin makale. Uygulamayı düşündükten sonra aşağıdaki şemayı buldum:

  1. Yandex.disk'te zaman damgalı belirli bir dosyanın varlığıyla düğümlerin bağlantı kurmaya hazır olduklarının sinyalini verin;
  2. Düğümler hazırsa STUN sunucusundan geçerli parametreleri alın;
  3. Geçerli ayarları Yandex.disk'e yükleyin;
  4. Yandex.disk'teki bir dosyadan uzak düğümün varlığını kontrol edin ve parametrelerini okuyun;
  5. OpenVPN kullanarak uzak bir ana bilgisayarla bağlantı kurma.

Uygulama

Biraz düşündükten sonra son makaledeki deneyimi dikkate alarak hızla bir senaryo yazdım. İhtiyacımız olacak:

# apt install openvpn stun-client curl 

Komut dosyasının kendisi:

Orijinal versiyon

# 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

Komut dosyasının çalışması için ihtiyacınız olan:

  1. Panoya kopyalayın ve düzenleyiciye yapıştırın, örneğin:
    # nano vpn8.sh 
  2. Yandex.disk'in kullanıcı adını ve şifresini belirtin.
  3. "—ifconfig 10.45.54.(1 veya 2) 255.255.255.252" alanında arayüzün dahili IP adresini belirtin
  4. yaratmak gizli anahtar komutla:
    # openvpn --genkey --secret secret.key 
  5. betiği çalıştırılabilir hale getirin:
    # chmod +x vpn8.sh
  6. betiği çalıştırın:
    # ./vpn8.sh nZbVGBuX5dtturD

    burada nZbVGBuX5dtturD oluşturulan bağlantı kimliğidir burada

Uzak düğümde, gizli anahtar ve bağlantı kimliğinin oluşturulması dışında her şeyi aynı yapın; bunların aynı olması gerekir.

Güncellenmiş sürüm (doğru çalışma için zamanın senkronize edilmesi gerekir):

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

Komut dosyasının çalışması için ihtiyacınız olan:

  1. Panoya kopyalayın ve düzenleyiciye yapıştırın, örneğin:
    # nano vpn10.sh 
  2. Yandex.disk için kullanıcı adını (2. satır) ve şifreyi (3. satır) belirtin.
  3. tünelin dahili IP adresini belirtin (4. satır).
  4. betiği çalıştırılabilir hale getirin:
    # chmod +x vpn10.sh
  5. betiği çalıştırın:
    # ./vpn10.sh nZbVGBuX5dtturD

    burada nZbVGBuX5dtturD oluşturulan bağlantı kimliğidir burada

Uzak düğümde de aynısını yapın, tünelin karşılık gelen dahili IP adresini ve bağlantı kimliğini belirtin.

Betiği açtığınızda otomatik olarak çalıştırmak için /etc/ dosyasında bulunan “nohup /<betiğin yolu>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &” komutunu kullanıyorum. rc.yerel

Sonuç

Komut dosyası çalışıyor, Ubuntu (18.04, 19.10, 20.04) ve Debian 9'da test edildi. Verici olarak başka herhangi bir hizmeti kullanabilirsiniz, ancak deneyim için Yandex.disk'i kullandım.
Deneyler sırasında bazı NAT sağlayıcı türlerinin bağlantı kurulmasına izin vermediği keşfedildi. Çoğunlukla torrentlerin engellendiği mobil operatörlerden.

Şu konularda gelişmeyi planlıyorum:

  • Uzak bir düğüme aktarım için her başlattığınızda, şifrelediğinizde ve Yandex.disk'e kopyaladığınızda gizli anahtarın otomatik olarak oluşturulması (Güncellenmiş sürüm dikkate alınarak)
  • Arayüzlerin IP adreslerinin otomatik atanması
  • Verileri Yandex.Disk'e yüklemeden önce şifrelemek
  • Kod optimizasyonu

Her evde IPv6 olsun!

Güncellenmiş! En son dosyalar ve DEB paketi burada - yandex.disk

Kaynak: habr.com

Yorum ekle