ProHoster > Blog > Stjórnsýsla > Bein VPN göng milli tölva í gegnum NAT veitenda (án VPS, með STUN netþjóni og Yandex.disk)
Bein VPN göng milli tölva í gegnum NAT veitenda (án VPS, með STUN netþjóni og Yandex.disk)
Framlenging Grein um hvernig mér tókst að skipuleggja bein VPN göng á milli tveggja tölva sem staðsettar eru fyrir aftan NAT veitendur. Fyrri grein lýsti ferlinu við að skipuleggja tengingu með hjálp þriðja aðila - milliliðs (leigður VPS sem virkar sem eitthvað eins og STUN netþjónn og hnútgagnasendir fyrir tenginguna). Í þessari grein mun ég segja þér hvernig mér tókst án VPS, en milliliðirnir voru eftir og þeir voru STUN þjónninn og Yandex.Disk...
Inngangur
Eftir að hafa lesið athugasemdir fyrri færslu, áttaði ég mig á því að helsti galli framkvæmdarinnar var notkun milliliðs - þriðja aðila (VPS) sem gaf til kynna núverandi breytur hnútsins, hvar og hvernig á að tengjast. Miðað við ráðleggingar um að nota þetta STUN (sem það er mikið af) til að ákvarða núverandi tengibreytur. Í fyrsta lagi ákvað ég að nota TCDPump til að skoða innihald pakkana þegar STUN þjónninn var að vinna með viðskiptavinum og fékk algjörlega ólæsilegt efni. Googlaði siðareglurnar sem ég rakst á grein sem lýsir bókuninni. Ég áttaði mig á því að ég gæti ekki útfært beiðni á STUN netþjóninn á eigin spýtur og setti hugmyndina í „fjarlægan kassa“.
Теория
Nýlega þurfti ég að setja upp STUN server á Debian úr pakkanum
# apt install stun-server
og í ósjálfstæði sá ég stun-client pakkann, en einhvern veginn tók ég ekki eftir honum. En seinna mundi ég eftir stun-client pakkanum og ákvað að finna út hvernig hann virkar, eftir að hafa googlað og leitað í Yandex fékk ég:
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 4
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 2
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Móttekin deyfingarskilaboð: 92 bæti
MappedAddress = <My IP>:2885
Heimildisfang = 216.93.246.18:3478
Breytt heimilisfang = 216.93.246.17:3479
Óþekkt eiginleiki: 32800
ServerName = Vovida.org 0.98-CPC
Móttekið skilaboð af gerðinni 257 id=1
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 0
Um að gera að senda skilaboð um len 28 til 216.93.246.17:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 4
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 2
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 0
Um að gera að senda skilaboð um len 28 á <My IP>:2885
Móttekin deyfingarskilaboð: 28 bæti
ChangeRequest = 0
Móttekið skilaboð af gerðinni 1 id=11
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 0
Um að gera að senda skilaboð um len 28 til 216.93.246.17:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 4
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 2
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Móttekin deyfingarskilaboð: 92 bæti
MappedAddress = <My IP>:2885
Heimildisfang = 216.93.246.17:3479
Breytt heimilisfang = 216.93.246.18:3478
Óþekkt eiginleiki: 32800
ServerName = Vovida.org 0.98-CPC
Móttekið skilaboð af gerðinni 257 id=10
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 4
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 2
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 4
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 2
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 4
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 2
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 4
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 2
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 4
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
Kóðun deyfingarskilaboða:
Encoding ChangeRequest: 2
Um að gera að senda skilaboð um len 28 til 216.93.246.18:3478
próf I = 1
próf II = 0
próf III = 0
próf I(2) = 1
er nat = 1
kortlagt IP sama = 1
hárnál = 1
varðveisluhöfn = 0
Aðal: Óháð kortlagning, höfn háð sía, handahófskennd höfn, mun hárnála
Skilagildi er 0x000006
Strengur með gildi
MappedAddress = <My IP>:2885
bara það sem þú þarft! Það sýndi núverandi stöðu fyrir tenginguna á staðbundnu UDP-tenginu 21234. En þetta er aðeins hálf baráttan, spurningin vaknaði um hvernig ætti að flytja þessi gögn til ytri gestgjafans og skipuleggja VPN-tengingu. Að nota póstsamskiptareglur, eða kannski Telegram?! Það eru margir möguleikar og ég ákvað að nota Yandex.disk, þar sem ég rakst á grein um að vinna Curl í gegnum WebDav með Yandex.disk. Eftir að hafa hugsað um útfærsluna fann ég eftirfarandi áætlun:
Merki um að hnútar séu tilbúnir til að koma á tengingu með því að vera til staðar ákveðin skrá með tímastimpli á Yandex.disk;
Ef hnútarnir eru tilbúnir skaltu fá núverandi breytur frá STUN þjóninum;
Hladdu upp núverandi stillingum á Yandex.disk;
Athugaðu viðveru og lestu breytur ytra hnút úr skrá á Yandex.disk;
Að koma á tengingu við ytri gestgjafa með OpenVPN.
Practice
Eftir að hafa hugsað aðeins, með hliðsjón af reynslu síðustu greinar, skrifaði ég fljótt handrit. Við munum þurfa:
# apt install openvpn stun-client curl
Handritið sjálft:
upprunalegu útgáfuna
# 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
Til að handritið virki þarftu:
Afritaðu á klemmuspjald og límdu inn í ritil, til dæmis:
# nano vpn8.sh
tilgreindu notandanafn og lykilorð fyrir Yandex.disk.
í reitnum "—ifconfig 10.45.54.(1 eða 2) 255.255.255.252" tilgreinið innri IP tölu viðmótsins
búa til leynilykill með skipun:
# openvpn --genkey --secret secret.key
gerðu handritið keyranlegt:
# chmod +x vpn8.sh
keyra scriptið:
# ./vpn8.sh nZbVGBuX5dtturD
þar sem nZbVGBuX5dtturD er myndað tengingarkenni hér
Á ytri hnút, gerðu allt eins nema að búa til secret.key og tengi auðkenni, þau verða að vera eins.
Uppfærð útgáfa (tíminn verður að vera samstilltur fyrir rétta notkun):
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
Til að handritið virki þarftu:
Afritaðu á klemmuspjald og límdu inn í ritil, til dæmis:
# nano vpn10.sh
tilgreindu innskráningu (2. lína) og lykilorð fyrir Yandex.disk (3. lína).
tilgreindu innri IP tölu ganganna (4. lína).
gerðu handritið keyranlegt:
# chmod +x vpn10.sh
keyra scriptið:
# ./vpn10.sh nZbVGBuX5dtturD
þar sem nZbVGBuX5dtturD er myndað tengingarkenni hér
Á ytri hnút, gerðu það sama, tilgreindu samsvarandi innri IP tölu gönganna og auðkenni tengingar.
Til að keyra skriftuna sjálfkrafa þegar kveikt er á því nota ég skipunina „nohup /<path to the script>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &“ sem er í skránni /etc/ rc.local
Ályktun
Handritið virkar, prófað á Ubuntu (18.04, 19.10, 20.04) og Debian 9. Þú getur notað hvaða aðra þjónustu sem er sem sendi, en til reynslu notaði ég Yandex.disk.
Í tilraununum kom í ljós að sumar tegundir NAT veitenda leyfa ekki að koma á tengingu. Aðallega frá farsímafyrirtækjum þar sem straumum er lokað.
Ég ætla að bæta mig hvað varðar:
Sjálfvirk myndun secret.key í hvert skipti sem þú byrjar, dulkóða og afritaðu á Yandex.disk til að flytja yfir á ytri hnút (með hliðsjón af uppfærðri útgáfu)
Sjálfvirk úthlutun á IP-tölum viðmóta
Dulkóða gögn áður en hlaðið er upp á Yandex.disk
Kóða hagræðingu
Láttu IPv6 vera á hverju heimili!
Uppfært! Nýjustu skrár og DEB pakki hér - yandex.diskur