Initial commit
This commit is contained in:
commit
341738e850
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
variables.conf
|
||||
*.key
|
25
README.md
Normal file
25
README.md
Normal file
@ -0,0 +1,25 @@
|
||||
# DNS update script
|
||||
|
||||
Source: http://www.btteknik.net/?p=143
|
||||
|
||||
### DNSSEC key
|
||||
* need to create a dnssec key, so that we can authenticate clients' updates
|
||||
```
|
||||
# ddns-confgen -s myhost.example.com
|
||||
```
|
||||
* this key must be:
|
||||
* added to DNS server's `named.conf` and associated to required zones
|
||||
* stored in a text file in the same directory as the script as `dns.key`
|
||||
|
||||
### Install script
|
||||
You may run `install.sh` (not as root, it includes `sudo`s) to:
|
||||
* copy Systemd units templates to system directory
|
||||
* enable timer for next reboot
|
||||
* NOTE: if you move the script, you need to install again
|
||||
|
||||
### Issues
|
||||
|
||||
#### Cannot restrict PTR update
|
||||
* We meet an issue when trying to use `tcp-self` in BIND9 zone config
|
||||
* https://superuser.com/questions/977132/when-using-nsupdate-to-update-both-a-and-ptr-records-why-do-i-get-update-faile
|
||||
* http://www.zytrax.com/books/dns/ch7/xfer.html#update-policy
|
15
install.sh
Normal file
15
install.sh
Normal file
@ -0,0 +1,15 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "Copying Systemd units to system directory..."
|
||||
sudo cp systemd-templates/dns-update.service /etc/systemd/system/
|
||||
sudo cp systemd-templates/dns-update.timer /etc/systemd/system/
|
||||
sudo sed -i -e "s/PH_USER/$(whoami)/g" /etc/systemd/system/dns-update.service
|
||||
sudo sed -i -e "s/PH_DIRECTORY/$(pwd)/g" /etc/systemd/system/dns-update.service
|
||||
|
||||
echo "Reloading Systemd..."
|
||||
sudo systemctl daemon-reload
|
||||
echo "Enabling timer (not starting it, either do it manually or reboot)"
|
||||
sudo systemctl enable dns-update.timer
|
||||
|
||||
echo "Finished install. Exiting..."
|
||||
exit 0
|
49
main.sh
Executable file
49
main.sh
Executable file
@ -0,0 +1,49 @@
|
||||
#!/bin/bash
|
||||
|
||||
source variables.conf
|
||||
|
||||
KEY="$(pwd)/dns.key"
|
||||
TTL=604800
|
||||
|
||||
FQDN=$(hostname)
|
||||
MYIP=$(ip route get 8.8.8.8 | grep -oP 'src \K[^ ]+')
|
||||
MYNUMBER=$(echo $MYIP | cut -d '.' -f 4) # last byte of IP
|
||||
#MYIP=$(dig +short myip.opendns.com @resolver1.opendns.com)
|
||||
|
||||
# if $MYIP is not a valid IP, exit
|
||||
if [[ ! "$MYIP" =~ ^([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]; then
|
||||
echo "Invalid IP, aborting"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# fetch current record with dig, and choose what to do
|
||||
current_ip_record=$(dig $FQDN +short)
|
||||
if [[ "$current_ip_record" =~ ^([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]; then
|
||||
if [[ ! "$MYIP" = "$current_ip_record" ]]; then
|
||||
echo "Updating record"
|
||||
else
|
||||
echo "Record is already up to date, exiting."
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
echo "Server unreachable or no record for $FQDN, exiting."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
nsupdate -k $KEY -v << EOF
|
||||
server $NS
|
||||
zone $MAINZONE
|
||||
update delete $FQDN. A
|
||||
update add $FQDN. $TTL A $MYIP
|
||||
send
|
||||
EOF
|
||||
|
||||
nsupdate -k $KEY -v << EOF
|
||||
server $NS
|
||||
zone $REVERSEZONE
|
||||
update delete $MYNUMBER.$REVERSEZONE PTR
|
||||
update add $MYNUMBER.$REVERSEZONE $TTL PTR $FQDN.
|
||||
send
|
||||
EOF
|
||||
|
||||
exit 0
|
6
systemd-templates/dns-update.service
Normal file
6
systemd-templates/dns-update.service
Normal file
@ -0,0 +1,6 @@
|
||||
[Unit]
|
||||
Description=Update (if needed) name server with our IP
|
||||
|
||||
[Service]
|
||||
User=PH_USER
|
||||
ExecStart=PH_DIRECTORY/main.sh
|
9
systemd-templates/dns-update.timer
Normal file
9
systemd-templates/dns-update.timer
Normal file
@ -0,0 +1,9 @@
|
||||
[Unit]
|
||||
Description=Run DNS update every 30 minutes
|
||||
|
||||
[Timer]
|
||||
OnBootSec=1min
|
||||
OnUnitActiveSec=30min
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
7
variables.conf.template
Normal file
7
variables.conf.template
Normal file
@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copy this file as variables.conf, with the correct values
|
||||
|
||||
NS=dns1.example.com
|
||||
MAINZONE=example.com.
|
||||
REVERSEZONE=1.168.192.in-addr.arpa.
|
Loading…
Reference in New Issue
Block a user