Үйлчилгээ үзүүлэгчийн NAT-уудаар дамжуулан компьютеруудын хооронд шууд VPN туннел (VPS-гүй, STUN сервер болон Yandex.disk ашиглан)

Үргэлжлэл нийтлэл Би NAT үйлчилгээ үзүүлэгчийн ард байрлах хоёр компьютерын хооронд шууд VPN туннелийг хэрхэн зохион байгуулж чадсан тухай. Өмнөх нийтлэлд гуравдагч этгээдийн тусламжтайгаар холболтыг зохион байгуулах үйл явцыг тайлбарласан - зуучлагч (түрээсэлсэн VPS нь STUN сервер болон холболтын зангилааны өгөгдөл дамжуулагчийн үүрэг гүйцэтгэдэг). Энэ нийтлэлд би VPS-гүйгээр хэрхэн удирдаж байснаа танд хэлэх болно, гэхдээ зуучлагчид хэвээр үлдсэн бөгөөд тэд STUN сервер болон Yandex.Disk байсан ...
Үйлчилгээ үзүүлэгчийн NAT-уудаар дамжуулан компьютеруудын хооронд шууд VPN туннел (VPS-гүй, STUN сервер болон Yandex.disk ашиглан)

Танилцуулга

Өмнөх нийтлэлийн сэтгэгдлийг уншсаны дараа хэрэгжилтийн гол дутагдал нь зангилааны одоогийн параметрүүд, хаана, хэрхэн холбогдохыг зааж өгсөн гуравдагч этгээд (VPS) -ийг ашиглах явдал гэдгийг би ойлгосон. Энэхүү STUN-ийг ашиглах зөвлөмжийг харгалзан үзээд (үүнээс маш олон байдаг) одоогийн холболтын параметрүүдийг тодорхойлох. Юуны өмнө би STUN сервер үйлчлүүлэгчидтэй ажиллаж, унших боломжгүй контент хүлээн авах үед пакетуудын агуулгыг үзэхийн тулд TCPDump ашиглахаар шийдсэн. Протоколыг хайж олоход надад таарсан протоколыг тодорхойлсон нийтлэл. Би STUN серверт хүсэлтээ бие даан хэрэгжүүлж чадахгүй гэдгээ ойлгоод энэ санааг "алсын хайрцаг"-т хийж чадсан.

Онол

Саяхан би STUN серверийг багцаас Debian дээр суулгах шаардлагатай болсон

# apt install stun-server

мөн хамаарал дээр би stun-client багцыг харсан боловч ямар нэгэн байдлаар би үүнийг анхаарч үзээгүй. Гэвч хожим нь би stun-client багцын талаар санаж, энэ нь хэрхэн ажилладагийг олж мэдэхээр шийдсэн бөгөөд Google-ээр хайж, Yandex-ээс хайсны дараа би дараахь зүйлийг олж авлаа.

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

Хариуд нь би хүлээн авсан:

STUN үйлчлүүлэгчийн хувилбар 0.97
fd 21234-тай 3 портыг нээсэн
fd 21235-тай 4 портыг нээсэн
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 0

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 4

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 2

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессеж хүлээн авсан: 92 байт
MappedAddress = <Миний IP>: 2885
SourceAddress = 216.93.246.18:3478
Өөрчлөгдсөн хаяг = 216.93.246.17:3479
Үл мэдэгдэх шинж чанар: 32800
Серверийн нэр = Vovida.org 0.98-CPC
257 id=1 төрлийн мессеж хүлээн авлаа
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 0

28:216.93.246.17 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 4

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 2

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 0

<My IP>:28 руу len 2885 мессеж илгээх гэж байна
Гайхах мессеж хүлээн авсан: 28 байт
ChangeRequest = 0
1 id=11 төрлийн мессеж хүлээн авлаа
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 0

28:216.93.246.17 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 4

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 2

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессеж хүлээн авсан: 92 байт
MappedAddress = <Миний IP>: 2885
SourceAddress = 216.93.246.17:3479
Өөрчлөгдсөн хаяг = 216.93.246.18:3478
Үл мэдэгдэх шинж чанар: 32800
Серверийн нэр = Vovida.org 0.98-CPC
257 id=10 төрлийн мессеж хүлээн авлаа
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 4

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 2

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 4

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 2

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 4

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 2

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 4

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 2

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 4

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
Гайхах мессежийг кодлох:
Өөрчлөлтийн хүсэлтийг кодлох: 2

28:216.93.246.18 руу len 3478 мессеж илгээх гэж байна.
тест I = 1
тест II = 0
тест III = 0
тест I(2) = 1
nat = 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 нь үүсгэсэн холболтын ID юм энд

Алсын зангилаа дээр secret.key болон холболтын ID үүсгэхээс бусад бүх зүйлийг ижилхэн хийнэ.

Шинэчлэгдсэн хувилбар (зөв ажиллахын тулд цагийг синхрончлох шаардлагатай):

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-д нэвтрэх (2-р мөр) болон нууц үгийг (3-р мөр) зааж өгнө.
  3. хонгилын дотоод IP хаягийг зааж өгнө (4-р мөр).
  4. скриптийг гүйцэтгэх боломжтой болгох:
    # chmod +x vpn10.sh
  5. скриптийг ажиллуулах:
    # ./vpn10.sh nZbVGBuX5dtturD

    Энд nZbVGBuX5dtturD нь үүсгэсэн холболтын ID юм энд

Алсын зангилаа дээр ижил зүйлийг хийж, хонгилын харгалзах дотоод IP хаяг болон холболтын ID-г зааж өгнө үү.

Би асаалттай үед скриптийг автоматаар ажиллуулахын тулд /etc/ файлд байгаа “nohup /<скрипт рүү очих зам>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &” командыг ашигладаг. rc.local

дүгнэлт

Энэ скрипт нь Ubuntu (18.04, 19.10, 20.04) болон Debian 9 дээр туршсан ажилладаг. Та өөр ямар ч үйлчилгээг дамжуулагч болгон ашиглаж болно, гэхдээ туршлага судлахын тулд би Yandex.disk ашигласан.
Туршилтын явцад зарим төрлийн NAT үйлчилгээ үзүүлэгчид холболт үүсгэхийг зөвшөөрдөггүй болохыг олж мэдсэн. Голчлон торрент хаагдсан үүрэн холбооны операторуудаас.

Би дараахь зүйлийг сайжруулахаар төлөвлөж байна.

  • Алсын зангилаа руу шилжүүлэхийн тулд Yandex.disk руу хуулж, шифрлэж, хуулж авах бүртээ secret.key-г автоматаар үүсгэх (Шинэчилсэн хувилбарыг харгалзан үзнэ)
  • Интерфейсийн IP хаягийг автоматаар хуваарилах
  • Yandex.disk-д байршуулахаас өмнө өгөгдлийг шифрлэх
  • Кодын оновчлол

Айл бүрт IPv6 байг!

Шинэчлэгдсэн! Хамгийн сүүлийн үеийн файлууд болон DEB багцыг эндээс авна уу - yandex.disk

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх