Tunail VPN dìreach eadar coimpiutairean tro NATs solaraiche (às aonais VPS, a ’cleachdadh frithealaiche STUN agus Yandex.disk)

A 'leantainn artaigilean mu mar a fhuair mi air dòigh tunail VPN dìreach a chuir air dòigh eadar dà choimpiutair a tha air cùl solaraichean NAT. Thug an artaigil roimhe cunntas air a ’phròiseas airson ceangal a chuir air dòigh le cuideachadh bho threas phàrtaidh - eadar-mheadhanair (VPS air màl ag obair mar rudeigin mar fhrithealaiche STUN agus inneal-sgaoilidh dàta nód airson a’ cheangal). San artaigil seo innsidh mi dhut mar a stiùir mi às aonais VPS, ach dh’ fhan na h-eadar-mheadhanairean agus b ’iad sin am frithealaiche STUN agus Yandex.Disk ...
Tunail VPN dìreach eadar coimpiutairean tro NATs solaraiche (às aonais VPS, a ’cleachdadh frithealaiche STUN agus Yandex.disk)

Ro-ràdh

Às deidh dhomh beachdan na dreuchd roimhe a leughadh, thuig mi gur e prìomh eas-bhuannachd a ’ghnìomhachais cleachdadh eadar-mheadhanair - treas phàrtaidh (VPS) a chomharraich crìochan gnàthach an nód, càite agus ciamar a nì thu ceangal. A’ beachdachadh air na molaidhean airson an STUN seo a chleachdadh (aig am bheil mòran dhiubh) gus na crìochan ceangail gnàthach a dhearbhadh. An toiseach, chuir mi romham TCPDump a chleachdadh gus sùil a thoirt air susbaint nam pacaidean nuair a bha am frithealaiche STUN ag obair le teachdaichean agus a’ faighinn susbaint gu tur nach gabh leughadh. Googling am protocol air an tàinig mi tarsainn artaigil a’ toirt cunntas air a’ phròtacal. Thuig mi nach b’ urrainn dhomh iarrtas a chuir an gnìomh don t-seirbheisiche STUN leam fhìn agus chuir mi am beachd ann am “bogsa fad às”.

Teòiridh

O chionn ghoirid bha agam ri frithealaiche STUN a chuir a-steach air Debian bhon phacaid

# apt install stun-server

agus anns na h-eisimeileachd chunnaic mi am pasgan stun-client, ach dòigh air choireigin cha tug mi aire dha. Ach nas fhaide air adhart chuimhnich mi mun phasgan stun-client agus cho-dhùin mi faighinn a-mach mar a tha e ag obair, an dèidh googling agus rannsachadh ann an Yandex fhuair mi:

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

Mar fhreagairt fhuair mi:

Tionndadh teachdaiche STUN 0.97
Dh’ fhosgail port 21234 le fd 3
Dh’ fhosgail port 21235 le fd 4
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 0

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 4

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 2

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Air fhaighinn teachdaireachd stun: 92 bytes
MappedAddress = <My IP>: 2885
SourceAddress = 216.93.246.18:3478
Seòladh air atharrachadh = 216.93.246.17:3479
Feart neo-aithnichte: 32800
ServerName = Vovida.org 0.98-CPC
Fhuair sinn teachdaireachd dhen t-seòrsa 257 id=1
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 0

Mu bhith a’ cur msg de len 28 gu 216.93.246.17:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 4

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 2

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 0

Mu bhith a’ cur msg de len 28 gu <My IP>:2885
Air fhaighinn teachdaireachd stun: 28 bytes
Iarrtas Atharraichte = 0
Fhuair sinn teachdaireachd dhen t-seòrsa 1 id=11
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 0

Mu bhith a’ cur msg de len 28 gu 216.93.246.17:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 4

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 2

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Air fhaighinn teachdaireachd stun: 92 bytes
MappedAddress = <My IP>: 2885
SourceAddress = 216.93.246.17:3479
Seòladh air atharrachadh = 216.93.246.18:3478
Feart neo-aithnichte: 32800
ServerName = Vovida.org 0.98-CPC
Fhuair sinn teachdaireachd dhen t-seòrsa 257 id=10
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 4

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 2

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 4

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 2

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 4

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 2

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 4

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 2

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 4

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
Teachdaireachd stun còdachadh:
Iarrtas airson atharrachadh còdachadh: 2

Mu bhith a’ cur msg de len 28 gu 216.93.246.18:3478
deuchainn I = 1
deuchainn II = 0
deuchainn III = 0
deuchainn I(2) = 1
tha nat = 1
IP air a mhapadh an aon rud = 1
bioran = 1
port gleidhidh = 0
Bun-sgoil: Bidh mapadh neo-eisimeileach, criathrag a tha an urra ri Port, port air thuaiream, gu math teann
Is e luach tilleadh 0x000006

Sreath le luach

MappedAddress = <My IP>: 2885

dìreach na tha a dhìth ort! Sheall e an inbhe a th' aig a' cheangal aig port ionadail UDP 21234 aig an àm seo. A’ cleachdadh protocol a’ phuist, no is dòcha Telegram?! Tha mòran roghainnean ann agus chuir mi romhpa Yandex.disk a chleachdadh, bhon a thàinig mi tarsainn artaigil mu bhith ag obair Curl tro WebDav le Yandex.disk. Às deidh dhomh smaoineachadh air a bhuileachadh, thàinig mi suas leis an sgeama a leanas:

  1. Comharra gu bheil nodan deiseil gus ceangal a stèidheachadh le bhith an làthair faidhle sònraichte le stampa-ama air Yandex.disk;
  2. Ma tha na nodan deiseil, faigh na paramadairean gnàthach bhon t-seirbheisiche STUN;
  3. Luchdaich suas na roghainnean gnàthach gu Yandex.disk;
  4. Thoir sùil air làthaireachd agus leugh crìochan nòta iomallach bho fhaidhle air Yandex.disk;
  5. A’ stèidheachadh ceangal le òstair iomallach a’ cleachdadh OpenVPN.

Cleachdaich

An dèidh smaoineachadh beagan, a 'toirt aire do eòlas an artaigil mu dheireadh, sgrìobh mi sgriobt gu luath. Bidh feum againn air:

# apt install openvpn stun-client curl 

An sgriobt fhèin:

dreach tùsail

# 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

Airson an sgriobt obrachadh feumaidh tu:

  1. Dèan lethbhreac gu clipboard agus cuir a-steach don neach-deasachaidh, mar eisimpleir:
    # nano vpn8.sh 
  2. sònraich an t-ainm-cleachdaidh agus am facal-faire airson Yandex.disk.
  3. san raon "-ifconfig 10.45.54.(1 no 2) 255.255.255.252" sònraich seòladh IP a-staigh an eadar-aghaidh
  4. cruthaich dìomhair.iuch òrdugh:
    # openvpn --genkey --secret secret.key 
  5. dèan an sgriobt so-ghnìomhaichte:
    # chmod +x vpn8.sh
  6. ruith an sgriobt:
    # ./vpn8.sh nZbVGBuX5dtturD

    far a bheil nZbVGBuX5dtturD an ID ceangail a chaidh a chruthachadh an seo

Air an nód iomallach, dèan a h-uile càil mar an ceudna ach a-mhàin airson secret.key agus ID ceangail a ghineadh, feumaidh iad a bhith co-ionann.

Tionndadh ùraichte (feumaidh ùine a bhith air a shioncronachadh airson obrachadh ceart):

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

Airson an sgriobt obrachadh feumaidh tu:

  1. Dèan lethbhreac gu clipboard agus cuir a-steach don neach-deasachaidh, mar eisimpleir:
    # nano vpn10.sh 
  2. comharraich an logadh a-steach (2na loidhne) agus facal-faire airson Yandex.disk (3mh loidhne).
  3. sònraich seòladh IP a-staigh an tunail (4mh loidhne).
  4. dèan an sgriobt so-ghnìomhaichte:
    # chmod +x vpn10.sh
  5. ruith an sgriobt:
    # ./vpn10.sh nZbVGBuX5dtturD

    far a bheil nZbVGBuX5dtturD an ID ceangail a chaidh a chruthachadh an seo

Air an nód iomallach, dèan an aon rud, sònraich seòladh IP taobh a-staigh an tunail agus ID ceangail.

Gus an sgriobt a ruith gu fèin-ghluasadach nuair a thèid a thionndadh air, bidh mi a’ cleachdadh an àithne “nohup / <path to the script>/vpn10.sh nZbVGBuX5dtturD> /var/log/vpn10.log 2>/dev/null &” anns an fhaidhle /etc/ rc.ionadail

co-dhùnadh

Bidh an sgriobt ag obair, air a dhearbhadh air Ubuntu (18.04, 19.10, 20.04) agus Debian 9. Faodaidh tu seirbheis sam bith eile a chleachdadh mar inneal-sgaoilidh, ach airson eòlas chleachd mi Yandex.disk.
Rè na deuchainnean, chaidh a lorg nach eil cuid de sheòrsaichean de sholaraichean NAT a 'ceadachadh ceangal a stèidheachadh. Sa mhòr-chuid bho ghnìomhaichean gluasadach far a bheil torrents air am bacadh.

Tha mi an dùil leasachadh a thaobh:

  • Gineadh fèin-ghluasadach de secret.key a h-uile uair a thòisicheas tu, a chrioptachadh agus a chopaigeadh gu Yandex.disk airson a ghluasad gu nód iomallach (A ’toirt aire don dreach ùraichte)
  • Sònrachadh fèin-ghluasadach seòlaidhean IP eadar-aghaidh
  • A’ crioptachadh dàta mus tèid a luchdachadh suas gu Yandex.disk
  • Còd optimization

Biodh IPv6 anns a h-uile dachaigh!

Ùraichte! Na faidhlichean as ùire agus pasgan DEB an seo - yandex.disk

Source: www.habr.com

Cuir beachd ann