<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>BoronDNS - News</title>
    <subtitle>Secondary DNS. Rust-built. Battle-ready.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://cya.hu/news/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://cya.hu/news/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-06-15T00:00:00+00:00</updated>
    <id>https://cya.hu/news/atom.xml</id>
    <entry xml:lang="en">
        <title>BoronGun 0.9 preview: scriptable attack profiles</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://cya.hu/news/borongun-preview/"/>
        <id>https://cya.hu/news/borongun-preview/</id>
        
        <content type="html" xml:base="https://cya.hu/news/borongun-preview/">&lt;p&gt;BoronGun exists so you find your DNS server&#x27;s breaking point before an attacker does. 0.9 makes the load profiles themselves a lot more expressive.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-landing&quot;&gt;What&#x27;s landing&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Weighted query mixes&lt;&#x2F;strong&gt; — define what fraction of traffic is A, AAAA, ANY, or garbage qtypes, instead of a flat round-robin.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Scriptable profiles&lt;&#x2F;strong&gt; — a small Lua surface for generating query names and timing dynamically, instead of replaying a static wordlist.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Per-worker pacing&lt;&#x2F;strong&gt; — smooth a target QPS across workers instead of bursting, useful for testing RRL tuning rather than just raw capacity.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;example-profile&quot;&gt;Example profile&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;profile.qtypes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; { A&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; 0.6&lt;&#x2F;span&gt;&lt;span&gt;, AAAA&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; 0.25&lt;&#x2F;span&gt;&lt;span&gt;, ANY&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; 0.05&lt;&#x2F;span&gt;&lt;span&gt;, NXDOMAIN&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; 0.10&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;profile.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;qname&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; = function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FD971F;font-style: italic;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;quot;load-&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt; (i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; 50000&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;quot;.bench.test.&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;availability&quot;&gt;Availability&lt;&#x2F;h2&gt;
&lt;p&gt;0.9 is in internal testing now. See &lt;a href=&quot;&#x2F;docs&#x2F;borongun&#x2F;&quot;&gt;BoronGun&lt;&#x2F;a&gt; for the current stable docs, and watch this feed for the release announcement.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>BoronDNS 1.0.0-beta.1 released</title>
        <published>2026-06-13T00:00:00+00:00</published>
        <updated>2026-06-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://cya.hu/news/beta-1/"/>
        <id>https://cya.hu/news/beta-1/</id>
        
        <content type="html" xml:base="https://cya.hu/news/beta-1/">&lt;p&gt;We&#x27;re happy to announce the first public beta of BoronDNS.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-in-beta-1&quot;&gt;What&#x27;s in beta.1&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zone transfers&lt;&#x2F;strong&gt; — AXFR and IXFR, with incremental diff tracking&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Zone Transfer over TLS&lt;&#x2F;strong&gt; (XoT, RFC 9103) — encrypted transfers end-to-end&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;DNS cookies&lt;&#x2F;strong&gt; (RFC 9018) — stateless client verification&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Response Rate Limiting&lt;&#x2F;strong&gt; (RRL) — per-client and per-prefix limits&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;TSIG authentication&lt;&#x2F;strong&gt; — HMAC-SHA256 and HMAC-SHA512 for all transfers&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Zero-allocation query path&lt;&#x2F;strong&gt; — no heap allocations per answered query&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;known-limitations-in-beta-1&quot;&gt;Known limitations in beta.1&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;No NOTIFY support yet (planned for 1.0.0)&lt;&#x2F;li&gt;
&lt;li&gt;Metrics endpoint is HTTP only (HTTPS in 1.0.0)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;borondnsctl reload&lt;&#x2F;code&gt; requires a full restart on some platforms&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;installing&quot;&gt;Installing&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;cargo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; install borondns&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;See the &lt;a href=&quot;&#x2F;docs&#x2F;quick-start&#x2F;&quot;&gt;Quick Start guide&lt;&#x2F;a&gt; for full setup instructions.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
&lt;p&gt;The 1.0.0 stable release will add NOTIFY, a Prometheus metrics endpoint over HTTPS,
and verified packages for Debian, Ubuntu, and Alpine.&lt;&#x2F;p&gt;
&lt;p&gt;Full changelog on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;integrity-ltd&#x2F;borondns&#x2F;releases&#x2F;tag&#x2F;v1.0.0-beta.1&quot;&gt;GitHub&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Hardening advisory: tighten default RRL thresholds before you expose port 53</title>
        <published>2026-05-18T00:00:00+00:00</published>
        <updated>2026-05-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://cya.hu/news/rrl-hardening-advisory/"/>
        <id>https://cya.hu/news/rrl-hardening-advisory/</id>
        
        <content type="html" xml:base="https://cya.hu/news/rrl-hardening-advisory/">&lt;p&gt;This is a hardening advisory, not a vulnerability disclosure — but it&#x27;s important enough that we&#x27;re putting it in the news feed rather than burying it in the docs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-issue&quot;&gt;The issue&lt;&#x2F;h2&gt;
&lt;p&gt;BoronDNS ships with conservative RRL (Response Rate Limiting) defaults so that legitimate high-volume resolvers — large public DNS, corporate forwarders — don&#x27;t get throttled out of the box:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[rrl]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;responses_per_second =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; 25&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;window_seconds        =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; 5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;On an open, internet-facing secondary, these defaults leave headroom that can be used to amplify reflection traffic before the limiter engages. They&#x27;re fine behind a network ACL or for internal-only deployments. They are &lt;strong&gt;not&lt;&#x2F;strong&gt; what we&#x27;d recommend for a publicly reachable authoritative server.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-to-change&quot;&gt;What to change&lt;&#x2F;h2&gt;
&lt;p&gt;For any secondary reachable from the open internet, we recommend:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[rrl]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;responses_per_second =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; 5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;window_seconds        =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;slip                   =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;exempt_prefixes        = [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt;&amp;quot;YOUR_MONITORING_CIDR&#x2F;24&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;See &lt;a href=&quot;&#x2F;docs&#x2F;security&#x2F;&quot;&gt;Security Hardening&lt;&#x2F;a&gt; for the full checklist, including the matching firewall and &lt;code&gt;exempt_prefixes&lt;&#x2F;code&gt; guidance.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;will-the-defaults-change&quot;&gt;Will the defaults change?&lt;&#x2F;h2&gt;
&lt;p&gt;We&#x27;re evaluating tightening the shipped defaults in a future release. Until then, treat this as a required step in your rollout checklist, not an optional tuning knob.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Why we built a secondary-only DNS server</title>
        <published>2026-04-02T00:00:00+00:00</published>
        <updated>2026-04-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://cya.hu/news/secondary-only-philosophy/"/>
        <id>https://cya.hu/news/secondary-only-philosophy/</id>
        
        <content type="html" xml:base="https://cya.hu/news/secondary-only-philosophy/">&lt;p&gt;Most authoritative DNS servers try to do everything: primary and secondary, dynamic updates, DNSSEC signing, sometimes even recursive resolution bolted on as an afterthought. BoronDNS does one thing.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-constraint&quot;&gt;The constraint&lt;&#x2F;h2&gt;
&lt;p&gt;BoronDNS only ever serves zones it received via AXFR&#x2F;IXFR from an upstream primary. It never accepts dynamic updates, never signs zones, and has no notion of &quot;primary&quot; mode. That sounds like a limitation — it&#x27;s actually the point.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Smaller attack surface.&lt;&#x2F;strong&gt; No update path means no update-injection class of bugs.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Simpler mental model.&lt;&#x2F;strong&gt; A zone on disk either matches the primary or it&#x27;s actively transferring. There&#x27;s no third state.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Predictable performance.&lt;&#x2F;strong&gt; Every query path is a lock-free read against an immutable snapshot — no contention with writers, because there are no writers in the serving path.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;what-this-means-for-you&quot;&gt;What this means for you&lt;&#x2F;h2&gt;
&lt;p&gt;If you need a primary nameserver, run BIND, Knot, or PowerDNS upstream and point BoronDNS at it as a secondary fleet. That&#x27;s the deployment model we optimize for, and it&#x27;s why the &lt;a href=&quot;&#x2F;docs&#x2F;quick-start&#x2F;&quot;&gt;Quick Start guide&lt;&#x2F;a&gt; assumes an existing primary from line one.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-next&quot;&gt;What&#x27;s next&lt;&#x2F;h2&gt;
&lt;p&gt;We&#x27;re not adding primary-mode support. We are working on wider RFC coverage and a faster zone-reload path — see &lt;a href=&quot;&#x2F;docs&#x2F;rfcs&#x2F;&quot;&gt;Implemented RFCs&lt;&#x2F;a&gt; for where things currently stand.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
