புரோஹோஸ்டர் > Блог > நிர்வாகம் > வழங்குநர்களின் NATகள் மூலம் கணினிகளுக்கு இடையே நேரடி VPN சுரங்கப்பாதை (VPS இல்லாமல், STUN சேவையகம் மற்றும் Yandex.disk ஐப் பயன்படுத்தி)
வழங்குநர்களின் NATகள் மூலம் கணினிகளுக்கு இடையே நேரடி VPN சுரங்கப்பாதை (VPS இல்லாமல், STUN சேவையகம் மற்றும் Yandex.disk ஐப் பயன்படுத்தி)
நீட்டிப்பு கட்டுரைகள் NAT வழங்குநர்களுக்குப் பின்னால் அமைந்துள்ள இரண்டு கணினிகளுக்கு இடையே நேரடி VPN சுரங்கப்பாதையை எவ்வாறு ஒழுங்கமைக்க முடிந்தது என்பதைப் பற்றி. மூன்றாம் தரப்பினரின் உதவியுடன் இணைப்பை ஒழுங்கமைக்கும் செயல்முறையை முந்தைய கட்டுரை விவரித்தது - ஒரு இடைத்தரகர் (ஒரு வாடகை VPS ஒரு STUN சேவையகம் மற்றும் இணைப்புக்கான நோட் தரவு டிரான்ஸ்மிட்டர் போன்றது). இந்த கட்டுரையில் நான் VPS இல்லாமல் எப்படி நிர்வகித்தேன் என்பதை நான் உங்களுக்கு சொல்கிறேன், ஆனால் இடைத்தரகர்கள் இருந்தனர், அவர்கள் STUN சேவையகம் மற்றும் Yandex.Disk...
அறிமுகம்
முந்தைய இடுகையின் கருத்துகளைப் படித்த பிறகு, செயல்படுத்தலின் முக்கிய குறைபாடு ஒரு இடைத்தரகரின் பயன்பாடு என்பதை உணர்ந்தேன் - மூன்றாம் தரப்பு (விபிஎஸ்) இது முனையின் தற்போதைய அளவுருக்கள், எங்கே, எப்படி இணைப்பது என்பதைக் குறிக்கிறது. இந்த STUN ஐப் பயன்படுத்துவதற்கான பரிந்துரைகளைக் கருத்தில் கொண்டு (இதில் நிறைய உள்ளன) தற்போதைய இணைப்பு அளவுருக்களை தீர்மானிக்க. முதலாவதாக, STUN சேவையகம் வாடிக்கையாளர்களுடன் பணிபுரியும் போது மற்றும் முழுமையாக படிக்க முடியாத உள்ளடக்கத்தைப் பெற்றபோது பாக்கெட்டுகளின் உள்ளடக்கங்களைப் பார்க்க TCPDump ஐப் பயன்படுத்த முடிவு செய்தேன். நெறிமுறையை கூகுள் செய்து பார்த்தேன் நெறிமுறையை விவரிக்கும் கட்டுரை. STUN சேவையகத்திற்கான கோரிக்கையை என்னால் சொந்தமாக செயல்படுத்த முடியாது என்பதை உணர்ந்து "தொலைதூர பெட்டியில்" யோசனையை வைக்கிறேன்.
கோட்பாடு
சமீபத்தில் நான் தொகுப்பில் இருந்து டெபியனில் STUN சேவையகத்தை நிறுவ வேண்டியிருந்தது
# apt install stun-server
மற்றும் சார்புகளில் நான் ஸ்டன்-கிளையன்ட் தொகுப்பைப் பார்த்தேன், ஆனால் எப்படியோ நான் அதில் கவனம் செலுத்தவில்லை. ஆனால் பின்னர் நான் ஸ்டன்-கிளையன்ட் தொகுப்பைப் பற்றி நினைவில் வைத்தேன், அது எவ்வாறு செயல்படுகிறது என்பதைக் கண்டுபிடிக்க முடிவு செய்தேன், யாண்டெக்ஸில் கூகிள் செய்து தேடிய பிறகு எனக்கு கிடைத்தது:
STUN கிளையன்ட் பதிப்பு 0.97
போர்ட் 21234 fd 3 உடன் திறக்கப்பட்டது
போர்ட் 21235 fd 4 உடன் திறக்கப்பட்டது
என்கோடிங் ஸ்டன் செய்தி:
குறியீட்டு மாற்றம் கோரிக்கை: 0
லென் 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
மாற்றப்பட்ட முகவரி = 216.93.246.17:3479
அறியப்படாத பண்புக்கூறு: 32800
ServerName = Vovida.org 0.98-CPC
வகை 257 ஐடி=1 இன் செய்தி கிடைத்தது
என்கோடிங் ஸ்டன் செய்தி:
குறியீட்டு மாற்றம் கோரிக்கை: 0
லென் 28 இன் செய்தியை 216.93.246.17:3478 க்கு அனுப்ப உள்ளது
என்கோடிங் ஸ்டன் செய்தி:
குறியீட்டு மாற்றம் கோரிக்கை: 4
லென் 28 இன் செய்தியை 216.93.246.18:3478 க்கு அனுப்ப உள்ளது
என்கோடிங் ஸ்டன் செய்தி:
குறியீட்டு மாற்றம் கோரிக்கை: 2
லென் 28 இன் செய்தியை 216.93.246.18:3478 க்கு அனுப்ப உள்ளது
என்கோடிங் ஸ்டன் செய்தி:
குறியீட்டு மாற்றம் கோரிக்கை: 0
லென் 28 இன் செய்தியை <எனது ஐபி>:2885 க்கு அனுப்ப உள்ளது
பெறப்பட்ட அதிர்ச்சி செய்தி: 28 பைட்டுகள்
மாற்றம் கோரிக்கை = 0
வகை 1 ஐடி=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
மாற்றப்பட்ட முகவரி = 216.93.246.18:3478
அறியப்படாத பண்புக்கூறு: 32800
ServerName = Vovida.org 0.98-CPC
வகை 257 ஐடி=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
நாட் = 1
வரைபடப்படுத்தப்பட்ட IP அதே = 1
ஹேர்பின் = 1
பாதுகாப்பு போர்ட் = 0
முதன்மை: சுயாதீன மேப்பிங், போர்ட் சார்ந்த வடிகட்டி, ரேண்டம் போர்ட், ஹேர்பின் செய்யும்
வருவாய் மதிப்பு 0x000006
மதிப்பு கொண்ட சரம்
MappedAddress = <எனது IP>:2885
உனக்கு என்ன தேவை! இது லோக்கல் UDP போர்ட் 21234 இல் இணைப்பிற்கான தற்போதைய நிலையைக் காட்டுகிறது. ஆனால் இது பாதிப் போர்தான்; இந்தத் தரவை ரிமோட் ஹோஸ்டுக்கு மாற்றுவது மற்றும் VPN இணைப்பை எவ்வாறு ஒழுங்கமைப்பது என்ற கேள்வி எழுந்தது. அஞ்சல் நெறிமுறையைப் பயன்படுத்துவதா அல்லது டெலிகிராமா?! பல விருப்பங்கள் உள்ளன, நான் பார்த்ததிலிருந்து Yandex.disk ஐப் பயன்படுத்த முடிவு செய்தேன் Yandex.disk உடன் WebDav வழியாக கர்ல் வேலை செய்வது பற்றிய கட்டுரை. செயல்படுத்துவது பற்றி யோசித்த பிறகு, நான் பின்வரும் திட்டத்தைக் கொண்டு வந்தேன்:
Yandex.disk இல் நேர முத்திரையுடன் ஒரு குறிப்பிட்ட கோப்பின் முன்னிலையில் ஒரு இணைப்பை நிறுவ முனைகள் தயாராக உள்ளன என்பதற்கான சமிக்ஞை;
முனைகள் தயாராக இருந்தால், STUN சேவையகத்திலிருந்து தற்போதைய அளவுருக்களைப் பெறவும்;
தற்போதைய அமைப்புகளை Yandex.disk இல் பதிவேற்றவும்;
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
ஸ்கிரிப்ட் வேலை செய்கிறது, உபுண்டு (18.04, 19.10, 20.04) மற்றும் டெபியன் 9 இல் சோதிக்கப்பட்டது. நீங்கள் வேறு எந்த சேவையையும் டிரான்ஸ்மிட்டராகப் பயன்படுத்தலாம், ஆனால் அனுபவத்திற்காக நான் Yandex.disk ஐப் பயன்படுத்தினேன்.
சோதனையின் போது, சில வகையான NAT வழங்குநர்கள் இணைப்பை நிறுவ அனுமதிப்பதில்லை என்று கண்டறியப்பட்டது. முக்கியமாக மொபைல் ஆபரேட்டர்களிடமிருந்து டோரண்ட்கள் தடுக்கப்பட்டுள்ளன.
நான் மேம்படுத்த திட்டமிட்டுள்ளேன்:
ஒவ்வொரு முறையும் நீங்கள் தொடங்கும், என்க்ரிப்ட் மற்றும் Yandex.disk க்கு நகலெடுக்கும் ஒவ்வொரு முறையும் secret.keyயை தானாக உருவாக்குதல் தொலைநிலை முனைக்கு மாற்றப்படும் (புதுப்பிக்கப்பட்ட பதிப்பில் கணக்கில் எடுத்துக்கொள்ளப்படுகிறது)
இடைமுகங்களின் IP முகவரிகளின் தானியங்கி ஒதுக்கீடு
Yandex.disk இல் பதிவேற்றுவதற்கு முன் தரவை குறியாக்கம் செய்கிறது
குறியீடு மேம்படுத்தல்
ஒவ்வொரு வீட்டிலும் IPv6 இருக்கட்டும்!
புதுப்பிக்கப்பட்டது! சமீபத்திய கோப்புகள் மற்றும் DEB தொகுப்பு இங்கே - yandex.disk