From e0bb10bfabd4030540dc9a47eacf66e981dbb740 Mon Sep 17 00:00:00 2001 From: Hermes Date: Fri, 24 Jul 2026 18:13:00 +0800 Subject: [PATCH] feat: listen-on and recursion toggles in upstream DNS form MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Web 端 '上游 DNS 转发' 卡片新增两个字段: 1. Listen-on (IPv4) 53 端口 — textarea,每行一个 CIDR/IP/ACL 名。 留空 = any(任意来源)。对应 BIND 指令 listen-on port 53 { ... };。 2. Recursion — yes/no 下拉,控制本 DNS 是否代客户端去外网递归。 内网递归服务器选 yes;纯权威服务器选 no。 修了一个 regex bug:之前 _replace_or_append_option 用 \\b(?!\\-) 做 lookahead 但没用 lookbehind,导致在内容含 allow-recursion 时匹配 recursion 时也会匹配到 allow- 后面的 recursion,把 allow-recursion 破坏。改为 (?;'.""" + m = re.search(r'recursion\s+(\w+)\s*;', content) + if not m: + return "yes" + val = m.group(1).lower() + return val if val in ("yes", "no") else "yes" + + def _replace_or_append_option(content, directive, new_block): """Replace an existing 'directive { ... };' or 'directive ;' in an options block with new_block, or append it after the opening 'options {' if @@ -1079,16 +1104,15 @@ def _replace_or_append_option(content, directive, new_block): Nested braces are matched by counting depth. """ pattern = re.compile( - r'(' + re.escape(directive) + r')\b(?!\-)', + r'(? listen-on port 53 { any; }; (default safe) + if not new_listen: + new_listen = ["any"] + new_content = _replace_or_append_option( + new_content, "listen-on", + _format_list_block("listen-on port 53", new_listen), + ) + new_content = _replace_or_append_option( + new_content, "recursion", + f"recursion {recursion_in};", + ) # Validate BEFORE writing to the live file tmp = "/tmp/named_check.tmp" @@ -1368,8 +1412,14 @@ def config_upstream_save(): u = current_user() AuditLog.log(u.username, "修改上游DNS转发配置", - f"forwarders={new_fwd}; allow-recursion={new_rc}; dnssec={dnssec_in}") - flash(f"已保存:forwarders {len(new_fwd)} 条,allow-recursion {len(new_rc)} 条,dnssec-validation {dnssec_in}", "success") + f"forwarders={new_fwd}; allow-recursion={new_rc}; " + f"dnssec={dnssec_in}; listen-on={new_listen}; recursion={recursion_in}") + flash( + f"已保存:forwarders {len(new_fwd)} 条,allow-recursion {len(new_rc)} 条," + f"dnssec-validation {dnssec_in},listen-on {len(new_listen)} 项," + f"recursion {recursion_in}", + "success", + ) return redirect(url_for("config_view")) diff --git a/templates/config.html b/templates/config.html index 073f62e..1c88e34 100644 --- a/templates/config.html +++ b/templates/config.html @@ -59,10 +59,29 @@ {% endfor %} +
+ + +
+
+ + +
- 此处只改 forwarders / allow-recursion / dnssec-validation;其它 options 字段请用下方文本编辑器。 + 此处改 forwarders / allow-recursion / dnssec-validation / listen-on / recursion;其它字段请用下方文本编辑器。