ProHoster > Օրագիր > Վարչակազմը > Ուղիղ VPN թունել համակարգիչների միջև մատակարար NAT-ների միջոցով (առանց VPS, STUN սերվերի և Yandex.disk-ի միջոցով)
Ուղիղ VPN թունել համակարգիչների միջև մատակարար NAT-ների միջոցով (առանց VPS, STUN սերվերի և Yandex.disk-ի միջոցով)
Շարունակությունը Հոդված այն մասին, թե ինչպես ես կարողացա կազմակերպել ուղիղ VPN թունել երկու համակարգիչների միջև, որոնք գտնվում են NAT պրովայդերների հետևում: Նախորդ հոդվածը նկարագրում էր երրորդ կողմի՝ միջնորդի օգնությամբ կապի կազմակերպման գործընթացը (վարձակալված VPS, որը գործում է որպես STUN սերվերի և հանգույցի տվյալների հաղորդիչի նման մի բան): Այս հոդվածում ես ձեզ կպատմեմ, թե ինչպես էի կարողանում առանց VPS-ի, բայց միջնորդները մնացին և դրանք STUN սերվերն ու Yandex.Disk-ն էին...
Ներածություն
Նախորդ գրառման մեկնաբանությունները կարդալուց հետո ես հասկացա, որ իրականացման հիմնական թերությունը միջնորդի օգտագործումն էր՝ երրորդ կողմ (VPS), որը նշում էր հանգույցի ընթացիկ պարամետրերը, որտեղ և ինչպես միացնել: Հաշվի առնելով այս STUN-ի օգտագործման առաջարկությունները (որոնցից շատ են) ընթացիկ կապի պարամետրերը որոշելու համար: Առաջին հերթին, ես որոշեցի օգտագործել TCPDump փաթեթների բովանդակությունը դիտելու համար, երբ STUN սերվերը աշխատում էր հաճախորդների հետ և ստանում էր ամբողջովին անընթեռնելի բովանդակություն: Գուգլելով արձանագրությունը՝ հանդիպեցի հոդվածը, որը նկարագրում է արձանագրությունը. Ես հասկացա, որ չեմ կարող ինքնուրույն կատարել հարցումը STUN սերվերին և գաղափարը տեղադրել «հեռավոր վանդակում»:
Теория
Վերջերս ես ստիպված էի փաթեթից տեղադրել STUN սերվերը Debian-ում
# apt install stun-server
և կախվածության մեջ ես տեսա stun-client փաթեթը, բայց ինչ-որ կերպ ուշադրություն չդարձրեցի դրան: Բայց ավելի ուշ հիշեցի stun-client փաթեթի մասին և որոշեցի պարզել, թե ինչպես է այն աշխատում, Google-ում և Yandex-ում փնտրելուց հետո ստացա.
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 4
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 2
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Ստացված ցնցող հաղորդագրություն՝ 92 բայթ
MappedAddress = <Իմ IP>:2885
ԱղբյուրՀասցե = 216.93.246.18:3478
ChangedAddress = 216.93.246.17:3479
Անհայտ հատկանիշ՝ 32800
ServerName = Vovida.org 0.98-CPC
Ստացվել է 257 տիպի հաղորդագրություն id=1
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 0
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.17:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 4
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 2
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 0
Պատրաստվում է ուղարկել 28-ի հաղորդագրություն <Իմ IP>:2885 հասցեին
Ստացված ցնցող հաղորդագրություն՝ 28 բայթ
ChangeRequest = 0
Ստացվել է 1 տիպի հաղորդագրություն id=11
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 0
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.17:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 4
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 2
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Ստացված ցնցող հաղորդագրություն՝ 92 բայթ
MappedAddress = <Իմ IP>:2885
ԱղբյուրՀասցե = 216.93.246.17:3479
ChangedAddress = 216.93.246.18:3478
Անհայտ հատկանիշ՝ 32800
ServerName = Vovida.org 0.98-CPC
Ստացվել է 257 տիպի հաղորդագրություն id=10
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 4
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 2
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 4
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 2
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 4
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 2
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 4
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 2
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 4
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18:3478 համարին
Կոդավորող ցնցող հաղորդագրություն.
Կոդավորման փոփոխության հարցում՝ 2
պատրաստվում է ուղարկել 28 հաղորդագրություն 216.93.246.18: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-ից, քանի որ հանդիպեցի հոդված Yandex.disk-ի միջոցով Curl-ի միջոցով WebDav-ի միջոցով աշխատելու մասին. Իրականացման մասին մտածելուց հետո ես հանգեցի հետևյալ սխեմայի.
Ազդանշան, որ հանգույցները պատրաստ են կապ հաստատել Yandex.disk-ում ժամանակի դրոշմով հատուկ ֆայլի առկայությամբ.
Եթե հանգույցները պատրաստ են, ապա ստացեք ընթացիկ պարամետրերը STUN սերվերից;
Ստուգեք Yandex.disk-ի ֆայլից հեռավոր հանգույցի առկայությունը և կարդացեք պարամետրերը.
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
Որպեսզի սցենարն աշխատի, ձեզ հարկավոր է.
Պատճենեք clipboard-ում և տեղադրեք խմբագրի մեջ, օրինակ՝
# nano vpn8.sh
նշեք Yandex.disk-ի օգտանունը և գաղտնաբառը:
«—ifconfig 10.45.54.(1 կամ 2) 255.255.255.252» դաշտում նշեք միջերեսի ներքին IP հասցեն
ստեղծել գաղտնի.բանալի հրամանով.
# openvpn --genkey --secret secret.key
սցենարը կատարելի դարձնել՝
# chmod +x vpn8.sh
գործարկել սցենարը.
# ./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
Որպեսզի սցենարն աշխատի, ձեզ հարկավոր է.
Պատճենեք clipboard-ում և տեղադրեք խմբագրի մեջ, օրինակ՝
# nano vpn10.sh
նշեք մուտքը (2-րդ տող) և գաղտնաբառը Yandex.disk-ի համար (3-րդ տող):
նշեք թունելի ներքին IP հասցեն (4-րդ տող):
սցենարը կատարելի դարձնել՝
# chmod +x vpn10.sh
գործարկել սցենարը.
# ./vpn10.sh nZbVGBuX5dtturD
որտեղ nZbVGBuX5dtturD-ը ստեղծված կապի ID-ն է այստեղ
Հեռավոր հանգույցում արեք նույնը, նշեք թունելի համապատասխան ներքին IP հասցեն և կապի ID-ն:
Սկրիպտը միացված ժամանակ ինքնաբերաբար գործարկելու համար ես օգտագործում եմ «nohup /<ուղիղ դեպի սցենար>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &» հրամանը, որը պարունակվում է ֆայլում /etc/: rc.local
Ամփոփում
Սցենարն աշխատում է՝ փորձարկված Ubuntu-ում (18.04, 19.10, 20.04) և Debian 9-ում: Դուք կարող եք ցանկացած այլ ծառայություն օգտագործել որպես հաղորդիչ, բայց փորձի համար ես օգտագործել եմ Yandex.disk-ը:
Փորձերի ընթացքում պարզվել է, որ NAT պրովայդերների որոշ տեսակներ թույլ չեն տալիս կապ հաստատել։ Հիմնականում բջջային օպերատորներից, որտեղ հեղեղներն արգելափակված են։
Ես նախատեսում եմ կատարելագործվել հետևյալ առումով.
Secret.key-ի ավտոմատ ստեղծում ամեն անգամ, երբ սկսում եք, գաղտնագրում և պատճենում Yandex.disk-ում՝ հեռավոր հանգույց տեղափոխելու համար (հաշվի առնելով թարմացված տարբերակում)
Ինտերֆեյսերի IP հասցեների ավտոմատ նշանակում
Տվյալների գաղտնագրում Yandex.disk-ում վերբեռնելուց առաջ
Կոդի օպտիմալացում
Թող յուրաքանչյուր տանը լինի IPv6:
Թարմացվել է Վերջին ֆայլերը և DEB փաթեթն այստեղ - yandex.disk