DynDNS ist eine schöne Sache, wenn man Dienste hinter einem DSL-Anschluss anbieten will.
Möchte man seine DynDNS-Domain zur Steuerung von Zugriffsberechtigungen verwenden stößt man schnell an die Grenzen. Squid und iptables lösen den DNS-Namen zum Startzeitpunkt auf und arbeiten ab dann mit der IP weiter. xinetd geht sogar noch weiter und macht einen ReverseDNS-Lookup auf die eingehende IP und vergleich das Ergebnis mit der eingetragenen IP, den ReverseDNS-Eintrag kann man jedoch nur der Provider festlegen. Xinetd ist mit dynamischen IP-Adressen gar nicht nutzbar.
Die Idee zur Lösung liegt schon im Internet unter http://diginc.us/linux/2010/using-iptables-with-dynamic-ip-hostnames-like-dyndns-org/. Es erlaubt bei Änderung der IP-Adresse des DynDNS-Domainnamens, Aktionen auszuführen.
Das Skript löst die aktuelle IP des Hostnamens auf und führt, falls sich die IP unterscheidet die gewünschten Aktionen aus. Dienste werden dabei neu gestartet, iptables-Regeln werden neu geschrieben. Die Regeln legt man zuvor manuell an und speichert sie dann mit iptables-save nach /etc/firewall.conf. Alle darin enthalteten IP-Adressen, die dynamisch sind werden durch den DynDNS-Namen ersetzt. Die Anpassungen im Skript prüfen die Quelladresse der ersten Regel im INPUT-Chain.
#!/usr/bin/python import os def gettextoutput(cmd): """Return (status, output) of executing cmd in a shell.""" pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r') pipe = os.popen(cmd + ' 2>&1', 'r') text = pipe.read() if text[-1:] == 'n': text = text[:-1] return text home_dyndns = "home.andi95.de" log_dyndns = "/var/log/iptables_dyndns_update.log" last_dyndns = gettextoutput("cat " + log_dyndns) cur_dyndns = gettextoutput("host " + home_dyndns) cur_iptables = gettextoutput("/sbin/iptables -S INPUT |grep "\-A INPUT \-s" -m 1|cut -d " " -f 4|cut -d "/" -f 1") print "Log: "+ last_dyndns print "Cur: "+ cur_dyndns print "IPT: "+ cur_iptables if last_dyndns == cur_dyndns and cur_iptables in last_dyndns and cur_iptables != "": print "IPs match, no restart necessary" else: print "Updating last IP with current" os.system("echo '" + cur_dyndns + "' > " + log_dyndns) print "Restarting iptables to update" os.system("/sbin/iptables-restore < /etc/firewall.conf") os.system("/etc/init.d/squid3 restart")
-
#!/usr/bin/python
-
-
import os
-
-
def gettextoutput(cmd):
-
"""Return (status, output) of executing cmd in a shell."""
-
pipe = os.popen(‘{ ‘ + cmd + ‘; } 2>&1’, ‘r’)
-
pipe = os.popen(cmd + ‘ 2>&1’, ‘r’)
-
text = pipe.read()
-
if text[–1:] == ‘n‘: text = text[:-1]
-
return text
-
-
home_dyndns = "home.andi95.de"
-
log_dyndns = "/var/log/iptables_dyndns_update.log"
-
last_dyndns = gettextoutput("cat " + log_dyndns)
-
cur_dyndns = gettextoutput("host " + home_dyndns)
-
cur_iptables = gettextoutput("/sbin/iptables -S INPUT |grep "\-A INPUT \-s" -m 1|cut -d " " -f 4|cut -d "/" -f 1")
-
-
print "Log: "+ last_dyndns
-
print "Cur: "+ cur_dyndns
-
print "IPT: "+ cur_iptables
-
-
if last_dyndns == cur_dyndns and cur_iptables in last_dyndns and cur_iptables != "":
-
print "IPs match, no restart necessary"
-
else:
-
print "Updating last IP with current"
-
os.system("echo ‘" + cur_dyndns + "’ > " + log_dyndns)
-
print "Restarting iptables to update"
-
os.system("/sbin/iptables-restore < /etc/firewall.conf")
-
os.system("/etc/init.d/squid3 restart")
Quelle: Feste dynamische IPs