<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[LuaDNS]]></title>
  <link href="https://www.luadns.com/atom.xml" rel="self"/>
  <link href="https://www.luadns.com/"/>
  <updated>2026-02-21T09:40:54+00:00</updated>
  <id>https://www.luadns.com/</id>
  <author>
    <name><![CDATA[Vitalie Cherpec]]></name>
    
  </author>
  <generator uri="https://jekyllrb.com/">Jekyll</generator>

  
  <entry>
    <title type="html"><![CDATA[Wildcard Certificates with certbot]]></title>
    <link href="https://www.luadns.com/blog/2024/09/20/wildcard.html"/>
    <updated>2024-09-20T00:00:00+00:00</updated>
    <id>https://www.luadns.com/blog/2024/09/20/wildcard</id>
    <content type="html"><![CDATA[<p>Modern computing requires secure communication between devices. Secure
communication is achieved by using encryption with asymmetric key algorithms.
An asymmetric algorithm uses a pair of keys, one of which can be used to
decrypt the information encrypted with the other. </p>

<p>One of the keys is being kept private and the other is public. When a secure
communication is initiated we must ensure that we are talking to the right
entity identified by public key. This part is handled by the PKI (public key
infrastructure).</p>

<p>A trusted third-party attests that the
presented public key by the server belongs to a certain entity. These trusted
third-parties  are called certificate authorities (CA). Currently there are
many trusted CA and you can inspect them in your OS if you are curious.</p>

<p>In recent years <a href="https://letsencrypt.org">Let&#39;s Encrypt</a>, a nonprofit organization which
offers certificates for free, gained more and more popularity.</p>

<p>Using <a href="https://certbot.eff.org">Certbot</a> created by <a href="https://www.eff.org">EFF</a> you can request a Let&#39;s Encrypt
certificate.</p>

<h2 id="install-certbot">Install certbot</h2>

<p>We&#39;ll use a machine with Ubuntu 24.04 with <code>snapd</code>, for other operating systems
please check <u>certbot</u> install <a href="https://certbot.eff.org/instructions">instructions</a>.</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nb">sudo </span>apt update
<span class="nb">sudo </span>apt <span class="nb">install </span>snapd
<span class="nb">sudo </span>snap <span class="nb">install</span> <span class="nt">--classic</span> certbot
<span class="nb">sudo ln</span> <span class="nt">-s</span> /snap/bin/certbot /usr/bin/certbot
<span class="nb">sudo </span>snap <span class="nb">set </span>certbot trust-plugin-with-root<span class="o">=</span>ok
</code></pre></div>
<h2 id="install-certbot-dns-luadns-plugin">Install certbot-dns-luadns plugin</h2>

<p>There are few providers which are shipped by default, unfortunately the LuaDNS
plugin is not yet there so you must install the <code>certbot-dns-luadns</code> plugin.</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nb">sudo </span>snap <span class="nb">install </span>certbot-dns-luadns
</code></pre></div>
<h2 id="get-your-api-key">Get your API key</h2>

<p>Create a new API key accessing <a href="https://app.luadns.com/api_keys">API keys</a> page. You
can restrict it to your domain if you are sure that it will not be used with
other domains.</p>

<h2 id="create-the-ini-file">Create the INI file</h2>

<p>The INI file will be used to store your API authentication credentials (email and API key).</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">root@certbot:~# <span class="nb">cat</span> ~/.luadns.ini
dns_luadns_email <span class="o">=</span> user@example.com
dns_luadns_token <span class="o">=</span> 9ea8a5f5eba25560f09e9dea13379e64
</code></pre></div>
<p>Credentials are required by <u>certbot</u> to add a TXT record to your DNS zone to
prove that you own the domain.</p>

<p>This file should be readable only by root user:</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nb">sudo chmod </span>0600 /root/.luadns.ini
<span class="nb">sudo chown </span>root.root /root/.luadns.ini 
</code></pre></div>
<h2 id="issuing-the-certificate">Issuing the certificate</h2>

<p>We&#39;ll issue a wildcard certificate for <code>mycompany.com</code>, we assume that this
domain is correctly delegated and configured on LuaDNS.</p>

<p>The <u>certbot</u> will make some DNS modifications via API according to Let&#39;s
Encrypt instructions which should be visible on the internet before the
certificate is issued. Usually this is a <code>_acme-challenge.mycompany.com</code> TXT
record containing a long text.</p>
<div class="highlight"><pre><code class="language-" data-lang="">root@certbot:~# certbot certonly --dns-luadns --dns-luadns-credentials ~/.luadns.ini -d '*.mycompany.com'
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for *.mycompany.com
Waiting 30 seconds for DNS changes to propagate

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/mycompany.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/mycompany.com/privkey.pem
This certificate expires on 2024-12-19.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
</code></pre></div>
<p>You can pass also the <code>--dry-run</code> parameter to <u>certbot</u> command to simulate
the certificate issue without issuing, this is useful to debug problems.</p>

<h2 id="common-problems">Common problems</h2>

<p>When you get the following message:</p>

<blockquote>
<p>Unable to determine zone identifier for mycompany.com using zone names: [&#39;mycompany.com&#39;, &#39;com&#39;]. </p>
</blockquote>

<p>This means that <u>certbot</u> could not get access to your zone with the API key you
have provided.</p>

<p>Check that zone exists, the API key is valid and has access to this zone.</p>

<p>Refrences:</p>

<ul>
<li><a href="https://certbot.eff.org/instructions">https://certbot.eff.org/instructions</a></li>
<li><a href="https://certbot-dns-luadns.readthedocs.io/en/stable/">https://certbot-dns-luadns.readthedocs.io/en/stable/</a></li>
</ul>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[HTTPS Record]]></title>
    <link href="https://www.luadns.com/blog/2024/03/06/https-record.html"/>
    <updated>2024-03-06T00:00:00+00:00</updated>
    <id>https://www.luadns.com/blog/2024/03/06/https-record</id>
    <content type="html"><![CDATA[<p>Today we added support for <a href="/help.html#https-record">HTTPS</a> records.
The <a href="https://www.rfc-editor.org/rfc/rfc9460.txt">RFC 9460</a> introduces two new records, one of them is the HTTPS record
which improves the speed, security and efficiency of how the browsers connect
to servers.</p>

<h2 id="the-problem">The Problem</h2>

<p>Currently the browser sends a HTTP request to the server, the server redirects
to HTTPS and then the browser reissues the request over HTTPS where it receives
ALPN (Application-Layer Protocol Negotiation) during the HTTPS handshake.</p>

<p><strong>Example</strong></p>

<ol>
<li><p>Browser issues the request and server responds with redirect:</p>
<div class="highlight"><pre><code class="language-" data-lang="">  &gt;&gt; GET http://www.example.com/ HTTP/1.1
  &gt;&gt; [...]

  &lt;&lt; 301 Moved Permanently
  &lt;&lt; [...]
  &lt;&lt; Location: https://www.example.com/
</code></pre></div></li>
<li><p>Browser follows the redirect and reissues the request after creating a new connection over HTTPS:</p>
<div class="highlight"><pre><code class="language-" data-lang="">  &gt;&gt; GET https://www.example.com/ HTTP/1.1
  &gt;&gt; [...]

  &lt;&lt; HTTP/2 200
  &lt;&lt; [...]
</code></pre></div></li>
</ol>

<p>This introduces a latency because of multiple round trips which impacts the Time to First Byte (TTFB).</p>

<h2 id="the-https-record">The HTTPS Record</h2>

<p>The RFC 9460 allows specification of connection details into DNS to reduce the
steps required to establish the connection and to add failover details. It
incorporates the <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Alt-Svc">Alt-Svc HTTP</a> header and ALPN TLS extension directly into DNS.</p>

<p>Format:</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="n">https</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">svc_prio</span><span class="p">,</span> <span class="n">svc_params</span><span class="p">,</span> <span class="n">ttl</span><span class="p">)</span>
</code></pre></div>
<p>A HTTPS record can be configured in two modes Alias Mode (SvcPrio = 0) or Service Mode (SvcPrio != 0). </p>

<h3 id="alias-mode">Alias Mode</h3>

<p>In alias mode, svc_prio is zero and svc_params list is empty.</p>

<p>The HTTPS record removes the limitation of CNAME with apex domains when used in alias mode.
This was designed as a replacement for <a href="/help.html#alias-record">ALIAS</a>/ANAME record type workaround.</p>

<p>It instructs the browsers to connect directly to the CDN service specified by
target.</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- Create an alias for the apex domain because we can't add a CNAME on the root domain.</span>
<span class="c1">-- The CNAME should be alone but we have at least a SOA record and NS records already.</span>
<span class="n">https</span><span class="p">(</span><span class="s2">""</span><span class="p">,</span> <span class="s2">"d8e8fca2dc0f896fd7cb4cb0031ba249.cloudfront.net"</span><span class="p">)</span>
</code></pre></div>
<h3 id="service-mode">Service Mode</h3>

<p>In the service mode the svc_prio is greater than zero and a optional list of key=value (svc_params) are specified.</p>

<p>Examples:</p>

<ol>
<li><p>Failover</p>

<p>A configuration with two services for www name. We instruct browsers to
try alternative services in a specific order (svc1, svc2) in the case of failures.</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- Lower svc_prio numbers have higher priority</span>
<span class="n">https</span><span class="p">(</span><span class="s2">"www"</span><span class="p">,</span> <span class="s2">"svc1.example.net"</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
<span class="n">https</span><span class="p">(</span><span class="s2">"www"</span><span class="p">,</span> <span class="s2">"svc2.example.net"</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
</code></pre></div></li>
<li><p>Load Balancing</p>

<p>A load balancing configuration with two services (svc1 and svc2) for www, we
use the same svc_prio value to distribute the load.</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="n">https</span><span class="p">(</span><span class="s2">"www"</span><span class="p">,</span> <span class="s2">"svc1.example.net"</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
<span class="n">https</span><span class="p">(</span><span class="s2">"www"</span><span class="p">,</span> <span class="s2">"svc2.example.net"</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
</code></pre></div></li>
<li><p>Encrypted ClientHello (ECH)</p>

<p>Distribute public key, it&#39;s recommended to enable DNSSEC for better security.</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="n">https</span><span class="p">(</span><span class="s2">"app"</span><span class="p">,</span> <span class="s2">"svc3.example.net"</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">{</span><span class="n">alpn</span><span class="o">=</span><span class="s2">"http/1.1,h2"</span><span class="p">,</span> <span class="n">ech</span><span class="o">=</span><span class="s2">"base64_public_key"</span><span class="p">})</span>
</code></pre></div></li>
</ol>

<h2 id="support">Support</h2>

<p>Currently all major browsers support HTTPS record.</p>

<ul>
<li><a href="https://chromestatus.com/feature/6196703843581952">Chrome</a> 117+</li>
<li>Firefox 118+</li>
<li>Safari (since September, 2020)</li>
</ul>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SSH Key Authentication]]></title>
    <link href="https://www.luadns.com/blog/2019/10/07/ssh-key-autentication.html"/>
    <updated>2019-10-07T00:00:00+00:00</updated>
    <id>https://www.luadns.com/blog/2019/10/07/ssh-key-autentication</id>
    <content type="html"><![CDATA[<p>Last week we worked to simplify the setup required for <a href="/help.html#git-integration">git integration</a>.
Until now we supported only repositories hosted on GitHub and Bitbucket,
authentication was done using special <code>luadns</code> users which was a legacy
of options available in 2011 when we built this service.</p>

<p>We moved now to a more general solution based on SSH keys authentication,
this allows you to use other hosts or self-hosted (Gitea/Gogs, etc) repositories.</p>

<p>If you are using git integration already, please migrate to SSH key authentication.
You&#39;ll find your public key in the <a href="https://app.luadns.com/settings">settings</a>
your public key which you can use to grant access to your git repository.</p>

<h2 id="two-factor-authentication-2fa">Two-Factor Authentication (2FA)</h2>

<p>It&#39;s been more than a year since we introduced two-factor authentication,
although this feature is optional we recommend to enable it on
your account for an extra layer of security.</p>

<h2 id="anycast-network-updates">Anycast Network Updates</h2>

<p>To improve response time and a better name servers distribution we launched 3 new POPs:</p>

<ul>
<li>Seattle, USA</li>
<li>Singapore</li>
<li>Sydney, Australia</li>
</ul>

<p>Currently we run 22 POPs located in USA, Europe, Africa, Asia &amp; Australia.</p>

<p>We are still testing new locations and we plan to introduce soon new POPs in
India, Brazil and South Africa.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Anycast DNS]]></title>
    <link href="https://www.luadns.com/blog/2017/12/10/anycast.html"/>
    <updated>2017-12-10T00:00:00+00:00</updated>
    <id>https://www.luadns.com/blog/2017/12/10/anycast</id>
    <content type="html"><![CDATA[<p>Today we have to announce that we successfully migrated to Anycast DNS,
this is was a major achievement in our multi year roadmap.</p>

<h2 id="why-anycast-dns">Why Anycast DNS?</h2>

<p>In Anycast a collection of servers share the same IP address and users are routed
via BGP (Border gateway protocol) the closest data center. This leads to better
response time and resilience against failures because the same set of name servers
are distributed over multiple data centers.</p>

<p>Currently we are operating Anycast network via our custom AS number and our
own prefixes:</p>

<ul>
<li>ASN: 41954</li>
<li>IPv4: 185.142.218.0/24</li>
<li>IPv6: 2001:67c:25a0::/48</li>
<li>22 POPs: <a href="/about.html#infrastructure">USA, Europe, Africa, Asia &amp; Australia</a></li>
</ul>

<p><img src="/assets/anycast_rtt-43cf5adbbcdba737887c61cf416714fe.png" alt="Anycast DNS switch response time" class="img-responsive"></p>

<p>As you can see from the graph, the response time improved after migration to Anycast DNS.</p>

<h2 id="migration">Migration</h2>

<p>Current set of Unicast DNS servers will be ceased on <u>February 1, 2018</u>. If you use
LuaDNS name servers (ns1-4.luadns.net) you are using the new Anycast servers already
you don&#39;t have to do anything.</p>

<p>Users using LuaDNS servers via custom domain (vanity name servers) will have to update
the IP addresses of name servers to point them the new IP address (zone &amp; registrar):</p>

<ul>
<li>ns1.luadns.net (185.142.218.1, 2001:67c:25a0::1)</li>
<li>ns2.luadns.net (185.142.218.2, 2001:67c:25a0::2)</li>
<li>ns3.luadns.net (185.142.218.3, 2001:67c:25a0::3)</li>
<li>ns4.luadns.net (185.142.218.4, 2001:67c:25a0::4)</li>
</ul>

<p>The IP address for AXFR transfers is axfr.luadns.net (108.61.179.251).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CAA Record]]></title>
    <link href="https://www.luadns.com/blog/2017/06/18/caa-record.html"/>
    <updated>2017-06-18T00:00:00+00:00</updated>
    <id>https://www.luadns.com/blog/2017/06/18/caa-record</id>
    <content type="html"><![CDATA[<p>Today we are pleased to announce support for <a href="/help.html#caa-record">CAA record</a>.</p>

<h2 id="what-is-caa">What is CAA?</h2>

<p><a href="/help.html#caa-record">CAA</a> (Certificate Authority Authorization) is a new DNS record
(along with the classical A, AAAA, CNAME, TXT, MX, SPF etc) defined
in <a href="https://tools.ietf.org/html/rfc6844">RFC 6844</a> since January 2013.</p>

<h2 id="why-we-need-caa">Why We Need CAA?</h2>

<p>A Certificate Authority (CA) is a entity that issues digital
certificates for domains. It acts as a trusted third-party between
owner of the certificate and the party relying on the certificate.</p>

<p>Two years ago, Google security engineers, discovered that a Chinese certificate
authority <a href="https://security.googleblog.com/2015/03/maintaining-digital-certificate-security.html">issued unauthorized certificates for several Google domains</a>
and could have issued digital certificates for virtually any domain.
This serious security issue can be avoided by using CAA records.</p>

<h2 id="why-now">Why Now?</h2>

<p>All certificate authorities &amp; browsers will have to implement CAA checking
starting <u>September 2017</u>, after a vote during <a href="https://cabforum.org/pipermail/public/2017-March/009988.html">CA/Browser forum</a>,
held in March 2017.</p>

<p>CAA records are not mandatory for users, but CAA records are encouraged
for increased security of internet domains.
Not using CAA records means that any certificate authority can issue a
certificate for your domain and there are many, just check your trusted
certificates from your OS and/or browser.</p>

<h2 id="usage">Usage</h2>

<p>To whitelist the certificate authorities which can emit digital certificates
for your domain use <code>caa</code> function.</p>

<p>Syntax:</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- @name    = relative name</span>
<span class="c1">-- @value   = value</span>
<span class="c1">-- @tag     = tag (issue, issuewild, iodef, default: issue)</span>
<span class="c1">-- @flag    = flag (default: 0)</span>
<span class="c1">-- @ttl     = TTL (default: user default TTL)</span>
<span class="n">caa</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">flag</span><span class="p">,</span> <span class="n">ttl</span><span class="p">)</span>
</code></pre></div>
<p>For example, if you use <code>letsencrypt.org</code> for issuing a certificate for your
domain, the syntax for your CAA record would be:</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- example.com.lua</span>
<span class="n">caa</span><span class="p">(</span><span class="s2">""</span><span class="p">,</span> <span class="s2">"letsencrypt.org"</span><span class="p">,</span> <span class="s2">"issue"</span><span class="p">)</span>
</code></pre></div>
<p>This means only <a href="https://letsencrypt.org/">letsencrypt.org</a> can issue certificates for your domain.
If you use multiple certificate authorities then you&#39;ll need to add
a CAA record for each authority. To include subdomains set tag to <code>issuewild</code>
instead of <code>issue</code>, it covers only first level of subdomains.</p>

<p>The <code>iodef</code> tag allows you to define an URL where you can be
notified when a certificate authority receives a certificate
request for a domain, but the CAA record denies it.</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- example.com.lua</span>
<span class="n">caa</span><span class="p">(</span><span class="s2">""</span><span class="p">,</span> <span class="s2">"letsencrypt.org"</span><span class="p">,</span> <span class="s2">"issue"</span><span class="p">)</span>
<span class="n">caa</span><span class="p">(</span><span class="s2">""</span><span class="p">,</span> <span class="s2">"mailto:me@example.com"</span><span class="p">,</span> <span class="s2">"iodef"</span><span class="p">)</span>
</code></pre></div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Redirect Record]]></title>
    <link href="https://www.luadns.com/blog/2015/02/15/http-redirect.html"/>
    <updated>2015-02-15T00:00:00+00:00</updated>
    <id>https://www.luadns.com/blog/2015/02/15/http-redirect</id>
    <content type="html"><![CDATA[<p>We are introducing a new handy peseudo record,
the <a href="/help.html#redirect-record">REDIRECT</a> record.
This new feature will help you to configure HTTP redirects
for your domains/subdomains from the web interface and git.</p>

<h2 id="problem">Problem</h2>

<p>Sometimes you need to redirect a domain/subdomain to another URL,
to achieve this you need a web server which will do the redirects
and then you need to point the domains to this server from the DNS.</p>

<h2 id="solution">Solution</h2>

<p>Now you can use LuaDNS to achieve this in a single step
without the overhead of maintaining an external web server.
We&#39;ve implemented a redirection service integrated with
your LuaDNS account. To add a HTTP redirect for a domain/subdomain
all you need is to add a simple <a href="/help.html#redirect-record">REDIRECT</a>
record to your configuration.</p>

<h2 id="how-it-works">How it works</h2>

<p>When you add a REDIRECT record the LuaDNS will configure
the redirection service and will point the redirected
domains/subdomains to it. There are three modes of
redirection:</p>

<ul>
<li>Relative redirect - the server issues a <code>301</code> redirect, the request path and query string are appended to destination URL</li>
<li>Exact redirect - the path and query string is discarded and visitors are redirected to destination URL with <code>301</code> status code</li>
<li>Frame masking - the destination is loaded in a HTML frame</li>
</ul>

<p>Syntax:</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- @name   = relative name or '*'</span>
<span class="c1">-- @target = target url</span>
<span class="c1">-- @mode   = redirect mode (0=relative, 1=exact, 2=frame, default: 0)</span>
<span class="c1">-- @ttl    = cache TTL (default: user default TTL)</span>
<span class="n">redirect</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">mode</span><span class="p">,</span> <span class="n">ttl</span><span class="p">)</span>
</code></pre></div>
<p>Example:</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- File: example.com.lua</span>
<span class="c1">-- _a variable is set by the system to zone name</span>
<span class="c1">-- _a = "example.com"</span>

<span class="c1">-- # Relative redirect</span>
<span class="c1">-- redirect apex/naked domain to www</span>
<span class="c1">-- Example: example.com/foo?q=param -&gt; www.example.com/foo?q=param</span>
<span class="n">redirect</span><span class="p">(</span><span class="n">_a</span><span class="p">,</span> <span class="s2">"http://www."</span> <span class="o">..</span> <span class="n">_a</span> <span class="o">..</span> <span class="s2">"/"</span><span class="p">)</span>

<span class="c1">-- # Exact redirect</span>
<span class="c1">-- redirect http://mail.example.com/* to http://mail.provider.com/</span>
<span class="c1">-- Example: http://mail.example.com/foo?q=param -&gt; http://mail.provider.com/</span>
<span class="n">redirect</span><span class="p">(</span><span class="s2">"webmail"</span><span class="p">,</span> <span class="s2">"http://mail.provider.com/"</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>

<span class="c1">-- # Frame redirect</span>
<span class="c1">-- redirect http://mail.example.com/ to http://www.provider.com/ using a HTML frame</span>
<span class="n">redirect</span><span class="p">(</span><span class="s2">"mail"</span><span class="p">,</span> <span class="s2">"http://mail.provider.com/"</span><span class="p">)</span>
</code></pre></div>
<h2 id="other-changes">Other Changes</h2>

<ul>
<li>Improved web interface</li>
</ul>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Alias Record]]></title>
    <link href="https://www.luadns.com/blog/2014/05/15/alias-record.html"/>
    <updated>2014-05-15T00:00:00+00:00</updated>
    <id>https://www.luadns.com/blog/2014/05/15/alias-record</id>
    <content type="html"><![CDATA[<p>Today we are introducing the <a href="/help.html#alias-record">ALIAS Record</a>,
this pseudo record allows you to add CNAME functionality
to root (naked, apex, bare) domains.</p>

<h2 id="the-problem">The problem</h2>

<p>Many PaaS/service providers (Ex: Heroku, AppFog,
dotCloud, GitHub Pages, etc) are requiring a CNAME
record to work properly with custom domains. 
The DNS standards impose a restriction regarding
CNAME records, when using a CNAME no other data
should exists for that name. A CNAME at root is
not a valid configuration because a minimum zone
definition includes at least one SOA record and
one NS record.</p>

<h2 id="solution">Solution</h2>

<p>To avoid this CNAME restriction with root domains
the ALIAS pseudo record should be used. </p>

<h2 id="how-it-works">How it Works</h2>

<p>The build system flattens the CNAME record
resolving the CNAME and returning directly the
IP4 &amp; IPv6 addresses instead of CNAME.</p>

<p>Alias Syntax:</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="n">alias</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">ttl</span><span class="p">)</span>
</code></pre></div>
<p>When you are creating an ALIAS record, the <code>target</code>
is automatically resolved and A &amp; AAAA are injected
for the <code>name</code>. The <code>target</code> is polled periodically and
A &amp;&amp; AAAA records are updated when changes occurs.
Polling frequency is using the <code>ttl</code> parameter.</p>

<p>The DNS provider for <code>target</code> may use multiple IP
addresses in a Round Robin DNS configuration.
While resolving <code>target</code> multiple DNS queries
are issued in order to capture multiple unique
IP addresses (up to 4 x IPv4 and 4 x IPv6).</p>

<h2 id="usage">Usage</h2>

<p>Example usage of <code>ALIAS</code> record:</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- templates/heroku.lua</span>
<span class="k">function</span> <span class="nf">heroku_app</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">app</span><span class="p">)</span>
  <span class="c1">-- Use alias for root domain</span>
  <span class="c1">-- Syntax: alias(name, target, ttl)</span>
  <span class="n">alias</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">app</span><span class="p">,</span> <span class="mi">300</span><span class="p">)</span>

  <span class="c1">-- Use a CNAME for www</span>
  <span class="c1">-- Syntax: cname(name, target, ttl)</span>
  <span class="n">cname</span><span class="p">(</span><span class="n">concat</span><span class="p">(</span><span class="s2">"www"</span><span class="p">,</span> <span class="n">root</span><span class="p">),</span> <span class="n">app</span><span class="p">)</span>
<span class="k">end</span>

<span class="c1">-- example.com.lua</span>
<span class="n">heroku_app</span><span class="p">(</span><span class="n">_a</span><span class="p">,</span> <span class="s2">"myapp.herokuapp.com"</span><span class="p">)</span>
</code></pre></div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Yes, we are alive!]]></title>
    <link href="https://www.luadns.com/blog/2014/04/10/yes-we-are-alive.html"/>
    <updated>2014-04-10T00:00:00+00:00</updated>
    <id>https://www.luadns.com/blog/2014/04/10/yes-we-are-alive</id>
    <content type="html"><![CDATA[<p>It&#39;s been a long time since we didn&#39;t posted to our blog.
I would like to answer to one of the questions we do receive
frequently:</p>

<p><strong>Yes, we are alive! :)</strong></p>

<p>I think we need offer you some explanations, in 2012 I&#39;ve became a 
father and this is the greatest experience of my life. While everything
was running smoothly it kept me busy for a while.</p>

<p>We have great news, we deployed a new release with the following
changes:</p>

<h2 id="platform">Platform</h2>

<p>The new platform is based on <a href="https://golang.org/">Go</a>
and <a href="https://angularjs.org/">AngularJS</a> which allows us to process
your configuration files and deploy them to name servers much faster
using a tiny fraction of the previous resources:</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND      
10805 lua-srv   20   0  606m  18m  360 S  0.0  3.7  10:31.18 server       
10834 lua-sbx   20   0  339m  11m    4 S  0.0  2.4   0:03.55 sandbox      
10433 lua-wrk   20   0  396m  10m  468 S  0.0  2.1   0:00.10 worker       
</code></pre></div>
<h2 id="web-interface">Web Interface</h2>

<p>We are introducing an experimental web interface
which allows you to edit records directly from browser.
Although we still believe that
<a href="https://en.wikipedia.org/wiki/Source_Control_Management">git</a>
is the proper way of manage configuration files, some
people find git requirement as a big barrier.
The git workflow is now optional now.</p>

<h2 id="templates-directory">Templates Directory</h2>

<p>Previously the templates were stored in one file
(<code>templates.lua</code>) which is inconvenient if you have
multiple templates. With this release templates can
be group and stored in separate <code>.lua</code> files in 
<code>templates</code> directory located in root of your git
repository (Thank you <a href="https://grahamc.com/">Graham</a>!).</p>

<h2 id="removed-features">Removed Features</h2>

<p>Due to low usage Amazon Route 53 integration was removed,
high availability still can be achieved adding
more <a href="/help.html#system-functions">slaves</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Amazon Route 53 integration]]></title>
    <link href="https://www.luadns.com/blog/2012/09/24/amazon-route-53-integration.html"/>
    <updated>2012-09-24T00:00:00+00:00</updated>
    <id>https://www.luadns.com/blog/2012/09/24/amazon-route-53-integration</id>
    <content type="html"><![CDATA[<p>Domain Name System is the <a href="https://en.wikipedia.org/wiki/Achilles&#x27;_heel">Achilles&#39;</a>
<a href="https://news.cnet.com/DNS-servers--an-Internet-Achilles-heel/2100-7349_3-5816061.html">Heel</a>
of the Internet, when it fails everything falls.
We know your needs and we know our limits, this is the reason
why we have implemented <a href="/help.html">integration</a>
with <strong>Amazon Route 53</strong> service instead of building our anycast network.
Now, you can benefit from Amazon&#39;s <strong>anycast network</strong> to
get high availability and improved performance.</p>

<p>To use our service together with Route 53, you need to
<a href="/help.html">grant permission</a> to LuaDNS on
your Route 53 account and to <a href="https://app.luadns.com/settings">add</a> your
AWS credentials (Access Key and Secret Access Key) to your
LuaDNS <a href="https://app.luadns.com/settings">account</a>.</p>

<p>After account setup, specify which domains should be exported
to Route 53, add a file named <strong>domains.route53</strong> to root of
your git repository with one domain per line or * to export
all domains.</p>

<p>To migrate your <strong>Bind</strong> zone files to Amazon Route 53 platform,
add configuration files to your git repository using <u>.bind</u>
extension and push modifications with git. LuaDNS will parse
your configuration files and emit corresponding API calls to
AWS Route 53. We&#39;ll automatically maintain SOA record and
update domain&#39;s NS records with name servers returned by Route 53.</p>

<ul>
<li>Easy to try</li>
<li>No API calls</li>
<li>No need to convert</li>
<li>No lock-in</li>
<li>Free magic :)</li>
</ul>

<p>UPDATE: Due low usage, the integration with Route 53 was removed.</p>

<p>References:</p>

<ul>
<li><a href="https://blog.cloudflare.com/65gbps-ddos-no-problem">How to Launch a 65Gbps DDoS, and How to Stop One</a> (cloudflare.com)</li>
<li><a href="https://status.fogcreek.com/2012/07/fog-creek-products-dns-issue-post-mortem.html">Fog Creek products DNS issue post-mortem</a> (fogcreek.com)</li>
<li><a href="https://blog.appfog.com/dns-outage-report/">DNS Outage Report</a> (appfog.com)</li>
<li><a href="https://news.ycombinator.com/item?id=4280345">Zerigo DNS services down for 6+ hours due to massive DDoS</a> (ycombinator.com)</li>
</ul>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Bind zone files]]></title>
    <link href="https://www.luadns.com/blog/2012/05/15/bind-zone-files.html"/>
    <updated>2012-05-15T00:00:00+00:00</updated>
    <id>https://www.luadns.com/blog/2012/05/15/bind-zone-files</id>
    <content type="html"><![CDATA[<p>We have noticed that our new users are finding hard to migrate their
configuration files to our Lua zone file format, to solve this issue we&#39;ve decided
to add native support for Bind zone files to our service.</p>

<h2 id="how-does-it-work">How does it work?</h2>

<p>Bind zone files can be easily deployed to our name servers with Git in
the same way as Lua zone files.</p>

<p>Users have the option to store their configurations in standard
Bind format or to use more powerful Lua format. Bind zone files can
be mixed with Lua zone files in the same Git repository
(<em>Lua files have higher priority</em>).</p>

<p>To get started, follow <a href="/blog/2012/04/18/how-to-manage-your-dns-with-github">previous post</a>
to setup your Git repository. Add your Bind files to repository using <em>.bind</em>
extension (<em>Example: mydomain.com.bind</em>) and push your modifications with <code>git push origin master</code>.</p>

<p>After <code>git push</code> command, shortly you&#39;ll receive an email with the status of the deployment.</p>

<div class="warn">
With Bind zone format, SOA record is maintained automatically and
domain NS records are updated to reflect LuaDNS name servers.
</div>

<p>Check the <a href="/help.html">documentation</a> page for updates and <a href="https://github.com/luadns/dns">example</a> repository.</p>

<h2 id="supported-directives">Supported directives</h2>

<ul>
<li>$TTL</li>
<li>$ORIGIN </li>
</ul>

<h2 id="supported-records">Supported records</h2>

<ul>
<li>A</li>
<li>AAAA</li>
<li>CNAME</li>
<li>MX</li>
<li>NS</li>
<li>PTR</li>
<li>SOA</li>
<li>SPF</li>
<li>SRV</li>
<li>TXT</li>
</ul>

<h2 id="example-bind-zone">Example Bind zone:</h2>
<div class="highlight"><pre><code class="language-" data-lang="">; File: example.org.bind
; Zone: example.org

; Default origin is computed from the file name,
; you may change the origin with $ORIGIN directive
; Example:
; $ORIGIN example.org.

; Default TTL is account's [default TTL](https://app.luadns.com/settings),
; you may change the default TTL with $TTL directive
; Example:
; $TTL 3600             ; 1 hour

; The system will generate and maintain domain's SOA record automatically,
; SOA records found in *.bind files are simply ignored
example.org.        IN  SOA   ns1.bind.net.   hostmaster.bind.net.  (
                              2012050901  ; serial
                              20m         ; refresh (20 minutes)
                              2m          ; retry (2 minutes)
                              1w          ; expire (1 week)
                              1h          ; minimum (1 hour)
                              )

; Domain NS records are replaced with system name servers
                        NS      ns1.bind.net.
                        NS      ns2.bind.net.
                        NS      ns3.bind.net.
                        NS      ns4.bind.net.

; The rest of records
@                       A       1.1.1.1
@                       MX      5 aspmx.l.google.com.

www                     CNAME   example.org.
mail                    CNAME   ghs.google.com.

; SPF record, see http://www.openspf.org/
@                       TXT     "v=spf1 a mx include:_spf.google.com ~all"

; SIP service available at the host sip.example.com
_sip._udp               SRV     0 0 5060 sip.example.com.


</code></pre></div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to manage your DNS with GitHub]]></title>
    <link href="https://www.luadns.com/blog/2012/04/18/how-to-manage-your-dns-with-github.html"/>
    <updated>2012-04-18T00:00:00+00:00</updated>
    <id>https://www.luadns.com/blog/2012/04/18/how-to-manage-your-dns-with-github</id>
    <content type="html"><![CDATA[<p><a href="/">LuaDNS</a> is a managed DNS service. <a href="https://git-scm.com/">Git</a> is used to manage domains and <a href="https://www.lua.org">Lua</a>
scripts to generate DNS records, changes are deployed to name servers with a simple <code>git push</code>.</p>

<h2 id="whats-wrong-with-traditional-aproach">What&#39;s wrong with traditional aproach?</h2>

<p>In our opinion, DNS configurations are best expressed with simple text files.
The problem is that Bind syntax is <a href="#update1">too noisy</a> and managing tens or hundreds of
domains through a web interface is not a pleasant task.</p>

<h2 id="luadns-platform">LuaDNS platform</h2>

<p>LuaDNS borrowed <a href="https://en.wikipedia.org/wiki/Convention_over_configuration">convention over configuration</a>
philosophy from <a href="https://en.wikipedia.org/wiki/Ruby_on_Rails">Rails</a>.
To accompish it&#39;s task LuaDNS is following a few conventions, once you&#39;ll understand them you&#39;ll love them. :)</p>

<p>It exploits defaults to the maximum to make configurations simple and clear.
Why same thing should be expressed over and over? If we are comfortable with defaults,
why we should pollute our configurations? <a href="/help.html#aliases">Domain aliases</a>
should be expressed easily.</p>

<ul>
<li><strong>Why source control ?</strong><br/>
When working in teams, ability to track changes (who, when, what)
and changes reverting are very important.</li>
<li><strong>Why scripting ?</strong><br/>
Repetitive tasks can be scripted into functions to fight complexity.
Lua is a mature scripting language, designed decade ago and used in
<a href="https://sites.google.com/site/marbux/home/where-lua-is-used">many</a> large projects.</li>
</ul>

<p>LuaDNS supports most common Resource Records (RR):</p>

<p><a href="/help.html#a-record">A</a>,
<a href="/help.html#aaaa-record">AAAA</a>,
<a href="/help.html#cname-record">CNAME</a>,
<a href="/help.html#mx-record">MX</a>,
<a href="/help.html#ns-record">NS</a>,
<a href="/help.html#ptr-record">PTR</a>,
<a href="/help.html#soa-record">SOA</a>,
<a href="/help.html#spf-record">SPF</a>,
<a href="/help.html#srv-record">SRV</a>,
<a href="/help.html#txt-record">TXT</a></p>

<h2 id="initial-configuration">Initial configuration</h2>

<p>To use LuaDNS platform you&#39;ll need a <a href="https://app.luadns.com/signup">LuaDNS account</a> and a GitHub repository.
Follow this easy steps:</p>

<ol>
<li><a href="https://github.com/repositories/new">Create</a> a new git repository on GitHub:

<ul>
<li>Project Name: <strong>dns</strong></li>
</ul></li>
<li>Create a local repository and connect it to freshly created GitHub repository
(replace <strong>USER</strong> with your GitHub username):
<pre>
mkdir dns
cd dns
git init
echo &#39;DNS settings, more on: <a href="https://www.luadns.com/">https://www.luadns.com/</a>&#39; &gt; README.md
git add README.md
git commit -m &#39;first commit&#39;
git remote add origin <a href="mailto:git@github.com">git@github.com</a>:USER/dns.git
git push -u origin master
</pre></li>
<li><a href="https://app.luadns.com/settings">Edit</a> your LuaDNS account and set your source repository
(replace <strong>USER</strong> with your GitHub username).
<pre>
<a href="mailto:git@github.com">git@github.com</a>:USER/dns.git
</pre></li>
<li>Configure your GitHub repository to notify LuaDNS when you push changes to it,
add a Post-Receive Hook<br/>
(Admin -&gt; Service Hooks -&gt; Post-Receive URL):<br/>
<code>https://api.luadns.com/notifications/YOUR_API_KEY/push</code><br/>
<em>(You&#39;ll find your API_KEY in the <a href="https://app.luadns.com/api_keys">API Keys</a> page)</em></li>
</ol>

<p>After initial configuration, you are ready to proceed to next step, zone configuration.</p>

<h2 id="example-domain">Example domain</h2>

<p>We&#39;ll show you an example using domain <strong>example.com</strong>, but you should replace <strong>example.com</strong>
with your domain name.</p>

<p>Change to your git repository created in previous section and add an &quot;example.com&quot;
zone to repository to it:</p>
<div class="highlight"><pre><code class="language-" data-lang="">touch example.com.lua templates.lua
git add example.com.lua templates.lua
</code></pre></div>
<p>Edit <strong>example.com.lua</strong> and paste the following content:</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- File: example.com.lua</span>
<span class="c1">-- Zone: example.com</span>
<span class="c1">-- _a variable is replaced with zone name "example.com"</span>

<span class="c1">-- ## GitHub pages example</span>
<span class="c1">-- More info in "Custom Domains" section here: https://help.github.com/pages/</span>
<span class="n">a</span><span class="p">(</span><span class="n">_a</span><span class="p">,</span> <span class="s2">"204.232.175.78"</span><span class="p">)</span>
<span class="n">cname</span><span class="p">(</span><span class="s2">"www"</span><span class="p">,</span> <span class="s2">"charlie.github.com"</span><span class="p">)</span>

<span class="c1">-- ## Google Apps example</span>
<span class="c1">-- We'll host our mail on Google Apps, because we have multiple domains using</span>
<span class="c1">-- Google Apps, we'll save snippet as a template (Lua function).</span>
<span class="c1">-- All templates should go to templates.lua file.</span>
<span class="n">google_app</span><span class="p">(</span><span class="n">_a</span><span class="p">)</span>
</code></pre></div>
<p>Save the following Lua code to <strong>templates.lua</strong>:</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- File: templates.lua</span>
<span class="c1">-- This file is executed before each .lua file</span>
<span class="c1">-- shared code/templates should reside here.</span>

<span class="k">function</span> <span class="nf">google_app</span><span class="p">(</span><span class="n">domain</span><span class="p">)</span>
  <span class="c1">-- mail exchangers</span>
  <span class="n">mx</span><span class="p">(</span><span class="n">domain</span><span class="p">,</span> <span class="s2">"aspmx.l.google.com"</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
  <span class="n">mx</span><span class="p">(</span><span class="n">domain</span><span class="p">,</span> <span class="s2">"alt1.aspmx.l.google.com"</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
  <span class="n">mx</span><span class="p">(</span><span class="n">domain</span><span class="p">,</span> <span class="s2">"alt2.aspmx.l.google.com"</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
  <span class="n">mx</span><span class="p">(</span><span class="n">domain</span><span class="p">,</span> <span class="s2">"aspmx2.googlemail.com"</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
  <span class="n">mx</span><span class="p">(</span><span class="n">domain</span><span class="p">,</span> <span class="s2">"aspmx3.googlemail.com"</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
  <span class="c1">-- mail.domain.com alias</span>
  <span class="n">cname</span><span class="p">(</span><span class="n">concat</span><span class="p">(</span><span class="s2">"mail"</span><span class="p">,</span> <span class="n">domain</span><span class="p">),</span> <span class="s2">"ghs.google.com"</span><span class="p">)</span>
  <span class="c1">-- SPF record</span>
  <span class="n">spf</span><span class="p">(</span><span class="n">domain</span><span class="p">,</span> <span class="s2">"v=spf1 a mx include:_spf.google.com ~all"</span><span class="p">)</span>
<span class="k">end</span>
</code></pre></div>
<h2 id="deploying">Deploying</h2>

<p>Now you are ready to to push your DNS configurations to LuaDNS servers through GitHub.</p>
<div class="highlight"><pre><code class="language-" data-lang="">git commit -m "add example.com domain" .
git push origin master
</code></pre></div>
<p>After <code>git push</code> command, you&#39;ll receive an email from <a href="/">LuaDNS.com</a> with the status of your changes.
If everything is OK (domains and records are validated on each push), your domains and records will
be deployed to name servers, if errors are found you&#39;ll receive details about the problems
so you can fix them and try again.</p>

<h2 id="changing-name-servers-at-your-registrar">Changing name servers at your registrar</h2>

<p>After successful deployment, you are ready to switch to LuaDNS name servers
<em>(more about name servers <a href="/about.html#infrastructure">here</a>)</em>:</p>

<ul>
<li>ns1.luadns.net</li>
<li>ns2.luadns.net</li>
<li>ns3.luadns.net</li>
<li>ns4.luadns.net</li>
</ul>

<h2 id="open-source">Open Source</h2>

<p>LuaDNS service was built using many open source technologies. To support open source movement
we are offering a special package to open source projects, more info <a href="/open-source.html">here</a>.</p>

<div class="warn">
  Alhtough DNS is intended to <strong>publish</strong> information,
  in some cases you may want to keep your domains and records private,
  to accompish this, mark your repository as private.
  <a href="https://bitbucket.org/">Bitbucket</a> is offering <u>free private</u> repositories
  (don't forget to configure <a href="/help.html#git-integration">repository permissions</a>).
</div>

<p><a name="update1" href="#"></a>
<strong>Update:</strong></p>

<ol>
<li>&quot;Too noisy&quot; when dealing with multiple domains sharing the same records/similar set of records (a common case).</li>
</ol>

<h2 id="references">References:</h2>

<ol>
<li>Documentation - <a href="/help.html">https://www.luadns.com/help.html</a></li>
<li>Example repository - <a href="https://github.com/luadns/dns">https://github.com/luadns/dns</a></li>
<li>GitHub - <a href="https://github.com">https://github.com</a></li>
<li>Bitbucket - <a href="https://bitbucket.org">https://bitbucket.org</a></li>
</ol>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[AXFR transfers]]></title>
    <link href="https://www.luadns.com/blog/2012/04/14/axfr-transfers.html"/>
    <updated>2012-04-14T00:00:00+00:00</updated>
    <id>https://www.luadns.com/blog/2012/04/14/axfr-transfers</id>
    <content type="html"><![CDATA[<p>For users who wish to run our service with external slave servers
or together with a third-party DNS hosting provider for extra redundancy,
we have configured an <a href="/help.html#axfr">AXFR transfer</a> service.</p>

<p>A new <a href="/help.html#functions"><strong>slave</strong> function</a> was added
to our API which allows simple addition of slave name servers to each zone.</p>

<p>Syntax:</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- @name  = slave name (domain name or fqdn)</span>
<span class="c1">-- @ip    = slave ip address (IPv4 address used to configure ACLs and for NOTIFY messages)</span>
<span class="c1">-- @ttl   = TTL (seconds)</span>
<span class="n">slave</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">ip</span><span class="p">,</span> <span class="n">ttl</span><span class="p">)</span>
</code></pre></div>
<p>Usage:</p>

<ul>
<li>For slaves residing in your your zone use: <code>slave(&quot;ns1&quot;, &quot;1.1.1.1&quot;)</code>,
A and NS records will be created automatically.</li>
<li>For slaves from third-party services use: <code>slave(&quot;ns1.third-party-ns.com&quot;, &quot;2.2.2.1&quot;)</code>,
NS records will be created automatically.</li>
</ul>

<p>To add multiple slaves invoke <strong>slave</strong> function multiple times.</p>

<div class="warn">
  Slave servers should be configured to fetch zone data from <strong>axfr.luadns.net</strong> (IP: 108.61.179.251).
</div>

<p>Example:</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- File: example.com.lua</span>
<span class="c1">-- Zone: example.com</span>

<span class="c1">-- [...]</span>

<span class="c1">-- Add two slave servers (ns1.example.com, ns2.example.com)</span>
<span class="c1">-- required A and NS records are created automatically</span>
<span class="n">slave</span><span class="p">(</span><span class="s2">"ns1"</span><span class="p">,</span> <span class="s2">"1.1.1.1"</span><span class="p">)</span>
<span class="n">slave</span><span class="p">(</span><span class="s2">"ns2"</span><span class="p">,</span> <span class="s2">"1.1.1.2"</span><span class="p">)</span>

<span class="c1">-- Add two external slave servers</span>
<span class="c1">-- required NS records are created automatically</span>
<span class="n">slave</span><span class="p">(</span><span class="s2">"ns1.third-party-ns.com"</span><span class="p">,</span> <span class="s2">"2.2.2.1"</span><span class="p">)</span>
<span class="n">slave</span><span class="p">(</span><span class="s2">"ns1.third-party-ns.com"</span><span class="p">,</span> <span class="s2">"2.2.2.2"</span><span class="p">)</span>

<span class="c1">-- Please, configure your ACLs on slave servers</span>
<span class="c1">-- to use axfr.luadns.net or IP 108.61.179.251.</span>
</code></pre></div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Additional record types]]></title>
    <link href="https://www.luadns.com/blog/2012/03/14/additional-record-types.html"/>
    <updated>2012-03-14T00:00:00+00:00</updated>
    <id>https://www.luadns.com/blog/2012/03/14/additional-record-types</id>
    <content type="html"><![CDATA[<p>Based on your requests we have added support for four new record types:</p>

<ul>
<li><a href="/help.html#aaaa-record">AAAA</a></li>
<li><a href="/help.html#ptr-record">PTR</a></li>
<li><a href="/help.html#spf-record">SPF</a></li>
<li><a href="/help.html#srv-record">SRV</a></li>
</ul>

<p>Example usage:</p>
<div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- file: example.com.lua</span>

<span class="c1">-- AAAA records</span>
<span class="n">aaaa</span><span class="p">(</span><span class="s2">"ns1"</span><span class="p">,</span> <span class="s2">"2001:4860:4860::8888"</span><span class="p">)</span>
<span class="n">aaaa</span><span class="p">(</span><span class="s2">"ns2"</span><span class="p">,</span> <span class="s2">"2001:4860:4860::8844"</span><span class="p">)</span>

<span class="c1">-- SPF records</span>
<span class="n">spf</span><span class="p">(</span><span class="n">_a</span><span class="p">,</span> <span class="s2">"v=spf1 a mx ~all"</span><span class="p">)</span>

<span class="c1">-- SRV records</span>
<span class="n">srv</span><span class="p">(</span><span class="s2">"_sip._tcp"</span><span class="p">,</span> <span class="s2">"sipserver.example.com"</span><span class="p">,</span> <span class="mi">5060</span><span class="p">)</span>
</code></pre></div><div class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- file: 1.168.192.in-addr.arpa.lua</span>
<span class="n">ptr</span><span class="p">(</span><span class="s2">"1"</span><span class="p">,</span> <span class="s2">"server.example.com"</span><span class="p">)</span>
</code></pre></div>
<p>Check the <a href="/help.html">manual</a> to see the full list of supported record types and its syntax.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[LuaDNS is live!]]></title>
    <link href="https://www.luadns.com/blog/2012/02/10/luadns-is-live.html"/>
    <updated>2012-02-10T00:00:00+00:00</updated>
    <id>https://www.luadns.com/blog/2012/02/10/luadns-is-live</id>
    <content type="html"><![CDATA[<p>Hello everyone!</p>

<p>After months of coding fun, tens of coffee cups, we have finally launched LuaDNS! Managing DNS zones it&#39;s not boring anymore.</p>

<p><strong>LuaDNS</strong> is a <strong>managed DNS service</strong> which is built differently than traditional services.
When dealing with many domains and records it&#39;s very hard to read/edit Bind syntax files
or to manage them through a web interface. With the power of Git and the <a href="https://www.lua.org">Lua</a>
language managing tens and hundreds of domains it&#39;s <a href="/why.html">easy and fun</a>.</p>

<p>We are offering a <strong><a href="/pricing.html">free plan</a></strong> with <strong>3 domains</strong>, just <a href="https://app.luadns.com/signup">sign up</a>
for a free account and <a href="/help.html">push</a> your DNS zones with Git.</p>

<p><strong>Name servers:</strong></p>

<ul>
<li>ns1.luadns.net (Germany)</li>
<li>ns2.luadns.net (Netherlands)</li>
<li>ns3.luadns.net (CA, USA)</li>
<li>ns4.luadns.net (NY, USA)</li>
</ul>

<p><a href="/about.html#infrastructure">more about servers</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Hello, world!]]></title>
    <link href="https://www.luadns.com/blog/2011/12/15/hello-world.html"/>
    <updated>2011-12-15T00:00:00+00:00</updated>
    <id>https://www.luadns.com/blog/2011/12/15/hello-world</id>
    <content type="html"><![CDATA[<p>This is the first post.</p>
]]></content>
  </entry>
  
</feed>
