Method for acting on IP address change from the ISP?
I have a Debian server at home. The server is my router and provides VPN access to the outside.
I do not have a static IP address; the lease time given by the ISP is two hours.
This cable cell which services the area I live, seems to have at least two different different netblocks for customers, and it is not entirely unusual obtaining a different IP address after a reboot of the Linux server, or less usually, but more importantly in what concerns this question, after some ISP maintenance operations.
I have some services that are dependent on the IP address; and the public IP adddress is used either for external (VPN) access, and for internal reference.
In some services, I use the dynamic DNS name from FreeDNS in order not to have to change an IP address in several locations.
As such, the best method I devised until now is running a script on dhclient-exit hooks. The script is called after DHCP gives/renews an IP, and restart services if the IP is changed.
I also change the IP of my dynamic DNS name on /etc/hosts
, for solving possible problems of using the old IP before the change at FreeDNS side trickles down to me.
The script I wrote for dhclient-exit-hooks.d
is this one; exit_status
should be 0 if all went ok with dhclient
.
#!/bin/bash
PATH=$PATH:/usr/bin
if ! [[ -v exit_status ]]
then
exit 1
fi
if [ $exit_status -eq 0 ]
then
IP=`ip addr show eth0.101 | grep inet | awk ' { print $2 } ' | cut -f1 -d "/"`
OLDIP=`awk ' /xxxx.mooo.com/ { print $1 } ' /etc/hosts`
if [ $reason = "REBOOT" ] || [ $reason = "BOUND" ] || [ $IP != $OLDIP ]
then
sed -i "s/^[0-9.]* xxxx.mooo.com/$IP xxxx.mooo.com/g" /etc/hosts
timeout 60 /opt/bin/iptables.sh
timeout 60 /etc/init.d/ipsec restart
timeout 60 /etc/init.d/asterisk restart
timeout 120 /etc/init.d/bind9 restart
timeout 60 /usr/bin/wget -O - http://freedns.afraid.org/dynamic/update.php?XXXXXXXXXXXX > /dev/null
fi
fi
I am aware of other posts that also recommend using dhclient-exit-hooks.d
; however my question is a way to automate the restarting and configuration of those services upon an IP address change.
linux debian dhcp
add a comment |
I have a Debian server at home. The server is my router and provides VPN access to the outside.
I do not have a static IP address; the lease time given by the ISP is two hours.
This cable cell which services the area I live, seems to have at least two different different netblocks for customers, and it is not entirely unusual obtaining a different IP address after a reboot of the Linux server, or less usually, but more importantly in what concerns this question, after some ISP maintenance operations.
I have some services that are dependent on the IP address; and the public IP adddress is used either for external (VPN) access, and for internal reference.
In some services, I use the dynamic DNS name from FreeDNS in order not to have to change an IP address in several locations.
As such, the best method I devised until now is running a script on dhclient-exit hooks. The script is called after DHCP gives/renews an IP, and restart services if the IP is changed.
I also change the IP of my dynamic DNS name on /etc/hosts
, for solving possible problems of using the old IP before the change at FreeDNS side trickles down to me.
The script I wrote for dhclient-exit-hooks.d
is this one; exit_status
should be 0 if all went ok with dhclient
.
#!/bin/bash
PATH=$PATH:/usr/bin
if ! [[ -v exit_status ]]
then
exit 1
fi
if [ $exit_status -eq 0 ]
then
IP=`ip addr show eth0.101 | grep inet | awk ' { print $2 } ' | cut -f1 -d "/"`
OLDIP=`awk ' /xxxx.mooo.com/ { print $1 } ' /etc/hosts`
if [ $reason = "REBOOT" ] || [ $reason = "BOUND" ] || [ $IP != $OLDIP ]
then
sed -i "s/^[0-9.]* xxxx.mooo.com/$IP xxxx.mooo.com/g" /etc/hosts
timeout 60 /opt/bin/iptables.sh
timeout 60 /etc/init.d/ipsec restart
timeout 60 /etc/init.d/asterisk restart
timeout 120 /etc/init.d/bind9 restart
timeout 60 /usr/bin/wget -O - http://freedns.afraid.org/dynamic/update.php?XXXXXXXXXXXX > /dev/null
fi
fi
I am aware of other posts that also recommend using dhclient-exit-hooks.d
; however my question is a way to automate the restarting and configuration of those services upon an IP address change.
linux debian dhcp
Define "better"? What's wrong with this method? Is there a problem with it, where something doesn't exactly work? Since you're getting your IP address from DHCP, running it from the DHCP client seems like the best method, to me. Remember the old adage, "if it ain't broken, don't fix it"...
– Wouter Verhelst
Mar 20 '16 at 7:59
A bit complicated, too much dependent on the DHCP client, slight probability of getting hang services. You are absolutely right in the KISS part.
– Rui F Ribeiro
Mar 20 '16 at 8:42
1
Complicated? Seems simple enough. Dependent on the DHCP client? That seems like a feature, not a bug (anything else would require you to poll the IP address every so often, which is... well, not a good idea). Hung services? There are plenty of good monitoring tools out there which you can use to automatically restart services that are hung... Personally, I think your setup is cool, and I might actually duplicate it at home :-)
– Wouter Verhelst
Mar 21 '16 at 15:31
I edited it out with a view on having possible hang up services. And yep, there is monit. I do really need the IPsec part to be working with the right IP, as I use the VPN to have access to everything from the outside, including voIP and ssh. Hmmm I have started encrypting DNS in the meanwhile, will have to see if I need to add it to the restarted services.
– Rui F Ribeiro
Mar 21 '16 at 15:47
add a comment |
I have a Debian server at home. The server is my router and provides VPN access to the outside.
I do not have a static IP address; the lease time given by the ISP is two hours.
This cable cell which services the area I live, seems to have at least two different different netblocks for customers, and it is not entirely unusual obtaining a different IP address after a reboot of the Linux server, or less usually, but more importantly in what concerns this question, after some ISP maintenance operations.
I have some services that are dependent on the IP address; and the public IP adddress is used either for external (VPN) access, and for internal reference.
In some services, I use the dynamic DNS name from FreeDNS in order not to have to change an IP address in several locations.
As such, the best method I devised until now is running a script on dhclient-exit hooks. The script is called after DHCP gives/renews an IP, and restart services if the IP is changed.
I also change the IP of my dynamic DNS name on /etc/hosts
, for solving possible problems of using the old IP before the change at FreeDNS side trickles down to me.
The script I wrote for dhclient-exit-hooks.d
is this one; exit_status
should be 0 if all went ok with dhclient
.
#!/bin/bash
PATH=$PATH:/usr/bin
if ! [[ -v exit_status ]]
then
exit 1
fi
if [ $exit_status -eq 0 ]
then
IP=`ip addr show eth0.101 | grep inet | awk ' { print $2 } ' | cut -f1 -d "/"`
OLDIP=`awk ' /xxxx.mooo.com/ { print $1 } ' /etc/hosts`
if [ $reason = "REBOOT" ] || [ $reason = "BOUND" ] || [ $IP != $OLDIP ]
then
sed -i "s/^[0-9.]* xxxx.mooo.com/$IP xxxx.mooo.com/g" /etc/hosts
timeout 60 /opt/bin/iptables.sh
timeout 60 /etc/init.d/ipsec restart
timeout 60 /etc/init.d/asterisk restart
timeout 120 /etc/init.d/bind9 restart
timeout 60 /usr/bin/wget -O - http://freedns.afraid.org/dynamic/update.php?XXXXXXXXXXXX > /dev/null
fi
fi
I am aware of other posts that also recommend using dhclient-exit-hooks.d
; however my question is a way to automate the restarting and configuration of those services upon an IP address change.
linux debian dhcp
I have a Debian server at home. The server is my router and provides VPN access to the outside.
I do not have a static IP address; the lease time given by the ISP is two hours.
This cable cell which services the area I live, seems to have at least two different different netblocks for customers, and it is not entirely unusual obtaining a different IP address after a reboot of the Linux server, or less usually, but more importantly in what concerns this question, after some ISP maintenance operations.
I have some services that are dependent on the IP address; and the public IP adddress is used either for external (VPN) access, and for internal reference.
In some services, I use the dynamic DNS name from FreeDNS in order not to have to change an IP address in several locations.
As such, the best method I devised until now is running a script on dhclient-exit hooks. The script is called after DHCP gives/renews an IP, and restart services if the IP is changed.
I also change the IP of my dynamic DNS name on /etc/hosts
, for solving possible problems of using the old IP before the change at FreeDNS side trickles down to me.
The script I wrote for dhclient-exit-hooks.d
is this one; exit_status
should be 0 if all went ok with dhclient
.
#!/bin/bash
PATH=$PATH:/usr/bin
if ! [[ -v exit_status ]]
then
exit 1
fi
if [ $exit_status -eq 0 ]
then
IP=`ip addr show eth0.101 | grep inet | awk ' { print $2 } ' | cut -f1 -d "/"`
OLDIP=`awk ' /xxxx.mooo.com/ { print $1 } ' /etc/hosts`
if [ $reason = "REBOOT" ] || [ $reason = "BOUND" ] || [ $IP != $OLDIP ]
then
sed -i "s/^[0-9.]* xxxx.mooo.com/$IP xxxx.mooo.com/g" /etc/hosts
timeout 60 /opt/bin/iptables.sh
timeout 60 /etc/init.d/ipsec restart
timeout 60 /etc/init.d/asterisk restart
timeout 120 /etc/init.d/bind9 restart
timeout 60 /usr/bin/wget -O - http://freedns.afraid.org/dynamic/update.php?XXXXXXXXXXXX > /dev/null
fi
fi
I am aware of other posts that also recommend using dhclient-exit-hooks.d
; however my question is a way to automate the restarting and configuration of those services upon an IP address change.
linux debian dhcp
linux debian dhcp
edited 1 min ago
Rui F Ribeiro
asked Mar 13 '16 at 22:25
Rui F RibeiroRui F Ribeiro
41.9k1483142
41.9k1483142
Define "better"? What's wrong with this method? Is there a problem with it, where something doesn't exactly work? Since you're getting your IP address from DHCP, running it from the DHCP client seems like the best method, to me. Remember the old adage, "if it ain't broken, don't fix it"...
– Wouter Verhelst
Mar 20 '16 at 7:59
A bit complicated, too much dependent on the DHCP client, slight probability of getting hang services. You are absolutely right in the KISS part.
– Rui F Ribeiro
Mar 20 '16 at 8:42
1
Complicated? Seems simple enough. Dependent on the DHCP client? That seems like a feature, not a bug (anything else would require you to poll the IP address every so often, which is... well, not a good idea). Hung services? There are plenty of good monitoring tools out there which you can use to automatically restart services that are hung... Personally, I think your setup is cool, and I might actually duplicate it at home :-)
– Wouter Verhelst
Mar 21 '16 at 15:31
I edited it out with a view on having possible hang up services. And yep, there is monit. I do really need the IPsec part to be working with the right IP, as I use the VPN to have access to everything from the outside, including voIP and ssh. Hmmm I have started encrypting DNS in the meanwhile, will have to see if I need to add it to the restarted services.
– Rui F Ribeiro
Mar 21 '16 at 15:47
add a comment |
Define "better"? What's wrong with this method? Is there a problem with it, where something doesn't exactly work? Since you're getting your IP address from DHCP, running it from the DHCP client seems like the best method, to me. Remember the old adage, "if it ain't broken, don't fix it"...
– Wouter Verhelst
Mar 20 '16 at 7:59
A bit complicated, too much dependent on the DHCP client, slight probability of getting hang services. You are absolutely right in the KISS part.
– Rui F Ribeiro
Mar 20 '16 at 8:42
1
Complicated? Seems simple enough. Dependent on the DHCP client? That seems like a feature, not a bug (anything else would require you to poll the IP address every so often, which is... well, not a good idea). Hung services? There are plenty of good monitoring tools out there which you can use to automatically restart services that are hung... Personally, I think your setup is cool, and I might actually duplicate it at home :-)
– Wouter Verhelst
Mar 21 '16 at 15:31
I edited it out with a view on having possible hang up services. And yep, there is monit. I do really need the IPsec part to be working with the right IP, as I use the VPN to have access to everything from the outside, including voIP and ssh. Hmmm I have started encrypting DNS in the meanwhile, will have to see if I need to add it to the restarted services.
– Rui F Ribeiro
Mar 21 '16 at 15:47
Define "better"? What's wrong with this method? Is there a problem with it, where something doesn't exactly work? Since you're getting your IP address from DHCP, running it from the DHCP client seems like the best method, to me. Remember the old adage, "if it ain't broken, don't fix it"...
– Wouter Verhelst
Mar 20 '16 at 7:59
Define "better"? What's wrong with this method? Is there a problem with it, where something doesn't exactly work? Since you're getting your IP address from DHCP, running it from the DHCP client seems like the best method, to me. Remember the old adage, "if it ain't broken, don't fix it"...
– Wouter Verhelst
Mar 20 '16 at 7:59
A bit complicated, too much dependent on the DHCP client, slight probability of getting hang services. You are absolutely right in the KISS part.
– Rui F Ribeiro
Mar 20 '16 at 8:42
A bit complicated, too much dependent on the DHCP client, slight probability of getting hang services. You are absolutely right in the KISS part.
– Rui F Ribeiro
Mar 20 '16 at 8:42
1
1
Complicated? Seems simple enough. Dependent on the DHCP client? That seems like a feature, not a bug (anything else would require you to poll the IP address every so often, which is... well, not a good idea). Hung services? There are plenty of good monitoring tools out there which you can use to automatically restart services that are hung... Personally, I think your setup is cool, and I might actually duplicate it at home :-)
– Wouter Verhelst
Mar 21 '16 at 15:31
Complicated? Seems simple enough. Dependent on the DHCP client? That seems like a feature, not a bug (anything else would require you to poll the IP address every so often, which is... well, not a good idea). Hung services? There are plenty of good monitoring tools out there which you can use to automatically restart services that are hung... Personally, I think your setup is cool, and I might actually duplicate it at home :-)
– Wouter Verhelst
Mar 21 '16 at 15:31
I edited it out with a view on having possible hang up services. And yep, there is monit. I do really need the IPsec part to be working with the right IP, as I use the VPN to have access to everything from the outside, including voIP and ssh. Hmmm I have started encrypting DNS in the meanwhile, will have to see if I need to add it to the restarted services.
– Rui F Ribeiro
Mar 21 '16 at 15:47
I edited it out with a view on having possible hang up services. And yep, there is monit. I do really need the IPsec part to be working with the right IP, as I use the VPN to have access to everything from the outside, including voIP and ssh. Hmmm I have started encrypting DNS in the meanwhile, will have to see if I need to add it to the restarted services.
– Rui F Ribeiro
Mar 21 '16 at 15:47
add a comment |
3 Answers
3
active
oldest
votes
As Wouter commented, your existing setup seems pretty decent already.
If you want something less dependent on dhclient
, you could have a look at the many dynamic DNS clients packaged in Debian.
For example, ddclient
can react to DHCP changes or simply monitor an Ethernet interface; when the IP address changes (and only then), it can update a dynamic DNS entry (on any number of providers), as well as run a separate script (which would cover both your use-cases).
The dynamic DNS entry is quite a good idea, thanks. I should not have modified the original question with the edited timeouts, as it should also been part of the answer. There is still something missing about the way I had dhcpd configured...I have to test BIND better, had a race problem that I am not sure it is 100% solved.
– Rui F Ribeiro
Apr 14 '16 at 6:18
add a comment |
I propose to further simplify/split up your solution following the principle of separation of concerns:
- a script
/etc/dhcp/dhclient-exit-hooks.d/trigger_on_ip_change
should only decide whether action needs to be taken and defer the action to a separate script/usr/local/bin/act_on_ip_change
- the script
/usr/local/bin/act_on_ip_change
should only execute the necessary changes
The reasons for separating those concerns are:
- you can test separately whether
dhclient
is triggering correctly (without actually modifying anything on your system during debugging) - you can test the "change making" without the need to renew (and thus potential loose) your IP
- you can execute
/usr/local/bin/act_on_ip_change
manually in case there's a need - the parts are much easier to understand
In short, I'd suggest to have this in /etc/dhcp/dhclient-exit-hooks.d/trigger_on_ip_change_action
:
# based on /etc/dhcp/dhclient-exit-hooks.d/debug
if [ "$reason" = "BOUND" -a "$old_ip_address" != "$new_ip_address" ]; then
/usr/local/bin/act_on_ip_change
fi
+1 for noticing$new_ip_address
is there, and does not have to be extracted from the interface.
– Rui F Ribeiro
Oct 4 '16 at 17:08
add a comment |
In the end, I ended up simplifying things a bit my setup to act on IP addresses changes.
The Internet NAT was changed to MASQUERADE, so I do not have to act on it; the iptables
rules left the dhclient-exit-hooks.d
, installing iptables-persistent
.
iptables -A POSTROUTING -o eth0.101 ! -p esp -j MASQUERADE
apt-get install iptables-persistent
iptables-save > /etc/iptables/rules.v4
BIND stopped failing on boot because it recognises dependencies on iptables going up now.
I also do not restart BIND now. Furthermore, BIND is now dependent on dnscrypt-proxy
crypt to leave to the Internet, so it is only binded to the internal interfaces (which do not change).
Whist the variable exit_status
is mentioned in the dhclient-exit-hooks.d
documentation, apparently there is some confusion, and it is only used to pass exit status to DHCP, and not to get it.
So the final script is:
#!/bin/bash
PATH=$PATH:/usr/bin
IP=`ip addr show eth0.101 | grep inet | awk ' { print $2 } ' | cut -f1 -d "/"`
OLDIP=`awk ' /xxxx.mooo.com/ { print $1 } ' /etc/hosts`
# if reboot or IP changed
if [ $reason = "REBOOT" ] || [ $reason = "BOUND" ] || [ $IP != $OLDIP ]
then
# put it in hosts
sed -i "s/^[0-9.]* xxxx.mooo.com/$IP xxxx.mooo.com/g" /etc/hosts
timeout 60 /etc/init.d/ipsec restart
timeout 60 /etc/init.d/asterisk restart
# update FreeDNS service
timeout 60 /usr/bin/wget -O - http://freedns.afraid.org/dynamic/update.php?XXXX > /dev/null
fi
As for the absence of exit_status
, these are the vars presented in dhclient-exit-hooks.d
upon boot:
requested_broadcast_address=1
new_network_number=95.94.xx.0
new_ip_address=95.94.xx.xx
new_dhcp_message_type=5
pid=1100
new_time_offset=0
new_routers=95.94.xx.xx
new_expiry=1462482903
new_subnet_mask=255.255.240.0
interface=eth0.101
requested_time_offset=1
new_domain_name=netcabo.pt
reason=REBOOT
new_time_servers=212.113.176.129 212.113.176.65
requested_routers=1
PATH=/usr/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin
requested_subnet_mask=1
new_log_servers=212.113.188.209
new_dhcp_server_identifier=79.169.255.254
new_domain_name_servers=0.0.0.0 8.8.8.8
new_broadcast_address=95.94.xx.255
new_dhcp_renewal_time=7200
new_dhcp_rebinding_time=12600
PWD=/
new_next_server=0.0.0.0
new_dhcp_lease_time=14400
1
An additional useful service is DNS-o-matic (dnsomatic.com). It's not useful if you just need to update one service, but I have to update both FreeDNS and HE's tunnel broker for my IPv6 tunnel and this lets me do it with only a single update (critical for things like DD-WRT that require hasty hacking to allow multiple update targets).
– Todd Knarr
May 5 '16 at 17:36
Cool stuff. Thanks for the heads up @ToddKnarr
– Rui F Ribeiro
May 5 '16 at 18:33
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f269567%2fmethod-for-acting-on-ip-address-change-from-the-isp%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
As Wouter commented, your existing setup seems pretty decent already.
If you want something less dependent on dhclient
, you could have a look at the many dynamic DNS clients packaged in Debian.
For example, ddclient
can react to DHCP changes or simply monitor an Ethernet interface; when the IP address changes (and only then), it can update a dynamic DNS entry (on any number of providers), as well as run a separate script (which would cover both your use-cases).
The dynamic DNS entry is quite a good idea, thanks. I should not have modified the original question with the edited timeouts, as it should also been part of the answer. There is still something missing about the way I had dhcpd configured...I have to test BIND better, had a race problem that I am not sure it is 100% solved.
– Rui F Ribeiro
Apr 14 '16 at 6:18
add a comment |
As Wouter commented, your existing setup seems pretty decent already.
If you want something less dependent on dhclient
, you could have a look at the many dynamic DNS clients packaged in Debian.
For example, ddclient
can react to DHCP changes or simply monitor an Ethernet interface; when the IP address changes (and only then), it can update a dynamic DNS entry (on any number of providers), as well as run a separate script (which would cover both your use-cases).
The dynamic DNS entry is quite a good idea, thanks. I should not have modified the original question with the edited timeouts, as it should also been part of the answer. There is still something missing about the way I had dhcpd configured...I have to test BIND better, had a race problem that I am not sure it is 100% solved.
– Rui F Ribeiro
Apr 14 '16 at 6:18
add a comment |
As Wouter commented, your existing setup seems pretty decent already.
If you want something less dependent on dhclient
, you could have a look at the many dynamic DNS clients packaged in Debian.
For example, ddclient
can react to DHCP changes or simply monitor an Ethernet interface; when the IP address changes (and only then), it can update a dynamic DNS entry (on any number of providers), as well as run a separate script (which would cover both your use-cases).
As Wouter commented, your existing setup seems pretty decent already.
If you want something less dependent on dhclient
, you could have a look at the many dynamic DNS clients packaged in Debian.
For example, ddclient
can react to DHCP changes or simply monitor an Ethernet interface; when the IP address changes (and only then), it can update a dynamic DNS entry (on any number of providers), as well as run a separate script (which would cover both your use-cases).
edited Feb 3 '18 at 0:30
Rui F Ribeiro
41.9k1483142
41.9k1483142
answered Apr 13 '16 at 21:08
Stephen KittStephen Kitt
179k25407485
179k25407485
The dynamic DNS entry is quite a good idea, thanks. I should not have modified the original question with the edited timeouts, as it should also been part of the answer. There is still something missing about the way I had dhcpd configured...I have to test BIND better, had a race problem that I am not sure it is 100% solved.
– Rui F Ribeiro
Apr 14 '16 at 6:18
add a comment |
The dynamic DNS entry is quite a good idea, thanks. I should not have modified the original question with the edited timeouts, as it should also been part of the answer. There is still something missing about the way I had dhcpd configured...I have to test BIND better, had a race problem that I am not sure it is 100% solved.
– Rui F Ribeiro
Apr 14 '16 at 6:18
The dynamic DNS entry is quite a good idea, thanks. I should not have modified the original question with the edited timeouts, as it should also been part of the answer. There is still something missing about the way I had dhcpd configured...I have to test BIND better, had a race problem that I am not sure it is 100% solved.
– Rui F Ribeiro
Apr 14 '16 at 6:18
The dynamic DNS entry is quite a good idea, thanks. I should not have modified the original question with the edited timeouts, as it should also been part of the answer. There is still something missing about the way I had dhcpd configured...I have to test BIND better, had a race problem that I am not sure it is 100% solved.
– Rui F Ribeiro
Apr 14 '16 at 6:18
add a comment |
I propose to further simplify/split up your solution following the principle of separation of concerns:
- a script
/etc/dhcp/dhclient-exit-hooks.d/trigger_on_ip_change
should only decide whether action needs to be taken and defer the action to a separate script/usr/local/bin/act_on_ip_change
- the script
/usr/local/bin/act_on_ip_change
should only execute the necessary changes
The reasons for separating those concerns are:
- you can test separately whether
dhclient
is triggering correctly (without actually modifying anything on your system during debugging) - you can test the "change making" without the need to renew (and thus potential loose) your IP
- you can execute
/usr/local/bin/act_on_ip_change
manually in case there's a need - the parts are much easier to understand
In short, I'd suggest to have this in /etc/dhcp/dhclient-exit-hooks.d/trigger_on_ip_change_action
:
# based on /etc/dhcp/dhclient-exit-hooks.d/debug
if [ "$reason" = "BOUND" -a "$old_ip_address" != "$new_ip_address" ]; then
/usr/local/bin/act_on_ip_change
fi
+1 for noticing$new_ip_address
is there, and does not have to be extracted from the interface.
– Rui F Ribeiro
Oct 4 '16 at 17:08
add a comment |
I propose to further simplify/split up your solution following the principle of separation of concerns:
- a script
/etc/dhcp/dhclient-exit-hooks.d/trigger_on_ip_change
should only decide whether action needs to be taken and defer the action to a separate script/usr/local/bin/act_on_ip_change
- the script
/usr/local/bin/act_on_ip_change
should only execute the necessary changes
The reasons for separating those concerns are:
- you can test separately whether
dhclient
is triggering correctly (without actually modifying anything on your system during debugging) - you can test the "change making" without the need to renew (and thus potential loose) your IP
- you can execute
/usr/local/bin/act_on_ip_change
manually in case there's a need - the parts are much easier to understand
In short, I'd suggest to have this in /etc/dhcp/dhclient-exit-hooks.d/trigger_on_ip_change_action
:
# based on /etc/dhcp/dhclient-exit-hooks.d/debug
if [ "$reason" = "BOUND" -a "$old_ip_address" != "$new_ip_address" ]; then
/usr/local/bin/act_on_ip_change
fi
+1 for noticing$new_ip_address
is there, and does not have to be extracted from the interface.
– Rui F Ribeiro
Oct 4 '16 at 17:08
add a comment |
I propose to further simplify/split up your solution following the principle of separation of concerns:
- a script
/etc/dhcp/dhclient-exit-hooks.d/trigger_on_ip_change
should only decide whether action needs to be taken and defer the action to a separate script/usr/local/bin/act_on_ip_change
- the script
/usr/local/bin/act_on_ip_change
should only execute the necessary changes
The reasons for separating those concerns are:
- you can test separately whether
dhclient
is triggering correctly (without actually modifying anything on your system during debugging) - you can test the "change making" without the need to renew (and thus potential loose) your IP
- you can execute
/usr/local/bin/act_on_ip_change
manually in case there's a need - the parts are much easier to understand
In short, I'd suggest to have this in /etc/dhcp/dhclient-exit-hooks.d/trigger_on_ip_change_action
:
# based on /etc/dhcp/dhclient-exit-hooks.d/debug
if [ "$reason" = "BOUND" -a "$old_ip_address" != "$new_ip_address" ]; then
/usr/local/bin/act_on_ip_change
fi
I propose to further simplify/split up your solution following the principle of separation of concerns:
- a script
/etc/dhcp/dhclient-exit-hooks.d/trigger_on_ip_change
should only decide whether action needs to be taken and defer the action to a separate script/usr/local/bin/act_on_ip_change
- the script
/usr/local/bin/act_on_ip_change
should only execute the necessary changes
The reasons for separating those concerns are:
- you can test separately whether
dhclient
is triggering correctly (without actually modifying anything on your system during debugging) - you can test the "change making" without the need to renew (and thus potential loose) your IP
- you can execute
/usr/local/bin/act_on_ip_change
manually in case there's a need - the parts are much easier to understand
In short, I'd suggest to have this in /etc/dhcp/dhclient-exit-hooks.d/trigger_on_ip_change_action
:
# based on /etc/dhcp/dhclient-exit-hooks.d/debug
if [ "$reason" = "BOUND" -a "$old_ip_address" != "$new_ip_address" ]; then
/usr/local/bin/act_on_ip_change
fi
answered Oct 4 '16 at 16:13
Tomáš PospíšekTomáš Pospíšek
542210
542210
+1 for noticing$new_ip_address
is there, and does not have to be extracted from the interface.
– Rui F Ribeiro
Oct 4 '16 at 17:08
add a comment |
+1 for noticing$new_ip_address
is there, and does not have to be extracted from the interface.
– Rui F Ribeiro
Oct 4 '16 at 17:08
+1 for noticing
$new_ip_address
is there, and does not have to be extracted from the interface.– Rui F Ribeiro
Oct 4 '16 at 17:08
+1 for noticing
$new_ip_address
is there, and does not have to be extracted from the interface.– Rui F Ribeiro
Oct 4 '16 at 17:08
add a comment |
In the end, I ended up simplifying things a bit my setup to act on IP addresses changes.
The Internet NAT was changed to MASQUERADE, so I do not have to act on it; the iptables
rules left the dhclient-exit-hooks.d
, installing iptables-persistent
.
iptables -A POSTROUTING -o eth0.101 ! -p esp -j MASQUERADE
apt-get install iptables-persistent
iptables-save > /etc/iptables/rules.v4
BIND stopped failing on boot because it recognises dependencies on iptables going up now.
I also do not restart BIND now. Furthermore, BIND is now dependent on dnscrypt-proxy
crypt to leave to the Internet, so it is only binded to the internal interfaces (which do not change).
Whist the variable exit_status
is mentioned in the dhclient-exit-hooks.d
documentation, apparently there is some confusion, and it is only used to pass exit status to DHCP, and not to get it.
So the final script is:
#!/bin/bash
PATH=$PATH:/usr/bin
IP=`ip addr show eth0.101 | grep inet | awk ' { print $2 } ' | cut -f1 -d "/"`
OLDIP=`awk ' /xxxx.mooo.com/ { print $1 } ' /etc/hosts`
# if reboot or IP changed
if [ $reason = "REBOOT" ] || [ $reason = "BOUND" ] || [ $IP != $OLDIP ]
then
# put it in hosts
sed -i "s/^[0-9.]* xxxx.mooo.com/$IP xxxx.mooo.com/g" /etc/hosts
timeout 60 /etc/init.d/ipsec restart
timeout 60 /etc/init.d/asterisk restart
# update FreeDNS service
timeout 60 /usr/bin/wget -O - http://freedns.afraid.org/dynamic/update.php?XXXX > /dev/null
fi
As for the absence of exit_status
, these are the vars presented in dhclient-exit-hooks.d
upon boot:
requested_broadcast_address=1
new_network_number=95.94.xx.0
new_ip_address=95.94.xx.xx
new_dhcp_message_type=5
pid=1100
new_time_offset=0
new_routers=95.94.xx.xx
new_expiry=1462482903
new_subnet_mask=255.255.240.0
interface=eth0.101
requested_time_offset=1
new_domain_name=netcabo.pt
reason=REBOOT
new_time_servers=212.113.176.129 212.113.176.65
requested_routers=1
PATH=/usr/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin
requested_subnet_mask=1
new_log_servers=212.113.188.209
new_dhcp_server_identifier=79.169.255.254
new_domain_name_servers=0.0.0.0 8.8.8.8
new_broadcast_address=95.94.xx.255
new_dhcp_renewal_time=7200
new_dhcp_rebinding_time=12600
PWD=/
new_next_server=0.0.0.0
new_dhcp_lease_time=14400
1
An additional useful service is DNS-o-matic (dnsomatic.com). It's not useful if you just need to update one service, but I have to update both FreeDNS and HE's tunnel broker for my IPv6 tunnel and this lets me do it with only a single update (critical for things like DD-WRT that require hasty hacking to allow multiple update targets).
– Todd Knarr
May 5 '16 at 17:36
Cool stuff. Thanks for the heads up @ToddKnarr
– Rui F Ribeiro
May 5 '16 at 18:33
add a comment |
In the end, I ended up simplifying things a bit my setup to act on IP addresses changes.
The Internet NAT was changed to MASQUERADE, so I do not have to act on it; the iptables
rules left the dhclient-exit-hooks.d
, installing iptables-persistent
.
iptables -A POSTROUTING -o eth0.101 ! -p esp -j MASQUERADE
apt-get install iptables-persistent
iptables-save > /etc/iptables/rules.v4
BIND stopped failing on boot because it recognises dependencies on iptables going up now.
I also do not restart BIND now. Furthermore, BIND is now dependent on dnscrypt-proxy
crypt to leave to the Internet, so it is only binded to the internal interfaces (which do not change).
Whist the variable exit_status
is mentioned in the dhclient-exit-hooks.d
documentation, apparently there is some confusion, and it is only used to pass exit status to DHCP, and not to get it.
So the final script is:
#!/bin/bash
PATH=$PATH:/usr/bin
IP=`ip addr show eth0.101 | grep inet | awk ' { print $2 } ' | cut -f1 -d "/"`
OLDIP=`awk ' /xxxx.mooo.com/ { print $1 } ' /etc/hosts`
# if reboot or IP changed
if [ $reason = "REBOOT" ] || [ $reason = "BOUND" ] || [ $IP != $OLDIP ]
then
# put it in hosts
sed -i "s/^[0-9.]* xxxx.mooo.com/$IP xxxx.mooo.com/g" /etc/hosts
timeout 60 /etc/init.d/ipsec restart
timeout 60 /etc/init.d/asterisk restart
# update FreeDNS service
timeout 60 /usr/bin/wget -O - http://freedns.afraid.org/dynamic/update.php?XXXX > /dev/null
fi
As for the absence of exit_status
, these are the vars presented in dhclient-exit-hooks.d
upon boot:
requested_broadcast_address=1
new_network_number=95.94.xx.0
new_ip_address=95.94.xx.xx
new_dhcp_message_type=5
pid=1100
new_time_offset=0
new_routers=95.94.xx.xx
new_expiry=1462482903
new_subnet_mask=255.255.240.0
interface=eth0.101
requested_time_offset=1
new_domain_name=netcabo.pt
reason=REBOOT
new_time_servers=212.113.176.129 212.113.176.65
requested_routers=1
PATH=/usr/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin
requested_subnet_mask=1
new_log_servers=212.113.188.209
new_dhcp_server_identifier=79.169.255.254
new_domain_name_servers=0.0.0.0 8.8.8.8
new_broadcast_address=95.94.xx.255
new_dhcp_renewal_time=7200
new_dhcp_rebinding_time=12600
PWD=/
new_next_server=0.0.0.0
new_dhcp_lease_time=14400
1
An additional useful service is DNS-o-matic (dnsomatic.com). It's not useful if you just need to update one service, but I have to update both FreeDNS and HE's tunnel broker for my IPv6 tunnel and this lets me do it with only a single update (critical for things like DD-WRT that require hasty hacking to allow multiple update targets).
– Todd Knarr
May 5 '16 at 17:36
Cool stuff. Thanks for the heads up @ToddKnarr
– Rui F Ribeiro
May 5 '16 at 18:33
add a comment |
In the end, I ended up simplifying things a bit my setup to act on IP addresses changes.
The Internet NAT was changed to MASQUERADE, so I do not have to act on it; the iptables
rules left the dhclient-exit-hooks.d
, installing iptables-persistent
.
iptables -A POSTROUTING -o eth0.101 ! -p esp -j MASQUERADE
apt-get install iptables-persistent
iptables-save > /etc/iptables/rules.v4
BIND stopped failing on boot because it recognises dependencies on iptables going up now.
I also do not restart BIND now. Furthermore, BIND is now dependent on dnscrypt-proxy
crypt to leave to the Internet, so it is only binded to the internal interfaces (which do not change).
Whist the variable exit_status
is mentioned in the dhclient-exit-hooks.d
documentation, apparently there is some confusion, and it is only used to pass exit status to DHCP, and not to get it.
So the final script is:
#!/bin/bash
PATH=$PATH:/usr/bin
IP=`ip addr show eth0.101 | grep inet | awk ' { print $2 } ' | cut -f1 -d "/"`
OLDIP=`awk ' /xxxx.mooo.com/ { print $1 } ' /etc/hosts`
# if reboot or IP changed
if [ $reason = "REBOOT" ] || [ $reason = "BOUND" ] || [ $IP != $OLDIP ]
then
# put it in hosts
sed -i "s/^[0-9.]* xxxx.mooo.com/$IP xxxx.mooo.com/g" /etc/hosts
timeout 60 /etc/init.d/ipsec restart
timeout 60 /etc/init.d/asterisk restart
# update FreeDNS service
timeout 60 /usr/bin/wget -O - http://freedns.afraid.org/dynamic/update.php?XXXX > /dev/null
fi
As for the absence of exit_status
, these are the vars presented in dhclient-exit-hooks.d
upon boot:
requested_broadcast_address=1
new_network_number=95.94.xx.0
new_ip_address=95.94.xx.xx
new_dhcp_message_type=5
pid=1100
new_time_offset=0
new_routers=95.94.xx.xx
new_expiry=1462482903
new_subnet_mask=255.255.240.0
interface=eth0.101
requested_time_offset=1
new_domain_name=netcabo.pt
reason=REBOOT
new_time_servers=212.113.176.129 212.113.176.65
requested_routers=1
PATH=/usr/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin
requested_subnet_mask=1
new_log_servers=212.113.188.209
new_dhcp_server_identifier=79.169.255.254
new_domain_name_servers=0.0.0.0 8.8.8.8
new_broadcast_address=95.94.xx.255
new_dhcp_renewal_time=7200
new_dhcp_rebinding_time=12600
PWD=/
new_next_server=0.0.0.0
new_dhcp_lease_time=14400
In the end, I ended up simplifying things a bit my setup to act on IP addresses changes.
The Internet NAT was changed to MASQUERADE, so I do not have to act on it; the iptables
rules left the dhclient-exit-hooks.d
, installing iptables-persistent
.
iptables -A POSTROUTING -o eth0.101 ! -p esp -j MASQUERADE
apt-get install iptables-persistent
iptables-save > /etc/iptables/rules.v4
BIND stopped failing on boot because it recognises dependencies on iptables going up now.
I also do not restart BIND now. Furthermore, BIND is now dependent on dnscrypt-proxy
crypt to leave to the Internet, so it is only binded to the internal interfaces (which do not change).
Whist the variable exit_status
is mentioned in the dhclient-exit-hooks.d
documentation, apparently there is some confusion, and it is only used to pass exit status to DHCP, and not to get it.
So the final script is:
#!/bin/bash
PATH=$PATH:/usr/bin
IP=`ip addr show eth0.101 | grep inet | awk ' { print $2 } ' | cut -f1 -d "/"`
OLDIP=`awk ' /xxxx.mooo.com/ { print $1 } ' /etc/hosts`
# if reboot or IP changed
if [ $reason = "REBOOT" ] || [ $reason = "BOUND" ] || [ $IP != $OLDIP ]
then
# put it in hosts
sed -i "s/^[0-9.]* xxxx.mooo.com/$IP xxxx.mooo.com/g" /etc/hosts
timeout 60 /etc/init.d/ipsec restart
timeout 60 /etc/init.d/asterisk restart
# update FreeDNS service
timeout 60 /usr/bin/wget -O - http://freedns.afraid.org/dynamic/update.php?XXXX > /dev/null
fi
As for the absence of exit_status
, these are the vars presented in dhclient-exit-hooks.d
upon boot:
requested_broadcast_address=1
new_network_number=95.94.xx.0
new_ip_address=95.94.xx.xx
new_dhcp_message_type=5
pid=1100
new_time_offset=0
new_routers=95.94.xx.xx
new_expiry=1462482903
new_subnet_mask=255.255.240.0
interface=eth0.101
requested_time_offset=1
new_domain_name=netcabo.pt
reason=REBOOT
new_time_servers=212.113.176.129 212.113.176.65
requested_routers=1
PATH=/usr/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin
requested_subnet_mask=1
new_log_servers=212.113.188.209
new_dhcp_server_identifier=79.169.255.254
new_domain_name_servers=0.0.0.0 8.8.8.8
new_broadcast_address=95.94.xx.255
new_dhcp_renewal_time=7200
new_dhcp_rebinding_time=12600
PWD=/
new_next_server=0.0.0.0
new_dhcp_lease_time=14400
edited May 26 '16 at 8:45
answered May 2 '16 at 17:25
Rui F RibeiroRui F Ribeiro
41.9k1483142
41.9k1483142
1
An additional useful service is DNS-o-matic (dnsomatic.com). It's not useful if you just need to update one service, but I have to update both FreeDNS and HE's tunnel broker for my IPv6 tunnel and this lets me do it with only a single update (critical for things like DD-WRT that require hasty hacking to allow multiple update targets).
– Todd Knarr
May 5 '16 at 17:36
Cool stuff. Thanks for the heads up @ToddKnarr
– Rui F Ribeiro
May 5 '16 at 18:33
add a comment |
1
An additional useful service is DNS-o-matic (dnsomatic.com). It's not useful if you just need to update one service, but I have to update both FreeDNS and HE's tunnel broker for my IPv6 tunnel and this lets me do it with only a single update (critical for things like DD-WRT that require hasty hacking to allow multiple update targets).
– Todd Knarr
May 5 '16 at 17:36
Cool stuff. Thanks for the heads up @ToddKnarr
– Rui F Ribeiro
May 5 '16 at 18:33
1
1
An additional useful service is DNS-o-matic (dnsomatic.com). It's not useful if you just need to update one service, but I have to update both FreeDNS and HE's tunnel broker for my IPv6 tunnel and this lets me do it with only a single update (critical for things like DD-WRT that require hasty hacking to allow multiple update targets).
– Todd Knarr
May 5 '16 at 17:36
An additional useful service is DNS-o-matic (dnsomatic.com). It's not useful if you just need to update one service, but I have to update both FreeDNS and HE's tunnel broker for my IPv6 tunnel and this lets me do it with only a single update (critical for things like DD-WRT that require hasty hacking to allow multiple update targets).
– Todd Knarr
May 5 '16 at 17:36
Cool stuff. Thanks for the heads up @ToddKnarr
– Rui F Ribeiro
May 5 '16 at 18:33
Cool stuff. Thanks for the heads up @ToddKnarr
– Rui F Ribeiro
May 5 '16 at 18:33
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f269567%2fmethod-for-acting-on-ip-address-change-from-the-isp%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Define "better"? What's wrong with this method? Is there a problem with it, where something doesn't exactly work? Since you're getting your IP address from DHCP, running it from the DHCP client seems like the best method, to me. Remember the old adage, "if it ain't broken, don't fix it"...
– Wouter Verhelst
Mar 20 '16 at 7:59
A bit complicated, too much dependent on the DHCP client, slight probability of getting hang services. You are absolutely right in the KISS part.
– Rui F Ribeiro
Mar 20 '16 at 8:42
1
Complicated? Seems simple enough. Dependent on the DHCP client? That seems like a feature, not a bug (anything else would require you to poll the IP address every so often, which is... well, not a good idea). Hung services? There are plenty of good monitoring tools out there which you can use to automatically restart services that are hung... Personally, I think your setup is cool, and I might actually duplicate it at home :-)
– Wouter Verhelst
Mar 21 '16 at 15:31
I edited it out with a view on having possible hang up services. And yep, there is monit. I do really need the IPsec part to be working with the right IP, as I use the VPN to have access to everything from the outside, including voIP and ssh. Hmmm I have started encrypting DNS in the meanwhile, will have to see if I need to add it to the restarted services.
– Rui F Ribeiro
Mar 21 '16 at 15:47