feat: dnssec-validation toggle in upstream DNS form

Web 端 '上游 DNS 转发' 卡片新增第三个字段:DNSSEC 验证(auto/yes/no),
解决 SERVFAIL 经典坑:内网 DNS 用 auto 时会被根服务器坏 DS 记录卡住,
返回 SERVFAIL 而非答案。

实现:
- _parse_options_dnssec() 抽出当前 dnssec-validation 值
- _replace_or_append_option() 扩展支持 value-terminated directives
  ('dnssec-validation auto;' 而非 '{...}'),用负向断言避免误匹配
  'listen-on' 时把 'listen-on-v6' 也吃掉
- config_view 多传 dnssec_value/dnssec_values 给模板
- config_upstream_save 多处理 dnssec 表单字段
- 模板加 <select> 下拉,默认选中当前文件里的值

测试覆盖:brace-delimited 替换、value-terminated 替换、hyphen
lookbehind、append-when-missing、parse 各种值、完整 round-trip。
This commit is contained in:
Hermes
2026-07-24 18:08:41 +08:00
parent 1614e37386
commit 9b1679bbd0
2 changed files with 110 additions and 40 deletions
+12 -1
View File
@@ -48,10 +48,21 @@
placeholder="127.0.0.0/8&#10;10.0.0.0/8&#10;172.16.0.0/12&#10;192.168.0.0/16">{% for net in recursion %}{{ net }}
{% endfor %}</textarea>
</div>
<div class="form-group">
<label for="dnssec">
<strong>DNSSEC 验证</strong>
<span class="text-muted text-sm">内网 DNS 通常选 <code>no</code>,避免根服务器坏 DS 记录导致 SERVFAIL。</span>
</label>
<select name="dnssec" id="dnssec" class="form-control">
{% for v in dnssec_values %}
<option value="{{ v }}" {% if v == dnssec_value %}selected{% endif %}>{{ v }}{% if v == 'auto' %}(默认,验证根 key{% elif v == 'yes' %}(强制验证){% elif v == 'no' %}(关闭验证){% endif %}</option>
{% endfor %}
</select>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary">💾 保存并重载</button>
<span class="text-muted text-sm" style="margin-left: 12px;">
此处只改 forwarders allow-recursion;其它 options 字段请用下方文本编辑器。
此处只改 forwarders / allow-recursion / dnssec-validation;其它 options 字段请用下方文本编辑器。
</span>
</div>
</form>