158 lines
7.3 KiB
HTML
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}}
|