Tunnel toos ah oo VPN ah oo u dhexeeya kombuyuutarrada iyada oo loo marayo bixiyayaasha NATs (la'aanteed VPS, iyada oo la adeegsanayo server-ka STUN iyo Yandex.disk)

Sii wadista qodobbada ku saabsan sida aan ugu suurtagashay in aan abaabulo tunnel toos ah oo VPN ah oo u dhexeeya laba kombuyuutar oo ka dambeeya bixiyeyaasha NAT. Maqaalkii hore wuxuu qeexay habka abaabulka xiriirka iyadoo la kaashanayo dhinac saddexaad - dhexdhexaadiye (VPS kirada ah oo u dhaqma sida shay sida STUN server iyo gudbiyaha xogta noodhka ee isku xirka). Maqaalkan waxaan kuu sheegi doonaa sida aan u maareeyay VPS la'aanteed, laakiin dhexdhexaadiyeyaasha ayaa hadhay oo waxay ahaayeen server-ka STUN iyo Yandex.Disk ...
Tunnel toos ah oo VPN ah oo u dhexeeya kombuyuutarrada iyada oo loo marayo bixiyayaasha NATs (la'aanteed VPS, iyada oo la adeegsanayo server-ka STUN iyo Yandex.disk)

Horudhac

Ka dib markii aan akhriyay faallooyinka qoraalkii hore, waxaan ogaaday in cilladda ugu weyn ee hirgelinta ay tahay isticmaalka dhexdhexaadiyaha - dhinac saddexaad (VPS) oo tilmaamaya xuduudaha hadda jira ee noodhka, meesha iyo sida loo xiro. Iyadoo la tixgelinayo talooyinka la isticmaalayo STUN (kuwaas oo ay ku badan yihiin) si loo go'aamiyo xuduudaha isku xirka hadda. Ugu horreyntii, waxaan go'aansaday inaan isticmaalo TCPDump si aan u eego waxa ku jira baakadaha markii STUN server uu la shaqeynayey macaamiisha oo uu helay nuxur aan la akhrin karin. Googling borotokoolka ayaan la kulmay maqaal qeexaya borotokoolka. Waxaan xaqiiqsaday inaanan fulin karin codsi ku socda server-ka STUN oo keligiis ah oo fikradda ku riday "sanduuq fog".

Aragtida

Dhawaan waxaan lahaa in aan ku rakibo server-ka STUN Debian ka xirmada

# apt install stun-server

iyo ku-tiirsanaanta waxaan ku arkay xirmada stun-macmiilka, laakiin si uun uma aan fiirsan. Laakiin markii dambe waxaan xusuustay xirmada-macmiilka oo waxaan go'aansaday inaan ogaado sida ay u shaqeyso, ka dib markaan googgooyo oo ka raadiyo Yandex, waxaan helay:

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

Jawaabta waxaan helay:

Nooca macmiilka ee STUN 0.97
Deked la furay 21234 oo leh fd 3
Deked la furay 21235 oo leh fd 4
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 0

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 4

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 2

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Farriinta naxdinta leh ee la helay: 92 bytes
MappedAddress = : 2885
Ciwaanka Ciwaanka = 216.93.246.18:3478
ChangedAdresse = 216.93.246.17:3479
Sifada aan la garanayn: 32800
Magaca Server = Vovida.org 0.98-CPC
Fariinta la helay oo ah nooca 257 id=1
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 0

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.17:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 4

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 2

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 0

Ku saabsan in loo diro fariinta len 28 :2885
Farriinta naxdinta leh ee la helay: 28 bytes
Isbeddelka Codsiga = 0
Fariinta la helay oo ah nooca 1 id=11
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 0

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.17:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 4

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 2

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Farriinta naxdinta leh ee la helay: 92 bytes
MappedAddress = : 2885
Ciwaanka Ciwaanka = 216.93.246.17:3479
ChangedAdresse = 216.93.246.18:3478
Sifada aan la garanayn: 32800
Magaca Server = Vovida.org 0.98-CPC
Fariinta la helay oo ah nooca 257 id=10
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 4

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 2

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 4

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 2

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 4

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 2

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 4

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 2

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 4

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
Codaynta fariinta naxdinta leh:
Codsiga beddelka codeynta: 2

Ku saabsan in la soo diro mg of len 28 ilaa 216.93.246.18:3478
imtixaanka I = 1
imtixaanka II = 0
imtixaanka III = 0
imtixaanka I (2) = 1
waa nat = 1
Khariidad IP isku mid ah = 1
timaha timaha = 1
dekedda kaydiyaha = 0
Aasaasiga ah: Khariidad madax-bannaan, Shaandheeyaha Ku-tiirsanaanta Dekedda, deked random, ayaa timo-jari doona
Qiimaha soo celinta waa 0x000006

Xarig qiimo leh

MappedAddress = : 2885

kaliya waxaad u baahan tahay! Waxay soo bandhigtay heerka hadda jira ee isku xirka dekedda gudaha ee UDP 21234. Laakiin tani waa kala bar dagaalka; su'aashu waxay soo baxday sida xogtan loogu wareejiyo martigeliyaha fog iyo abaabulo isku xirka VPN. Isticmaalka borotokoolka boostada, ama laga yaabee Telegram?! Waxaa jira fursado badan oo waxaan go'aansaday inaan isticmaalo Yandex.disk, tan iyo markii aan la kulmay maqaal ku saabsan ka shaqaynta Curl iyada oo loo marayo WebDav oo leh Yandex.disk. Ka dib markaan ka fekeray hirgelinta, waxaan la imid qorshahan:

  1. Calaamadaha in noodhadhku ay diyaar u yihiin inay abuuraan isku xirka joogitaanka fayl gaar ah oo leh shaambad waqtiyeedka Yandex.disk;
  2. Haddii noodhadhku ay diyaar yihiin, ka dibna ka hel xuduudaha hadda jira server-ka STUN;
  3. U soo rar dejinta hadda Yandex.disk;
  4. Hubi joogitaanka oo akhri xuduudaha noode fog ee faylka Yandex.disk;
  5. Samaynta xidhiidhka martigeliyaha fog iyadoo la isticmaalayo OpenVPN.

Tababarka

Ka dib markii aan wax yar ka fikiray, anigoo tixgelinaya waayo-aragnimadii maqaalkii ugu dambeeyay, waxaan si degdeg ah u qoray qoraal. Waxaan u baahan doonaa:

# apt install openvpn stun-client curl 

Qoraalka laftiisa:

Nooca hore

# 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

Si qoraalku u shaqeeyo waxaad u baahan tahay:

  1. Ku koobbi sabuuradda oo ku dheji tafatiraha, tusaale ahaan:
    # nano vpn8.sh 
  2. sheeg magaca isticmaalaha iyo erayga sirta ah ee Yandex.disk.
  3. garoonka dhexdiisa "-ifconfig 10.45.54.(1 ama 2) 255.255.255.252" cadee ciwaanka IP gudaha ee interface-ka
  4. abuurto sir.fure amar:
    # openvpn --genkey --secret secret.key 
  5. samee qoraalka la fulin karo:
    # chmod +x vpn8.sh
  6. socodsii qoraalka:
    # ./vpn8.sh nZbVGBuX5dtturD

    halka nZbVGBuX5dtturD uu yahay aqoonsiga xidhiidhka ee la sameeyay halkan

Dusha fog, samee wax kasta oo isku mid ah marka laga reebo abuurista secret.key iyo aqoonsiga xiriirka, waa inay isku mid ahaadaan.

Nooca la cusboonaysiiyay (waqtiga waa in la waafajiyaa hawlgalka saxda ah):

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

Si qoraalku u shaqeeyo waxaad u baahan tahay:

  1. Ku koobbi sabuuradda oo ku dheji tafatiraha, tusaale ahaan:
    # nano vpn10.sh 
  2. Tilmaan gelida (khadka 2aad) iyo erayga sirta ah ee Yandex.disk (khadka 3aad).
  3. sheeg ciwaanka IP-ga gudaha ee tunnelka (khadka 4aad).
  4. samee qoraalka la fulin karo:
    # chmod +x vpn10.sh
  5. socodsii qoraalka:
    # ./vpn10.sh nZbVGBuX5dtturD

    halka nZbVGBuX5dtturD uu yahay aqoonsiga xidhiidhka ee la sameeyay halkan

Dhinaca noodhka fog, sidaas oo kale samee, sheeg cinwaanka IP-ga gudaha ee u dhigma ee tunnelka iyo aqoonsiga xidhiidhka.

Si loo maamulo qoraalka marka la shido, waxaan isticmaalaa amarka "nohup //vpn10.sh nZbVGBuX5dtturD> /var/log/vpn10.log 2>/dev/null &" ee ku jira faylka /etc/ rc.maxali ah

gunaanad

Qoraalku wuxuu shaqeeyaa, lagu tijaabiyay Ubuntu (18.04, 19.10, 20.04) iyo Debian 9. Waxaad isticmaali kartaa adeeg kasta oo kale sida gudbiyaha, laakiin waayo-aragnimada waxaan isticmaalay Yandex.disk.
Intii lagu guda jiray tijaabooyinka, waxaa la ogaaday in qaar ka mid ah bixiyeyaasha NAT aysan ogolayn in la sameeyo xiriir. Inta badan ka timaadda hawl-wadeennada mobaylada ee durduryadu xidhmaan.

Waxaan qorsheynayaa inaan horumariyo xagga:

  • Jiilka tooska ah ee sirta.key markasta oo aad bilowdo, sir oo koobiyayso Yandex.disk si aad ugu wareejiso noodhka fog (Adiga oo ku xisaabtamaya nooca la cusboonaysiiyay)
  • Meelaynta tooska ah ee ciwaannada IP-yada ee is-dhexgalka
  • Sirin xogta ka hor inta aan la gelin Yandex.disk
  • Hagaajinta koodka

Guri kasta ha ahaado IPv6!

La cusbooneysiiyay! Faylasha ugu dambeeyay iyo xirmada DEB halkan - yandex.disk

Source: www.habr.com

Add a comment