Tshaj Tawm
Taw qhia
Tom qab nyeem cov lus ntawm cov lus tshaj tawm dhau los, kuv pom tau hais tias qhov teeb meem tseem ceeb ntawm kev siv yog kev siv tus neeg nruab nrab - ib tus neeg thib peb (VPS) uas qhia txog qhov tsis sib xws tam sim no ntawm node, qhov twg thiab yuav txuas li cas. Xav txog cov lus pom zoo kom siv qhov STUN (
Txoj kev xav
Tsis ntev los no kuv yuav tsum tau nruab STUN server ntawm Debian los ntawm pob
# apt install stun-server
thiab nyob rau hauv dependencies kuv pom cov stun-cov neeg siv khoom pob, tab sis cas kuv tsis xyuam xim rau nws. Tab sis tom qab ntawd kuv nco qab txog cov pob khoom siv tsis txaus ntseeg thiab txiav txim siab seb nws ua haujlwm li cas, tom qab googling thiab tshawb hauv Yandex kuv tau txais:
# apt install stun-client
# stun stun.ekiga.net -p 21234 -v
Hauv kev teb kuv tau txais:
STUN tus thov kev pabcuam 0.97
Qhib chaw nres nkoj 21234 nrog fd 3
Qhib chaw nres nkoj 21235 nrog fd 4
Encoding stun message:
Encoding ChangeRequest: 0Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Encoding stun message:
Encoding ChangeRequest: 4Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Encoding stun message:
Encoding ChangeRequest: 2Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Tau txais cov lus tsis txaus siab: 92 bytes
MappedAddress = <Kuv tus IP>: 2885
Qhov chaw nyob = 216.93.246.18: 3478
216.93.246.17:3479
Tsis paub tus cwj pwm: 32800
ServerName = Vovida.org 0.98-CPC
Tau txais cov lus ntawm hom 257 id=1
Encoding stun message:
Encoding ChangeRequest: 0Hais txog xa msg ntawm len 28 rau 216.93.246.17: 3478
Encoding stun message:
Encoding ChangeRequest: 4Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Encoding stun message:
Encoding ChangeRequest: 2Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Encoding stun message:
Encoding ChangeRequest: 0Hais txog xa msg ntawm len 28 rau <Kuv tus IP>: 2885
Tau txais cov lus tsis txaus siab: 28 bytes
ChangeRequest = 0
Tau txais cov lus ntawm hom 1 id=11
Encoding stun message:
Encoding ChangeRequest: 0Hais txog xa msg ntawm len 28 rau 216.93.246.17: 3478
Encoding stun message:
Encoding ChangeRequest: 4Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Encoding stun message:
Encoding ChangeRequest: 2Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Tau txais cov lus tsis txaus siab: 92 bytes
MappedAddress = <Kuv tus IP>: 2885
Qhov chaw nyob = 216.93.246.17: 3479
216.93.246.18:3478
Tsis paub tus cwj pwm: 32800
ServerName = Vovida.org 0.98-CPC
Tau txais cov lus ntawm hom 257 id=10
Encoding stun message:
Encoding ChangeRequest: 4Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Encoding stun message:
Encoding ChangeRequest: 2Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Encoding stun message:
Encoding ChangeRequest: 4Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Encoding stun message:
Encoding ChangeRequest: 2Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Encoding stun message:
Encoding ChangeRequest: 4Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Encoding stun message:
Encoding ChangeRequest: 2Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Encoding stun message:
Encoding ChangeRequest: 4Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Encoding stun message:
Encoding ChangeRequest: 2Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Encoding stun message:
Encoding ChangeRequest: 4Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
Encoding stun message:
Encoding ChangeRequest: 2Hais txog xa msg ntawm len 28 rau 216.93.246.18: 3478
test I = 1
test II = 0
test III = 0
test I(2) = 1
nat = 1
mapped IP tib = 1
plaub = 1
chaw nres nkoj = 0
Qhov Tseem Ceeb: Kev Ua Haujlwm Tsis Txaus Siab, Chaw Nres Nkoj Raws Lim Lim, chaw nres nkoj random, yuav hairpin
Tus nqi rov qab yog 0x000006
Txoj hlua nrog tus nqi
MappedAddress = <Kuv tus IP>: 2885
tsuas yog yam koj xav tau! Nws tau nthuav tawm cov xwm txheej tam sim no rau kev sib txuas ntawm lub zos UDP chaw nres nkoj 21234. Tab sis qhov no tsuas yog ib nrab ntawm kev sib ntaus sib tua; cov lus nug tshwm sim ntawm yuav ua li cas hloov cov ntaub ntawv no mus rau cov chaw taws teeb tswj thiab teeb tsa kev sib txuas VPN. Siv cov txheej txheem xa ntawv, lossis tej zaum Telegram?! Muaj ntau txoj kev xaiv thiab kuv txiav txim siab siv Yandex.disk, txij li thaum kuv tuaj hla
- Cov teeb liab uas cov nodes tau npaj los tsim kom muaj kev sib txuas los ntawm qhov muaj cov ntaub ntawv tshwj xeeb nrog lub sijhawm rau Yandex.disk;
- Yog tias cov nodes tau npaj txhij, ces tau txais cov kev ntsuas tam sim no los ntawm STUN server;
- Upload tam sim no nqis rau Yandex.disk;
- Tshawb xyuas lub xub ntiag thiab nyeem cov kev txwv ntawm cov chaw taws teeb ntawm cov ntaub ntawv ntawm Yandex.disk;
- Tsim kev sib txuas nrog tus tswv tsev nyob deb siv OpenVPN.
Xyaum ua haujlwm
Tom qab xav me ntsis, coj mus rau hauv tus account qhov kev paub ntawm tsab xov xwm kawg, kuv sau ntawv sai sai. Peb yuav xav tau:
# apt install openvpn stun-client curl
Tsab ntawv nws tus kheej:
thawj 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
done
Rau tsab ntawv ua haujlwm koj xav tau:
- Luam rau cov ntawv teev cia thiab muab tso rau hauv editor, piv txwv li:
# nano vpn8.sh
- qhia tus username thiab password rau Yandex.disk.
- hauv daim teb "—ifconfig 10.45.54.(1 lossis 2) 255.255.255.252" qhia qhov chaw nyob IP sab hauv ntawm lub interface
- tsim secret.key hais kom ua:
# openvpn --genkey --secret secret.key
- ua kom tsab ntawv executable:
# chmod +x vpn8.sh
- khiav tsab ntawv:
# ./vpn8.sh nZbVGBuX5dtturD
qhov twg nZbVGBuX5dtturD yog qhov kev sib txuas ID generated
S, SѓS,
Ntawm cov chaw taws teeb, ua txhua yam zoo ib yam tsuas yog tsim secret.key thiab kev sib txuas ID, lawv yuav tsum zoo ib yam.
Hloov tshiab version (lub sij hawm yuav tsum tau synchronized rau kev ua haujlwm raug):
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
Rau tsab ntawv ua haujlwm koj xav tau:
- Luam rau cov ntawv teev cia thiab muab tso rau hauv editor, piv txwv li:
# nano vpn10.sh
- qhia tus ID nkag mus ( kab thib 2) thiab lo lus zais rau Yandex.disk ( kab thib 3).
- qhia qhov chaw nyob IP sab hauv ntawm lub qhov (4th kab).
- ua kom tsab ntawv executable:
# chmod +x vpn10.sh
- khiav tsab ntawv:
# ./vpn10.sh nZbVGBuX5dtturD
qhov twg nZbVGBuX5dtturD yog qhov kev sib txuas ID generated
S, SѓS,
Ntawm cov chaw taws teeb tswj, ua tib yam, qhia qhov sib thooj IP chaw nyob ntawm lub qhov thiab kev sib txuas ID.
Txhawm rau autorun tsab ntawv thaum qhib, kuv siv cov lus txib "nohup / <path rau tsab ntawv>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &" muaj nyob rau hauv cov ntaub ntawv /etc/ rc.loj
xaus
Tsab ntawv ua haujlwm, sim ntawm Ubuntu (18.04, 19.10, 20.04) thiab Debian 9. Koj tuaj yeem siv lwm yam kev pabcuam ua tus xa xov, tab sis rau kev paub kuv siv Yandex.disk.
Thaum lub sijhawm sim, nws tau pom tias qee hom NAT cov chaw muab kev pabcuam tsis tso cai tsim kev sib txuas. Feem ntau los ntawm cov neeg siv xov tooj ntawm tes qhov twg torrents raug thaiv.
Kuv npaj yuav txhim kho nyob rau hauv cov nqe lus ntawm:
- Tsis siv neeg tiam ntawm secret.key txhua zaus koj pib, encrypt thiab luam rau Yandex.disk rau kev hloov mus rau ib qho chaw taws teeb (Ua rau hauv tus account hauv qhov hloov tshiab)
- Tsis siv neeg muab IP chaw nyob ntawm interfaces
- Encrypting cov ntaub ntawv ua ntej uploading rau Yandex.disk
- Code optimization
Cia muaj IPv6 hauv txhua lub tsev!
Hloov tshiab! Cov ntaub ntawv tseeb thiab DEB pob ntawm no -
Tau qhov twg los: www.hab.com