From a0af04037a55ef8734fa8aa5093436a39cd8734a Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 Feb 2025 15:57:18 +0300 Subject: [PATCH 1/8] feat(podkop.js): add DNS protocol type and server options to configuration --- .../resources/view/podkop/podkop.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js index 4d0d3ff..262991a 100644 --- a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js +++ b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js @@ -653,6 +653,25 @@ return view.extend({ o.rmempty = false; o.ucisection = 'main'; + o = s.taboption('additional', form.ListValue, 'dns_type', 'DNS Protocol Type', 'Select DNS protocol to use'); + o.value('doh', 'DNS over HTTPS (DoH)'); + o.value('dot', 'DNS over TLS (DoT)'); + o.value('udp', 'UDP (Unprotected DNS)'); + o.default = 'doh'; + o.rmempty = false; + o.ucisection = 'main'; + + o = s.taboption('additional', form.Value, 'dns_server', 'DNS Server', 'Select or enter DNS server address'); + o.value('1.1.1.1', 'Cloudflare (1.1.1.1)'); + o.value('8.8.8.8', 'Google (8.8.8.8)'); + o.value('9.9.9.9', 'Quad9 (9.9.9.9)'); + o.value('dns.adguard-dns.com', 'AdGuard Default (dns.adguard-dns.com)'); + o.value('unfiltered.adguard-dns.com', 'AdGuard Unfiltered (unfiltered.adguard-dns.com)'); + o.value('family.adguard-dns.com', 'AdGuard Family (family.adguard-dns.com)'); + o.default = '1.1.1.1'; + o.rmempty = false; + o.ucisection = 'main'; + // Diagnostics tab o = s.tab('diagnostics', _('Diagnostics')); From c31785d20e9324ba6ee618f7bde60731067cca4b Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 Feb 2025 15:57:52 +0300 Subject: [PATCH 2/8] feat(init.d/podkop): add DNS resolver discovery and dynamic configuration --- podkop/files/etc/init.d/podkop | 100 +++++++++++++++++++++++++++------ 1 file changed, 82 insertions(+), 18 deletions(-) diff --git a/podkop/files/etc/init.d/podkop b/podkop/files/etc/init.d/podkop index 0e3f7d6..82c3dd1 100755 --- a/podkop/files/etc/init.d/podkop +++ b/podkop/files/etc/init.d/podkop @@ -40,6 +40,8 @@ SING_BOX_CONFIG="/etc/sing-box/config.json" CACHE_FILE_PATH="/tmp/cache.db" 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" +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() { log "Start podkop" @@ -545,6 +547,17 @@ list_update() { 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 @@ -622,27 +635,78 @@ sing_box_inbound_proxy() { } 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" + + 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 + + # Добавляем fakeip сервер + server_json=$(echo "$server_json" | jq '.servers += [{"tag": "fakeip-server", "address": "fakeip"}]') + + # Обновляем конфигурацию sing-box jq \ - --arg FAKEIP "$FAKEIP" \ - '.dns = { - "strategy": "ipv4_only", - "fakeip": { - "enabled": true, - "inet4_range": $FAKEIP - }, - "servers": [ - { - "tag": "cloudflare-doh-server", - "address": "https://1.1.1.1/dns-query", - "detour": "direct-out" + --argjson dns_config "$server_json" \ + --arg fakeip "$FAKEIP" \ + '.dns = { + "strategy": "ipv4_only", + "fakeip": { + "enabled": true, + "inet4_range": $fakeip }, - { - "tag": "fakeip-server", - "address": "fakeip" - } - ] - }' $SING_BOX_CONFIG >/tmp/sing-box-config-tmp.json && mv /tmp/sing-box-config-tmp.json $SING_BOX_CONFIG + "servers": $dns_config.servers + }' $SING_BOX_CONFIG > /tmp/sing-box-config-tmp.json && mv /tmp/sing-box-config-tmp.json $SING_BOX_CONFIG } sing_box_dns_rule_fakeip() { From 85642a25852b8406c602e19d0aa9d8a7ffbd9a09 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 Feb 2025 16:01:12 +0300 Subject: [PATCH 3/8] feat(podkop.pot): add new DNS protocol and server options for translation --- luci-app-podkop/po/templates/podkop.pot | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/luci-app-podkop/po/templates/podkop.pot b/luci-app-podkop/po/templates/podkop.pot index f13ab9a..1506f1b 100644 --- a/luci-app-podkop/po/templates/podkop.pot +++ b/luci-app-podkop/po/templates/podkop.pot @@ -854,4 +854,25 @@ msgid "Check completed" msgstr "" msgid "Check failed" +msgstr "" + +msgid "DNS Protocol Type" +msgstr "" + +msgid "Select DNS protocol to use" +msgstr "" + +msgid "DNS over HTTPS (DoH)" +msgstr "" + +msgid "DNS over TLS (DoT)" +msgstr "" + +msgid "UDP (Unprotected DNS)" +msgstr "" + +msgid "DNS Server" +msgstr "" + +msgid "Select or enter DNS server address" msgstr "" \ No newline at end of file From e49bd91109922e095bf60ea4bcac7a0d18e67ef7 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 Feb 2025 16:01:23 +0300 Subject: [PATCH 4/8] feat(podkop.po): add translations for DNS protocol and server options --- luci-app-podkop/po/ru/podkop.po | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/luci-app-podkop/po/ru/podkop.po b/luci-app-podkop/po/ru/podkop.po index b5afa80..de59561 100644 --- a/luci-app-podkop/po/ru/podkop.po +++ b/luci-app-podkop/po/ru/podkop.po @@ -494,4 +494,25 @@ msgid "Update Lists" msgstr "Обновить списки" msgid "Lists Update Results" -msgstr "Результаты обновления списков" \ No newline at end of file +msgstr "Результаты обновления списков" + +msgid "DNS Protocol Type" +msgstr "Тип DNS протокола" + +msgid "Select DNS protocol to use" +msgstr "Выберите протокол DNS" + +msgid "DNS over HTTPS (DoH)" +msgstr "DNS через HTTPS (DoH)" + +msgid "DNS over TLS (DoT)" +msgstr "DNS через TLS (DoT)" + +msgid "UDP (Unprotected DNS)" +msgstr "UDP (Незащищённый DNS)" + +msgid "DNS Server" +msgstr "DNS сервер" + +msgid "Select or enter DNS server address" +msgstr "Выберите или введите адрес DNS сервера" \ No newline at end of file From 1a6b0cac46cba4bc34af1237c0300f8cc2e1ce75 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 Feb 2025 16:03:15 +0300 Subject: [PATCH 5/8] chore(init.d/podkop): remove redundant comments --- podkop/files/etc/init.d/podkop | 2 -- 1 file changed, 2 deletions(-) diff --git a/podkop/files/etc/init.d/podkop b/podkop/files/etc/init.d/podkop index 82c3dd1..100bc54 100755 --- a/podkop/files/etc/init.d/podkop +++ b/podkop/files/etc/init.d/podkop @@ -692,10 +692,8 @@ sing_box_dns() { }]') fi - # Добавляем fakeip сервер server_json=$(echo "$server_json" | jq '.servers += [{"tag": "fakeip-server", "address": "fakeip"}]') - # Обновляем конфигурацию sing-box jq \ --argjson dns_config "$server_json" \ --arg fakeip "$FAKEIP" \ From 75b8bef0e07bb5817b685c7bff440a4c29f46a25 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 Feb 2025 16:06:14 +0300 Subject: [PATCH 6/8] fix(podkop.js): update DNS protocol type and server labels to use translation function --- .../htdocs/luci-static/resources/view/podkop/podkop.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js index 262991a..f52c22f 100644 --- a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js +++ b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js @@ -653,15 +653,15 @@ return view.extend({ o.rmempty = false; o.ucisection = 'main'; - o = s.taboption('additional', form.ListValue, 'dns_type', 'DNS Protocol Type', 'Select DNS protocol to use'); - o.value('doh', 'DNS over HTTPS (DoH)'); - o.value('dot', 'DNS over TLS (DoT)'); - o.value('udp', 'UDP (Unprotected DNS)'); + o = s.taboption('additional', form.ListValue, 'dns_type', _('DNS Protocol Type'), _('Select DNS protocol to use')); + o.value('doh', _('DNS over HTTPS (DoH)')); + o.value('dot', _('DNS over TLS (DoT)')); + o.value('udp', _('UDP (Unprotected DNS)')); o.default = 'doh'; o.rmempty = false; o.ucisection = 'main'; - o = s.taboption('additional', form.Value, 'dns_server', 'DNS Server', 'Select or enter DNS server address'); + o = s.taboption('additional', form.Value, 'dns_servers', _('DNS Server'), _('Select or enter DNS server address')); o.value('1.1.1.1', 'Cloudflare (1.1.1.1)'); o.value('8.8.8.8', 'Google (8.8.8.8)'); o.value('9.9.9.9', 'Quad9 (9.9.9.9)'); From e1df26e62b6829557e32390c5b8f3b411f6ad05d Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 Feb 2025 16:33:23 +0300 Subject: [PATCH 7/8] feat(podkop.js): add DNS server validation for IP and domain formats --- .../resources/view/podkop/podkop.js | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js index f52c22f..cdbb3cc 100644 --- a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js +++ b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js @@ -672,6 +672,31 @@ return view.extend({ o.rmempty = false; o.ucisection = 'main'; + o.validate = function(section_id, value) { + if (!value) { + return _('DNS server address cannot be empty'); + } + + const ipRegex = /^(\d{1,3}\.){3}\d{1,3}$/; + if (ipRegex.test(value)) { + const parts = value.split('.'); + for (const part of parts) { + const num = parseInt(part); + if (num < 0 || num > 255) { + return _('IP address parts must be between 0 and 255'); + } + } + return true; + } + + 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'); + } + + return true; + }; + // Diagnostics tab o = s.tab('diagnostics', _('Diagnostics')); From 51a9cc59341bcc68bb7a50bddc0c2d7c4aa140b4 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 Feb 2025 16:34:55 +0300 Subject: [PATCH 8/8] feat(podkop.po): add translations for DNS server address validation messages --- luci-app-podkop/po/ru/podkop.po | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/luci-app-podkop/po/ru/podkop.po b/luci-app-podkop/po/ru/podkop.po index de59561..93c6974 100644 --- a/luci-app-podkop/po/ru/podkop.po +++ b/luci-app-podkop/po/ru/podkop.po @@ -515,4 +515,10 @@ msgid "DNS Server" msgstr "DNS сервер" msgid "Select or enter DNS server address" -msgstr "Выберите или введите адрес DNS сервера" \ No newline at end of file +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" \ No newline at end of file