mirror of
https://github.com/itdoginfo/podkop.git
synced 2025-12-06 19:46:52 +03:00
Compare commits
57 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2074ccecce | ||
|
|
06f9bee038 | ||
|
|
891b8f713d | ||
|
|
b96552fb49 | ||
|
|
ce9a7cdc45 | ||
|
|
6071a96e9c | ||
|
|
e17422a0cf | ||
|
|
2e78b2b4b8 | ||
|
|
b84f3b6782 | ||
|
|
0f66305e50 | ||
|
|
a32a5c600b | ||
|
|
89737efcbc | ||
|
|
4608bc31cd | ||
|
|
d9e9f2dfe4 | ||
|
|
bb9318e96f | ||
|
|
7ff49c3e4e | ||
|
|
134a79cb3b | ||
|
|
560dda8604 | ||
|
|
255c08a6de | ||
|
|
1f3a65347e | ||
|
|
ec936e2369 | ||
|
|
cee934d139 | ||
|
|
a25c6b8013 | ||
|
|
ec3a281cef | ||
|
|
86947e7dee | ||
|
|
ff5d017acc | ||
|
|
22d919657c | ||
|
|
3271f23ae0 | ||
|
|
35ea1a14cf | ||
|
|
51a9cc5934 | ||
|
|
e1df26e62b | ||
|
|
75b8bef0e0 | ||
|
|
1a6b0cac46 | ||
|
|
e49bd91109 | ||
|
|
85642a2585 | ||
|
|
c31785d20e | ||
|
|
a0af04037a | ||
|
|
51fb10e30e | ||
|
|
069ea41ef8 | ||
|
|
7ee92123bc | ||
|
|
5fd0e23cf9 | ||
|
|
9b25669c8f | ||
|
|
4b020671cc | ||
|
|
6222221847 | ||
|
|
6fa215e343 | ||
|
|
a33835415f | ||
|
|
f76c657bd7 | ||
|
|
cceedd6c17 | ||
|
|
8fa1986961 | ||
|
|
8dec59d118 | ||
|
|
c1fac487c7 | ||
|
|
d934bcc5e9 | ||
|
|
fc99bd7aaa | ||
|
|
b6cf73b974 | ||
|
|
6df7c8abf8 | ||
|
|
8eb97a8023 | ||
|
|
cd43449585 |
28
README.md
28
README.md
@@ -89,11 +89,8 @@ Luci: Services/podkop
|
|||||||
- [x] Сеть рестартится при любом раскладе
|
- [x] Сеть рестартится при любом раскладе
|
||||||
- [x] Выкл-вкл wg через luci не отрабатывает поднятие маршрута
|
- [x] Выкл-вкл wg через luci не отрабатывает поднятие маршрута
|
||||||
- [ ] Если eof после последней строки в rt_tables, то скрипт не добавляет перенос строки
|
- [ ] Если eof после последней строки в rt_tables, то скрипт не добавляет перенос строки
|
||||||
- [ ] Парсинг VLESS не отрабатывает, если в SNI два домена. Пример `sni=telegram.org%3Bwww.telegram.org`
|
|
||||||
- [ ] `service network restart` ломает маршруты при sing-box
|
|
||||||
- [ ] Совпадение секции с ruleset ломает конфиг sing-box
|
|
||||||
- [ ] В каких-то случаях плохо отрабатывает localfile
|
- [ ] В каких-то случаях плохо отрабатывает localfile
|
||||||
- [ ] exit 1 если в конфиге присуствует
|
- [ ] warnging если в конфиге присуствует. Значит в системе есть https-dns-proxy, который тоже может перетирать конфигурацию dhcp. Рекомендовать его выключить и сделать disable. Возможно в будущем добавить несовместимость на уровне Makefile
|
||||||
```
|
```
|
||||||
option doh_backup_noresolv '0'
|
option doh_backup_noresolv '0'
|
||||||
list doh_backup_server ''
|
list doh_backup_server ''
|
||||||
@@ -102,6 +99,8 @@ Luci: Services/podkop
|
|||||||
list doh_server '127.0.0.1#5054'
|
list doh_server '127.0.0.1#5054'
|
||||||
```
|
```
|
||||||
- [x] Только кастомный remote list не создаёт секцию в route-rules-rule-set и dns-rules-ruleset
|
- [x] Только кастомный remote list не создаёт секцию в route-rules-rule-set и dns-rules-ruleset
|
||||||
|
- [ ] Не отрабатывает service podkop stop, если podkop запущен и не может, к пример, зарезолвить домен с сломанным DNS
|
||||||
|
- [ ] Длинный label ломает sing-box
|
||||||
|
|
||||||
# ToDo
|
# ToDo
|
||||||
Этот раздел не означает задачи, которые нужно брать и делать. Это общий список хотелок. Если вы хотите помочь, пожалуйста, спросите сначала в телеграмме.
|
Этот раздел не означает задачи, которые нужно брать и делать. Это общий список хотелок. Если вы хотите помочь, пожалуйста, спросите сначала в телеграмме.
|
||||||
@@ -143,23 +142,19 @@ Luci: Services/podkop
|
|||||||
3) включен, версия 1 (старые релизы xray, sing-box на сервере)
|
3) включен, версия 1 (старые релизы xray, sing-box на сервере)
|
||||||
Проблема в том, что это нужно только если SS. Выставлять выбор при парсинг из конфига вопрос можно ли. Если совсем тупо - сделать костыль в допонительные настройки
|
Проблема в том, что это нужно только если SS. Выставлять выбор при парсинг из конфига вопрос можно ли. Если совсем тупо - сделать костыль в допонительные настройки
|
||||||
- [x] Проверка места в скрипте install. Если доступно меньше 20MB - exit 1 c выводом колько надо и сколько доступно. + показ модели роутера
|
- [x] Проверка места в скрипте install. Если доступно меньше 20MB - exit 1 c выводом колько надо и сколько доступно. + показ модели роутера
|
||||||
- [ ] Правило запрещающее QUIC
|
- [x] Правило запрещающее QUIC
|
||||||
- [ ] Проверить обновление списков, отрабатывает ли
|
- [ ] Проверить обновление списков, отрабатывает ли
|
||||||
- [ ] Проверка на ванильную openwrt
|
- [ ] Проверка на ванильную openwrt
|
||||||
- [ ] Проверка откуда установлен sing-box. Например, проверять установлен ли он из официального репозитория
|
- [ ] Проверка откуда установлен sing-box. Например, проверять установлен ли он из официального репозитория
|
||||||
- [x] TG в сервисы
|
- [x] TG в сервисы
|
||||||
- [ ] Выбор ткуда направлять трафик в туннель. В том числе чтоб откуда угодно, а не только br-lan
|
|
||||||
- [ ] Диагностика: Proxy check completed successfully предположительно не показывает IP, если вернулся это IPv6.
|
- [ ] Диагностика: Proxy check completed successfully предположительно не показывает IP, если вернулся это IPv6.
|
||||||
- [ ] Диагностика: podkop_domains: 0 elements как проверять что доходят запросы при fakeip? Мб врубать логи dnsmasq и их чекать.
|
|
||||||
- [ ] Сделать галку запрещающую подкопу редачить dhcp. Допилить в исключение вместе с пустыми полями proxy и vpn
|
- [ ] Сделать галку запрещающую подкопу редачить dhcp. Допилить в исключение вместе с пустыми полями proxy и vpn
|
||||||
- [ ] Валидации предустановленных значений. Если прописаны другие, то вывод в лог о неизвестной переменной и продолжение работы
|
- [x] Валидации предустановленных значений. Если прописаны другие, то вывод в лог о неизвестной переменной и продолжение работы
|
||||||
- [ ] Добавление в список доменов домены первого уровня (LuCI)
|
|
||||||
- [ ] Проверка, что версия в makefile совпадает с тегом
|
- [ ] Проверка, что версия в makefile совпадает с тегом
|
||||||
- [ ] Don't touch my DHCP!
|
|
||||||
|
|
||||||
Приоритет 2
|
Приоритет 2
|
||||||
- [x] Списки доменов и подсетей с роутера
|
- [x] Списки доменов и подсетей с роутера
|
||||||
- [ ] Кнопка обновления списка доменов и подсетей. Запихнуть в главное меню
|
- [x] Кнопка обновления списка доменов и подсетей. Запихнуть в главное меню
|
||||||
- [ ] IPv6
|
- [ ] IPv6
|
||||||
|
|
||||||
Wiki
|
Wiki
|
||||||
@@ -179,17 +174,6 @@ Wiki
|
|||||||
- [ ] Unit тесты (BATS)
|
- [ ] Unit тесты (BATS)
|
||||||
- [ ] Интеграционые тесты бекенда (OpenWrt rootfs + BATS)
|
- [ ] Интеграционые тесты бекенда (OpenWrt rootfs + BATS)
|
||||||
|
|
||||||
Хз как сделать
|
|
||||||
- [ ] Добавить label от конфига vless\ss\etc в luci.
|
|
||||||
|
|
||||||
# Установка версии v0.2.5
|
|
||||||
Удаляет полностью все пакеты podkop. Удаляет текущую конфигурацию podkop.
|
|
||||||
После установки **обязательно** сбросьте кэш в LuCI.
|
|
||||||
|
|
||||||
```
|
|
||||||
sh <(wget -O - https://raw.githubusercontent.com/itdoginfo/podkop/refs/heads/main/install-v0.2.5.sh)
|
|
||||||
```
|
|
||||||
|
|
||||||
# Разработка
|
# Разработка
|
||||||
Есть два варианта:
|
Есть два варианта:
|
||||||
- Просто поставить пакет на роутер или виртуалку и прям редактировать через SFTP (opkg install openssh-sftp-server)
|
- Просто поставить пакет на роутер или виртуалку и прям редактировать через SFTP (opkg install openssh-sftp-server)
|
||||||
|
|||||||
@@ -1,97 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
REPO="https://api.github.com/repos/itdoginfo/podkop/releases/tags/v0.2.5"
|
|
||||||
|
|
||||||
DOWNLOAD_DIR="/tmp/podkop"
|
|
||||||
COUNT=3
|
|
||||||
|
|
||||||
rm -rf "$DOWNLOAD_DIR"
|
|
||||||
mkdir -p "$DOWNLOAD_DIR"
|
|
||||||
|
|
||||||
main() {
|
|
||||||
check_system
|
|
||||||
|
|
||||||
opkg update
|
|
||||||
|
|
||||||
if [ -f "/etc/init.d/podkop" ]; then
|
|
||||||
echo "Remove current vesrion podkop"
|
|
||||||
opkg remove luci-i18n-podkop-ru luci-app-podkop podkop
|
|
||||||
rm /etc/config/podkop
|
|
||||||
else
|
|
||||||
echo "Installed podkop..."
|
|
||||||
fi
|
|
||||||
|
|
||||||
wget -qO- "$REPO" | grep -o 'https://[^"[:space:]]*\.ipk' | while read -r url; do
|
|
||||||
filename=$(basename "$url")
|
|
||||||
filepath="$DOWNLOAD_DIR/$filename"
|
|
||||||
|
|
||||||
attempt=0
|
|
||||||
while [ $attempt -lt $COUNT ]; do
|
|
||||||
if [ -f "$filepath" ] && [ -s "$filepath" ]; then
|
|
||||||
echo "$filename has already been uploaded"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Download $filename (count $((attempt+1)))..."
|
|
||||||
wget -q -O "$filepath" "$url"
|
|
||||||
|
|
||||||
if [ -s "$filepath" ]; then
|
|
||||||
echo "$filename successfully downloaded"
|
|
||||||
else
|
|
||||||
echo "Download error $filename. Retry..."
|
|
||||||
rm -f "$filepath"
|
|
||||||
fi
|
|
||||||
attempt=$((attempt+1))
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
|
||||||
for pkg in podkop luci-app-podkop; do
|
|
||||||
file=$(ls "$DOWNLOAD_DIR" | grep "^$pkg" | head -n 1)
|
|
||||||
if [ -n "$file" ]; then
|
|
||||||
echo "Installing $file"
|
|
||||||
opkg install "$DOWNLOAD_DIR/$file"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
ru=$(ls "$DOWNLOAD_DIR" | grep "luci-i18n-podkop-ru" | head -n 1)
|
|
||||||
if [ -n "$ru" ]; then
|
|
||||||
printf "\033[32;1mРусский язык интерфейса ставим? y/n (Need a Russian translation?)\033[0m "
|
|
||||||
while true; do
|
|
||||||
read -r -p '' RUS
|
|
||||||
case $RUS in
|
|
||||||
y)
|
|
||||||
opkg install "$DOWNLOAD_DIR/$ru"
|
|
||||||
break
|
|
||||||
;;
|
|
||||||
n)
|
|
||||||
break
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Введите y или n"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
rm -f $DOWNLOAD_DIR/podkop*.ipk $DOWNLOAD_DIR/luci-app-podkop*.ipk $DOWNLOAD_DIR/luci-i18n-podkop-ru*.ipk
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
check_system() {
|
|
||||||
# Get router model
|
|
||||||
MODEL=$(cat /tmp/sysinfo/model)
|
|
||||||
echo "Router model: $MODEL"
|
|
||||||
|
|
||||||
if ! nslookup google.com >/dev/null 2>&1; then
|
|
||||||
log "DNS not working"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if opkg list-installed | grep -qE "iptables|kmod-iptab"; then
|
|
||||||
printf "\033[31;1mFound incompatible iptables packages. If you're using FriendlyWrt: https://t.me/itdogchat/44512/181082\033[0m\n"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
main
|
|
||||||
@@ -111,7 +111,7 @@ main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
add_tunnel() {
|
add_tunnel() {
|
||||||
printf "\033[32;1mWill you be using Wireguard, AmneziaWG, OpenVPN, OpenConnect? If yes, select a number and they will be automatically installed\033[0m "
|
printf "\033[32;1mWill you be using Wireguard, AmneziaWG, OpenVPN, OpenConnect? If yes, select a number and they will be automatically installed\033[0m\n"
|
||||||
echo "1) Wireguard"
|
echo "1) Wireguard"
|
||||||
echo "2) AmneziaWG"
|
echo "2) AmneziaWG"
|
||||||
echo "3) OpenVPN"
|
echo "3) OpenVPN"
|
||||||
@@ -412,7 +412,7 @@ check_system() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if ! nslookup google.com >/dev/null 2>&1; then
|
if ! nslookup google.com >/dev/null 2>&1; then
|
||||||
log "DNS not working"
|
printf "\033[31;1mDNS not working\033[0m\n"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=luci-app-podkop
|
PKG_NAME:=luci-app-podkop
|
||||||
PKG_VERSION:=0.3.10
|
PKG_VERSION:=0.3.15
|
||||||
PKG_RELEASE:=1
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
LUCI_TITLE:=LuCI podkop app
|
LUCI_TITLE:=LuCI podkop app
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -25,44 +25,59 @@ msgstr "Тип подключения"
|
|||||||
msgid "Select between VPN and Proxy connection methods for traffic routing"
|
msgid "Select between VPN and Proxy connection methods for traffic routing"
|
||||||
msgstr "Выберите между VPN и Proxy методами для маршрутизации трафика"
|
msgstr "Выберите между VPN и Proxy методами для маршрутизации трафика"
|
||||||
|
|
||||||
|
msgid "Configuration Type"
|
||||||
|
msgstr "Тип конфигурации"
|
||||||
|
|
||||||
|
msgid "Select how to configure the proxy"
|
||||||
|
msgstr "Выберите способ настройки прокси"
|
||||||
|
|
||||||
|
msgid "Connection URL"
|
||||||
|
msgstr "URL подключения"
|
||||||
|
|
||||||
|
msgid "Outbound Config"
|
||||||
|
msgstr "Конфигурация Outbound"
|
||||||
|
|
||||||
msgid "Proxy Configuration URL"
|
msgid "Proxy Configuration URL"
|
||||||
msgstr "URL конфигурации прокси"
|
msgstr "URL конфигурации прокси"
|
||||||
|
|
||||||
msgid "Enter connection string starting with vless:// or ss:// for proxy configuration"
|
msgid "Enter connection string starting with vless:// or ss:// for proxy configuration"
|
||||||
msgstr "Введите строку подключения, начинающуюся с vless:// или ss:// для настройки прокси"
|
msgstr "Введите строку подключения, начинающуюся с vless:// или ss:// для настройки прокси"
|
||||||
|
|
||||||
|
msgid "Outbound Configuration"
|
||||||
|
msgstr "Конфигурация исходящего соединения"
|
||||||
|
|
||||||
|
msgid "Enter complete outbound configuration in JSON format"
|
||||||
|
msgstr "Введите полную конфигурацию исходящего соединения в формате JSON"
|
||||||
|
|
||||||
msgid "Network Interface"
|
msgid "Network Interface"
|
||||||
msgstr "Сетевой интерфейс"
|
msgstr "Сетевой интерфейс"
|
||||||
|
|
||||||
msgid "Select network interface for VPN connection"
|
msgid "Select network interface for VPN connection"
|
||||||
msgstr "Выберите сетевой интерфейс для VPN подключения"
|
msgstr "Выберите сетевой интерфейс для VPN подключения"
|
||||||
|
|
||||||
msgid "Community Domain Lists"
|
msgid "Community Lists"
|
||||||
msgstr "Предустановленные списки доменов"
|
msgstr "Предустановленные списки"
|
||||||
|
|
||||||
msgid "Domain List"
|
msgid "Service List"
|
||||||
msgstr "Список доменов"
|
msgstr "Список сервисов"
|
||||||
|
|
||||||
msgid "Select a list"
|
msgid "Select predefined service for routing"
|
||||||
msgstr "Выберите список доменов"
|
msgstr "Выберите предустановленные сервисы для маршрутизации"
|
||||||
|
|
||||||
msgid "Community Subnet Lists"
|
msgid "User Domain List Type"
|
||||||
msgstr "Предустановленные сети сервисов"
|
msgstr "Тип пользовательского списка доменов"
|
||||||
|
|
||||||
msgid "Enable routing for popular services like Twitter, Meta, and Discord"
|
msgid "Select how to add your custom domains"
|
||||||
msgstr "Включить маршрутизацию для популярных сервисов, таких как Twitter, Meta и Discord"
|
msgstr "Выберите способ добавления пользовательских доменов"
|
||||||
|
|
||||||
msgid "Service Networks"
|
msgid "Disabled"
|
||||||
msgstr "Сети сервисов"
|
msgstr "Отключено"
|
||||||
|
|
||||||
msgid "Select predefined service networks for routing"
|
msgid "Dynamic List"
|
||||||
msgstr "Выберите предустановленные сети сервисов для маршрутизации"
|
msgstr "Динамический список"
|
||||||
|
|
||||||
msgid "User Domain List"
|
msgid "Text List"
|
||||||
msgstr "Пользовательский список доменов"
|
msgstr "Текстовый список"
|
||||||
|
|
||||||
msgid "Enable and manage your custom list of domains for selective routing"
|
|
||||||
msgstr "Включить и управлять пользовательским списком доменов для выборочной маршрутизации"
|
|
||||||
|
|
||||||
msgid "User Domains"
|
msgid "User Domains"
|
||||||
msgstr "Пользовательские домены"
|
msgstr "Пользовательские домены"
|
||||||
@@ -70,6 +85,24 @@ msgstr "Пользовательские домены"
|
|||||||
msgid "Enter domain names without protocols (example: sub.example.com or example.com)"
|
msgid "Enter domain names without protocols (example: sub.example.com or example.com)"
|
||||||
msgstr "Введите имена доменов без протоколов (пример: sub.example.com или example.com)"
|
msgstr "Введите имена доменов без протоколов (пример: sub.example.com или example.com)"
|
||||||
|
|
||||||
|
msgid "User Domains List"
|
||||||
|
msgstr "Список пользовательских доменов"
|
||||||
|
|
||||||
|
msgid "Enter domain names separated by comma, space or newline (example: sub.example.com, example.com or one domain per line)"
|
||||||
|
msgstr "Введите имена доменов через запятую, пробел или новую строку (пример: sub.example.com, example.com или один домен на строку)"
|
||||||
|
|
||||||
|
msgid "Local Domain Lists"
|
||||||
|
msgstr "Локальные списки доменов"
|
||||||
|
|
||||||
|
msgid "Use the list from the router filesystem"
|
||||||
|
msgstr "Использовать список из файловой системы роутера"
|
||||||
|
|
||||||
|
msgid "Local Domain Lists Path"
|
||||||
|
msgstr "Путь к локальным спискам доменов"
|
||||||
|
|
||||||
|
msgid "Enter to the list file path"
|
||||||
|
msgstr "Введите путь к файлу списка"
|
||||||
|
|
||||||
msgid "Remote Domain Lists"
|
msgid "Remote Domain Lists"
|
||||||
msgstr "Удаленные списки доменов"
|
msgstr "Удаленные списки доменов"
|
||||||
|
|
||||||
@@ -82,17 +115,26 @@ msgstr "URL удаленных доменов"
|
|||||||
msgid "Enter full URLs starting with http:// or https://"
|
msgid "Enter full URLs starting with http:// or https://"
|
||||||
msgstr "Введите полные URL, начинающиеся с http:// или https://"
|
msgstr "Введите полные URL, начинающиеся с http:// или https://"
|
||||||
|
|
||||||
msgid "User Subnet List"
|
msgid "User Subnet List Type"
|
||||||
msgstr "Пользовательский список подсетей"
|
msgstr "Тип пользовательского списка подсетей"
|
||||||
|
|
||||||
msgid "Enable and manage your custom list of IP subnets for selective routing"
|
msgid "Select how to add your custom subnets"
|
||||||
msgstr "Включить и управлять пользовательским списком IP-подсетей для выборочной маршрутизации"
|
msgstr "Выберите способ добавления пользовательских подсетей"
|
||||||
|
|
||||||
|
msgid "Text List (comma/space/newline separated)"
|
||||||
|
msgstr "Текстовый список (разделенный запятыми/пробелами/новыми строками)"
|
||||||
|
|
||||||
msgid "User Subnets"
|
msgid "User Subnets"
|
||||||
msgstr "Пользовательские подсети"
|
msgstr "Пользовательские подсети"
|
||||||
|
|
||||||
msgid "Enter subnet in CIDR notation (example: 103.21.244.0/22)"
|
msgid "Enter subnets in CIDR notation (example: 103.21.244.0/22) or single IP addresses"
|
||||||
msgstr "Введите подсеть в нотации CIDR (пример: 103.21.244.0/22)"
|
msgstr "Введите подсети в нотации CIDR (пример: 103.21.244.0/22) или отдельные IP-адреса"
|
||||||
|
|
||||||
|
msgid "User Subnets List"
|
||||||
|
msgstr "Список пользовательских подсетей"
|
||||||
|
|
||||||
|
msgid "Enter subnets in CIDR notation or single IP addresses, separated by comma, space or newline"
|
||||||
|
msgstr "Введите подсети в нотации CIDR или отдельные IP-адреса через запятую, пробел или новую строку"
|
||||||
|
|
||||||
msgid "Remote Subnet Lists"
|
msgid "Remote Subnet Lists"
|
||||||
msgstr "Удаленные списки подсетей"
|
msgstr "Удаленные списки подсетей"
|
||||||
@@ -103,18 +145,6 @@ msgstr "Загрузка и использование списков подсе
|
|||||||
msgid "Remote Subnet URLs"
|
msgid "Remote Subnet URLs"
|
||||||
msgstr "URL удаленных подсетей"
|
msgstr "URL удаленных подсетей"
|
||||||
|
|
||||||
msgid "Domain Exclusions"
|
|
||||||
msgstr "Исключения доменов"
|
|
||||||
|
|
||||||
msgid "Exclude specific domains from routing rules"
|
|
||||||
msgstr "Исключить определенные домены из правил маршрутизации"
|
|
||||||
|
|
||||||
msgid "Excluded Domains"
|
|
||||||
msgstr "Исключенные домены"
|
|
||||||
|
|
||||||
msgid "Domains to be excluded from routing"
|
|
||||||
msgstr "Домены, которые будут исключены из маршрутизации"
|
|
||||||
|
|
||||||
msgid "IP for full redirection"
|
msgid "IP for full redirection"
|
||||||
msgstr "Принудительные прокси IP"
|
msgstr "Принудительные прокси IP"
|
||||||
|
|
||||||
@@ -133,6 +163,27 @@ msgstr "Исключения прокси IP"
|
|||||||
msgid "Specify local IP addresses that will never use the configured route"
|
msgid "Specify local IP addresses that will never use the configured route"
|
||||||
msgstr "Укажите локальные IP-адреса, которые никогда не будут использовать настроенный маршрут"
|
msgstr "Укажите локальные IP-адреса, которые никогда не будут использовать настроенный маршрут"
|
||||||
|
|
||||||
|
msgid "Mixed enable"
|
||||||
|
msgstr "Включить смешанный режим"
|
||||||
|
|
||||||
|
msgid "Browser port: 2080"
|
||||||
|
msgstr "Порт браузера: 2080"
|
||||||
|
|
||||||
|
msgid "Yacd enable"
|
||||||
|
msgstr "Включить Yacd"
|
||||||
|
|
||||||
|
msgid "Exclude NTP"
|
||||||
|
msgstr "Исключить NTP"
|
||||||
|
|
||||||
|
msgid "For issues with open connections sing-box"
|
||||||
|
msgstr "Для проблем с открытыми соединениями sing-box"
|
||||||
|
|
||||||
|
msgid "QUIC disable"
|
||||||
|
msgstr "Отключить QUIC"
|
||||||
|
|
||||||
|
msgid "For issues with the video stream"
|
||||||
|
msgstr "Для проблем с видеопотоком"
|
||||||
|
|
||||||
msgid "List Update Frequency"
|
msgid "List Update Frequency"
|
||||||
msgstr "Частота обновления списков"
|
msgstr "Частота обновления списков"
|
||||||
|
|
||||||
@@ -145,6 +196,9 @@ msgstr "Каждый час"
|
|||||||
msgid "Every 2 hours"
|
msgid "Every 2 hours"
|
||||||
msgstr "Каждые 2 часа"
|
msgstr "Каждые 2 часа"
|
||||||
|
|
||||||
|
msgid "Every 3 hours"
|
||||||
|
msgstr "Каждые 3 часа"
|
||||||
|
|
||||||
msgid "Every 4 hours"
|
msgid "Every 4 hours"
|
||||||
msgstr "Каждые 4 часа"
|
msgstr "Каждые 4 часа"
|
||||||
|
|
||||||
@@ -154,51 +208,18 @@ msgstr "Каждые 6 часов"
|
|||||||
msgid "Every 12 hours"
|
msgid "Every 12 hours"
|
||||||
msgstr "Каждые 12 часов"
|
msgstr "Каждые 12 часов"
|
||||||
|
|
||||||
|
msgid "Every day"
|
||||||
|
msgstr "Каждый день"
|
||||||
|
|
||||||
|
msgid "Every 3 days"
|
||||||
|
msgstr "Каждые 3 дня"
|
||||||
|
|
||||||
msgid "Once a day at 04:00"
|
msgid "Once a day at 04:00"
|
||||||
msgstr "Раз в день в 04:00"
|
msgstr "Раз в день в 04:00"
|
||||||
|
|
||||||
msgid "Once a week on Sunday at 04:00"
|
msgid "Once a week on Sunday at 04:00"
|
||||||
msgstr "Раз в неделю в воскресенье в 04:00"
|
msgstr "Раз в неделю в воскресенье в 04:00"
|
||||||
|
|
||||||
msgid "Yacd enable"
|
|
||||||
msgstr "Включить Yacd"
|
|
||||||
|
|
||||||
msgid "Mixed enable"
|
|
||||||
msgstr "Включить смешанный режим"
|
|
||||||
|
|
||||||
msgid "Browser port: 2080"
|
|
||||||
msgstr "Порт браузера: 2080"
|
|
||||||
|
|
||||||
msgid "Exclude NTP"
|
|
||||||
msgstr "Исключить NTP"
|
|
||||||
|
|
||||||
msgid "For issues with open connections sing-box"
|
|
||||||
msgstr "Для проблем с открытыми соединениями sing-box"
|
|
||||||
|
|
||||||
msgid "Service Domain List Enable"
|
|
||||||
msgstr "Включить список доменов сервисов"
|
|
||||||
|
|
||||||
msgid "Enable predefined service domain lists for routing"
|
|
||||||
msgstr "Включить предустановленные списки доменов для маршрутизации"
|
|
||||||
|
|
||||||
msgid "Service List"
|
|
||||||
msgstr "Список сервисов"
|
|
||||||
|
|
||||||
msgid "Select predefined services for routing"
|
|
||||||
msgstr "Выберите предустановленные сервисы для маршрутизации"
|
|
||||||
|
|
||||||
msgid "Domains"
|
|
||||||
msgstr "Домены"
|
|
||||||
|
|
||||||
msgid "Subnet List"
|
|
||||||
msgstr "Список подсетей"
|
|
||||||
|
|
||||||
msgid "Configure custom subnets for routing"
|
|
||||||
msgstr "Настройка пользовательских подсетей для маршрутизации"
|
|
||||||
|
|
||||||
msgid "Subnets"
|
|
||||||
msgstr "Подсети"
|
|
||||||
|
|
||||||
msgid "Invalid domain format. Enter domain without protocol (example: sub.example.com)"
|
msgid "Invalid domain format. Enter domain without protocol (example: sub.example.com)"
|
||||||
msgstr "Неверный формат домена. Введите домен без протокола (пример: sub.example.com)"
|
msgstr "Неверный формат домена. Введите домен без протокола (пример: sub.example.com)"
|
||||||
|
|
||||||
@@ -208,8 +229,8 @@ msgstr "URL должен использовать протокол http:// ил
|
|||||||
msgid "Invalid URL format. URL must start with http:// or https://"
|
msgid "Invalid URL format. URL must start with http:// or https://"
|
||||||
msgstr "Неверный формат URL. URL должен начинаться с http:// или https://"
|
msgstr "Неверный формат URL. URL должен начинаться с http:// или https://"
|
||||||
|
|
||||||
msgid "Invalid subnet format. Use format: X.X.X.X/Y (like 192.168.1.0/24)"
|
msgid "Invalid format. Use format: X.X.X.X or X.X.X.X/Y"
|
||||||
msgstr "Неверный формат подсети. Используйте формат: X.X.X.X/Y (например: 192.168.1.0/24)"
|
msgstr "Неверный формат. Используйте формат: X.X.X.X или X.X.X.X/Y"
|
||||||
|
|
||||||
msgid "IP address parts must be between 0 and 255"
|
msgid "IP address parts must be between 0 and 255"
|
||||||
msgstr "Части IP-адреса должны быть между 0 и 255"
|
msgstr "Части IP-адреса должны быть между 0 и 255"
|
||||||
@@ -220,71 +241,23 @@ msgstr "CIDR должен быть между 0 и 32"
|
|||||||
msgid "Invalid IP format. Use format: X.X.X.X (like 192.168.1.1)"
|
msgid "Invalid IP format. Use format: X.X.X.X (like 192.168.1.1)"
|
||||||
msgstr "Неверный формат IP. Используйте формат: X.X.X.X (например: 192.168.1.1)"
|
msgstr "Неверный формат IP. Используйте формат: X.X.X.X (например: 192.168.1.1)"
|
||||||
|
|
||||||
msgid "User Domain List Type"
|
|
||||||
msgstr "Тип пользовательского списка доменов"
|
|
||||||
|
|
||||||
msgid "Select how to add your custom domains"
|
|
||||||
msgstr "Выберите способ добавления пользовательских доменов"
|
|
||||||
|
|
||||||
msgid "Disabled"
|
|
||||||
msgstr "Отключено"
|
|
||||||
|
|
||||||
msgid "Dynamic List"
|
|
||||||
msgstr "Динамический список"
|
|
||||||
|
|
||||||
msgid "Text List"
|
|
||||||
msgstr "Текстовый список"
|
|
||||||
|
|
||||||
msgid "User Domains List"
|
|
||||||
msgstr "Список пользовательских доменов"
|
|
||||||
|
|
||||||
msgid "Enter domain names separated by comma, space or newline (example: sub.example.com, example.com or one domain per line)"
|
|
||||||
msgstr "Введите имена доменов через запятую, пробел или новую строку (пример: sub.example.com, example.com или один домен на строку)"
|
|
||||||
|
|
||||||
msgid "Invalid domain format: %s. Enter domain without protocol"
|
msgid "Invalid domain format: %s. Enter domain without protocol"
|
||||||
msgstr "Неверный формат домена: %s. Введите домен без протокола"
|
msgstr "Неверный формат домена: %s. Введите домен без протокола"
|
||||||
|
|
||||||
msgid "User Subnet List Type"
|
msgid "Invalid format: %s. Use format: X.X.X.X or X.X.X.X/Y"
|
||||||
msgstr "Тип пользовательского списка подсетей"
|
msgstr "Неверный формат: %s. Используйте формат: X.X.X.X или X.X.X.X/Y"
|
||||||
|
|
||||||
msgid "Select how to add your custom subnets"
|
|
||||||
msgstr "Выберите способ добавления пользовательских подсетей"
|
|
||||||
|
|
||||||
msgid "Text List (comma/space/newline separated)"
|
|
||||||
msgstr "Текстовый список (разделенный запятыми/пробелами/новыми строками)"
|
|
||||||
|
|
||||||
msgid "Enter subnets in CIDR notation (example: 103.21.244.0/22) or single IP addresses"
|
|
||||||
msgstr "Введите подсети в нотации CIDR (пример: 103.21.244.0/22) или отдельные IP-адреса"
|
|
||||||
|
|
||||||
msgid "User Subnets List"
|
|
||||||
msgstr "Список пользовательских подсетей"
|
|
||||||
|
|
||||||
msgid "Enter subnets in CIDR notation or single IP addresses, separated by comma, space or newline"
|
|
||||||
msgstr "Введите подсети в нотации CIDR или отдельные IP-адреса через запятую, пробел или новую строку"
|
|
||||||
|
|
||||||
msgid "Invalid format. Use format: X.X.X.X or X.X.X.X/Y"
|
|
||||||
msgstr "Неверный формат. Используйте формат: X.X.X.X или X.X.X.X/Y"
|
|
||||||
|
|
||||||
msgid "IP parts must be between 0 and 255 in: %s"
|
msgid "IP parts must be between 0 and 255 in: %s"
|
||||||
msgstr "Части IP-адреса должны быть между 0 и 255 в: %s"
|
msgstr "Части IP-адреса должны быть между 0 и 255 в: %s"
|
||||||
|
|
||||||
msgid "Configuration Type"
|
msgid "CIDR must be between 0 and 32 in: %s"
|
||||||
msgstr "Тип конфигурации"
|
msgstr "CIDR должен быть между 0 и 32 в: %s"
|
||||||
|
|
||||||
msgid "Select how to configure the proxy"
|
msgid "Invalid path format. Path must start with \"/\" and contain only valid characters (letters, numbers, \"-\", \"_\", \"/\", \".\")"
|
||||||
msgstr "Выберите способ настройки прокси"
|
msgstr "Неверный формат пути. Путь должен начинаться с \"/\" и содержать только допустимые символы (буквы, цифры, \"-\", \"_\", \"/\", \".\")"
|
||||||
|
|
||||||
msgid "Connection URL"
|
msgid "Invalid path format"
|
||||||
msgstr "URL подключения"
|
msgstr "Неверный формат пути"
|
||||||
|
|
||||||
msgid "Outbound Config"
|
|
||||||
msgstr "Конфигурация Outbound"
|
|
||||||
|
|
||||||
msgid "Outbound Configuration"
|
|
||||||
msgstr "Конфигурация исходящего соединения"
|
|
||||||
|
|
||||||
msgid "Enter complete outbound configuration in JSON format"
|
|
||||||
msgstr "Введите полную конфигурацию исходящего соединения в формате JSON"
|
|
||||||
|
|
||||||
msgid "JSON must contain at least type, server and server_port fields"
|
msgid "JSON must contain at least type, server and server_port fields"
|
||||||
msgstr "JSON должен содержать как минимум поля type, server и server_port"
|
msgstr "JSON должен содержать как минимум поля type, server и server_port"
|
||||||
@@ -292,189 +265,293 @@ msgstr "JSON должен содержать как минимум поля type
|
|||||||
msgid "Invalid JSON format"
|
msgid "Invalid JSON format"
|
||||||
msgstr "Неверный формат JSON"
|
msgstr "Неверный формат JSON"
|
||||||
|
|
||||||
msgid "Diagnostics"
|
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
|
||||||
msgstr "Диагностика"
|
msgstr "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены."
|
||||||
|
|
||||||
msgid "Main Check"
|
msgid "Regional options cannot be used together"
|
||||||
msgstr "Основная проверка"
|
msgstr "Нельзя использовать несколько региональных опций"
|
||||||
|
|
||||||
msgid "Run a comprehensive diagnostic check of all components"
|
msgid "Warning: Russia inside can only be used with Meta, Twitter, Discord, and Telegram. %s already in Russia inside and have been removed from selection."
|
||||||
msgstr "Запустить комплексную диагностическую проверку всех компонентов"
|
msgstr "Внимание: Russia inside может использоваться только с Meta, Twitter, Discord и Telegram. %s были удалены из выбора."
|
||||||
|
|
||||||
msgid "Run Check"
|
msgid "Russia inside restrictions"
|
||||||
msgstr "Запустить проверку"
|
msgstr "Ограничения Russia inside"
|
||||||
|
|
||||||
msgid "Full Diagnostic Results"
|
msgid "URL must start with vless:// or ss://"
|
||||||
msgstr "Полные результаты диагностики"
|
msgstr "URL должен начинаться с vless:// или ss://"
|
||||||
|
|
||||||
msgid "Failed to copy: "
|
msgid "Invalid Shadowsocks URL format: missing method and password separator \":\""
|
||||||
msgstr "Ошибка копирования: "
|
msgstr "Неверный формат URL Shadowsocks: отсутствует разделитель метода и пароля \":\""
|
||||||
|
|
||||||
msgid "Copy to Clipboard"
|
msgid "Invalid Shadowsocks URL format"
|
||||||
msgstr "Скопировать в буфер"
|
msgstr "Неверный формат URL Shadowsocks"
|
||||||
|
|
||||||
msgid "Close"
|
msgid "Invalid Shadowsocks URL: missing server address"
|
||||||
msgstr "Закрыть"
|
msgstr "Неверный URL Shadowsocks: отсутствует адрес сервера"
|
||||||
|
|
||||||
msgid "No output"
|
msgid "Invalid Shadowsocks URL: missing server"
|
||||||
msgstr "Нет данных"
|
msgstr "Неверный URL Shadowsocks: отсутствует сервер"
|
||||||
|
|
||||||
msgid "System Logs"
|
msgid "Invalid Shadowsocks URL: missing port"
|
||||||
msgstr "Системные логи"
|
msgstr "Неверный URL Shadowsocks: отсутствует порт"
|
||||||
|
|
||||||
msgid "View recent system logs related to Podkop"
|
msgid "Invalid port number. Must be between 1 and 65535"
|
||||||
msgstr "Просмотр недавних системных логов, связанных с Podkop"
|
msgstr "Неверный номер порта. Должен быть между 1 и 65535"
|
||||||
|
|
||||||
msgid "View Logs"
|
msgid "Invalid Shadowsocks URL: missing or invalid server/port format"
|
||||||
msgstr "Просмотр логов"
|
msgstr "Неверный URL Shadowsocks: отсутствует или неверный формат сервера/порта"
|
||||||
|
|
||||||
msgid "Failed to copy logs: "
|
msgid "Invalid VLESS URL: missing UUID"
|
||||||
msgstr "Ошибка копирования логов: "
|
msgstr "Неверный URL VLESS: отсутствует UUID"
|
||||||
|
|
||||||
msgid "Show Config"
|
msgid "Invalid VLESS URL: missing server address"
|
||||||
msgstr "Показать конфигурацию"
|
msgstr "Неверный URL VLESS: отсутствует адрес сервера"
|
||||||
|
|
||||||
msgid "Show current podkop configuration with masked sensitive data"
|
msgid "Invalid VLESS URL: missing server"
|
||||||
msgstr "Показать текущую конфигурацию podkop с маскированными конфиденциальными данными"
|
msgstr "Неверный URL VLESS: отсутствует сервер"
|
||||||
|
|
||||||
msgid "Podkop Configuration"
|
msgid "Invalid VLESS URL: missing port"
|
||||||
msgstr "Конфигурация Podkop"
|
msgstr "Неверный URL VLESS: отсутствует порт"
|
||||||
|
|
||||||
msgid "Update lists"
|
msgid "Invalid VLESS URL: missing or invalid server/port format"
|
||||||
|
msgstr "Неверный URL VLESS: отсутствует или неверный формат сервера/порта"
|
||||||
|
|
||||||
|
msgid "Invalid VLESS URL: missing query parameters"
|
||||||
|
msgstr "Неверный URL VLESS: отсутствуют параметры запроса"
|
||||||
|
|
||||||
|
msgid "Invalid VLESS URL: missing type parameter"
|
||||||
|
msgstr "Неверный URL VLESS: отсутствует параметр type"
|
||||||
|
|
||||||
|
msgid "Invalid VLESS URL: missing security parameter"
|
||||||
|
msgstr "Неверный URL VLESS: отсутствует параметр security"
|
||||||
|
|
||||||
|
msgid "Invalid VLESS URL: missing pbk parameter for reality security"
|
||||||
|
msgstr "Неверный URL VLESS: отсутствует параметр pbk для security reality"
|
||||||
|
|
||||||
|
msgid "Invalid VLESS URL: missing fp parameter for reality security"
|
||||||
|
msgstr "Неверный URL VLESS: отсутствует параметр fp для security reality"
|
||||||
|
|
||||||
|
msgid "Invalid VLESS URL: missing sni parameter for tls security"
|
||||||
|
msgstr "Неверный URL VLESS: отсутствует параметр sni для security tls"
|
||||||
|
|
||||||
|
msgid "Invalid URL format: %s"
|
||||||
|
msgstr "Неверный формат URL: %s"
|
||||||
|
|
||||||
|
msgid "Remote Domain Lists URL"
|
||||||
|
msgstr "URL удаленных списков доменов"
|
||||||
|
|
||||||
|
msgid "Enter URL to download domain list"
|
||||||
|
msgstr "Введите URL для загрузки списка доменов"
|
||||||
|
|
||||||
|
msgid "Update Interval"
|
||||||
|
msgstr "Интервал обновления"
|
||||||
|
|
||||||
|
msgid "Select how often to update the lists"
|
||||||
|
msgstr "Выберите, как часто обновлять списки"
|
||||||
|
|
||||||
|
msgid "Last Update"
|
||||||
|
msgstr "Последнее обновление"
|
||||||
|
|
||||||
|
msgid "Last update time"
|
||||||
|
msgstr "Время последнего обновления"
|
||||||
|
|
||||||
|
msgid "Next Update"
|
||||||
|
msgstr "Следующее обновление"
|
||||||
|
|
||||||
|
msgid "Next scheduled update time"
|
||||||
|
msgstr "Время следующего запланированного обновления"
|
||||||
|
|
||||||
|
msgid "Version"
|
||||||
|
msgstr "Версия"
|
||||||
|
|
||||||
|
msgid "Component version"
|
||||||
|
msgstr "Версия компонента"
|
||||||
|
|
||||||
|
msgid "Installed"
|
||||||
|
msgstr "Установлено"
|
||||||
|
|
||||||
|
msgid "Not installed"
|
||||||
|
msgstr "Не установлено"
|
||||||
|
|
||||||
|
msgid "Unknown version"
|
||||||
|
msgstr "Неизвестная версия"
|
||||||
|
|
||||||
|
msgid "Error parsing version"
|
||||||
|
msgstr "Ошибка разбора версии"
|
||||||
|
|
||||||
|
msgid "Error parsing status"
|
||||||
|
msgstr "Ошибка разбора статуса"
|
||||||
|
|
||||||
|
msgid "Service is running"
|
||||||
|
msgstr "Сервис запущен"
|
||||||
|
|
||||||
|
msgid "Service is stopped"
|
||||||
|
msgstr "Сервис остановлен"
|
||||||
|
|
||||||
|
msgid "Service is enabled"
|
||||||
|
msgstr "Сервис включен"
|
||||||
|
|
||||||
|
msgid "Service is disabled"
|
||||||
|
msgstr "Сервис отключен"
|
||||||
|
|
||||||
|
msgid "Service Status"
|
||||||
|
msgstr "Статус сервиса"
|
||||||
|
|
||||||
|
msgid "working"
|
||||||
|
msgstr "работает"
|
||||||
|
|
||||||
|
msgid "not working"
|
||||||
|
msgstr "не работает"
|
||||||
|
|
||||||
|
msgid "check error"
|
||||||
|
msgstr "ошибка проверки"
|
||||||
|
|
||||||
|
msgid "Diagnostic check in progress..."
|
||||||
|
msgstr "Выполняется диагностическая проверка..."
|
||||||
|
|
||||||
|
msgid "Diagnostic check completed"
|
||||||
|
msgstr "Диагностическая проверка завершена"
|
||||||
|
|
||||||
|
msgid "Diagnostic check failed"
|
||||||
|
msgstr "Диагностическая проверка не удалась"
|
||||||
|
|
||||||
|
msgid "Update in progress..."
|
||||||
|
msgstr "Выполняется обновление..."
|
||||||
|
|
||||||
|
msgid "Update completed"
|
||||||
|
msgstr "Обновление завершено"
|
||||||
|
|
||||||
|
msgid "Update failed"
|
||||||
|
msgstr "Обновление не удалось"
|
||||||
|
|
||||||
|
msgid "Check in progress..."
|
||||||
|
msgstr "Выполняется проверка..."
|
||||||
|
|
||||||
|
msgid "Check completed"
|
||||||
|
msgstr "Проверка завершена"
|
||||||
|
|
||||||
|
msgid "Check failed"
|
||||||
|
msgstr "Проверка не удалась"
|
||||||
|
|
||||||
|
msgid "Version Information"
|
||||||
|
msgstr "Информация о версии"
|
||||||
|
|
||||||
|
msgid "Copied!"
|
||||||
|
msgstr "Скопировано!"
|
||||||
|
|
||||||
|
msgid "Podkop Status"
|
||||||
|
msgstr "Статус Podkop"
|
||||||
|
|
||||||
|
msgid "Start Podkop"
|
||||||
|
msgstr "Запустить Podkop"
|
||||||
|
|
||||||
|
msgid "Stop Podkop"
|
||||||
|
msgstr "Остановить Podkop"
|
||||||
|
|
||||||
|
msgid "Restart Podkop"
|
||||||
|
msgstr "Перезапустить Podkop"
|
||||||
|
|
||||||
|
msgid "Enable Podkop"
|
||||||
|
msgstr "Включить Podkop"
|
||||||
|
|
||||||
|
msgid "Disable Podkop"
|
||||||
|
msgstr "Отключить Podkop"
|
||||||
|
|
||||||
|
msgid "Loading diagnostics..."
|
||||||
|
msgstr "Загрузка диагностики..."
|
||||||
|
|
||||||
|
msgid "Error loading diagnostics"
|
||||||
|
msgstr "Ошибка загрузки диагностики"
|
||||||
|
|
||||||
|
msgid "Sing-box Status"
|
||||||
|
msgstr "Статус Sing-box"
|
||||||
|
|
||||||
|
msgid "Diagnostic Tools"
|
||||||
|
msgstr "Инструменты диагностики"
|
||||||
|
|
||||||
|
msgid "Unknown"
|
||||||
|
msgstr "Неизвестно"
|
||||||
|
|
||||||
|
msgid "Device Model: "
|
||||||
|
msgstr "Модель устройства: "
|
||||||
|
|
||||||
|
msgid "OpenWrt Version: "
|
||||||
|
msgstr "Версия OpenWrt: "
|
||||||
|
|
||||||
|
msgid "Sing-box: "
|
||||||
|
msgstr "Sing-box: "
|
||||||
|
|
||||||
|
msgid "LuCI App: "
|
||||||
|
msgstr "LuCI App: "
|
||||||
|
|
||||||
|
msgid "Podkop: "
|
||||||
|
msgstr "Podkop: "
|
||||||
|
|
||||||
|
msgid "Check NFT Rules"
|
||||||
|
msgstr "Проверить правила NFT"
|
||||||
|
|
||||||
|
msgid "Update Lists"
|
||||||
msgstr "Обновить списки"
|
msgstr "Обновить списки"
|
||||||
|
|
||||||
msgid "Update all lists in config"
|
|
||||||
msgstr "Обновить все списки в конфигурации"
|
|
||||||
|
|
||||||
msgid "List Update"
|
|
||||||
msgstr "Обновление списков"
|
|
||||||
|
|
||||||
msgid "Lists will be updated in background. You can check the progress in system logs."
|
|
||||||
msgstr "Списки будут обновлены в фоновом режиме. Вы можете проверить прогресс в системных логах."
|
|
||||||
|
|
||||||
msgid "Extra configurations"
|
|
||||||
msgstr "Дополнительные конфигурации"
|
|
||||||
|
|
||||||
msgid "Extra configuration"
|
|
||||||
msgstr "Дополнительная конфигурация"
|
|
||||||
|
|
||||||
msgid "Add Section"
|
|
||||||
msgstr "Добавить раздел"
|
|
||||||
|
|
||||||
msgid "QUIC disable"
|
|
||||||
msgstr "Отключить QUIC"
|
|
||||||
|
|
||||||
msgid "For issues with the video stream"
|
|
||||||
msgstr "Для проблем с видеопотоком"
|
|
||||||
|
|
||||||
msgid "Community Lists"
|
|
||||||
msgstr "Списки сообщества"
|
|
||||||
|
|
||||||
msgid "Local Domain Lists"
|
|
||||||
msgstr "Локальные списки доменов"
|
|
||||||
|
|
||||||
msgid "Use the list from the router filesystem"
|
|
||||||
msgstr "Использовать список из файловой системы роутера"
|
|
||||||
|
|
||||||
msgid "Local Domain Lists Path"
|
|
||||||
msgstr "Путь к локальным спискам доменов"
|
|
||||||
|
|
||||||
msgid "Enter to the list file path"
|
|
||||||
msgstr "Введите путь к файлу списка"
|
|
||||||
|
|
||||||
msgid "Proxy Check"
|
|
||||||
msgstr "Проверка прокси"
|
|
||||||
|
|
||||||
msgid "Check if sing-box proxy works correctly"
|
|
||||||
msgstr "Проверить корректность работы прокси sing-box"
|
|
||||||
|
|
||||||
msgid "Check Proxy"
|
|
||||||
msgstr "Проверить прокси"
|
|
||||||
|
|
||||||
msgid "Proxy Check Results"
|
|
||||||
msgstr "Результаты проверки прокси"
|
|
||||||
|
|
||||||
msgid "NFT Rules"
|
|
||||||
msgstr "Правила NFT"
|
|
||||||
|
|
||||||
msgid "Show current nftables rules and statistics"
|
|
||||||
msgstr "Показать текущие правила и статистику nftables"
|
|
||||||
|
|
||||||
msgid "Check Rules"
|
|
||||||
msgstr "Проверить правила"
|
|
||||||
|
|
||||||
msgid "GitHub Connectivity"
|
|
||||||
msgstr "Подключение к GitHub"
|
|
||||||
|
|
||||||
msgid "Check GitHub connectivity and lists availability"
|
|
||||||
msgstr "Проверить подключение к GitHub и доступность списков"
|
|
||||||
|
|
||||||
msgid "Check GitHub"
|
|
||||||
msgstr "Проверить GitHub"
|
|
||||||
|
|
||||||
msgid "GitHub Connectivity Results"
|
|
||||||
msgstr "Результаты проверки подключения к GitHub"
|
|
||||||
|
|
||||||
msgid "Sing-Box Logs"
|
|
||||||
msgstr "Логи Sing-Box"
|
|
||||||
|
|
||||||
msgid "View recent sing-box logs from system journal"
|
|
||||||
msgstr "Просмотр последних логов sing-box из системного журнала"
|
|
||||||
|
|
||||||
msgid "View Sing-Box Logs"
|
|
||||||
msgstr "Просмотр логов Sing-Box"
|
|
||||||
|
|
||||||
msgid "Podkop Logs"
|
|
||||||
msgstr "Логи Podkop"
|
|
||||||
|
|
||||||
msgid "View recent podkop logs from system journal"
|
|
||||||
msgstr "Просмотр последних логов podkop из системного журнала"
|
|
||||||
|
|
||||||
msgid "View Podkop Logs"
|
|
||||||
msgstr "Просмотр логов Podkop"
|
|
||||||
|
|
||||||
msgid "Active Connections"
|
|
||||||
msgstr "Активные соединения"
|
|
||||||
|
|
||||||
msgid "View active sing-box network connections"
|
|
||||||
msgstr "Просмотр активных сетевых соединений sing-box"
|
|
||||||
|
|
||||||
msgid "Check Connections"
|
|
||||||
msgstr "Проверить соединения"
|
|
||||||
|
|
||||||
msgid "DNSMasq Configuration"
|
|
||||||
msgstr "Конфигурация DNSMasq"
|
|
||||||
|
|
||||||
msgid "View current DNSMasq configuration settings"
|
|
||||||
msgstr "Просмотр текущих настроек конфигурации DNSMasq"
|
|
||||||
|
|
||||||
msgid "Check DNSMasq"
|
|
||||||
msgstr "Проверить DNSMasq"
|
|
||||||
|
|
||||||
msgid "Sing-Box Configuration"
|
|
||||||
msgstr "Конфигурация Sing-Box"
|
|
||||||
|
|
||||||
msgid "Show current sing-box configuration"
|
|
||||||
msgstr "Показать текущую конфигурацию sing-box"
|
|
||||||
|
|
||||||
msgid "Show Sing-Box Config"
|
|
||||||
msgstr "Показать конфигурацию Sing-Box"
|
|
||||||
|
|
||||||
msgid "Lists Update Results"
|
msgid "Lists Update Results"
|
||||||
msgstr "Результаты обновления списков"
|
msgstr "Результаты обновления списков"
|
||||||
|
|
||||||
#: applications/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js:XXX
|
msgid "DNS Protocol Type"
|
||||||
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
|
msgstr "Тип DNS протокола"
|
||||||
msgstr "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены."
|
|
||||||
|
|
||||||
#: applications/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js:XXX
|
msgid "Select DNS protocol to use"
|
||||||
msgid "Warning: Russia inside can only be used with Meta, Twitter, Discord, and Telegram. %s have been removed from selection."
|
msgstr "Выберите протокол DNS"
|
||||||
msgstr "Внимание: Russia inside может использоваться только с Meta, Twitter, Discord и Telegram. %s были удалены из выбора."
|
|
||||||
|
|
||||||
#: applications/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js:XXX
|
msgid "DNS over HTTPS (DoH)"
|
||||||
msgid "Regional options cannot be used together"
|
msgstr "DNS через HTTPS (DoH)"
|
||||||
msgstr "Нельзя использовать несколько региональных опций"
|
|
||||||
|
|
||||||
#: applications/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js:XXX
|
msgid "DNS over TLS (DoT)"
|
||||||
msgid "Russia inside restrictions"
|
msgstr "DNS через TLS (DoT)"
|
||||||
msgstr "Ограничения Russia inside"
|
|
||||||
|
msgid "UDP (Unprotected DNS)"
|
||||||
|
msgstr "UDP (Незащищённый DNS)"
|
||||||
|
|
||||||
|
msgid "DNS Server"
|
||||||
|
msgstr "DNS сервер"
|
||||||
|
|
||||||
|
msgid "Select or enter DNS server address"
|
||||||
|
msgstr "Выберите или введите адрес DNS сервера"
|
||||||
|
|
||||||
|
msgid "DNS server address cannot be empty"
|
||||||
|
msgstr "Адрес DNS сервера не может быть пустым"
|
||||||
|
|
||||||
|
msgid "Invalid DNS server format. Examples: 8.8.8.8 or dns.example.com"
|
||||||
|
msgstr "Неверный формат DNS сервера. Примеры: 8.8.8.8 или dns.example.com"
|
||||||
|
|
||||||
|
msgid "DNS Rewrite TTL"
|
||||||
|
msgstr "Перезапись TTL для DNS"
|
||||||
|
|
||||||
|
msgid "Time in seconds for DNS record caching (default: 600)"
|
||||||
|
msgstr "Время в секундах для кэширования DNS записей (по умолчанию: 600)"
|
||||||
|
|
||||||
|
msgid "TTL value cannot be empty"
|
||||||
|
msgstr "Значение TTL не может быть пустым"
|
||||||
|
|
||||||
|
msgid "TTL must be a positive number"
|
||||||
|
msgstr "TTL должно быть положительным числом"
|
||||||
|
|
||||||
|
msgid "Cache File Path"
|
||||||
|
msgstr "Путь к файлу кэша"
|
||||||
|
|
||||||
|
msgid "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing"
|
||||||
|
msgstr "Выберите или введите путь к файлу кэша sing-box. Меняйте ТОЛЬКО если знаете, что делаете"
|
||||||
|
|
||||||
|
msgid "Cache file path cannot be empty"
|
||||||
|
msgstr "Путь к файлу кэша не может быть пустым"
|
||||||
|
|
||||||
|
msgid "Path must be absolute (start with /)"
|
||||||
|
msgstr "Путь должен быть абсолютным (начинаться с /)"
|
||||||
|
|
||||||
|
msgid "Path must end with cache.db"
|
||||||
|
msgstr "Путь должен заканчиваться на cache.db"
|
||||||
|
|
||||||
|
msgid "Path must contain at least one directory (like /tmp/cache.db)"
|
||||||
|
msgstr "Путь должен содержать хотя бы одну директорию (например /tmp/cache.db)"
|
||||||
|
|
||||||
|
msgid "Invalid path format. Must be like /tmp/cache.db"
|
||||||
|
msgstr "Неверный формат пути. Пример: /tmp/cache.db"
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=podkop
|
PKG_NAME:=podkop
|
||||||
PKG_VERSION:=0.3.10
|
PKG_VERSION:=0.3.15
|
||||||
PKG_RELEASE:=1
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
PKG_MAINTAINER:=ITDog <podkop@itdog.info>
|
PKG_MAINTAINER:=ITDog <podkop@itdog.info>
|
||||||
|
|||||||
@@ -29,5 +29,6 @@ config main 'main'
|
|||||||
option socks5 '0'
|
option socks5 '0'
|
||||||
option exclude_ntp '0'
|
option exclude_ntp '0'
|
||||||
option quic_disable '0'
|
option quic_disable '0'
|
||||||
|
option dont_touch_dhcp '0'
|
||||||
option update_interval '1d'
|
option update_interval '1d'
|
||||||
option custom_domains_text
|
option custom_domains_text
|
||||||
@@ -7,7 +7,7 @@ script=$(readlink "$initscript")
|
|||||||
NAME="$(basename ${script:-$initscript})"
|
NAME="$(basename ${script:-$initscript})"
|
||||||
config_load "$NAME"
|
config_load "$NAME"
|
||||||
|
|
||||||
EXTRA_COMMANDS="main list_update check_proxy check_nft check_github check_logs check_sing_box_connections check_sing_box_logs check_dnsmasq show_config show_version show_sing_box_config"
|
EXTRA_COMMANDS="main list_update check_proxy check_nft check_github check_logs check_sing_box_connections check_sing_box_logs check_dnsmasq show_config show_version show_sing_box_config show_luci_version show_sing_box_version show_system_info get_status get_sing_box_status get_proxy_label"
|
||||||
EXTRA_HELP=" list_update Updating domain and subnet lists
|
EXTRA_HELP=" list_update Updating domain and subnet lists
|
||||||
check_proxy Check if sing-box proxy works correctly
|
check_proxy Check if sing-box proxy works correctly
|
||||||
check_nft Show PodkopTable nftables rules
|
check_nft Show PodkopTable nftables rules
|
||||||
@@ -18,7 +18,11 @@ EXTRA_HELP=" list_update Updating domain and subnet lists
|
|||||||
check_dnsmasq Show current DNSMasq configuration
|
check_dnsmasq Show current DNSMasq configuration
|
||||||
show_config Show current configuration with masked sensitive data
|
show_config Show current configuration with masked sensitive data
|
||||||
show_version Show current version
|
show_version Show current version
|
||||||
show_sing_box_config Show current sing-box configuration"
|
show_sing_box_config Show current sing-box configuration
|
||||||
|
show_luci_version Show LuCI app version
|
||||||
|
show_sing_box_version Show sing-box version
|
||||||
|
show_system_info Show OpenWrt version and device model
|
||||||
|
get_sing_box_status Get sing-box status"
|
||||||
|
|
||||||
[ ! -L /usr/sbin/podkop ] && ln -s /etc/init.d/podkop /usr/sbin/podkop
|
[ ! -L /usr/sbin/podkop ] && ln -s /etc/init.d/podkop /usr/sbin/podkop
|
||||||
|
|
||||||
@@ -33,9 +37,10 @@ SUBNETS_META="${GITHUB_RAW_URL}/Subnets/IPv4/meta.lst"
|
|||||||
SUBNETS_DISCORD="${GITHUB_RAW_URL}/Subnets/IPv4/discord.lst"
|
SUBNETS_DISCORD="${GITHUB_RAW_URL}/Subnets/IPv4/discord.lst"
|
||||||
SUBNETS_TELERAM="${GITHUB_RAW_URL}/Subnets/IPv4/telegram.lst"
|
SUBNETS_TELERAM="${GITHUB_RAW_URL}/Subnets/IPv4/telegram.lst"
|
||||||
SING_BOX_CONFIG="/etc/sing-box/config.json"
|
SING_BOX_CONFIG="/etc/sing-box/config.json"
|
||||||
CACHE_FILE_PATH="/tmp/cache.db"
|
|
||||||
FAKEIP="198.18.0.0/15"
|
FAKEIP="198.18.0.0/15"
|
||||||
VALID_SERVICES="russia_inside russia_outside ukraine_inside geoblock block porn news anime youtube discord meta twitter hdrezka tiktok telegram"
|
VALID_SERVICES="russia_inside russia_outside ukraine_inside geoblock block porn news anime youtube discord meta twitter hdrezka tiktok telegram"
|
||||||
|
DNS_RESOLVERS="1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 9.9.9.9 9.9.9.11 94.140.14.14 94.140.15.15 208.67.220.220 208.67.222.222 77.88.8.1 77.88.8.8"
|
||||||
|
TEST_DOMAIN="google.com"
|
||||||
|
|
||||||
start_service() {
|
start_service() {
|
||||||
log "Start podkop"
|
log "Start podkop"
|
||||||
@@ -71,7 +76,11 @@ start_service() {
|
|||||||
stop_service() {
|
stop_service() {
|
||||||
log "Stopping the podkop"
|
log "Stopping the podkop"
|
||||||
remove_cron_job
|
remove_cron_job
|
||||||
dnsmasq_rm
|
|
||||||
|
config_get_bool dont_touch_dhcp "main" "dont_touch_dhcp" "0"
|
||||||
|
if [ "$dont_touch_dhcp" -eq 0 ]; then
|
||||||
|
dnsmasq_restore
|
||||||
|
fi
|
||||||
|
|
||||||
rm -rf /tmp/podkop/*.lst
|
rm -rf /tmp/podkop/*.lst
|
||||||
|
|
||||||
@@ -149,6 +158,7 @@ main() {
|
|||||||
sing_box_dns
|
sing_box_dns
|
||||||
sing_box_dns_rule_fakeip
|
sing_box_dns_rule_fakeip
|
||||||
sing_box_rule_dns
|
sing_box_rule_dns
|
||||||
|
sing_box_add_secure_dns_probe_domain
|
||||||
sing_box_cache_file
|
sing_box_cache_file
|
||||||
process_socks5
|
process_socks5
|
||||||
|
|
||||||
@@ -200,7 +210,10 @@ main() {
|
|||||||
config_get interface "main" "interface"
|
config_get interface "main" "interface"
|
||||||
|
|
||||||
if [ -n "$proxy_string" ] || [ -n "$interface" ]; then
|
if [ -n "$proxy_string" ] || [ -n "$interface" ]; then
|
||||||
dnsmasq_add
|
config_get_bool dont_touch_dhcp "main" "dont_touch_dhcp" "0"
|
||||||
|
if [ "$dont_touch_dhcp" -eq 0 ]; then
|
||||||
|
dnsmasq_add_resolver
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,6 +260,12 @@ migration() {
|
|||||||
log "Found and removed filter-rr=HTTPS in dnsmasq config"
|
log "Found and removed filter-rr=HTTPS in dnsmasq config"
|
||||||
sed -i '/^filter-rr=HTTPS/d' "/etc/dnsmasq.conf"
|
sed -i '/^filter-rr=HTTPS/d' "/etc/dnsmasq.conf"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# dhcp use-application-dns.net
|
||||||
|
if grep -q "use-application-dns.net" "/etc/config/dhcp"; then
|
||||||
|
log "Found and removed use-application-dns.net in dhcp config"
|
||||||
|
sed -i '/use-application-dns/d' "/etc/config/dhcp"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
validate_service() {
|
validate_service() {
|
||||||
@@ -310,27 +329,72 @@ create_nft_table() {
|
|||||||
nft add rule inet $table proxy meta mark 0x105 meta l4proto udp tproxy ip to :1602 counter
|
nft add rule inet $table proxy meta mark 0x105 meta l4proto udp tproxy ip to :1602 counter
|
||||||
}
|
}
|
||||||
|
|
||||||
dnsmasq_add() {
|
save_dnsmasq_config() {
|
||||||
## Future: Check config and skip restart
|
local key="$1"
|
||||||
|
local backup_key="$2"
|
||||||
|
value=$(uci get "$key" 2>/dev/null)
|
||||||
|
|
||||||
|
if [ -z "$value" ]; then
|
||||||
|
uci set "$backup_key"="unset"
|
||||||
|
else
|
||||||
|
uci set "$backup_key"="$value"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
dnsmasq_add_resolver() {
|
||||||
|
log "Save dnsmasq config"
|
||||||
|
save_dnsmasq_config "dhcp.@dnsmasq[0].noresolv" "dhcp.@dnsmasq[0].podkop_noresolv"
|
||||||
|
save_dnsmasq_config "dhcp.@dnsmasq[0].cachesize" "dhcp.@dnsmasq[0].podkop_cachesize"
|
||||||
|
|
||||||
|
uci -q delete dhcp.@dnsmasq[0].podkop_server
|
||||||
|
for server in $(uci get dhcp.@dnsmasq[0].server 2>/dev/null); do
|
||||||
|
if [[ "$server" == "127.0.0.42" ]]; then
|
||||||
|
log "Dnsmasq save config error: server=127.0.0.42"
|
||||||
|
else
|
||||||
|
uci add_list dhcp.@dnsmasq[0].podkop_server="$server"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
log "Configure dnsmasq for sing-box"
|
log "Configure dnsmasq for sing-box"
|
||||||
uci set dhcp.@dnsmasq[0].noresolv="1"
|
uci set dhcp.@dnsmasq[0].noresolv="1"
|
||||||
uci set dhcp.@dnsmasq[0].filter_aaaa="1"
|
|
||||||
uci set dhcp.@dnsmasq[0].cachesize="0"
|
uci set dhcp.@dnsmasq[0].cachesize="0"
|
||||||
uci -q delete dhcp.@dnsmasq[0].server
|
uci -q delete dhcp.@dnsmasq[0].server
|
||||||
uci add_list dhcp.@dnsmasq[0].server="127.0.0.42"
|
uci add_list dhcp.@dnsmasq[0].server="127.0.0.42"
|
||||||
uci add_list dhcp.@dnsmasq[0].server='/use-application-dns.net/'
|
|
||||||
uci commit dhcp
|
uci commit dhcp
|
||||||
|
|
||||||
/etc/init.d/dnsmasq restart
|
/etc/init.d/dnsmasq restart
|
||||||
}
|
}
|
||||||
|
|
||||||
dnsmasq_rm() {
|
dnsmasq_restore() {
|
||||||
log "Removing configuration for dnsmasq"
|
log "Removing configuration for dnsmasq"
|
||||||
uci set dhcp.@dnsmasq[0].noresolv="0"
|
|
||||||
uci set dhcp.@dnsmasq[0].filter_aaaa="0"
|
local cachesize=$(uci get dhcp.@dnsmasq[0].podkop_cachesize 2>/dev/null)
|
||||||
uci set dhcp.@dnsmasq[0].cachesize="1000"
|
if [ -z "$cachesize" ]; then
|
||||||
uci -q delete dhcp.@dnsmasq[0].server
|
log "dnsmasq revert: cachesize is unset"
|
||||||
uci add_list dhcp.@dnsmasq[0].server="8.8.8.8"
|
else
|
||||||
|
uci set dhcp.@dnsmasq[0].cachesize="$cachesize"
|
||||||
|
fi
|
||||||
|
|
||||||
|
local noresolv=$(uci get dhcp.@dnsmasq[0].podkop_noresolv 2>/dev/null)
|
||||||
|
if [[ "$noresolv" == "unset" ]]; then
|
||||||
|
log "dnsmasq revert: noresolv is unset"
|
||||||
|
uci -q delete dhcp.@dnsmasq[0].noresolv
|
||||||
|
else
|
||||||
|
uci set dhcp.@dnsmasq[0].noresolv="$noresolv"
|
||||||
|
fi
|
||||||
|
|
||||||
|
local server=$(uci get dhcp.@dnsmasq[0].server 2>/dev/null)
|
||||||
|
if [[ "$server" == "127.0.0.42" ]]; then
|
||||||
|
uci -q delete dhcp.@dnsmasq[0].server
|
||||||
|
for server in $(uci get dhcp.@dnsmasq[0].podkop_server 2>/dev/null); do
|
||||||
|
uci add_list dhcp.@dnsmasq[0].server="$server"
|
||||||
|
done
|
||||||
|
uci delete dhcp.@dnsmasq[0].podkop_server
|
||||||
|
fi
|
||||||
|
|
||||||
|
uci delete dhcp.@dnsmasq[0].podkop_cachesize
|
||||||
|
uci delete dhcp.@dnsmasq[0].podkop_noresolv
|
||||||
|
|
||||||
uci commit dhcp
|
uci commit dhcp
|
||||||
|
|
||||||
/etc/init.d/dnsmasq restart
|
/etc/init.d/dnsmasq restart
|
||||||
@@ -483,6 +547,17 @@ list_update() {
|
|||||||
config_foreach process_subnet_for_section_remote
|
config_foreach process_subnet_for_section_remote
|
||||||
}
|
}
|
||||||
|
|
||||||
|
find_working_resolver() {
|
||||||
|
local resolver_found=""
|
||||||
|
for resolver in $DNS_RESOLVERS; do
|
||||||
|
if nslookup $TEST_DOMAIN $resolver >/dev/null 2>&1; then
|
||||||
|
echo "$resolver"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "8.8.8.8"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
# sing-box funcs
|
# sing-box funcs
|
||||||
|
|
||||||
@@ -560,32 +635,86 @@ sing_box_inbound_proxy() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sing_box_dns() {
|
sing_box_dns() {
|
||||||
|
local dns_type
|
||||||
|
local dns_server
|
||||||
|
local resolver_tag="resolver"
|
||||||
|
|
||||||
|
config_get dns_type "main" "dns_type" "doh"
|
||||||
|
config_get dns_server "main" "dns_server" "1.1.1.1"
|
||||||
|
|
||||||
|
local server_json
|
||||||
|
local is_ip=$(echo "$dns_server" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' && echo "1" || echo "0")
|
||||||
|
|
||||||
|
if [ "$is_ip" = "0" ]; then
|
||||||
|
log "Finding working DNS resolver"
|
||||||
|
local dns_resolver=$(find_working_resolver)
|
||||||
|
log "Found working resolver: $dns_resolver"
|
||||||
|
fi
|
||||||
|
|
||||||
log "Configure DNS in sing-box"
|
log "Configure DNS in sing-box"
|
||||||
|
|
||||||
|
server_json=$(jq -n \
|
||||||
|
--arg type "$dns_type" \
|
||||||
|
--arg server "$dns_server" \
|
||||||
|
--arg resolver "$resolver_tag" \
|
||||||
|
--arg is_ip "$is_ip" \
|
||||||
|
'{
|
||||||
|
"servers": [
|
||||||
|
{
|
||||||
|
"tag": "dns-server",
|
||||||
|
"address": (
|
||||||
|
if $type == "doh" then
|
||||||
|
"https://" + $server + "/dns-query"
|
||||||
|
elif $type == "dot" then
|
||||||
|
"tls://" + $server
|
||||||
|
else
|
||||||
|
$server
|
||||||
|
end
|
||||||
|
),
|
||||||
|
"detour": "direct-out"
|
||||||
|
} + (
|
||||||
|
if $is_ip == "0" then
|
||||||
|
{"address_resolver": $resolver}
|
||||||
|
else
|
||||||
|
{}
|
||||||
|
end
|
||||||
|
)
|
||||||
|
]
|
||||||
|
}')
|
||||||
|
|
||||||
|
if [ "$is_ip" = "0" ]; then
|
||||||
|
server_json=$(echo "$server_json" | jq \
|
||||||
|
--arg resolver "$resolver_tag" \
|
||||||
|
--arg address "$dns_resolver" \
|
||||||
|
'.servers += [{
|
||||||
|
"tag": $resolver,
|
||||||
|
"address": $address
|
||||||
|
}]')
|
||||||
|
fi
|
||||||
|
|
||||||
|
server_json=$(echo "$server_json" | jq '.servers += [{"tag": "fakeip-server", "address": "fakeip"}]')
|
||||||
|
|
||||||
jq \
|
jq \
|
||||||
--arg FAKEIP "$FAKEIP" \
|
--argjson dns_config "$server_json" \
|
||||||
'.dns = {
|
--arg fakeip "$FAKEIP" \
|
||||||
"strategy": "ipv4_only",
|
'.dns = {
|
||||||
"fakeip": {
|
"strategy": "ipv4_only",
|
||||||
"enabled": true,
|
"fakeip": {
|
||||||
"inet4_range": $FAKEIP
|
"enabled": true,
|
||||||
},
|
"inet4_range": $fakeip
|
||||||
"servers": [
|
|
||||||
{
|
|
||||||
"tag": "cloudflare-doh-server",
|
|
||||||
"address": "https://1.1.1.1/dns-query",
|
|
||||||
"detour": "direct-out"
|
|
||||||
},
|
},
|
||||||
{
|
"servers": $dns_config.servers
|
||||||
"tag": "fakeip-server",
|
}' $SING_BOX_CONFIG > /tmp/sing-box-config-tmp.json && mv /tmp/sing-box-config-tmp.json $SING_BOX_CONFIG
|
||||||
"address": "fakeip"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}' $SING_BOX_CONFIG >/tmp/sing-box-config-tmp.json && mv /tmp/sing-box-config-tmp.json $SING_BOX_CONFIG
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sing_box_dns_rule_fakeip() {
|
sing_box_dns_rule_fakeip() {
|
||||||
log "Configure fakeip route in sing-box"
|
local rewrite_ttl
|
||||||
|
config_get rewrite_ttl "main" "dns_rewrite_ttl" "600"
|
||||||
|
|
||||||
|
log "Configure fakeip route in sing-box and set TTL to $rewrite_ttl seconds"
|
||||||
|
|
||||||
jq \
|
jq \
|
||||||
|
--arg ttl "$rewrite_ttl" \
|
||||||
'.dns += {
|
'.dns += {
|
||||||
"rules": [
|
"rules": [
|
||||||
{
|
{
|
||||||
@@ -595,7 +724,15 @@ sing_box_dns_rule_fakeip() {
|
|||||||
"action": "reject"
|
"action": "reject"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"domain_suffix": [
|
||||||
|
"use-application-dns.net"
|
||||||
|
],
|
||||||
|
"action": "reject"
|
||||||
|
},
|
||||||
|
{
|
||||||
"server": "fakeip-server",
|
"server": "fakeip-server",
|
||||||
|
"domain": "",
|
||||||
|
"rewrite_ttl": ($ttl | tonumber),
|
||||||
"rule_set": []
|
"rule_set": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -623,14 +760,17 @@ sing_box_dns_rule_fakeip_section() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sing_box_cache_file() {
|
sing_box_cache_file() {
|
||||||
log "Configure cache.db in sing-box"
|
config_get cache_file "main" "cache_file" "/tmp/cache.db"
|
||||||
|
|
||||||
|
log "Configure sing-box cache.db path"
|
||||||
|
|
||||||
jq \
|
jq \
|
||||||
--arg CACHE_FILE_PATH "$CACHE_FILE_PATH" \
|
--arg cache_file "$cache_file" \
|
||||||
'.experimental = {
|
'.experimental = {
|
||||||
"cache_file": {
|
"cache_file": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"store_fakeip": true,
|
"store_fakeip": true,
|
||||||
"path": $CACHE_FILE_PATH
|
"path": $cache_file
|
||||||
}
|
}
|
||||||
}' $SING_BOX_CONFIG >/tmp/sing-box-config-tmp.json && mv /tmp/sing-box-config-tmp.json $SING_BOX_CONFIG
|
}' $SING_BOX_CONFIG >/tmp/sing-box-config-tmp.json && mv /tmp/sing-box-config-tmp.json $SING_BOX_CONFIG
|
||||||
}
|
}
|
||||||
@@ -1609,3 +1749,135 @@ show_version() {
|
|||||||
local version=$(opkg info podkop | grep -m 1 "Version:" | cut -d' ' -f2)
|
local version=$(opkg info podkop | grep -m 1 "Version:" | cut -d' ' -f2)
|
||||||
echo "$version"
|
echo "$version"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
show_luci_version() {
|
||||||
|
local version=$(opkg info luci-app-podkop | grep -m 1 "Version:" | cut -d' ' -f2)
|
||||||
|
echo "$version"
|
||||||
|
}
|
||||||
|
|
||||||
|
show_sing_box_version() {
|
||||||
|
local version=$(opkg info sing-box | grep -m 1 "Version:" | cut -d' ' -f2)
|
||||||
|
echo "$version"
|
||||||
|
}
|
||||||
|
|
||||||
|
show_system_info() {
|
||||||
|
echo "=== OpenWrt Version ==="
|
||||||
|
grep OPENWRT_RELEASE /etc/os-release | cut -d'"' -f2
|
||||||
|
echo
|
||||||
|
echo "=== Device Model ==="
|
||||||
|
cat /tmp/sysinfo/model
|
||||||
|
}
|
||||||
|
|
||||||
|
get_sing_box_status() {
|
||||||
|
local running=0
|
||||||
|
local enabled=0
|
||||||
|
local status=""
|
||||||
|
local version=""
|
||||||
|
|
||||||
|
# Check if service is enabled
|
||||||
|
if [ -x /etc/rc.d/S99sing-box ]; then
|
||||||
|
enabled=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if service is running
|
||||||
|
if pgrep -f "sing-box" >/dev/null; then
|
||||||
|
running=1
|
||||||
|
version=$(sing-box version | head -n 1 | awk '{print $3}')
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Format status message
|
||||||
|
if [ $running -eq 1 ]; then
|
||||||
|
if [ $enabled -eq 1 ]; then
|
||||||
|
status="running & enabled"
|
||||||
|
else
|
||||||
|
status="running but disabled"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [ $enabled -eq 1 ]; then
|
||||||
|
status="stopped but enabled"
|
||||||
|
else
|
||||||
|
status="stopped & disabled"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "{\"running\":$running,\"enabled\":$enabled,\"status\":\"$status\"}"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_status() {
|
||||||
|
local running=0
|
||||||
|
local enabled=0
|
||||||
|
local status=""
|
||||||
|
|
||||||
|
# Check if service is enabled
|
||||||
|
if [ -x /etc/rc.d/S99podkop ]; then
|
||||||
|
enabled=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if service is running
|
||||||
|
if pgrep -f "sing-box" >/dev/null; then
|
||||||
|
running=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Format status message
|
||||||
|
if [ $running -eq 1 ]; then
|
||||||
|
if [ $enabled -eq 1 ]; then
|
||||||
|
status="running & enabled"
|
||||||
|
else
|
||||||
|
status="running but disabled"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [ $enabled -eq 1 ]; then
|
||||||
|
status="stopped but enabled"
|
||||||
|
else
|
||||||
|
status="stopped & disabled"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "{\"running\":$running,\"enabled\":$enabled,\"status\":\"$status\"}"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_proxy_label() {
|
||||||
|
local section="$1"
|
||||||
|
local proxy_string
|
||||||
|
local label=""
|
||||||
|
|
||||||
|
config_get proxy_string "$section" "proxy_string"
|
||||||
|
if [ -n "$proxy_string" ]; then
|
||||||
|
label=$(echo "$proxy_string" | sed -n 's/.*#\(.*\)$/\1/p')
|
||||||
|
echo "$label"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
sing_box_add_secure_dns_probe_domain() {
|
||||||
|
local domain="httpbin.org"
|
||||||
|
local override_address="numbersapi.com"
|
||||||
|
|
||||||
|
if [ -z "$override_address" ]; then
|
||||||
|
log "Error: Could not get br-lan IP address"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Adding DNS probe domain ${domain} to fakeip-server configuration"
|
||||||
|
|
||||||
|
jq \
|
||||||
|
--arg domain "$domain" \
|
||||||
|
--arg override "$override_address" \
|
||||||
|
'.dns.rules |= map(
|
||||||
|
if .server == "fakeip-server" then
|
||||||
|
. + {
|
||||||
|
"domain": $domain
|
||||||
|
}
|
||||||
|
else
|
||||||
|
.
|
||||||
|
end
|
||||||
|
) |
|
||||||
|
.route.rules |= . + [
|
||||||
|
{
|
||||||
|
"domain": $domain,
|
||||||
|
"action": "route-options",
|
||||||
|
"override_address": $override
|
||||||
|
}
|
||||||
|
]' "$SING_BOX_CONFIG" >/tmp/sing-box-config-tmp.json && mv /tmp/sing-box-config-tmp.json "$SING_BOX_CONFIG"
|
||||||
|
|
||||||
|
log "DNS probe domain ${domain} configured with override to ${override_address}"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user