Files
vibedns/web/templates/pages/settings_dns.html
T
2026-08-16 21:18:45 -05:00

158 lines
7.3 KiB
HTML

{{define "content"}}
{{$s := .Data.S}}
<h1 class="page-title mb-1">Settings</h1>
<p class="text-body-secondary mb-4">Server configuration, stored in the database.</p>
{{template "settingsnav" .}}
<form method="post" action="/settings/dns">
<input type="hidden" name="_csrf" value="{{.CSRF}}">
<div class="row g-3">
<div class="col-12 col-xl-8">
<div class="card">
<div class="card-header">DNS service</div>
<div class="card-body">
<div class="form-section">
<div class="form-section-title">Listeners</div>
<div class="row g-3">
<div class="col-12 col-md-6">
<label class="form-label" for="udpListen">
UDP listen address {{template "restartbadge"}}
</label>
<input type="text" class="form-control mono" id="udpListen" name="udp_listen"
value="{{$s.DNS.UDPListen}}" placeholder="0.0.0.0:53" required>
<div class="form-text">
Currently bound to <span class="mono">{{.Data.BoundUDP}}</span>.
Use <span class="mono">[::]:53</span> to accept IPv4 and IPv6 together.
</div>
</div>
<div class="col-12 col-md-6">
<label class="form-label" for="tcpListen">
TCP listen address {{template "restartbadge"}}
</label>
<input type="text" class="form-control mono" id="tcpListen" name="tcp_listen"
value="{{$s.DNS.TCPListen}}" placeholder="0.0.0.0:53" required>
<div class="form-text">
Currently bound to <span class="mono">{{.Data.BoundTCP}}</span>.
TCP is required: it is how large answers and zone transfers are carried.
</div>
</div>
</div>
</div>
<div class="form-section">
<div class="form-section-title">Recursion</div>
<div class="form-check form-switch mb-2">
<input type="hidden" name="recursion" value="false">
<input class="form-check-input" type="checkbox" role="switch" id="recursion"
name="recursion" value="true" {{if $s.DNS.Recursion}}checked{{end}}>
<label class="form-check-label" for="recursion">
Answer recursive queries for permitted clients
</label>
</div>
<div class="form-text">
With this off, the server answers only from its own authoritative zones and
refuses everything else. Which clients may recurse is controlled on the
<a href="/settings/resolver">Resolver</a> page — that list is what prevents an
open resolver.
</div>
</div>
<div class="form-section">
<div class="form-section-title">EDNS and message sizes</div>
<div class="form-check form-switch mb-3">
<input type="hidden" name="edns_enabled" value="false">
<input class="form-check-input" type="checkbox" role="switch" id="ednsEnabled"
name="edns_enabled" value="true" {{if $s.DNS.EDNSEnabled}}checked{{end}}>
<label class="form-check-label" for="ednsEnabled">Enable EDNS(0)</label>
</div>
<div class="row g-3">
<div class="col-12 col-md-6">
<label class="form-label" for="ednsSize">Advertised UDP buffer size</label>
<input type="number" class="form-control" id="ednsSize" name="edns_udp_size"
value="{{$s.DNS.EDNSUDPSize}}" min="512" max="65535">
<div class="form-text">
1232 bytes is the widely recommended value: it stays under the smallest
path MTU in common use, so answers are not silently lost to fragmentation.
</div>
</div>
<div class="col-12 col-md-6">
<label class="form-label" for="maxUDP">Maximum UDP response size</label>
<input type="number" class="form-control" id="maxUDP" name="max_udp_response"
value="{{$s.DNS.MaxUDPResponse}}" min="512" max="65535">
<div class="form-text">
Larger answers are truncated, which tells the client to retry over TCP.
</div>
</div>
</div>
</div>
<div class="form-section">
<div class="form-section-title">Defaults and behaviour</div>
<div class="row g-3">
<div class="col-12 col-md-4">
<label class="form-label" for="defTTL">Default TTL for new zones</label>
<input type="number" class="form-control" id="defTTL" name="default_ttl"
value="{{$s.DNS.DefaultTTL}}" min="1" max="604800">
<div class="form-text">Seconds</div>
</div>
<div class="col-12 col-md-4">
<label class="form-label" for="tcpIdle">TCP idle timeout</label>
<input type="number" class="form-control" id="tcpIdle" name="tcp_idle"
value="{{$s.DNS.TCPIdleSeconds}}" min="1" max="120">
<div class="form-text">Seconds a TCP connection is kept open between queries</div>
</div>
<div class="col-12 col-md-4 d-flex align-items-center">
<div class="form-check form-switch mt-3">
<input type="hidden" name="expose_version" value="false">
<input class="form-check-input" type="checkbox" role="switch" id="exposeVersion"
name="expose_version" value="true" {{if $s.DNS.ExposeVersion}}checked{{end}}>
<label class="form-check-label" for="exposeVersion">
Answer version.bind
</label>
<div class="form-text">
Off by default: publishing the software version only helps someone
looking for a matching exploit.
</div>
</div>
</div>
</div>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary">
<i class="bi bi-check-lg me-1"></i>Save DNS settings
</button>
</div>
</div>
</div>
</div>
<div class="col-12 col-xl-4">
<div class="card">
<div class="card-header">Service status</div>
<div class="card-body">
<div class="d-flex align-items-center gap-2 mb-3">
<span class="status-dot {{if .Data.Running}}status-up{{else}}status-down{{end}}"></span>
<span class="fw-semibold">
{{if .Data.Running}}Listeners running{{else}}Listeners stopped{{end}}
</span>
</div>
<dl class="row small mb-0">
<dt class="col-5 text-body-secondary">UDP</dt>
<dd class="col-7 mono">{{.Data.BoundUDP}}</dd>
<dt class="col-5 text-body-secondary">TCP</dt>
<dd class="col-7 mono">{{.Data.BoundTCP}}</dd>
<dt class="col-5 text-body-secondary">Recursion</dt>
<dd class="col-7">{{if $s.DNS.Recursion}}enabled{{else}}disabled{{end}}</dd>
</dl>
</div>
</div>
</div>
</div>
</form>
{{end}}