307 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			307 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
.\" These numbers should match those in nonamed.c:
 | 
						|
.ds ST "two seconds"
 | 
						|
.ds MT "four seconds"
 | 
						|
.ds LT "five minutes"
 | 
						|
.ds HT "one hour"
 | 
						|
.ds NI "256"
 | 
						|
.TH NONAMED 8
 | 
						|
.SH NAME
 | 
						|
nonamed \- not a name daemon, but acts like one
 | 
						|
.SH SYNOPSIS
 | 
						|
.B nonamed
 | 
						|
.RB [ \-qs ]
 | 
						|
.RB [ \-d [\fIlevel\fP]]
 | 
						|
.RB [ \-p
 | 
						|
.IR port ]
 | 
						|
.SH DESCRIPTION
 | 
						|
.de SP
 | 
						|
.if t .sp 0.4
 | 
						|
.if n .sp
 | 
						|
..
 | 
						|
.B Nonamed
 | 
						|
is not a name daemon.  It can answer simple queries from
 | 
						|
.BR /etc/hosts ,
 | 
						|
but anything else is relayed to a real name daemon.
 | 
						|
.B Nonamed
 | 
						|
maintaines a small cache of replies it has seen from a name daemon, and will
 | 
						|
use this cache to minimize traffic if the machine is permanently connected
 | 
						|
to the Internet, or to answer requests if the machine is often disconnected
 | 
						|
from the Internet, i.e. a computer at home.
 | 
						|
.PP
 | 
						|
On startup
 | 
						|
.B nonamed
 | 
						|
sends a simple query to each of its name servers to see if one is up.  This
 | 
						|
is repeated every \*(LT in an "at home" situation, or when necessary if the
 | 
						|
current name daemon doesn't respond.  The first name server to answer is
 | 
						|
used as the current name server to answer queries.
 | 
						|
.PP
 | 
						|
If no name servers are found in the DHCP data or
 | 
						|
.BR /etc/hosts
 | 
						|
then only the hosts file is used to answer queries, and any query for a name
 | 
						|
not in that file gets a failure response.
 | 
						|
.PP
 | 
						|
.B Nonamed
 | 
						|
accepts both UDP and TCP queries under Minix-vmd.  Under standard MINIX 3
 | 
						|
only UDP queries are accepted.  \*(NI relayed UDP queries can be outstanding
 | 
						|
before it forgets where the first one came from.
 | 
						|
.PP
 | 
						|
Using the hosts file,
 | 
						|
.B nonamed
 | 
						|
can answer simple DNS queries to translate a host name to an IP address, or
 | 
						|
an IP address to a host name.  Suppose
 | 
						|
.B /etc/hosts
 | 
						|
looks like this:
 | 
						|
.PP
 | 
						|
.RS
 | 
						|
.ta +15n
 | 
						|
.nf
 | 
						|
10.0.0.1	flotsam.cs.vu.nl\0www
 | 
						|
10.0.0.2	jetsam.cs.vu.nl
 | 
						|
.fi
 | 
						|
.RE
 | 
						|
.PP
 | 
						|
Then queries for the host names listed can be answered with the IP addresses
 | 
						|
to the left of them.  An alias like "www" above is seen as a CNAME for the
 | 
						|
first host name on the line, in the same domain as the first host name if
 | 
						|
unqualified (no dots).  A reverse lookup for an IP address on the left is
 | 
						|
answered by the first host name on the right.  If more than one match is
 | 
						|
possible then all matches are put in the answer, so all IP addresses of
 | 
						|
multihomed hosts can be listed by multiple entries in the hosts file.
 | 
						|
.PP
 | 
						|
Requests for names like "flotsam.cs.vu.nl.cs.vu.nl" that are often generated
 | 
						|
on a domain search for an already fully qualified domain name
 | 
						|
are recognized and made to fail.  This kludge avoids a lot of unnecessary
 | 
						|
requests to possibly unreachable name servers and client timeouts.
 | 
						|
.PP
 | 
						|
The name "localhost" in any domain is given the IP address 127.0.0.1.
 | 
						|
.PP
 | 
						|
.B Nonamed
 | 
						|
employs several timeouts for efficient operation:
 | 
						|
.PP
 | 
						|
If no UDP reply is seen in \*(MT then a new search is started for a name
 | 
						|
server in the hope of finding one that does work.
 | 
						|
A failing TCP connection will also invoke a search, the
 | 
						|
TCP connection is then made to the new name server.  A client using UDP will
 | 
						|
retry eventually, a client using TCP will notice nothing but a short delay.
 | 
						|
If a TCP connection fails after 5 tries then an answer is sought in the
 | 
						|
hosts file, and failing that the connection is closed.
 | 
						|
.PP
 | 
						|
Any TCP operation is given \*(LT to show any action before the connection is
 | 
						|
aborted.
 | 
						|
.PP
 | 
						|
UDP replies from a name server are put in a cache of by default 8 (16-bit
 | 
						|
system) or 16 kilobytes (32-bit system).  New queries are
 | 
						|
first sought in the cache, and if found answered from the cache.  An entry
 | 
						|
in the cache is expired when the resource record with the smallest TTL (time
 | 
						|
to live) expires, unless its expire time is artificially extended by the
 | 
						|
"%stale" parameter (see below).  An answer from the cache has all TTLs
 | 
						|
appropriately lowered, and the AA bit ("answer authoritive") is cleared.
 | 
						|
Any request answered by stale data is refreshed as soon as
 | 
						|
.B nonamed
 | 
						|
notices that one of the external name daemons is reachable.
 | 
						|
.PP
 | 
						|
Data is only cached if it is has "no error" result code, or a "no such
 | 
						|
domain" result code with a SOA record in the name server section, and all
 | 
						|
records have a nonzero TTL.  The %stale parameter has no effect on the
 | 
						|
decision to cache a result.
 | 
						|
.PP
 | 
						|
The cache is rewritten to the cache file \*(LT after a new entry has been
 | 
						|
added.  Mere changes to the order in the cache don't cause a rewrite.
 | 
						|
.SS Configuration through /etc/hosts
 | 
						|
The real name servers, stale data extension, and cache size can be
 | 
						|
configured by special entries in the hosts file.  For example:
 | 
						|
.PP
 | 
						|
.RS
 | 
						|
.ta +\w'172.16.24.3'u+2m +\w'%nameserver'u+2m
 | 
						|
.nf
 | 
						|
86400	%ttl	# Answers from this file get this TTL
 | 
						|
2419200	%stale	# Stale data may linger on for 4 weeks
 | 
						|
32768	%memory	# 32k cache size
 | 
						|
10.0.0.1	%nameserver	# flotsam
 | 
						|
172.16.24.3	%nameserver	# dns1.example.com
 | 
						|
172.16.24.6	%nameserver	# dns2.example.com
 | 
						|
.SP
 | 
						|
10.0.0.1	flotsam.home.example.com\0www
 | 
						|
10.0.0.2	jetsam.home.example.com
 | 
						|
.fi
 | 
						|
.RE
 | 
						|
.PP
 | 
						|
In this example we have two machines, flotsam and jetsam, that are at home.
 | 
						|
Answers from the hosts file get a TTL of one day, by default this is \*(HT.
 | 
						|
Normally there is no connection to the Internet, so any stale data in the
 | 
						|
cache is allowed to linger on for 2419200 seconds (4 weeks) before it is
 | 
						|
finally discarded.  The cache size is set to 32 kilobytes.  The first name
 | 
						|
server is the flotsam.  On the flotsam itself this entry is ignored, but the
 | 
						|
jetsam will now run its requests through flotsam if possible.  This means
 | 
						|
that both flotsam and jetsam use the cache of the flotsam.  The other
 | 
						|
nameserver entries are external name servers of the Internet provider.
 | 
						|
.PP
 | 
						|
If no nameservers are listed in the hosts file then they are obtained from
 | 
						|
data gathered by DHCP.  This is the preferred situation.
 | 
						|
.PP
 | 
						|
If the hosts file contains a line that says:
 | 
						|
.PP
 | 
						|
.RS
 | 
						|
.BI include " file"
 | 
						|
.RE
 | 
						|
.PP
 | 
						|
Then the current hosts file is closed and the file named is read next.
 | 
						|
.SS "Automatic calling"
 | 
						|
If your connection to the Internet is set up on demand, either in software
 | 
						|
on the machine that has the modem, or by a special box such as an ISDN
 | 
						|
router, then you need to filter the name server probes that
 | 
						|
.B nonamed
 | 
						|
sends out every \*(LT to see if a real name daemon is reachable.  These
 | 
						|
probes need to be recognized as packets that must not trigger a call, and
 | 
						|
that must not keep the line up.  You can either filter all IP packets
 | 
						|
destined for port 53 decimal (the
 | 
						|
.B domain
 | 
						|
port).  This may be a bit too much, the first packet out is often a normal
 | 
						|
DNS request (not a probe), so you may want to do better.  A probe by
 | 
						|
.B nonamed
 | 
						|
is a nonrecursive request for the name servers of the root domain.  You
 | 
						|
can recognize them by looking at the flags, they are all off.  Here is a
 | 
						|
typical probe in hex (twenty octets per line), followed by the names of
 | 
						|
interesting fields, and the octets values you should look for:
 | 
						|
.PP
 | 
						|
.RS
 | 
						|
.nf
 | 
						|
45 00 00 2D C8 19 00 00 1D 11 53 18 AC 10 66 41 AC 10 18 03
 | 
						|
00 35 00 35 00 19 79 93 00 00 00 00 00 01 00 00 00 00 00 00
 | 
						|
00 00 02 00 01
 | 
						|
.SP
 | 
						|
ip ip ip ip ip ip ip ip ip ip ip ip si si si si di di di di
 | 
						|
sp sp dp dp xx xx xx xx id id fl fl qd qd an an ns ns ar ar
 | 
						|
dn ty ty cl cl
 | 
						|
.SP
 | 
						|
45 xx xx xx xx xx xx xx xx 11 xx xx xx xx xx xx xx xx xx xx
 | 
						|
xx xx 00 35 xx xx xx xx xx xx 00 00 xx xx xx xx xx xx xx xx
 | 
						|
xx xx xx xx xx
 | 
						|
.SP
 | 
						|
.fi
 | 
						|
(ip = IP header, si = source IP, di = dest IP, sp = source port, dp = dest
 | 
						|
port, id = DNS ID, fl = DNS flags, qd = query count, an = answer count, ns =
 | 
						|
nameserver count, ar = additional records count, dn = domain (""), ty = type
 | 
						|
(NS), cl = class (IN).)
 | 
						|
.RE
 | 
						|
.PP
 | 
						|
So if a packet has octets 45, 11, 00 35, and 00 00 at the appropriate places
 | 
						|
then don't let it cause a call.  Read the documentation of your software/router
 | 
						|
to find out how to do this.  Hopefully it is possible to view the contents of
 | 
						|
the packet that triggered the last call.  If so you simply let
 | 
						|
.B nonamed
 | 
						|
bring up the line once with a probe.
 | 
						|
.SS "Remote information"
 | 
						|
The program version and name servers it is working with can be obtained with:
 | 
						|
.PP
 | 
						|
.RS
 | 
						|
host \-r \-v \-c chaos \-t txt version.bind. \fIserver\fP
 | 
						|
.RE
 | 
						|
.PP
 | 
						|
.I Server
 | 
						|
is the name or IP address of the host whose name server you want to know
 | 
						|
this of.
 | 
						|
(This call is really an undocumented hack to ask the version numbers of the
 | 
						|
BIND name daemon.  It just had to be implemented for
 | 
						|
.B nonamed
 | 
						|
as well.)
 | 
						|
.PP
 | 
						|
The % variables in the hosts file can be viewed like this:
 | 
						|
.PP
 | 
						|
.RS
 | 
						|
host \-r \-t a %nameserver. \fIserver\fP
 | 
						|
.RE
 | 
						|
.PP
 | 
						|
Don't forget the dot at the end of the name.  %ttl and %stale will be shown
 | 
						|
as a dotted quad, e.g. 0.36.234.0.  The proper value can be computed as 36 *
 | 
						|
65536 + 234 * 256 + 0 = 2419200.
 | 
						|
.SH OPTIONS
 | 
						|
The options are only useful when debugging
 | 
						|
.BR nonamed ,
 | 
						|
although it can be very instructive to watch DNS queries being done.
 | 
						|
.TP
 | 
						|
.BR \-d [\fIlevel\fP]
 | 
						|
Set debugging level to
 | 
						|
.I level
 | 
						|
(by default
 | 
						|
.BR 1 .)
 | 
						|
Debug mode 1 makes
 | 
						|
.B nonamed
 | 
						|
decode and display the DNS queries and replies that it receives, sends and
 | 
						|
relays.  In debug mode 2 it prints tracing information about the internal
 | 
						|
jobs it executes.  In debug mode 3 it core dumps when an error causes it to
 | 
						|
exit.  The debugging level may also be increased by 1 at runtime by sending
 | 
						|
signal
 | 
						|
.B SIGUSR1
 | 
						|
or turned off (set to 0) with
 | 
						|
.BR SIGUSR2 .
 | 
						|
.TP
 | 
						|
.RB [ \-p " \fIport\fP]
 | 
						|
Port to listen on instead of the normal
 | 
						|
.B domain
 | 
						|
port.
 | 
						|
.TP
 | 
						|
.RB [ \-q ]
 | 
						|
Read the cache file with the debug level set to 2, causing its contents to
 | 
						|
be printed, then exit.
 | 
						|
.TP
 | 
						|
.RB [ \-s ]
 | 
						|
Run single: ignore hosts or cache file, only use the DHCP information.  This
 | 
						|
allows another
 | 
						|
.B nonamed
 | 
						|
to be run on a different interface to serve a few programs that run there.
 | 
						|
.SH FILES
 | 
						|
.TP 15n
 | 
						|
/etc/hosts
 | 
						|
Hosts to address translation table and configuration file.
 | 
						|
.TP
 | 
						|
/usr/run/nonamed.pid
 | 
						|
Process ID of the currently running
 | 
						|
.BR nonamed .
 | 
						|
.TP
 | 
						|
/usr/adm/nonamed.cache
 | 
						|
Copy of the cache.  Read when the program starts, written \*(LT after
 | 
						|
something has been added to it, and written when a SIGTERM signal is
 | 
						|
received, which is normally sent at system shutdown.
 | 
						|
.TP
 | 
						|
/usr/adm/dhcp.cache
 | 
						|
Data gathered by the DHCP daemon.  Among lots of other junk it lists name
 | 
						|
servers that we should use.
 | 
						|
.SH "SEE ALSO"
 | 
						|
.BR gethostbyname (3),
 | 
						|
.BR resolver (3),
 | 
						|
.BR hosts (5),
 | 
						|
.BR inet (8),
 | 
						|
.BR boot (8),
 | 
						|
.BR inetd (8),
 | 
						|
.BR dhcpd (8).
 | 
						|
.SP
 | 
						|
.BR RFC-1034
 | 
						|
and
 | 
						|
.BR RFC-1035 .
 | 
						|
.SH NOTES
 | 
						|
Do not use the %stale parameter for a PC that is directly connected to the
 | 
						|
Internet.  You run the risk of getting wrong answers, a risk that is only
 | 
						|
worth taking for a system that is mostly disconnected from the Internet.
 | 
						|
.PP
 | 
						|
You can specify one or more remote name servers in
 | 
						|
.B /etc/resolv.conf
 | 
						|
so that nonamed isn't needed.  This will save memory, but you'll lose
 | 
						|
.BR nonamed 's
 | 
						|
cache and its "offline" tricks.  That's no problem if you can use a
 | 
						|
neighbouring name daemon on another PC at home.
 | 
						|
.PP
 | 
						|
The default cache size seems to be more than enough for normal use, but if
 | 
						|
you do decide to make it larger then don't forget to increase the stack size
 | 
						|
of the program under standard MINIX 3.
 | 
						|
.PP
 | 
						|
Don't let two
 | 
						|
.BR nonamed 's
 | 
						|
forward queries to each other.  They will pingpong a query over the
 | 
						|
network as fast as they can.
 | 
						|
.SH BUGS
 | 
						|
The idea of serving "stale DNS data" will probably make some purists
 | 
						|
violently sick...
 | 
						|
.SH AUTHOR
 | 
						|
Kees J. Bot (kjb@cs.vu.nl)
 |