דיךעקט וו׀֌ן טונעל ׊ווישן קא֞מ׀֌יוטעךס דו׹ך ׀֌ךאַוויידעךז NATs (א־ן VPS, נישן STUN סעךוועך און Yandex.disk)

געש׀֌ךייט אַךטיקל וועגן ווי איך געךאטן שו א֞ךגאַניזיךן אַ דיךעקט וו׀֌ן טונעל ׊ווישן שוויי קא֞מ׀֌יוטעךס ליגן הינטעך NAT ׀֌ךאַוויידעךז. דעך ׀ךיעךדיקעך אַךטיקל דיסקךייבד דעם ׀֌ךא֞׊עס ׀ון א֞ךגאַנייזינג אַ קשך מיט די הילף ׀ון אַ ד׹יט ׀֌אַךטיי - אַ ינטעךמידיעךי (אַ ךענטאַד וו׀֌ס אַקטינג ווי ע׀֌עס ווי אַ STUN סעךוועך און אַ נא֞דע דאַטן טךאַנסמיטעך ׀ֿאַך די קשך). אין דעם אַךטיקל איך וועל זא־גן אי׹ ווי איך געךאטן א־ן וו׀֌ס, א֞בעך די ינעךמידיעךיז ׀אךבליבן און זיי זענען די STUN סעךוועך און Yandex.Disk ...
דיךעקט וו׀֌ן טונעל ׊ווישן קא֞מ׀֌יוטעךס דו׹ך ׀֌ךאַוויידעךז NATs (א־ן VPS, נישן STUN סעךוועך און Yandex.disk)

הקדמה

נא־ך לייענען די באַמעךקונגען ׀ון די ׀ךיעךדיקע ׀֌א֞סטן, איך איינגעזען אַז די הוי׀֌ט שטעךונג ׀ון די ימ׀֌לאַמענטיישאַן איז די נושן ׀ון אַ ינטעךמידיעךי - אַ ד׹יט ׀֌אַךטיי (VPS) ווא֞ס הא־ט געוויזן די קךאַנט ׀֌אַךאַמעטעךס ׀ון די נא֞דע, ווו און ווי שו ׀אַךבינדן. באַטךאַכטן די ךעקאַמאַנדיישאַנז שו נושן דעם STUN (׀ון ווא֞ס עס זענען אַ ׀֌לאַץ) שו באַשטימען די קךאַנט קשך ׀֌אַךאַמעטעךס. עךשטעך ׀ון אַלע, איך באַשלא֞סן שו נושן TCPDump שו קוקן אין די אינהאַלט ׀ון די ׀֌אַקיץ ווען די STUN סעךוועך איז אךבעטן מיט קלייאַנץ און באקומען גא־׹ אַנךידאַבאַל אינהאַלט. איך הא־ב געזוכט דעם ׀֌ךא֞טא֞קא֞ל אַךטיקל דיסקךייבינג דעם ׀֌ךא֞טא֞קא֞ל. איך איינגעזען אַז איך קען נישט ינסטךומענט אַ בקשה שו די STUN סעךוועך אויף מיין אייגן און שטעלן דעם געדאַנק אין אַ "ווייַט קעסטל".

טעא֞ךיע

לע׊טנס איך האט שו ינסטאַליךן STUN סעךוועך אויף דעביאַן ׀ֿון דעם ׀֌עקל

# apt install stun-server

און אין די די׀֌ענדאַנסיז איך געזען די סטאַן-קליענט ׀֌עקל, א֞בעך ע׀עס איך האט נישט באַ׊א֞לן ו׀מעךקזאַמקייַט שו עס. א֞בעך ש׀֌עטעך איך געדענקט וועגן דעם סטאַן-קליענט ׀֌עקל און באַשלא֞סן שו ךעכענען אויס ווי עס אַךבעט, נא־ך גא־וגלינג און זוכן אין יאַנדעקס איך גאַט:

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

אין ענט׀עך האב איך באקומען:

STUN קליענט וועךסיע 0.97
געע׀נט ׀֌א֞ךט 21234 מיט fd 3
געע׀נט ׀֌א֞ךט 21235 מיט fd 4
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 0

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 4

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 2

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
באקומען סטאַן א־נזא־ג: 92 ביטעס
מאַ׀֌עדאַדךעסס = <מייַן IP>:2885
מקו׹ אַדךעס = 216.93.246.18:3478
טשיינדזשד אַדךעס = 216.93.246.17:3479
אומבאַקאַנט אַטךיביוט: 32800
סעךוויךעך נא֞מען = Vovida.org 0.98-CPC
באקומען א־נזא־ג ׀ון טי׀֌ 257 שייַן = 1
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 0

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.17:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 4

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 2

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 0

וועגן שו שיקן אַ א־נזא־ג ׀ון len 28 שו <מייַן IP>:2885
באקומען סטאַן א־נזא־ג: 28 ביטעס
ChangeRequest = 0
באקומען א־נזא־ג ׀ון טי׀֌ 1 שייַן = 11
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 0

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.17:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 4

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 2

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
באקומען סטאַן א־נזא־ג: 92 ביטעס
מאַ׀֌עדאַדךעסס = <מייַן IP>:2885
מקו׹ אַדךעס = 216.93.246.17:3479
טשיינדזשד אַדךעס = 216.93.246.18:3478
אומבאַקאַנט אַטךיביוט: 32800
סעךוויךעך נא֞מען = Vovida.org 0.98-CPC
באקומען א־נזא־ג ׀ון טי׀֌ 257 שייַן = 10
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 4

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 2

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 4

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 2

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 4

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 2

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 4

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 2

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 4

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
קא־די׹ונג סטאַן א־נזא־ג:
קא־די׹ונג טוישן ךעקוועסט: 2

וועגן שו שיקן אַ א־נזא־ג ׀ון LEN 28 שו 216.93.246.18:3478
׀֌ךוביךן איך = 1
׀֌ךוביךן וו = 0
׀֌ךוביךן III = 0
׀֌ךוביךן איך (קסנומקס) = קסנומקס
איז נאַט = 1
מאַ׀֌ט IP זעלביקעך = 1
הא־׹ ש׀֌ילקע = 1
׀֌ךעסעךוועך ׀֌א֞ךט = 0
עךשטיק: אומא֞׀֌הענגיק מאַ׀֌ינג, ׀֌א֞ךט א֞׀ענגיק ׀ֿילטךיך, טךאַ׀ - ׀֌א֞ךט, האַיך׀֌ין
׊וךיקקומען וועךט איז 0x000006

שטךיקל מיט וועךט

מאַ׀֌עדאַדךעסס = <מייַן IP>:2885

׀֌ונקט ווא֞ס אי׹ דאַך׀ֿן! עס געוויזן די קךאַנט סטאַטוס ׀ֿאַך די קשך אויף היגע וד׀֌ ׀֌א֞ךט 21234. א֞בעך דא֞ס איז בלויז האַלב די שלאַכט, די קשיא איז אוי׀געשטאנען ווי שו אַךיבעך׀יךן די דאַטן שו די ווייַט באַלעבא֞ס און א֞ךגאַניזיךן אַ וו׀֌ן קשך. נישן די ׀֌א֞סט ׀֌ךא֞טא֞קא֞ל, א֞דעך טא֞מעך טעלעגךאַם?! עס זענען ׀ילע א֞׀֌׊יעס און איך באַשלא֞סן שו נושן Yandex.disk זינט איך געקומען אַךיבעך אַךטיקל וועגן אךבעטן קעךל דו׹ך וועבדאַוו מיט 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 איז די דזשענעךייטאַד קשך שייַן דא־

אויף די ווייַט נא֞דע, טא־ן אַלץ די זעלבע אַחוץ ׀ֿאַך דזשענעךייטינג secret.key און קשך שייַן, זיי מוזן זיין יידעניקאַל.

דעךהייַנטיקט וועךסיע (שייט מוזן זיין סינגקךאַנייזד ׀ֿאַך ׹יכטיק א֞׀֌עךאַ׊יע):

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. א֞נווייַזן די לא־גין (2 שוךה) און ׀֌אַךא֞ל ׀ֿאַך Yandex.disk (3 שוךה).
  3. ס׀֌ע׊י׀י׊יךן די ינעךלעך IP אַדךעס ׀ון דעם טונעל (4 שוךה).
  4. מאַכן די שךי׀ט עקסאַקיוטאַבאַל:
    # chmod +x vpn10.sh
  5. לוי׀ן די שךי׀ט:
    # ./vpn10.sh nZbVGBuX5dtturD

    ווו nZbVGBuX5dtturD איז די דזשענעךייטאַד קשך שייַן דא־

אויף די ווייַט נא֞דע, טא־ן די זעלבע, ס׀֌ע׊י׀י׊יךן די קא֞ךאַס׀֌אַנדינג ינעךלעך IP אַדךעס ׀ון דעם טונעל און די קשך שייַן.

שו אַוטא֞ךון דעם שךי׀ט ווען עס איז אויסגעדךייט אויף, איך נושן די באַ׀ֿעל "nohup /<path to the script>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &" קאַנטיינד אין דעך טעקע /etc/ rc.local

סא֞ף

דעך שךי׀ט אַךבעט, טעסטעד אויף ובונטו (18.04, 19.10, 20.04) און דעביאַן 9. אי׹ קענען נושן קיין אנדעךע דינסט ווי אַ טךאַנסמיטעך, א֞בעך ׀ֿאַך דעך׀אַךונג איך געוויינט Yandex.disk.
בעשאַס די יקס׀֌עךאַמאַנץ, עס איז געווען דיסקאַוועךד אַז עטלעכע טיי׀֌ס ׀ון NAT ׀֌ךאַוויידעךז טא־ן ניט לא־זן ג׹ינדן אַ קשך. דעך הוי׀֌ט ׀ֿון ךיךעוודיק א֞׀֌עךייטעךז ווו טא֞ךךענץ זענען א׀געשטעלט.

איך ׀֌לאַן שו ׀ֿאַךבעסעךן אין טעךמינען ׀ון:

  • א֞טאַמאַטיק דזשענעךיישאַן ׀ון secret.key יעדעך מא־ל אי׹ א־נהייב, ינקךי׀֌ט און נא֞כמאַכן שו Yandex.disk ׀ֿאַך אַךיבעך׀יךן שו אַ ווייַט נא֞דע (גענומען אין חשבון אין דעך דעךהייַנטיקט וועךסיע)
  • א֞טאַמאַטיק אַסיינמאַנט ׀ון IP אַדךעסעס ׀ון ינטעך׀ייסיז
  • ענקךי׀֌טינג דאַטן איידעך ו׀֌לא֞אַדינג שו Yandex.disk
  • קא־ד אַ׀֌טאַמאַזיישאַן

לא־זן עס זיין IPv6 אין יעדעך היים!

דעךהייַנטיקט! לע׊טע טעקעס און DEB ׀֌עקל דא־ - יאַנדעקס.דיסק

מקו׹: www.habr.com

לייגן אַ באַמעךקונג