mirror of
https://github.com/infinet/dnsmasq.git
synced 2025-05-08 00:56:06 +08:00
232 lines
12 KiB
HTML
232 lines
12 KiB
HTML
<HTML>
|
|
<HEAD>
|
|
<TITLE> Configuring Dnsmasq.</TITLE>
|
|
</HEAD>
|
|
<BODY BGCOLOR="WHITE">
|
|
<H1 ALIGN=center>Dnsmasq setup</H1>
|
|
<H2>Installation.</H2>
|
|
To compile and install dnsmasq, the following command (as root) is enough.
|
|
|
|
<PRE>
|
|
make install
|
|
</PRE>
|
|
|
|
You might want to edit config.h. Dnsmasq has
|
|
been run on (at least) Linux, uCLinux, AIX 4.1.5, FreeBSD 4.4 OpenBSD and Tru64 4.x
|
|
|
|
Dnsmasq is normally run on a firewall machine (the machine with the
|
|
modem or other connection to your ISP.) but it can run on any machine
|
|
with access to the ISPs nameservers.
|
|
|
|
Put the binary in <TT>/usr/local/sbin/dnsmasq</TT> (running <TT>make install</TT> will do this) and arrange for it
|
|
to be started at boot time.
|
|
|
|
Note that dnsmasq needs to run as root, since it binds privileged ports. It will drop root privileges after start-up. Dnsmasq
|
|
logs problems using the syslog facility as a daemon. It logs debugging
|
|
information to local0
|
|
<P>
|
|
<H2>Configuration.</H2>
|
|
Configuration for dnsmasq is pretty simple in almost all cases. The
|
|
program has collected a fair few options as it has developed but most of them
|
|
are not needed most of the time. A machine which already has a DNS
|
|
configuration (ie one or more external nameservers in <TT>/etc/resolv.conf</TT>
|
|
and any local hosts in <TT>/etc/hosts</TT>) can be turned into a nameserver
|
|
simply by running dnsmasq, with no options or configuration at
|
|
all. Set the IP address of the machine running dnsmasq as the DNS
|
|
server in all the other machines on your network, and you're done.
|
|
<P>
|
|
With a few option flags, it is possible to make dnsmasq do more clever
|
|
tricks. Options for dnsmasq can be set either on the command line
|
|
when starting dnsmasq, or in its configuration file, <TT>/etc/dnsmasq.conf</TT>.
|
|
|
|
<h2>Making the nameserver machine use dnsmasq.</h2>
|
|
In the simple configuration described above, processes local to the
|
|
machine will not use dnsmasq, since they get their information about
|
|
which nameservers to use from /etc/resolv.conf, which is set to the
|
|
upstream nameservers. To fix this, simply replace the nameserver in
|
|
<TT>/etc/resolv.conf</TT> with the local address 127.0.0.1 and give the
|
|
address(es) of the upstream nameserver(s) to dnsmasq directly. You can
|
|
do this using either the <TT>server</TT> option, or by putting them into
|
|
another file, and telling dnsmasq about its location with
|
|
the <TT>resolv-file</TT> option.
|
|
|
|
<h2>Automatic nameserver configuration.</h2>
|
|
The two protocols most used for automatic IP network configuration
|
|
(PPP and DHCP) can determine the IP addresses for nameservers automatically.
|
|
The daemons can be made to write out a file in the resolv.conf format with the
|
|
nameservers in which is perfect for dnsmasq to use. When the
|
|
nameservers change, for instance on dialling into a new ISP using PPP,
|
|
dnsmasq will automatically re-read this file and begin using the new
|
|
nameserver(s) completely transparently.
|
|
|
|
<h3>Automatic DNS server configuration with PPP.</h3>
|
|
Later versions of pppd have an option "usepeerdns" which instructs it to write a file containing
|
|
the address(es) of the DNS severs in <TT>/etc/ppp/resolv.conf</TT>. Configure dnsmasq
|
|
as above with "nameserver 127.0.0.1" in <TT>/etc/resolv.conf</TT> and run dnsmasq
|
|
with to option <TT>resolv-file=/etc/ppp/resolv.conf</TT>.
|
|
<P>
|
|
On Redhat (at least versions 7.1, 7.2 and 7.3) you can set pppd
|
|
options by adding "PPPOPTIONS=usepeerdns" to
|
|
<TT>/etc/sysconfig/network-scripts/ifcfg-ippp0</TT>. In the same file, make sure
|
|
that "PEERDNS=no" to stop RedHat's network initscripts from copying
|
|
<TT>/etc/ppp/resolv.conf</TT> into <TT>/etc/resolv.conf</TT>.<BR>
|
|
|
|
On SuSE (at least version 8.1, and 8.2) you should use YaST to activate
|
|
<TT>[x] Modify DNS when connected</TT> then stop SuSEs network initscripts
|
|
from copying <TT>/etc/ppp/resolv.conf</TT> into <TT>/etc/resolv.conf</TT>
|
|
by modifying MODIFY_RESOLV_CONF_DYNAMICALLY="no" in <TT>/etc/sysconfig/network/config</TT>.
|
|
|
|
|
|
<h3>Automatic DNS server configuration with DHCP.</h3>
|
|
You need to get your DHCP client to write the address(es) of the DNS
|
|
servers to a file other than <TT>/etc/resolv.conf</TT>. For dhcpcd, the
|
|
<TT>dhcpcd.exe</TT> script gets run with the addresses of the nameserver(s) in
|
|
the shell variable <TT>$DNS</TT>. The following bit of shell script
|
|
uses that to write a file suitable for dnsmasq.
|
|
<PRE>
|
|
|
|
echo -n >|/etc/dhcpc/resolv.conf
|
|
dnsservers=${DNS//,/ }
|
|
for serv in $dnsservers; do
|
|
echo "nameserver $serv" >>/etc/dhcpc/resolv.conf
|
|
done
|
|
|
|
</PRE>
|
|
|
|
Remember to give dhcpcd the <TT>-R</TT> flag to stop it overwriting
|
|
<TT>/etc/resolv.conf</TT>.
|
|
|
|
<P>
|
|
For other DHCP clients it should be possible to achieve the same effect.
|
|
|
|
<h3> DHCP and PPP.</h3>
|
|
On a laptop which may potentially connect via a modem and PPP or
|
|
ethernet and DHCP it is possible to combine both of the above
|
|
configurations. Running dnsmasq with the flags
|
|
<TT>resolv-file=/etc/ppp/resolv.conf resolv-file=/etc/dhcpc/resolv.conf</TT>
|
|
makes it poll <B>both</B> files and use whichever was updated
|
|
last. The result is automatic switching between DNS servers.
|
|
</H3>
|
|
|
|
<H2> Integration with DHCP.</H2>
|
|
Dnsmasq reads <TT>/etc/hosts</TT> so that the names of local machines are
|
|
available in DNS. This is fine when you give all your local machines
|
|
static IP addresses which can go in <TT>/etc/hosts</TT>, but it doesn't work
|
|
when local machines are configured via DHCP, since the IP address
|
|
allocated to machine is not fixed. Dnsmasq comes with an integrated
|
|
DHCP daemon to solve this problem.
|
|
<P>
|
|
The dnsmasq DHCP daemon allocates addresses to hosts on the network and tries
|
|
to determine their names. If it succeeds it add the name and address
|
|
pair to the DNS. There are basically two ways to associate a name with
|
|
a DHCP-configured machine; either the machine knows its name which it
|
|
gets a DHCP lease, or dnsmasq gives it a name, based on the MAC
|
|
address of its ethernet card. For the former to work, a machine needs to know its name when it
|
|
requests a DHCP lease. For dhcpcd, the -h option specifies this. The
|
|
names may be anything as far as DHCP is concerned, but dnsmasq adds
|
|
some limitations. By default the names must no have a domain part, ie
|
|
they must just be alphanumeric names, without any dots. This is a
|
|
security feature to stop a machine on your network telling DHCP that
|
|
its name is "www.microsoft.com" and thereby grabbing traffic which
|
|
shouldn't go to it. A domain part is only allowed by dnsmasq in DHCP machine names
|
|
if the <TT>domain-suffix</TT> option is set, the domain part must match the
|
|
suffix.
|
|
<P>
|
|
As an aside, make sure not to tell DHCP to set the hostname when it
|
|
obtains a lease (in dhcpcd that's the -H flag.)
|
|
This is not reliable since the DHCP server gets the
|
|
hostname from DNS which in this case is dnsmasq. There is a race
|
|
condition because the host's name in the DNS may change as a
|
|
result of it getting a DHCP lease, but this does not propagate before
|
|
the name is looked up. The net effect may be that the host believes it
|
|
is called something different to its name in the DNS. To be safe, set
|
|
the hostname on a machine locally, and pass the same name to DHCP when
|
|
requesting a lease.
|
|
<P>
|
|
<H2>Setting up a mailhub.</H2>
|
|
If you generate mail on the machines attached to your private network, you may
|
|
be interested in the MX record feature of dnsmasq. This allows you to have all
|
|
the machines on your network use your firewall or another machine as a "smarthost" and
|
|
deliver mail to it. The details of how to set this up are highly dependent on
|
|
your mailer, system and distribution. The only thing that's relevant to dnsmasq is that the mailer
|
|
needs to be able to interrogate the DNS and find an MX record for your mailhub.
|
|
<P>
|
|
By giving dnsmasq the <TT>mx-host</TT> option
|
|
you instruct dnsmasq to serve an MX record for the specified address.
|
|
By default the MX record
|
|
points to the machine on which dnsmasq is running, so mail delivered to that
|
|
name will get sent to the mailer on your firewall machine. You can
|
|
have the MX record point to another machine by using the <TT>mx-target</TT>
|
|
option.
|
|
<P>
|
|
In some cases it's useful for all local machines to see an MX record
|
|
pointing at themselves: this allows mailers which insist on an MX record and
|
|
don't fall back to A records to deliver mail within the
|
|
machine. These MX records are enabled using the <TT>selfmx</TT> option.
|
|
|
|
<H2>Using special servers.</H2>
|
|
Dnsmasq has the ability to direct DNS queries for certain domains to
|
|
specific upstream nameservers. This feature was added for use with
|
|
VPNs but it is fully general. The scenario is this: you have a
|
|
standard internet connection via an ISP, and dnsmasq is configured to
|
|
forward queries to the ISP's nameservers, then you make a VPN
|
|
connection into your companies network, giving access to hosts inside
|
|
the company firewall. You have access, but since many of the internal hosts
|
|
aren't visible on the public internet, your company doesn't publish
|
|
them to the public DNS and you can't get their IP address from the ISP
|
|
nameservers. The solution is to use the companies nameserver for
|
|
private domains within the company, and dnsmasq allows this. Assuming
|
|
that internal company machines are all in the domain internal.myco.com
|
|
and the companies nameserver is at 192.168.10.1 then the option
|
|
<TT>server=/internal.myco.com/192.168.10.1</TT> will direct all
|
|
queries in the internal domain to the correct nameserver. You can
|
|
specify more than one domain in each server option. If there is
|
|
more than one nameserver just include as many
|
|
<TT>server</TT> options as is needed to specify them all.
|
|
|
|
<H2>Local domains.</H2>
|
|
Sometimes people have local domains which they do not want forwarded
|
|
to upstream servers. This is accommodated by using server options
|
|
without the server IP address. To make things clearer <TT>local</TT>
|
|
is a synonym for <TT>server</TT>. For example the option
|
|
<TT>local=/localnet/</TT> ensures that any domain name query which ends in
|
|
<TT>.localnet</TT> will be answered if possible from
|
|
<TT>/etc/hosts</TT> or DHCP, but never sent to an upstream server.
|
|
|
|
<H2>Defeating wildcards in top level domains.</H2>
|
|
In September 2003 Verisign installed a wildcard record in the .com and
|
|
.net top level domains. The effect of this is that queries for
|
|
unregistered .com and .net names now return the address of Verisign's
|
|
sitefinder service, rather than a "no such domain" response. To
|
|
restore the correct behaviour, you can tell dnsmasq the address of the
|
|
sitefinder host and have it substitute an NXDOMAIN reply when it sees
|
|
that address. The sitefinder address is currently 64.94.110.11, so
|
|
giving the option <TT>bogus-nxdomain=64.94.110.11</TT> will enable
|
|
this facility for Verisign. If other TLDs do that same thing you can
|
|
add the correct addresses for them too. See the dnsmasq FAQ for more
|
|
details on the <TT>bogus-nxdomain</TT> option.
|
|
|
|
<H2>Other configuration details.</H2>
|
|
By default dnsmasq offers DNS service on all the configured interfaces
|
|
of a host. It's likely that you don't (for instance) want to offer a
|
|
DNS service to the world via an interface connected to ADSL or
|
|
cable-modem so dnsmasq allows you to specify which interfaces it will
|
|
listen on. Use either the <TT>interface</TT> or <TT>address</TT> options to do this.
|
|
<P>
|
|
The <TT>filterwin2k</TT> option makes dnsmasq ignore certain DNS requests which
|
|
are made by Windows boxen every few minutes. The requests generally
|
|
don't get sensible answers in the global DNS and cause trouble by
|
|
triggering dial-on-demand internet links.
|
|
<P>
|
|
Sending SIGHUP to the dnsmasq process will cause it to empty its cache and
|
|
then re-load <TT>/etc/hosts</TT> and <TT>/etc/resolv.conf</TT>.
|
|
<P> Sending SIGUSR1 (killall -10 dnsmasq) to the dnsmasq process will
|
|
cause to write cache usage statisticss to the log, typically
|
|
<TT>/var/log/syslog</TT> or <TT>/var/log/messages</TT>.
|
|
<P> The <TT>log-queries</TT> option tells dnsmasq to verbosely log the queries
|
|
it is handling and causes SIGUSR1 to trigger a complete dump of the
|
|
contents of the cache to the syslog.
|
|
|
|
<P>For a complete listing of options please take a look at the manpage
|
|
dnsmasq(8).
|