공급자의 NAT를 통해 컴퓨터 간 직접 VPN 터널(VPS 없음, STUN 서버 및 Yandex.disk 사용)

확장 조항 NAT 공급자 뒤에 있는 두 컴퓨터 사이에 직접 VPN 터널을 구성하는 방법에 대해 설명합니다. 이전 기사에서는 중개자(STUN 서버와 연결을 위한 노드 데이터 송신기 역할을 하는 임대 VPS)의 도움을 받아 연결을 구성하는 프로세스를 설명했습니다. 이 기사에서는 VPS 없이 어떻게 관리했는지 설명할 것입니다. 그러나 중개자는 남아 있었고 그들은 STUN 서버와 Yandex.Disk였습니다...
공급자 NAT를 통해 컴퓨터 간 직접 VPN 터널(VPS 없음, STUN 서버 및 Yandex.disk 사용)

소개

이전 게시물의 댓글을 읽은 후 구현의 주요 단점은 노드의 현재 매개변수, 연결 위치 및 방법을 나타내는 제XNUMX자(VPS)인 중개자를 사용한다는 것임을 깨달았습니다. 이 STUN 사용에 대한 권장 사항을 고려하면(그 중 많은 것이) 현재 연결 매개변수를 결정합니다. 우선 STUN 서버가 클라이언트와 작업 중이고 전혀 읽을 수 없는 콘텐츠를 수신했을 때 TCPDump를 사용하여 패킷의 콘텐츠를 살펴보기로 결정했습니다. 내가 발견한 프로토콜을 인터넷 검색해 보면 프로토콜을 설명하는 기사. 나는 STUN 서버에 대한 요청을 스스로 구현할 수 없다는 것을 깨달았고 그 아이디어를 "먼 상자"에 담았습니다.

Теория

최근에 패키지에서 Debian에 STUN 서버를 설치해야 했습니다.

# apt install stun-server

의존성에서 stun-client 패키지를 보았지만 어쩐지 주의를 기울이지 않았습니다. 그러나 나중에 나는 stun-client 패키지에 대해 기억하고 그것이 어떻게 작동하는지 알아보기로 결정했습니다. Yandex에서 인터넷 검색과 검색을 한 후 다음과 같은 결과를 얻었습니다.

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

이에 대한 응답으로 나는 다음을 받았습니다:

STUN 클라이언트 버전 0.97
fd 21234으로 포트 3를 열었습니다.
fd 21235으로 포트 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 id=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바이트
변경요청 = 0
1 id=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 id=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로 보내려고 합니다.
테스트 I = 1
테스트 II = 0
테스트 III = 0
테스트 I(2) = 1
nat = 1인가요?
매핑된 IP 동일 = 1
머리핀 = 1
보존 포트 = 0
기본: 독립 매핑, 포트 종속 필터, 임의 포트, 헤어핀
반환 값은 0x000006입니다.

값이 포함된 문자열

매핑된 주소 = <내 IP>:2885

딱 필요한 것! 로컬 UDP 포트 21234의 연결에 대한 현재 상태가 표시되었습니다. 그러나 이것은 전투의 절반에 불과하며 이 데이터를 원격 호스트로 전송하고 VPN 연결을 구성하는 방법에 대한 질문이 생겼습니다. 메일 프로토콜을 사용하나요, 아니면 텔레그램을 사용하나요?! 많은 옵션이 있으며 저는 Yandex.disk를 사용하기로 결정했습니다. Yandex.disk를 사용하여 WebDav를 통해 Curl 작업에 대한 기사. 구현에 대해 생각한 후 다음 계획을 생각해 냈습니다.

  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는 생성된 연결 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

스크립트가 작동하려면 다음이 필요합니다.

  1. 클립보드에 복사하여 편집기에 붙여넣습니다. 예:
    # nano vpn10.sh 
  2. Yandex.disk의 로그인(두 번째 줄)과 비밀번호(세 번째 줄)를 나타냅니다.
  3. 터널의 내부 IP 주소를 지정합니다(네 번째 줄).
  4. 스크립트를 실행 가능하게 만듭니다.
    # chmod +x vpn10.sh
  5. 스크립트를 실행합니다:
    # ./vpn10.sh nZbVGBuX5dtturD

    여기서 nZbVGBuX5dtturD는 생성된 연결 ID입니다. 여기에

원격 노드에서도 동일한 작업을 수행하고 터널의 해당 내부 IP 주소와 연결 ID를 지정합니다.

켜져 있을 때 스크립트를 자동 실행하려면 /etc/ 파일에 포함된 "nohup /<스크립트 경로>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &" 명령을 사용합니다. 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

출처 : habr.com

코멘트를 추가