I thought I would dedicate a portion of my weekend to testing the capabilities that
DNS SRV
records could provide for
IPC
systems. I am running
Debian Linux with version 8.4.6
of
bind.
Step 1: Install BIND
# apt-get install dhcp
Easy enough
Step 2: Manaully add a SRV record
# vi /etc/bind/db.local
;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA localhost. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost.
@ IN A 127.0.0.1
_http._tcp.fuzzy.localhost. IN SRV 10 0 8080 localhost.
That gives me a http SRV record with the domain name "fuzzy.localhost.". It points to
127.0.0.1:8080. I can now run my own little web server at that location, and it won't conflict
with the web server running at port 80, nor with any other user's web server. Theoretically,
that means I can run any number of little http-speaking applications on behalf of any number of
users on this machine.
There are two problems with this. The first is that you want to dynamically assign ports,
rather than manage them centrally. The second is that the use of SRV records has not been
defined for http, though attempts
have been made
to do so. Firefox
does not currently support
SRV records. Someone will have to work on that :)
Hopefully the dynamic assignment issue can be sorted out, though.
Step 3: Dynamic assignment
I used
Painless DDNS
as my guide, but had to do a few vesion-specific tweaks
# vi /etc/bind/named.conf.local
//
// Add local zone definitions here.
include "/etc/bind/keys.conf";
zone "fuzzy.localhost" {
type master;
file "/etc/bind/db.local.fuzzy";
allow-update {
key fuzzy.localhost.;
};
};
$ dnskeygen -H 512 -u -n fuzzy.localhost.
# vi /etc/bind/keys.conf
key fuzzy.localhost. {
algorithm HMAC-MD5;
secret "svi6dhhSrwpcsfTivW67ruC9itm3DeGutpp0uNj1HTJGHVWl/Y/BUqwVEM0NE/S2gq8DENAXFaT7RSh3D4Fvxg==";
}
# vi /etc/bind/db.local.fuzzy
;
; BIND data file for user fuzzy on localhost
;
$TTL 604800
@ IN SOA fuzzy.localhost. fuzzy.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS fuzzy.localhost.
@ IN A 127.0.0.1
Now the server is ready to go. We have set up a single user who can assign services to
their sub-domain of localhost. In a real RPC setup we would probably have this done automatically
or implicitly for the set of users that should be permitted to offer services to themselves,
to the machine, and to the world.
The last step is to actually perform the updates:
$ nsupdate -k Kfuzzy.localhost.+157+00000.private
> server localhost
> zone fuzzy.localhost
> update add _http._tcp.fuzzy.localhost. 86400 SRV 10 0 8080 fuzzy.localhost.
> show
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id: 0
;; flags: ; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; UPDATE SECTION:
_http._tcp.fuzzy.localhost. 86400 IN SRV 10 0 8080 fuzzy.localhost.
> send
> ^D
And to prove it works:
$ dig @localhost _http._tcp.fuzzy.localhost -t srv
; <<>> DiG 9.3.2 <<>> @localhost _http._tcp.fuzzy.localhost -t srv
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22814
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;_http._tcp.fuzzy.localhost. IN SRV
;; ANSWER SECTION:
_http._tcp.fuzzy.localhost. 86400 IN SRV 10 0 8080 fuzzy.localhost.
;; AUTHORITY SECTION:
fuzzy.localhost. 604800 IN NS fuzzy.localhost.
;; ADDITIONAL SECTION:
fuzzy.localhost. 604800 IN A 127.0.0.1
;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Aug 12 09:44:46 2006
;; MSG SIZE rcvd: 109
Benjamin