Feste dynamische IPs

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")
  1. #!/usr/bin/python
  2.  
  3. import os
  4.  
  5. def gettextoutput(cmd):
  6.     """Return (status, output) of executing cmd in a shell."""
  7.     pipe = os.popen(‘{ ‘ + cmd + ‘; } 2>&1’, ‘r’)
  8.     pipe = os.popen(cmd + ‘ 2>&1’, ‘r’)
  9.     text = pipe.read()
  10.     if text[1:] == n: text = text[:-1]
  11.     return text
  12.  
  13. home_dyndns = "home.andi95.de"
  14. log_dyndns = "/var/log/iptables_dyndns_update.log"
  15. last_dyndns = gettextoutput("cat " + log_dyndns)
  16. cur_dyndns = gettextoutput("host " + home_dyndns)
  17. cur_iptables = gettextoutput("/sbin/iptables -S INPUT |grep "\-A INPUT \-s" -m 1|cut -d " " -f 4|cut -d "/" -f 1")
  18.  
  19. print "Log: "+ last_dyndns
  20. print "Cur: "+ cur_dyndns
  21. print "IPT: "+ cur_iptables
  22.  
  23. if last_dyndns == cur_dyndns and cur_iptables in last_dyndns and cur_iptables != "":
  24.     print "IPs match, no restart necessary"
  25. else:
  26.     print "Updating last IP with current"
  27.     os.system("echo ‘" + cur_dyndns + "’ > " + log_dyndns)
  28.     print "Restarting iptables to update"
  29.     os.system("/sbin/iptables-restore < /etc/firewall.conf")
  30.     os.system("/etc/init.d/squid3 restart")

Quelle: Feste dynamische IPs

Über Andreas Bräu

Software Developer Freifunker