Provayderlərin NAT-ları vasitəsilə kompüterlər arasında birbaşa VPN tuneli (VPS olmadan, STUN serverindən və Yandex.diskdən istifadə etməklə)

Artırma Məqalə ISP NAT-ların arxasında yerləşən iki kompüter arasında birbaşa VPN tunelini necə təşkil etməyi bacardığım haqqında. Son məqalə üçüncü tərəfin - vasitəçinin (STUN serveri və qoşulma üçün node məlumat ötürücüsü kimi fəaliyyət göstərən icarəyə götürülmüş VPS) köməyi ilə əlaqənin təşkili prosesini təsvir etdi. Bu yazıda sizə VPS olmadan necə idarə etdiyimi söyləyəcəyəm, lakin vasitəçilər qaldı və onlar STUN server və Yandex.Disk idi ...
Provayderlərin NAT-ları vasitəsilə kompüterlər arasında birbaşa VPN tuneli (VPS olmadan, STUN serverindən və Yandex.diskdən istifadə etməklə)

Giriş

Son yazının şərhlərini oxuduqdan sonra başa düşdüm ki, həyata keçirilməsinin əsas çatışmazlığı bir vasitəçinin - üçüncü tərəfin (VPS) istifadəsidir ki, qovşağın cari parametrlərini, harada və necə qoşulacağını göstərir. Həqiqi STUN-dan istifadə etmək üçün tövsiyələri nəzərə alaraq (bunlardan çoxu var) cari əlaqə parametrlərini müəyyən etmək üçün. Əvvəla, STUN serveri müştərilərlə işləyərkən və tamamilə oxunmayan məzmunlar aldıqda paketlərin məzmununa baxmaq üçün TCPDump-dan istifadə etmək qərarına gəldim. Protokolda googling qarşısına çıxdı protokolu təsvir edən məqalə. Mən başa düşdüm ki, STUN serverinə sorğunu təkbaşına həyata keçirə bilməyəcəm və fikrimi kənara qoya biləcəyəm.

Теория

Bu yaxınlarda paketdən Debian-da STUN server quraşdırmalı oldum

# apt install stun-server

və asılılıqlarda heyrətləndirici müştəri paketini gördüm, amma birtəhər buna əhəmiyyət vermədim. Ancaq sonradan stun-client paketini xatırladım və Yandex-dən istifadə edərək onun necə işlədiyini anlamağa qərar verdim:

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

Cavab olaraq aldım:

STUN müştəri versiyası 0.97
21234 portu fd 3 ilə açıldı
21235 portu fd 4 ilə açıldı
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 0

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 4

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 2

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Qəbul edilmiş şok mesajı: 92 bayt
Xəritəli Ünvan = <Mənim IP>:2885
Mənbə ünvanı = 216.93.246.18:3478
Dəyişdirilmiş Ünvan = 216.93.246.17:3479
Naməlum atribut: 32800
ServerName=Vovida.org 0.98-CPC
257 id=1 tipli mesaj alındı
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 0

28:216.93.246.17 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 4

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 2

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 0

<Mənim IP>:28-ə len 2885 mesajı göndərmək üzrədir
Qəbul edilmiş şok mesajı: 28 bayt
ChangeRequest = 0
1 id=11 tipli mesaj alındı
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 0

28:216.93.246.17 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 4

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 2

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Qəbul edilmiş şok mesajı: 92 bayt
Xəritəli Ünvan = <Mənim IP>:2885
Mənbə ünvanı = 216.93.246.17:3479
Dəyişdirilmiş Ünvan = 216.93.246.18:3478
Naməlum atribut: 32800
ServerName=Vovida.org 0.98-CPC
257 id=10 tipli mesaj alındı
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 4

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 2

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 4

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 2

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 4

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 2

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 4

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 2

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 4

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
Çarpıcı mesajın kodlanması:
Dəyişiklik sorğusunun kodlaşdırılması: 2

28:216.93.246.18 nömrəsinə len 3478 mesajı göndərmək üzrədir
test I = 1
test II = 0
test III = 0
test I(2) = 1
nat = 1-dir
xəritələnmiş IP eyni = 1
saç sancağı = 1
qoruyucu port = 0
İlkin: Müstəqil Xəritəçəkmə, Portdan Asılı Filtr, təsadüfi port, saç tıxacları
qaytarılması dəyəri 0x000006-dır

Dəyəri olan sətir

Xəritəli Ünvan = <Mənim IP>:2885

yalnız sizə lazım olan şey! O, yerli UDP portu 21234-də əlaqənin cari vəziyyətini göstərdi. Ancaq bu, döyüşün yalnız yarısıdır, bu məlumatı uzaq bir hosta necə ötürmək və VPN bağlantısı qurmaq barədə sual yarandı. Poçt protokolundan və ya bəlkə Telegramdan istifadə etmək?! Bir çox variant var və rast gəldiyim kimi Yandex.diskdən istifadə etmək qərarına gəldim Yandex.disk ilə WebDav vasitəsilə Curl ilə işləmək haqqında məqalə. Tətbiq haqqında düşünəndən sonra bu sxemlə gəldim:

  1. Yandex.disk-də vaxt möhürü olan xüsusi bir faylın olması ilə qovşaqların əlaqə yaratmağa hazır olduğunu bildirin;
  2. Düyünlər hazırdırsa, STUN serverindən cari parametrləri əldə edin;
  3. Cari parametrləri Yandex.disk-ə yükləyin;
  4. Yandex.disk-dəki fayldan uzaq hostun varlığını yoxlayın və parametrlərini oxuyun;
  5. OpenVPN istifadə edərək uzaq host ilə əlaqə yaratmaq.

Praktika

Bir az fikirləşəndən sonra sonuncu yazının təcrübəsini nəzərə alaraq tələsik ssenari yazdım. Bizə lazım olacaq:

# apt install openvpn stun-client curl 

Əslində skriptin özü:

orijinal versiya

# 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

Skriptin işləməsi üçün sizə lazımdır:

  1. Mübadilə buferinə kopyalayın və redaktora yapışdırın, məsələn:
    # nano vpn8.sh 
  2. Yandex.disk-dən giriş və şifrəni göstərin.
  3. sahəsində "—ifconfig 10.45.54.(1 və ya 2) 255.255.255.252" interfeysin daxili IP ünvanını göstərin
  4. yaratmaq gizli açar əmri ilə:
    # openvpn --genkey --secret secret.key 
  5. skripti icra edilə bilən hala gətirin:
    # chmod +x vpn8.sh
  6. skripti işlədin:
    # ./vpn8.sh nZbVGBuX5dtturD

    burada nZbVGBuX5dtturD yaradılan əlaqə id-dir burada

Uzaq hostda, secret.key və əlaqə ID yaratmaq istisna olmaqla, eyni şeyi edin, onlar eyni olmalıdır.

Yenilənmiş versiya (düzgün işləmək üçün vaxt sinxronlaşdırılmalıdır):

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

Skriptin işləməsi üçün sizə lazımdır:

  1. Mübadilə buferinə kopyalayın və redaktora yapışdırın, məsələn:
    # nano vpn10.sh 
  2. Yandex.disk-dən (2-cü sətir) giriş (3-ci sətir) və şifrəni göstərin.
  3. tunelin daxili IP ünvanını təyin edin (4-cü sətir).
  4. skripti icra edilə bilən hala gətirin:
    # chmod +x vpn10.sh
  5. skripti işlədin:
    # ./vpn10.sh nZbVGBuX5dtturD

    burada nZbVGBuX5dtturD yaradılan əlaqə id-dir burada

Uzaq hostda da eyni şeyi edin, müvafiq daxili tunel IP ünvanını və əlaqə ID-sini göstərin.

Başlanğıcda skripti avtomatik işə salmaq üçün /etc/rc faylında olan "nohup /<skriptə yol>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &" əmrindən istifadə edirəm. .yerli

Nəticə

Skript işləyir, Ubuntu (18.04, 19.10, 20.04) və Debian 9-da sınaqdan keçirilib. Transmitter kimi istənilən başqa xidmətdən istifadə edə bilərsiniz, lakin təcrübə üçün Yandex.disk-dən istifadə etdim.
Təcrübələr zamanı müəyyən edilmişdir ki, bəzi növ NAT provayderləri əlaqə yaratmağa imkan vermir. Əsasən torrentlərin bloklandığı mobil operatorlardan.

Mən bu baxımdan təkmilləşdirməyi planlaşdırıram:

  • Hər dəfə işə saldığınız zaman secret.key-in avtomatik yaradılması, uzaq hosta ötürülməsi üçün Yandex.disk-ə şifrələmə və kopyalama (yenilənmiş versiyada nəzərə alınır)
  • İnterfeys IP ünvanlarının avtomatik təyin edilməsi
  • Yandex.disk-ə yükləməzdən əvvəl məlumatların şifrələnməsi
  • Kodun optimallaşdırılması

Qoy hər evdə IPv6 olsun!

Yeniləndi! Ən son fayllar və DEB paketi burada - yandex.disk

Mənbə: www.habr.com

Добавить комментарий