Brian Cunnie 1b6d72cf49 🐞 dig: "any" type query works on macOS & Linux
The behavior of `dig` version **9.11.25-RedHat-9.11.25-2.fc32** differs
from macOS's `dig` version **9.10.6**. In other words, this test passes
on my mac but not until now on (Linux-based) CI.

I also took the opportunity to refactor our `dig` arguments to conform with
the suggested usage:

> Usage:  dig [@global-server] [domain] [q-type] [q-class] {q-opt}

fixes <https://ci.nono.io/teams/main/pipelines/sslip.io/jobs/unit/builds/145>:
```
  Expected
      <int>: 9
  to match exit code:
      <int>: 0
```

Note that for the `any` test I had to append an additional `+notcp`
argument to avoid an attempted TCP connection. I suspect a bug in `dig`:
```
dig any sslip.io @localhost
;; Connection to 127.0.0.1#53(127.0.0.1) for sslip.io failed: connection refused.
```
2021-01-19 07:05:17 -08:00
2021-01-18 10:42:54 -08:00
2015-08-30 10:27:54 -07:00
2020-12-01 12:09:50 -08:00
2020-11-26 15:11:25 -08:00

sslip.io

Test Type Status
Production Nameservers ci.nono.io
DNS Server Unit Tests ci.nono.io

sslip.io is a DNS server that maps specially-crafted DNS A records to IP addresses (e.g. "127-0-0-1.sslip.io" maps to 127.0.0.1). It is similar to, and inspired by, xip.io.

If you'd like to use sslip.io as a service, refer to the website (sslip.io) for more information. This README targets developers; the website targets users.

  • src/ contains the source code to the DNS server.
  • ci/ contains the Concourse continuous integration (CI) pipeline and task.
  • spec/ contains the tests for the production nameservers. To run the tests locally:
    DOMAIN=sslip.io rspec --format documentation --color spec/
    
  • k8s/document_root/ contains the HTML content of the sslip.io website. Please run tidy -im -w 120 k8s/document_root/index.html before submitting pull requests.
  • bosh-release/ contains the BOSH release. BOSH is the mechanism we use to deploy the servers, and the sslip.io BOSH release is a packaging of the DNS server (analogous to a .msi, .pkg, .deb or .rpm)
  • conf/sslip.io+nono.io.yml (deprecated) contains the PowerDNS's pipe backend's configuration in YAML format for use with BOSH. The pdns_pipe key is the pipe backend script, and pdns_pipe_conf is its configuration file.

DNS Server

The DNS server is written in Golang and is not configurable without modifying the source:

  • it binds to port 53 (you can't change it)
  • it only binds to UDP (no TCP, sorry)
  • The SOA record is hard-coded with the exception of the MNAME (primary master name server) record, which is set to the queried hostname (e.g. dig big.apple.com @ns-aws.nono.io would return an SOA with an MNAME record of big.apple.com.
  • The NS records are hard-coded
  • The MX records are hard-coded to the queried hostname with a preference of 0, with the exception of sslip.io itself, which has custom MX records to enable email delivery to ProtonMail.
  • No TXT records are returned with the exception of sslip.io, which has custom records to enable email delivery
  • There are no SRV records

To run the unit tests:

cd src
go get github.com/onsi/ginkgo/ginkgo
go get github.com/onsi/gomega/...
ginkgo -r .

To run the server on, say, a Mac, you must first start the server:

cd src
go run main.go

And then, in another window, run a query, e.g.:

dig +short 127.0.0.1.sslip.io @localhost

Which will return the expected IP address:

127.0.0.1

You will also see a log message in the server window, similar to the following:

2020/11/22 03:45:44 ::1.62302 TypeA 127.0.0.1.sslip.io. ? 127.0.0.1
Description
基于 Golang 的 DNS 服务器,它将带有嵌入式 IP 地址的 DNS 记录映射到这些地址。
Readme Apache-2.0 2.8 MiB
Languages
Go 81%
HTML 14.2%
Ruby 2.6%
Dockerfile 1.8%
Shell 0.4%