Tunnel VPN mivantana eo anelanelan'ny solosaina amin'ny alΓ lan'ny mpamatsy NATs (tsy misy VPS, mampiasa server STUN sy Yandex.disk)

fanitarana lahatsoratra momba ny fomba nahavitako nandamina tonelina VPN mivantana teo anelanelan'ny solosaina roa ao ambadiky ny mpamatsy NAT. Ny lahatsoratra teo aloha dia nanoritsoritra ny fizotran'ny fandaminana fifandraisana miaraka amin'ny fanampian'ny antoko fahatelo - mpanelanelana (VPS nohofana miasa toy ny server STUN sy mpandefa data node ho an'ny fifandraisana). Ato amin'ity lahatsoratra ity dia holazaiko aminao ny fomba nitantanako tsy nisy VPS, fa nijanona ny mpanelanelana ary izy ireo dia ny mpizara STUN sy Yandex.Disk...
Tunnel VPN mivantana eo anelanelan'ny solosaina amin'ny alΓ lan'ny mpamatsy NATs (tsy misy VPS, mampiasa server STUN sy Yandex.disk)

fampidirana

Rehefa avy namaky ny fanehoan-kevitra tao amin'ny lahatsoratra teo aloha, dia tsapako fa ny tena tsy fahampian'ny fampiharana dia ny fampiasana mpanelanelana - antoko fahatelo (VPS) izay manondro ny masontsivana amin'izao fotoana izao ny node, ny toerana sy ny fomba hifandraisana. Raha jerena ny tolo-kevitra hampiasana ity STUN ity (izay misy betsaka) mba hamaritana ny mari-pamantarana fifandraisana ankehitriny. Voalohany indrindra, nanapa-kevitra ny hampiasa TCPDump aho mba hijerena ny votoatin'ny fonosana rehefa niasa tamin'ny mpanjifa ny mpizara STUN ary nahazo votoaty tsy azo vakina tanteraka. Googling ny protocole hitako lahatsoratra mamaritra ny protocol. Tsapako fa tsy afaka mametraka fangatahana amin'ny mpizara STUN irery aho ary mametraka ilay hevitra ao anaty "boaty lavitra".

-kevitra

Vao haingana aho no tsy maintsy nametraka mpizara STUN amin'ny Debian avy amin'ny fonosana

# apt install stun-server

ary tao amin'ny fiankinan-doha dia hitako ilay fonosana stun-client, saingy tsy niraharaha izany aho. Saingy taty aoriana dia nahatsiaro ny fonosana stun-client aho ary nanapa-kevitra ny hamantatra ny fomba fiasany, rehefa avy nijery sy nikaroka tao amin'ny Yandex aho dia nahazo:

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

Ho valin'izany dia nahazo aho:

STUN mpanjifa kinova 0.97
Nanokatra port 21234 miaraka amin'ny fd 3
Nanokatra port 21235 miaraka amin'ny fd 4
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 0

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 4

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 2

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Naharay hafatra manaitra: 92 bytes
MappedAddress = <My IP>:2885
SourceAddress = 216.93.246.18:3478
ChangedAddress = 216.93.246.17:3479
Toetra tsy fantatra: 32800
ServerName = Vovida.org 0.98-CPC
Nahazo hafatra karazana 257 id=1
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 0

Saika handefa ny len 28 amin'ny 216.93.246.17:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 4

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 2

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 0

Handefa hafatra amin'ny len 28 amin'ny <My IP>:2885
Naharay hafatra manaitra: 28 bytes
ChangeRequest = 0
Nahazo hafatra karazana 1 id=11
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 0

Saika handefa ny len 28 amin'ny 216.93.246.17:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 4

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 2

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Naharay hafatra manaitra: 92 bytes
MappedAddress = <My IP>:2885
SourceAddress = 216.93.246.17:3479
ChangedAddress = 216.93.246.18:3478
Toetra tsy fantatra: 32800
ServerName = Vovida.org 0.98-CPC
Nahazo hafatra karazana 257 id=10
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 4

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 2

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 4

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 2

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 4

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 2

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 4

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 2

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 4

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
Fanodinana hafatra manaitra:
Fanodinana ChangeRequest: 2

Saika handefa ny len 28 amin'ny 216.93.246.18:3478
test I = 1
test II = 0
fitsapana III = 0
fitsapana I(2) = 1
dia nat = 1
sarintany IP mitovy = 1
volo = 1
seranan-tsambo mpitahiry = 0
Kilonga: Sarintany mahaleo tena, sivana miankina amin'ny seranan-tsambo, seranan-tsambo kisendrasendra, dia hihety volo
Ny sandan'ny fiverenana dia 0x000006

Tady misy sanda

MappedAddress = <My IP>:2885

izay ilainao ihany! Nasehony ny sata misy amin'izao fotoana izao ho an'ny fifandraisana amin'ny seranan-tsambo UDP 21234 eo an-toerana. Saingy antsasa-manilan'ny ady ihany no nipoitra ny fanontaniana momba ny fomba hamindrana ity data ity amin'ny mpampiantrano lavitra ary mandamina fifandraisana VPN. Mampiasa ny protocol mail, na angamba Telegram?! Betsaka ny safidy ary nanapa-kevitra ny hampiasa ny Yandex.disk aho, hatramin'ny nahitako azy lahatsoratra momba ny fiasana Curl amin'ny alΓ lan'ny WebDav amin'ny Yandex.disk. Rehefa avy nieritreritra momba ny fampiharana aho dia tonga tamin'ity drafitra manaraka ity:

  1. Famantarana fa ny nodes dia vonona ny hametraka fifandraisana amin'ny fisian'ny rakitra manokana miaraka amin'ny timestamp ao amin'ny Yandex.disk;
  2. Raha efa vonona ny nodes, dia raiso ny masontsivana ankehitriny avy amin'ny mpizara STUN;
  3. Alefaso any amin'ny Yandex.disk ny fanovana ankehitriny;
  4. Jereo ny fisiana ary vakio ny mari-pamantarana amin'ny node lavitra avy amin'ny rakitra ao amin'ny Yandex.disk;
  5. Mametraka fifandraisana amin'ny mpampiantrano lavitra mampiasa OpenVPN.

fampiharana

Rehefa avy nieritreritra kely aho, rehefa nandinika ny zavatra niainan’ilay lahatsoratra farany, dia nanoratra lahatsoratra haingana aho. Mila:

# apt install openvpn stun-client curl 

Ny script mihitsy:

version original

# 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

Mba hiasa ny script dia mila:

  1. Adikao amin'ny takelaka ary apetaho amin'ny mpanonta, ohatra:
    # nano vpn8.sh 
  2. mamaritra ny solon'anarana sy ny tenimiafina ho an'ny Yandex.disk.
  3. ao amin'ny saha "β€”ifconfig 10.45.54.(1 na 2) 255.255.255.252" mamaritra ny adiresy IP anatiny an'ny interface
  4. MANANGANA tsiambaratelo.key baiko:
    # openvpn --genkey --secret secret.key 
  5. ataovy azo tanterahina ny script:
    # chmod +x vpn8.sh
  6. mandehana ny script:
    # ./vpn8.sh nZbVGBuX5dtturD

    izay nZbVGBuX5dtturD dia ny fifandraisana ID novokarina eto

Amin'ny node lavitra, ataovy mitovy daholo ny zava-drehetra afa-tsy ny famoronana secret.key sy ID fifandraisana, tsy maintsy mitovy izy ireo.

Dika nohavaozina (tsy maintsy ampifanarahina amin'ny asa marina ny fotoana):

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

Mba hiasa ny script dia mila:

  1. Adikao amin'ny takelaka ary apetaho amin'ny mpanonta, ohatra:
    # nano vpn10.sh 
  2. manondro ny fidirana (andalana faha-2) sy ny tenimiafina ho an'ny Yandex.disk (andalana faha-3).
  3. mamaritra ny adiresy IP anatiny amin'ny tonelina (andalana faha-4).
  4. ataovy azo tanterahina ny script:
    # chmod +x vpn10.sh
  5. mandehana ny script:
    # ./vpn10.sh nZbVGBuX5dtturD

    izay nZbVGBuX5dtturD dia ny fifandraisana ID novokarina eto

Ao amin'ny node lavitra, manaova toy izany koa, mamaritra ny adiresy IP anatiny mifanaraka amin'ny tonelina sy ny fifandraisana ID.

Mba hamerenana ny script rehefa mandeha dia mampiasa ny baiko aho "nohup /<lalana mankany amin'ny script>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &" voarakitra ao amin'ny rakitra /etc/ rc.local

famaranana

Ny script dia miasa, nosedraina tamin'ny Ubuntu (18.04, 19.10, 20.04) ary Debian 9. Azonao atao ny mampiasa serivisy hafa ho toy ny mpandefa, fa noho ny traikefa dia nampiasa Yandex.disk.
Nandritra ny andrana dia hita fa misy karazana mpamatsy NAT tsy mamela ny fametrahana fifandraisana. Avy amin'ny mpandraharaha finday izay voasakana ny torrent.

Mikasa ny hanatsara aho amin'ny lafiny:

  • Famoronana mandeha ho azy ny secret.key isaky ny manomboka ianao, asio encryption ary kopia ao amin'ny Yandex.disk mba hafindra any amin'ny node lavitra (Raha jerena ny dikan-teny nohavaozina)
  • Fametrahana ho azy ny adiresy IP an'ny interface
  • Fametahana angona alohan'ny hampidirana ao amin'ny Yandex.disk
  • Optimization kaody

Aoka hisy IPv6 isaky ny trano!

Nohavaozina! Ny rakitra farany sy ny fonosana DEB eto - yandex.disk

Source: www.habr.com

Add a comment