mirror of
https://github.com/pi-hole/dnsmasq.git
synced 2025-12-19 10:18:25 +00:00
82 lines
2.7 KiB
Plaintext
82 lines
2.7 KiB
Plaintext
This script can be used to implement persistent leases on openWRT, DD-WRT
|
|
etc. Persistent leases are good: if the lease database is lost on a
|
|
reboot, then it will eventually be restored as hosts renew their
|
|
leases. Until a host renews (which may take hours/days) it will
|
|
not exist in the DNS if dnsmasq's DDNS function is in use.
|
|
|
|
*WRT systems remount all non-volatile fileystems read-only after boot,
|
|
so the normal leasefile will not work. They do, however have NV
|
|
storage, accessed with the nvram command:
|
|
|
|
/usr/lib # nvram
|
|
usage: nvram [get name] [set name=value] [unset name] [show]
|
|
|
|
The principle is that leases are kept in NV variable with data
|
|
corresponding to the line in a leasefile:
|
|
|
|
dnsmasq_lease_192.168.1.56=3600 00:41:4a:05:80:74 192.168.1.56 * *
|
|
|
|
By giving dnsmasq the leasefile-ro command, it no longer creates or writes a
|
|
leasefile; responsibility for maintaining the lease database transfers
|
|
to the lease change script. At startup, in leasefile-ro mode,
|
|
dnsmasq will run
|
|
|
|
"<lease_change_script> init"
|
|
|
|
and read whatever that command spits out, expecting it to
|
|
be in dnsmasq leasefile format.
|
|
|
|
So the lease change script, given "init" as argv[1] will
|
|
suck existing leases out of the NVRAM and emit them from
|
|
stdout in the correct format.
|
|
|
|
The second part of the problem is keeping the NVRAM up-to-date: this
|
|
is done by the lease-change script which dnsmasq runs when a lease is
|
|
updated. When it is called with argv[1] as "old", "add", or "del"
|
|
it updates the relevant nvram entry.
|
|
|
|
So, dnsmasq should be run as :
|
|
|
|
dnsmasq --leasefile-ro --dhcp-script=/path/to/lease_update.sh
|
|
|
|
or the same flags added to /etc/dnsmasq.conf
|
|
|
|
|
|
|
|
Notes:
|
|
|
|
This needs dnsmasq-2.33 or later to work.
|
|
|
|
This technique will work with, or without, compilation with
|
|
HAVE_BROKEN_RTC. Compiling with HAVE_BROKEN_RTC is
|
|
_highly_recommended_ for this application since is avoids problems
|
|
with the system clock being warped by NTP, and it vastly reduces the
|
|
number of writes to the NVRAM. With HAVE_BROKEN_RTC, NVRAM is updated
|
|
only when a lease is created or destroyed; without it, a write occurs
|
|
every time a lease is renewed.
|
|
|
|
It probably makes sense to restrict the number of active DHCP leases
|
|
to an appropriate number using dhcp-lease-max. On a new DD_WRT system,
|
|
there are about 10K bytes free in the NVRAM. Each lease record is
|
|
about 100 bytes, so restricting the number of leases to 50 will limit
|
|
use to half that. (The default limit in the distributed source is 150)
|
|
|
|
Any UI script which reads the dnsmasq leasefile will have to be
|
|
ammended, probably by changing it to read the output of
|
|
`lease_update init` instead.
|
|
|
|
|
|
Thanks:
|
|
|
|
To Steve Horbachuk for checks on the script and debugging beyond the
|
|
call of duty.
|
|
|
|
|
|
Simon Kelley
|
|
Fri Jul 28 11:51:13 BST 2006
|
|
|
|
|
|
|
|
|
|
|