{% from "partials/_macros.html" import card_header %} {% set verdict_cls = { 'malicious': 'bg-red-900/40 text-red-300 border border-red-900/60', 'suspicious': 'bg-amber-900/40 text-amber-300 border border-amber-900/60', 'unknown': 'bg-slate-700/40 text-slate-300 border border-slate-600', 'benign': 'bg-emerald-900/30 text-emerald-300 border border-emerald-900/50', } %} {% set level_cls = { 'DoH (encrypted)': 'bg-sky-900/40 text-sky-300 border border-sky-900/60', 'external DNS': 'bg-amber-900/30 text-amber-300 border border-amber-900/50', 'local resolver': 'bg-slate-800 text-slate-300 border border-slate-700', 'unknown': 'bg-slate-800/60 text-slate-500 border border-slate-700/60', } %}
{{ card_header("DNS queries — what your host is resolving") }} {% if dns and dns.rows %}
{% set s = dns.summary %}
{{ s.domains }}
domains
{{ "{:,}".format(s.queries) }}
queries
{{ s.doh }}
DoH endpoints
{{ s.malicious }}
malicious
{{ s.suspicious }}
suspicious
{% for q in dns.rows %} {% endfor %}
verdict domain resolved via type resolver process queries why
{% if q.verdict %} {{ q.verdict }}{% if q.confidence is not none %} {{ "%.0f"|format(q.confidence * 100) }}% {% endif %} {% else %} {% endif %} {{ q.qname }} {{ q.level }} {{ q.qtype or "—" }} {{ q.server_ip or "—" }} {{ q.process or "—" }} {{ "{:,}".format(q.count or 0) }} {{ q.reasoning }}
{% else %}
no DNS queries captured yet — the collector needs root (run the monitor with sudo) and a capture window to elapse. Plaintext DNS (port 53) is shown here; encrypted DoH appears as a DoH endpoint when detected.
{% endif %}