From 5c7e3dce316de27842cbc8ed374a89b9e094cd99 Mon Sep 17 00:00:00 2001 From: yandexru45 Date: Sun, 8 Mar 2026 13:04:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D1=87=D0=B8=D0=BD=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=BC=D1=83=D0=BB=D1=8C=D1=82=D0=B8=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=D1=85=20+=20=D0=B2=D0=B5=D1=80=D0=BD=D1=83=D0=BB?= =?UTF-8?q?=20readme=20&=20install=20script?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 55 +++++++++++++++++++++++++++++++------ install.sh | 10 +++---- podkop/files/usr/bin/podkop | 45 ++++++++++++++++++++++++------ 3 files changed, 89 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index a938bc1..2b8ac9c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,11 @@ +# Podkop Evolution + +> **Podkop's fork with HWID and Subscription URL support** +> +> Этот форк добавляет поддержку ссылок подписки (subscription URL) с кастомными заголовками (HWID, Device-OS, Device-Model) и автоматическим обновлением. Основан на [itdoginfo/podkop](https://github.com/itdoginfo/podkop). + +--- + # Вещи, которые вам нужно знать перед установкой - Это бета-версия, которая находится в активной разработке. Из версии в версию что-то может меняться. @@ -16,12 +24,45 @@ # Документация https://podkop.net/ -# Установка Podkop +# Установка Podkop Evolution Полная информация в [документации](https://podkop.net/docs/install/) Вкратце, достаточно одного скрипта для установки и обновления: ``` -sh <(wget -O - https://raw.githubusercontent.com/itdoginfo/podkop/refs/heads/main/install.sh) +sh <(wget -O - https://raw.githubusercontent.com/yandexru45/podkop-evolution/refs/heads/main/install.sh) +``` + +## Новое в этом форке: Подписки (Subscription) + +Добавлена поддержка subscription URL — ссылки подписки от провайдера прокси. При выборе типа конфигурации **Subscription** в LuCI: + +- Введите URL подписки от вашего провайдера +- Выберите интервал автообновления (от 30 минут до 1 дня) +- Все серверы из подписки автоматически появятся в дашборде +- Автоматический выбор лучшего сервера по задержке (URLTest) +- Ручное переключение между серверами через дашборд + +При скачивании подписки отправляются заголовки: +- `User-Agent: singbox/<версия>` +- `X-HWID` — уникальный идентификатор роутера +- `X-Device-OS: OpenWrt Linux` +- `X-Device-Model` — модель роутера +- `X-Ver-OS` — версия ядра + +Пример конфигурации через UCI: +``` +uci set podkop.my_sub=section +uci set podkop.my_sub.connection_type='proxy' +uci set podkop.my_sub.proxy_config_type='subscription' +uci set podkop.my_sub.subscription_url='https://your-provider.com/api/sub' +uci set podkop.my_sub.subscription_update_interval='1h' +uci add_list podkop.my_sub.community_lists='russia_inside' +uci commit podkop +``` + +Ручное обновление подписки: +``` +/usr/bin/podkop subscription_update ``` ## Изменения 0.7.0 @@ -38,7 +79,7 @@ mv /etc/config/podkop /etc/config/podkop-070 ``` 2. Стянуть новый дефолтный конфиг: ``` -wget -O /etc/config/podkop https://raw.githubusercontent.com/itdoginfo/podkop/refs/heads/main/podkop/files/etc/config/podkop +wget -O /etc/config/podkop https://raw.githubusercontent.com/yandexru45/podkop-evolution/refs/heads/main/podkop/files/etc/config/podkop ``` 3. Настроить заново ваш Podkop через Luci или UCI. @@ -48,14 +89,12 @@ wget -O /etc/config/podkop https://raw.githubusercontent.com/itdoginfo/podkop/re > PR принимаются только по issues, у которых стоит label "enhancement". Либо по согласованию с авторами в ТГ-чате. Остальные PR на данный момент не рассматриваются. ## Будущее -- [ ] [Подписка](https://github.com/itdoginfo/podkop/issues/118). Здесь нужна реализация, чтоб для каждой секции помимо ручного выбора, был выбор фильтрации по тегу. Например, для main выбираем ключевые слова NL, DE, FI. А для extra секции фильтруем по RU. И создаётся outbound c urltest в которых перечислены outbound из фильтров. +- [x] [Подписка](https://github.com/itdoginfo/podkop/issues/118) — **реализовано в этом форке!** - [ ] Весь трафик в sing-box и маршрутизация полностью на его уровне. -- [ ] При успешном запуске переходит в фоновый режим и следит за состоянием sing-box. Если вдруг идёт exit 1, выполняется dnsmasq restore и снова следит за состоянием. Вопрос в том, как это искусственно провернуть. Попробовать положить прокси и посмотреть, останется ли работать DNS в этом случае. И здесь, вероятно, можно обойтись триггером в init.d. [Issue](https://github.com/itdoginfo/podkop/issues/111) +- [ ] При успешном запуске переходит в фоновый режим и следит за состоянием sing-box. Если вдруг идёт exit 1, выполняется dnsmasq restore и снова следит за состоянием. [Issue](https://github.com/itdoginfo/podkop/issues/111) - [ ] Галочка, которая режет доступ к doh серверам. - [ ] IPv6. Только после наполнения Wiki. ## Тесты - [ ] Unit тесты (BATS) -- [ ] Интеграционные тесты бекенда (OpenWrt rootfs + BATS) - -[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/itdoginfo/podkop) \ No newline at end of file +- [ ] Интеграционные тесты бекенда (OpenWrt rootfs + BATS) \ No newline at end of file diff --git a/install.sh b/install.sh index 6376d7c..6fde517 100755 --- a/install.sh +++ b/install.sh @@ -1,7 +1,7 @@ #!/bin/sh # shellcheck shell=dash -REPO="https://api.github.com/repos/itdoginfo/podkop/releases/latest" +REPO="https://api.github.com/repos/yandexru45/podkop-evolution/releases/latest" DOWNLOAD_DIR="/tmp/podkop" COUNT=3 @@ -66,7 +66,7 @@ update_config() { printf "\033[48;5;196m\033[1m║ ! Обнаружена старая версия podkop. ║\033[0m\n" printf "\033[48;5;196m\033[1m║ Если продолжите обновление, вам потребуется настроить Podkop заново. ║\033[0m\n" printf "\033[48;5;196m\033[1m║ Старая конфигурация будет сохранена в /etc/config/podkop-070 ║\033[0m\n" - printf "\033[48;5;196m\033[1m║ Подробности: https://github.com/itdoginfo/podkop ║\033[0m\n" + printf "\033[48;5;196m\033[1m║ Подробности: https://github.com/yandexru45/podkop-evolution ║\033[0m\n" printf "\033[48;5;196m\033[1m║ Точно хотите продолжить? ║\033[0m\n" printf "\033[48;5;196m\033[1m╚══════════════════════════════════════════════════════════════════════╝\033[0m\n" @@ -76,7 +76,7 @@ update_config() { printf "\033[48;5;196m\033[1m║ ! Detected old podkop version. ║\033[0m\n" printf "\033[48;5;196m\033[1m║ If you continue the update, you will need to RECONFIGURE podkop. ║\033[0m\n" printf "\033[48;5;196m\033[1m║ Your old configuration will be saved to /etc/config/podkop-070 ║\033[0m\n" - printf "\033[48;5;196m\033[1m║ Details: https://github.com/itdoginfo/podkop ║\033[0m\n" + printf "\033[48;5;196m\033[1m║ Details: https://github.com/yandexru45/podkop-evolution ║\033[0m\n" printf "\033[48;5;196m\033[1m║ Are you sure you want to continue? ║\033[0m\n" printf "\033[48;5;196m\033[1m╚══════════════════════════════════════════════════════════════════════╝\033[0m\n" @@ -88,7 +88,7 @@ update_config() { yes|y|Y) mv /etc/config/podkop /etc/config/podkop-070 - wget -O /etc/config/podkop https://raw.githubusercontent.com/itdoginfo/podkop/refs/heads/main/podkop/files/etc/config/podkop + wget -O /etc/config/podkop https://raw.githubusercontent.com/yandexru45/podkop-evolution/refs/heads/main/podkop/files/etc/config/podkop msg "Podkop config has been reset to default. Your old config saved in /etc/config/podkop-070" break ;; @@ -115,7 +115,7 @@ main() { fi if command -v curl >/dev/null 2>&1; then - check_response=$(curl -s "https://api.github.com/repos/itdoginfo/podkop/releases/latest") + check_response=$(curl -s "https://api.github.com/repos/yandexru45/podkop-evolution/releases/latest") if echo "$check_response" | grep -q 'API rate limit '; then msg "You've reached the GitHub rate limit. Repeat in five minutes." diff --git a/podkop/files/usr/bin/podkop b/podkop/files/usr/bin/podkop index 79b2fd3..3d1a214 100755 --- a/podkop/files/usr/bin/podkop +++ b/podkop/files/usr/bin/podkop @@ -568,6 +568,23 @@ add_subscription_cron_job() { } | crontab - log "The subscription cron job has been created: $cron_job" } +ensure_nft_ready_for_list_update() { + if nft list table inet "$NFT_TABLE_NAME" > /dev/null 2>&1; then + return 0 + fi + + log "NFT table '$NFT_TABLE_NAME' is missing before lists update, recreating nft rules" "warn" + route_table_rule_mark + create_nft_rules + + if ! nft list table inet "$NFT_TABLE_NAME" > /dev/null 2>&1; then + log "Failed to recreate NFT table '$NFT_TABLE_NAME'" "error" + return 1 + fi + + return 0 +} + list_update() { echolog "🔄 Starting lists update..." @@ -600,7 +617,7 @@ list_update() { local service_proxy_address service_proxy_address="$(get_service_proxy_address)" - if [ -n "$http_proxy_address" ]; then + if [ -n "$service_proxy_address" ]; then if curl -s -x "http://$service_proxy_address" -m $curl_timeout https://github.com > /dev/null; then echolog "✅ GitHub connection check passed (via proxy)" break @@ -624,16 +641,23 @@ list_update() { return 1 fi + if ! ensure_nft_ready_for_list_update; then + echolog "❌ NFT table is unavailable, cannot update lists" + return 1 + fi + echolog "📥 Downloading and processing lists..." - config_foreach import_community_subnet_lists "section" - config_foreach import_domains_from_remote_domain_lists "section" - config_foreach import_subnets_from_remote_subnet_lists "section" + local update_failed=0 + config_foreach import_community_subnet_lists "section" || update_failed=1 + config_foreach import_domains_from_remote_domain_lists "section" || update_failed=1 + config_foreach import_subnets_from_remote_subnet_lists "section" || update_failed=1 - if [ $? -eq 0 ]; then + if [ "$update_failed" -eq 0 ]; then echolog "✅ Lists update completed successfully" else echolog "❌ Lists update failed" + return 1 fi } @@ -1570,9 +1594,14 @@ import_community_service_subnet_list_handler() { ;; "discord") URL=$SUBNETS_DISCORD - nft_create_ipv4_set "$NFT_TABLE_NAME" "$NFT_DISCORD_SET_NAME" - nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr \ - "@$NFT_DISCORD_SET_NAME" udp dport '{ 50000-65535 }' meta mark set "$NFT_FAKEIP_MARK" counter + if ! nft list set inet "$NFT_TABLE_NAME" "$NFT_DISCORD_SET_NAME" > /dev/null 2>&1; then + nft_create_ipv4_set "$NFT_TABLE_NAME" "$NFT_DISCORD_SET_NAME" + fi + if ! nft list chain inet "$NFT_TABLE_NAME" mangle 2> /dev/null | \ + grep -Fq "@$NFT_DISCORD_SET_NAME udp dport { 50000-65535 }"; then + nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr \ + "@$NFT_DISCORD_SET_NAME" udp dport '{ 50000-65535 }' meta mark set "$NFT_FAKEIP_MARK" counter + fi ;; "roblox") URL=$SUBNETS_ROBLOX