mirror of
https://github.com/itdoginfo/podkop.git
synced 2025-12-12 22:46:58 +03:00
Merge remote-tracking branch 'origin/main' into fix/many-sni-support
This commit is contained in:
33
README.md
33
README.md
@@ -88,9 +88,8 @@ Luci: Services/podkop
|
|||||||
- [x] awg работает не стабильно
|
- [x] awg работает не стабильно
|
||||||
- [x] Сеть рестартится при любом раскладе
|
- [x] Сеть рестартится при любом раскладе
|
||||||
- [x] Выкл-вкл wg через luci не отрабатывает поднятие маршрута
|
- [x] Выкл-вкл wg через luci не отрабатывает поднятие маршрута
|
||||||
- [ ] Если eof после последней строки в rt_tables, то скрипт не добавляет перенос строки
|
- [x] В каких-то случаях плохо отрабатывает localfile
|
||||||
- [ ] В каких-то случаях плохо отрабатывает localfile
|
- [x] warnging если в конфиге присуствует. Значит в системе есть https-dns-proxy, который тоже может перетирать конфигурацию dhcp. Рекомендовать его выключить и сделать disable. Возможно в будущем добавить несовместимость на уровне Makefile
|
||||||
- [ ] 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 ''
|
||||||
@@ -100,34 +99,11 @@ Luci: Services/podkop
|
|||||||
```
|
```
|
||||||
- [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
|
- [ ] Не отрабатывает service podkop stop, если podkop запущен и не может, к пример, зарезолвить домен с сломанным DNS
|
||||||
|
- [ ] Длинный label ломает sing-box
|
||||||
|
|
||||||
# ToDo
|
# ToDo
|
||||||
Этот раздел не означает задачи, которые нужно брать и делать. Это общий список хотелок. Если вы хотите помочь, пожалуйста, спросите сначала в телеграмме.
|
Этот раздел не означает задачи, которые нужно брать и делать. Это общий список хотелок. Если вы хотите помочь, пожалуйста, спросите сначала в телеграмме.
|
||||||
|
|
||||||
Сделано
|
|
||||||
- [x] Скрипт для автоматической установки.
|
|
||||||
- [x] Подсети дискорда.
|
|
||||||
- [x] Удаление getdomains через скрипт. Кроме туннеля и sing-box.
|
|
||||||
- [x] Дополнительная вкладка для ещё одного туннеля. Домены, подсети.
|
|
||||||
- [x] Улучшение скрипта автоматической установки. Спрашивать про туннели.
|
|
||||||
- [x] Зависимость от dnsmasq-full
|
|
||||||
- [x] Весь трафик для устойства пускать в туннель\прокси
|
|
||||||
- [x] Исключение для IP, не ходить в туннель\прокси совсем 0x0
|
|
||||||
- [x] Врубать галочкой yacd в sing-box
|
|
||||||
- [x] Свои списки. Просто список доменов с переносом строки
|
|
||||||
- [x] Свои списки ipv4
|
|
||||||
- [x] В nft разделить правило tproxy на маркировку и tproxy
|
|
||||||
- [x] Вернуть две цепочки nft
|
|
||||||
- [x] Ntp (порт 123) делать маркировку 0x0. По галке
|
|
||||||
- [x] Открытый прокси порт на роутере для браузеров
|
|
||||||
- [x] Автонастройка wireguard по примеру getdomains
|
|
||||||
- [x] Автонастройка awg по примеру getdomains
|
|
||||||
- [x] RU перевод
|
|
||||||
- [x] Переделать на PROCD и выкинуть ucitrack.
|
|
||||||
- [x] Нужен дебаг. Restart ucitrack в отдельный скрипт postinst, не отрабатывает.
|
|
||||||
- [x] Закомментировать дефолтные значения у list. interface поставить в пустое.
|
|
||||||
- [x] Скрипт установки: проверка установлен ли уже podkop. Если да, то просто предлагать обновится без установки тунелей и прокси.
|
|
||||||
|
|
||||||
Приоритет 1
|
Приоритет 1
|
||||||
- [x] Изменить название "Alternative Config"
|
- [x] Изменить название "Alternative Config"
|
||||||
- [x] "domain_service_enabled" Добавить _second
|
- [x] "domain_service_enabled" Добавить _second
|
||||||
@@ -142,9 +118,6 @@ Luci: Services/podkop
|
|||||||
Проблема в том, что это нужно только если SS. Выставлять выбор при парсинг из конфига вопрос можно ли. Если совсем тупо - сделать костыль в допонительные настройки
|
Проблема в том, что это нужно только если SS. Выставлять выбор при парсинг из конфига вопрос можно ли. Если совсем тупо - сделать костыль в допонительные настройки
|
||||||
- [x] Проверка места в скрипте install. Если доступно меньше 20MB - exit 1 c выводом колько надо и сколько доступно. + показ модели роутера
|
- [x] Проверка места в скрипте install. Если доступно меньше 20MB - exit 1 c выводом колько надо и сколько доступно. + показ модели роутера
|
||||||
- [x] Правило запрещающее QUIC
|
- [x] Правило запрещающее QUIC
|
||||||
- [ ] Проверить обновление списков, отрабатывает ли
|
|
||||||
- [ ] Проверка на ванильную openwrt
|
|
||||||
- [ ] Проверка откуда установлен sing-box. Например, проверять установлен ли он из официального репозитория
|
|
||||||
- [x] TG в сервисы
|
- [x] TG в сервисы
|
||||||
- [ ] Диагностика: Proxy check completed successfully предположительно не показывает IP, если вернулся это IPv6.
|
- [ ] Диагностика: Proxy check completed successfully предположительно не показывает IP, если вернулся это IPv6.
|
||||||
- [ ] Сделать галку запрещающую подкопу редачить dhcp. Допилить в исключение вместе с пустыми полями proxy и vpn
|
- [ ] Сделать галку запрещающую подкопу редачить dhcp. Допилить в исключение вместе с пустыми полями proxy и vpn
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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.13
|
PKG_VERSION:=0.3.15
|
||||||
PKG_RELEASE:=1
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
LUCI_TITLE:=LuCI podkop app
|
LUCI_TITLE:=LuCI podkop app
|
||||||
|
|||||||
@@ -53,6 +53,23 @@ function getNetworkInterfaces(o) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getNetworkInterfaces(o) {
|
||||||
|
const excludeInterfaces = ['br-lan', 'eth0', 'eth1', 'wan', 'phy0-ap0', 'phy1-ap0', 'pppoe-wan'];
|
||||||
|
|
||||||
|
return network.getDevices().then(devices => {
|
||||||
|
devices.forEach(device => {
|
||||||
|
if (device.dev && device.dev.name) {
|
||||||
|
const deviceName = device.dev.name;
|
||||||
|
if (!excludeInterfaces.includes(deviceName) && !/^lan\d+$/.test(deviceName)) {
|
||||||
|
o.value(deviceName, deviceName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).catch(error => {
|
||||||
|
console.error('Failed to get network devices:', error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Общая функция для создания конфигурационных секций
|
// Общая функция для создания конфигурационных секций
|
||||||
function createConfigSection(section, map, network) {
|
function createConfigSection(section, map, network) {
|
||||||
const s = section;
|
const s = section;
|
||||||
@@ -209,6 +226,7 @@ function createConfigSection(section, map, network) {
|
|||||||
o.depends('mode', 'vpn');
|
o.depends('mode', 'vpn');
|
||||||
o.ucisection = s.section;
|
o.ucisection = s.section;
|
||||||
getNetworkInterfaces(o);
|
getNetworkInterfaces(o);
|
||||||
|
getNetworkInterfaces(o);
|
||||||
|
|
||||||
o = s.taboption('basic', form.Flag, 'domain_list_enabled', _('Community Lists'));
|
o = s.taboption('basic', form.Flag, 'domain_list_enabled', _('Community Lists'));
|
||||||
o.default = '0';
|
o.default = '0';
|
||||||
@@ -529,25 +547,78 @@ return view.extend({
|
|||||||
o.value('1.1.1.1', 'Cloudflare (1.1.1.1)');
|
o.value('1.1.1.1', 'Cloudflare (1.1.1.1)');
|
||||||
o.value('8.8.8.8', 'Google (8.8.8.8)');
|
o.value('8.8.8.8', 'Google (8.8.8.8)');
|
||||||
o.value('9.9.9.9', 'Quad9 (9.9.9.9)');
|
o.value('9.9.9.9', 'Quad9 (9.9.9.9)');
|
||||||
o.value('dns.adguard-dns.com', 'AdGuard Default');
|
o.value('dns.adguard-dns.com', 'AdGuard Default (dns.adguard-dns.com)');
|
||||||
o.value('unfiltered.adguard-dns.com', 'AdGuard Unfiltered');
|
o.value('unfiltered.adguard-dns.com', 'AdGuard Unfiltered (unfiltered.adguard-dns.com)');
|
||||||
o.value('family.adguard-dns.com', 'AdGuard Family');
|
o.value('family.adguard-dns.com', 'AdGuard Family (family.adguard-dns.com)');
|
||||||
o.default = '1.1.1.1';
|
o.default = '1.1.1.1';
|
||||||
o.rmempty = false;
|
o.rmempty = false;
|
||||||
o.ucisection = 'main';
|
o.ucisection = 'main';
|
||||||
o.validate = function (section_id, value) {
|
o.validate = function (section_id, value) {
|
||||||
if (!value) return _('DNS server address cannot be empty');
|
if (!value) {
|
||||||
|
return _('DNS server address cannot be empty');
|
||||||
|
}
|
||||||
|
|
||||||
const ipRegex = /^(\d{1,3}\.){3}\d{1,3}$/;
|
const ipRegex = /^(\d{1,3}\.){3}\d{1,3}$/;
|
||||||
if (ipRegex.test(value)) {
|
if (ipRegex.test(value)) {
|
||||||
const parts = value.split('.');
|
const parts = value.split('.');
|
||||||
for (const part of parts) {
|
for (const part of parts) {
|
||||||
const num = parseInt(part);
|
const num = parseInt(part);
|
||||||
if (num < 0 || num > 255) return _('IP address parts must be between 0 and 255');
|
if (num < 0 || num > 255) {
|
||||||
|
return _('IP address parts must be between 0 and 255');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const domainRegex = /^([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.[a-zA-Z]{2,}$/;
|
const domainRegex = /^([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.[a-zA-Z]{2,}$/;
|
||||||
if (!domainRegex.test(value)) return _('Invalid DNS server format. Examples: 8.8.8.8 or dns.example.com');
|
if (!domainRegex.test(value)) {
|
||||||
|
return _('Invalid DNS server format. Examples: 8.8.8.8 or dns.example.com');
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
o = mainSection.taboption('additional', form.Value, 'dns_rewrite_ttl', _('DNS Rewrite TTL'), _('Time in seconds for DNS record caching (default: 600)'));
|
||||||
|
o.default = '600';
|
||||||
|
o.rmempty = false;
|
||||||
|
o.ucisection = 'main';
|
||||||
|
o.validate = function (section_id, value) {
|
||||||
|
if (!value) {
|
||||||
|
return _('TTL value cannot be empty');
|
||||||
|
}
|
||||||
|
|
||||||
|
const ttl = parseInt(value);
|
||||||
|
if (isNaN(ttl) || ttl < 0) {
|
||||||
|
return _('TTL must be a positive number');
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
o = mainSection.taboption('additional', form.Value, 'cache_file', _('Cache File Path'), _('Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing'));
|
||||||
|
o.value('/tmp/cache.db', 'RAM (/tmp/cache.db)');
|
||||||
|
o.value('/usr/share/sing-box/cache.db', 'Flash (/usr/share/sing-box/cache.db)');
|
||||||
|
o.default = '/tmp/cache.db';
|
||||||
|
o.rmempty = false;
|
||||||
|
o.ucisection = 'main';
|
||||||
|
o.validate = function (section_id, value) {
|
||||||
|
if (!value) {
|
||||||
|
return _('Cache file path cannot be empty');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!value.startsWith('/')) {
|
||||||
|
return _('Path must be absolute (start with /)');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!value.endsWith('cache.db')) {
|
||||||
|
return _('Path must end with cache.db');
|
||||||
|
}
|
||||||
|
|
||||||
|
const parts = value.split('/').filter(Boolean);
|
||||||
|
if (parts.length < 2) {
|
||||||
|
return _('Path must contain at least one directory (like /tmp/cache.db)');
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=podkop
|
PKG_NAME:=podkop
|
||||||
PKG_VERSION:=0.3.13
|
PKG_VERSION:=0.3.15
|
||||||
PKG_RELEASE:=1
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
PKG_MAINTAINER:=ITDog <podkop@itdog.info>
|
PKG_MAINTAINER:=ITDog <podkop@itdog.info>
|
||||||
|
|||||||
@@ -53,8 +53,12 @@ start_service() {
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if opkg list-installed | grep -qE "iptables|kmod-iptab"; then
|
if grep -q FriendlyWrt /etc/banner; then
|
||||||
printf "\033[31;1mFound incompatible iptables packages. If you're using FriendlyWrt: https://t.me/itdogchat/44512/181082\033[0m\n"
|
printf "\033[31;1mYou use FriendlyWrt. If you have problems, check out: https://t.me/itdogchat/44512/181082\033[0m\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if grep -qE 'doh_backup_noresolv|doh_backup_server|doh_server' /etc/config/dhcp; then
|
||||||
|
printf "\033[31;1mDetected https-dns-proxy. Disable or uninstall it for correct functionality.\033[0m\n"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! ip addr | grep -q "br-lan"; then
|
if ! ip addr | grep -q "br-lan"; then
|
||||||
@@ -1373,8 +1377,13 @@ list_custom_local_domains_create() {
|
|||||||
local filename=$(basename "$local_file" | cut -d. -f1)
|
local filename=$(basename "$local_file" | cut -d. -f1)
|
||||||
|
|
||||||
while IFS= read -r domain; do
|
while IFS= read -r domain; do
|
||||||
log "From local file: $domain"
|
domain=$(echo "$domain" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
||||||
sing_box_ruleset_domains $domain $section
|
if [ -n "$domain" ] && echo "$domain" | grep -E -q '^([a-zA-Z0-9][-a-zA-Z0-9]*\.)+[a-zA-Z]{2,}$'; then
|
||||||
|
log "Added $domain from local file"
|
||||||
|
sing_box_ruleset_domains "$domain" "$section"
|
||||||
|
else
|
||||||
|
log "Invalid domain skipped: $domain"
|
||||||
|
fi
|
||||||
done <"$local_file"
|
done <"$local_file"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user