Fortsetzung einem Artikel darüber, wie ich es geschafft habe, einen direkten VPN-Tunnel zwischen zwei hinter NATs der Anbieter befindlichen Computern zu organisieren. Im letzten Artikel wurde der Prozess beschrieben, um eine Verbindung über einen Drittanbieter — einen Vermittler (gemieteten VPS der als eine Art STUN-Server und Datenübertragungsstelle für die Verbindung agiert). In diesem Artikel werde ich erläutern, wie ich ohne VPS ausgekommen bin, wobei die Vermittler dennoch vorhanden waren: STUN-Server und Yandex.Disk…
Einführung
Nach dem Lesen der Kommentare zu meinem letzten Post wurde mir klar, dass der Hauptnachteil der Umsetzung die Nutzung eines Vermittlers — eines Drittanbieters (VPS) war, der die aktuellen Parameter des Knotens angab, wohin und wie man sich verbinden sollte. In Anbetracht der Empfehlungen, einen echten STUN (von denen es sehr viele gibt) zur Bestimmung der aktuellen Verbindungsparameter zu verwenden. Zuerst wollte ich mit TCPDump den Inhalt der Pakete zu beobachten, während der STUN-Server mit den Clients arbeitete, und erhielt völlig unleserliche Inhalte. Ich stieß beim Googeln des Protokolls auf einen Artikel über das Protokoll. Mir wurde klar, dass ich einen eigenen STUN-Server-Anfrage nicht umsetzen kann und legte die Idee in die "ferne Schublade".
Theorie
Kürzlich musste ich einen STUN-Server auf Debian aus dem Paket installieren
# apt install stun-serverund in den Abhängigkeiten entdeckte ich das Paket stun-client, dem ich zunächst keine Beachtung schenkte. Später erinnerte ich mich jedoch an das Paket stun-client und entschloss mich, herauszufinden, wie es funktioniert. Nach einer Google- und Yandex-Suche erhielt ich:
# apt install stun-client
# stun stun.ekiga.net -p 21234 -v
Als Antwort erhielt ich:
STUN-Client-Version 0.97
Öffneter Port 21234 mit fd 3
Öffneter Port 21235 mit fd 4
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 0Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 4Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 2Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Erhaltene STUN-Nachricht: 92 Bytes
MappedAddress = :2885
SourceAddress = 216.93.246.18:3478
ChangedAddress = 216.93.246.17:3479
Unbekanntes Attribut: 32800
ServerName = Vovida.org 0.98-CPC
Erhaltene Nachricht vom Typ 257 id=1
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 0Bereit, eine Nachricht mit Länge 28 an 216.93.246.17:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 4Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 2Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 0Bereit, eine Nachricht mit Länge 28 an :2885 zu senden
Erhaltene STUN-Nachricht: 28 Bytes
ChangeRequest = 0
Erhaltene Nachricht vom Typ 1 id=11
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 0Bereit, eine Nachricht mit Länge 28 an 216.93.246.17:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 4Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 2Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Erhaltene STUN-Nachricht: 92 Bytes
MappedAddress = :2885
SourceAddress = 216.93.246.17:3479
ChangedAddress = 216.93.246.18:3478
Unbekanntes Attribut: 32800
ServerName = Vovida.org 0.98-CPC
Erhaltene Nachricht vom Typ 257 id=10
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 4Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 2Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 4Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 2Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 4Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 2Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 4Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 2Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 4Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
Kodierung der STUN-Nachricht:
Kodierung ChangeRequest: 2Bereit, eine Nachricht mit Länge 28 an 216.93.246.18:3478 zu senden
test I = 1
test II = 0
test III = 0
test I(2) = 1
is nat = 1
mapped IP same = 1
hairpin = 1
preserver port = 0
Primär: Unabhängige Zuordnung, portspezifischer Filter, zufälliger Port, wird hairpin
Rückgabewert ist 0x000006
Zeichenfolge mit Wert
MappedAddress = :2885
genau das, was ich brauche! Es zeigte den aktuellen Status der Verbindung auf dem lokalen UDP-Port 21234 an. Aber das ist nur die halbe Miete, denn die Frage ist, wie man diese Daten an einen entfernten Knoten überträgt und eine VPN-Verbindung einrichtet. Die Verwendung eines Postprotokolls, oder vielleicht Telegram?! Es gibt viele Optionen, und ich habe mich entschieden, Yandex.Disk zu verwenden, da ich darüber einen Artikel gefunden habe. über die Verwendung von Curl über WebDav mit Yandex.Disk.. Nach Überlegungen zur Umsetzung kam ich zu folgendem Schema:
- Signalisieren, dass die Knoten bereit sind, eine Verbindung herzustellen, durch das Vorhandensein einer bestimmten Datei mit einem Zeitstempel auf Yandex.Disk;
- Wenn die Knoten bereit sind, die aktuellen Parameter vom STUN-Server abrufen;
- Die aktuellen Parameter auf Yandex.Disk hochladen;
- Das Vorhandensein überprüfen und die Parameter des entfernten Knotens aus der Datei auf Yandex.Disk auslesen;
- Die Verbindung mit dem entfernten Knoten über OpenVPN herstellen.
Praxis
Nachdem ich ein wenig nachgedacht hatte und unter Berücksichtigung der Erfahrungen aus dem letzten Artikel, schrieb ich schnell ein Skript. Wir benötigen:
# apt install openvpn stun-client curl Das eigentliche Skript:
Die ursprüngliche Version
# 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
doneFür die Ausführung des Skripts ist es nötig:
- In die Zwischenablage kopieren und in einen Editor einfügen, zum Beispiel:
# nano vpn8.sh - die Anmeldedaten für Yandex.Disk anzugeben.
- Im Feld „ifconfig 10.45.54.(1 oder 2) 255.255.255.252“ die interne IP-Adresse des Interfaces angeben.
- erstellen secret.key mit dem Befehl:
# openvpn --genkey --secret secret.key - Script ausführbar machen:
# chmod +x vpn8.sh - Script ausführen:
# ./vpn8.sh nZbVGBuX5dtturDwobei nZbVGBuX5dtturD die generierte Verbindungs-ID ist. hier
Auf dem entfernten Knoten alles gleich machen, mit Ausnahme der Generierung von secret.key und der Verbindungs-ID; diese müssen identisch sein.
Aktualisierte Version (für ordnungsgemäße Funktion muss die Zeit synchronisiert sein):
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
Für die Ausführung des Skripts ist es nötig:
- In die Zwischenablage kopieren und in einen Editor einfügen, zum Beispiel:
# nano vpn10.sh - Benutzernamen (2. Zeile) und Passwort für Yandex.Disk (3. Zeile) angeben.
- Die interne IP-Adresse des Tunnels (4. Zeile) angeben.
- Script ausführbar machen:
# chmod +x vpn10.sh - Script ausführen:
# ./vpn10.sh nZbVGBuX5dtturDwobei nZbVGBuX5dtturD die generierte Verbindungs-ID ist. hier
Auf dem entfernten Knoten alles gleich machen, die entsprechende interne IP-Adresse Tunnel- und Verbindungs-ID angeben.
Für den automatischen Start des Scripts beim Einschalten verwende ich den Befehl „nohup //vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &“, der in der Datei /etc/rc.local enthalten ist.
Fazit
Das Script funktioniert und wurde auf Ubuntu (18.04, 19.10, 20.04) und Debian 9 getestet. Als Übertragungsdienst kann jeder andere Dienst verwendet werden, aber ich habe Yandex.Disk für dieses Experiment genutzt.
Im Verlauf der Experimente wurde festgestellt, dass einige NAT-Typen von Providern die Verbindung nicht zulassen. Dies betrifft hauptsächlich Mobilfunkanbieter, bei denen Torrents blockiert sind.
Ich plane, Folgendes zu verbessern:
- Automatische Generierung von secret.key bei jedem Start, Verschlüsselung und Kopie auf Yandex.Disk zur Übertragung an einen entfernten Knoten (berücksichtigt in der aktualisierten Version)
- Automatische Zuweisung von IP-Adressen für Schnittstellen
- Verschlüsselung der Daten vor dem Hochladen auf Yandex.Disk
- Code-Optimierung
Möge IPv6 in jedem Haushalt sein!
Aktualisiert! Die letzten Dateien und das DEB-Paket finden Sie hier — yandex.disk
Quelle: habr.com
