Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Home-Server
DynDNS
Gelegentlich ist es eine gute Idee, einen Server zu Hause einzurichten und ihn dann aus dem Internet erreichbar zu machen. Das nennt sich "Home-Server".
Hat man seinen Internetzugang bei der Telekom oder bei 1und1, dann ist das mit einem DynDNS-Account ganz einfach zu realisieren. Komplizierter wird es, wenn man seinen Internetzugang bei Unitymedia hat.
Mit einem Internetzugang von Unitymedia, bei dem man eine Fritz!Box bekommen hat, benötigt man einen DynDNS-Anbieter, der IPv6 unterstützt.
deutsche DynDNS-Anbieter:
- http://selfhost.de/ - der beste, kann aber kein IPv6
- http://spdns.de/ - kann IPv6
ddclient
Achtung: ddclient ist ziemlich buggy, wenn Cloudflare als DNS zum Einsatz kommt, empfehle ich das selbstgeschriebene Skript weiter unten (Stand ddclient 3.9.1)
- https://github.com/ddclient/ddclient - originale Konfigurationsvorlage findet man im repo unter dem Namen: ddclient.conf.in
- IPv6 und manche DNS Anbieter (z.B. Cloudflare) brauchen noch weitere Abhängigkeiten. Siehe Installation.
Konfigurationsdateien
- /etc/ddclient/ddclientv4.conf
daemon=0 syslog=yes pid=@runstatedir@/ddclient.pid ssl=yes ipv6=no login=E-MAIL password=API-KEY-TOKEN use=cmd, cmd='curl --ipv4 http://checkip.dyndns.org/', cmd-skip='Current IP Address: ' #use=web, web='http://checkip.dyndns.org/', web-skip='Current IP Address: ' protocol=cloudflare, zone=EXAMPLE.COM, ttl=1, EXAMPLE.COM
- /etc/ddclient/ddclientv6.conf
daemon=0 syslog=yes pid=@runstatedir@/ddclient.pid ssl=yes ipv6=yes login=E-MAIL password=API-KEY-TOKEN use=cmd, cmd='curl --ipv6 http://checkipv6.dyndns.org/', cmd-skip='Current IP Address: ' #use=web, web='http://checkipv6.dyndns.org/', web-skip='Current IP Address: ' protocol=cloudflare, zone=EXAMPLE.COM, ttl=1, EXAMPLE.COM
IPv6 auf der von Debian gepatchten Version (z.B. Ubuntu)
- /etc/ddclient/ddclientv6.conf
daemon=0 syslog=yes pid=@runstatedir@/ddclient.pid ssl=yes ipv6=yes login=E-MAIL password=API-KEY-TOKEN ### usev6 only works with debian's patched version in apt repos usev6=if, if='eth0', if-skip='inet6 ' protocol=cloudflare, zone=EXAMPLE.COM, ttl=1, EXAMPLE.COM
Benutzung
Aufruf (IPv4 & IPv6):
ddclient -daemon 0 -file /etc/ddclient/ddclientv4.conf -force && ddclient -daemon 0 -file /etc/ddclient/ddclientv6.conf -force
Debuggen (IPv4 & IPv6)
ddclient -daemon=0 -file /etc/ddclient/ddclientv4.conf -force -debug -noquiet -verbose && ddclient -daemon 0 -file /etc/ddclient/ddclientv6.conf -force -debug -noquiet -verbose
ddclient soll stündlich statt täglich ausgeführt werden
mv /usr/local/etc/periodic/daily/ddclient_force /usr/local/etc/periodic/hourly/
alternativ: nur den einzelnen Befehl in crontab hinzufügen
0 * * * * ddclient -daemon 0 -file /etc/ddclient/ddclientv4.conf -force && ddclient -daemon 0 -file /etc/ddclient/ddclientv6.conf -force
DynDNS-Client selbst gebaut
Cloudflare
neuste Version auf GitHub: https://github.com/Masterflitzer/cloudflare-dyndns.git
Abhängigkeiten: links und jq
Cron:
@reboot root cloudflare-dyndns.sh > /var/log/cloudflare-dyndns.log 2>&1 @hourly root cloudflare-dyndns.sh > /var/log/cloudflare-dyndns.log 2>&1
- cloudflare-dyndns.sh
#!/bin/sh ### Variables INTERVAL="5" COUNTER="10" # credentials: email + password/api-key # when using api-key: the key needs the following permissions: com.cloudflare.api.user.read, #dns_records:edit EMAIL="" API_KEY="" # when you want to update "www.example.com", "www" is the RECORD_NAME and "example.com" is the ZONE_NAME ZONE_NAME="" # multiple record names separated by space, e.g. "www mail smtp" RECORD_NAME_V4="" RECORD_NAME_V6="" TTL="1" PROXIED="false" #------------------------------------------------------------------------------# ### Functions links_IPv4() { IPv4="$(links -dump http://checkip.dyndns.org/ | tr -s '[ :]' '\n' | egrep '[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+')" #IPv4="1.1.1.1" } links_IPv6() { IPv6="$(links -dump http://checkipv6.dyndns.org/ | tr -s ' ' '\n' | egrep '[0-9a-f]+[:]+[0-9a-f]+[:]*')" #IPv6="2606:4700:4700::1111" } #------------------------------------------------------------------------------# ### Get IPs COUNTER_V4="${COUNTER}" COUNTER_V6="${COUNTER}" links_IPv4 while [ "x${IPv4}" = "x" -a "${COUNTER_V4}" -gt "0" ] do echo -n '.' COUNTER_V4="$(echo "${COUNTER_V4}"|awk '{print $1-1}')" sleep ${INTERVAL} links_IPv4 done links_IPv6 while [ "x${IPv6}" = "x" -a "${COUNTER_V6}" -gt "0" ] do echo -n '.' COUNTER_V6="$(echo "${COUNTER_V6}"|awk '{print $1-1}')" sleep ${INTERVAL} links_IPv6 done #==============================================================================# ### Get ZONE_ID echo "#==============================================================================#" ZONE_ID="$(curl -X GET "https://api.cloudflare.com/client/v4/zones" -H "X-Auth-Email: ${EMAIL}" -H "X-Auth-Key: ${API_KEY}" -H "Content-Type: application/json" 2>/dev/null | jq -r '.result[] | .id')" echo echo "1. ZONE_NAME='${ZONE_NAME}'" echo "2. ZONE_ID='${ZONE_ID}'" #------------------------------------------------------------------------------# ### IPv4 ### Get RECORD_ID for ZONE_NAME RECORD_ID="$(curl -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records" -H "X-Auth-Email: ${EMAIL}" -H "X-Auth-Key: ${API_KEY}" -H "Content-Type: application/json" 2>/dev/null | jq -r ".result[] | select((.name == \"${ZONE_NAME}\") and (.type == \"A\")) | .id")" echo echo "3. RECORD_ID='${RECORD_ID}'" ### Set IPv4 curl -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${RECORD_ID}" -H "X-Auth-Email: ${EMAIL}" -H "X-Auth-Key: ${API_KEY}" -H "Content-Type: application/json" --data "{\"type\":\"A\",\"name\":\"${ZONE_NAME}\",\"content\":\"${IPv4}\",\"ttl\":${TTL},\"proxied\":${PROXIED}}" echo #------------------------------------------------------------------------------# ### IPv4 - RECORD_NAME for RECORD_NAME in ${RECORD_NAME_V4} { ### Get RECORD_ID for ZONE_NAME RECORD_ID="$(curl -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records" -H "X-Auth-Email: ${EMAIL}" -H "X-Auth-Key: ${API_KEY}" -H "Content-Type: application/json" 2>/dev/null | jq -r ".result[] | select((.name == \"${RECORD_NAME}.${ZONE_NAME}\") and (.type == \"A\")) | .id")" echo echo "4. RECORD_NAME.ZONE_NAME='${RECORD_NAME}.${ZONE_NAME}'" echo "5. RECORD_ID='${RECORD_ID}'" ### Set IPv4 curl -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${RECORD_ID}" -H "X-Auth-Email: ${EMAIL}" -H "X-Auth-Key: ${API_KEY}" -H "Content-Type: application/json" --data "{\"type\":\"A\",\"name\":\"${RECORD_NAME}.${ZONE_NAME}\",\"content\":\"${IPv4}\",\"ttl\":${TTL},\"proxied\":${PROXIED}}" echo } #------------------------------------------------------------------------------# ### IPv6 ### Get RECORD_ID for ZONE_NAME RECORD_ID="$(curl -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records" -H "X-Auth-Email: ${EMAIL}" -H "X-Auth-Key: ${API_KEY}" -H "Content-Type: application/json" 2>/dev/null | jq -r ".result[] | select((.name == \"${ZONE_NAME}\") and (.type == \"AAAA\")) | .id")" echo echo "6. RECORD_ID='${RECORD_ID}'" ### Set IPv6 curl -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${RECORD_ID}" -H "X-Auth-Email: ${EMAIL}" -H "X-Auth-Key: ${API_KEY}" -H "Content-Type: application/json" --data "{\"type\":\"AAAA\",\"name\":\"${ZONE_NAME}\",\"content\":\"${IPv6}\",\"ttl\":${TTL},\"proxied\":${PROXIED}}" echo #------------------------------------------------------------------------------# ### IPv6 - RECORD_NAME for RECORD_NAME in ${RECORD_NAME_V6} { ### Get RECORD_ID for ZONE_NAME RECORD_ID="$(curl -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records" -H "X-Auth-Email: ${EMAIL}" -H "X-Auth-Key: ${API_KEY}" -H "Content-Type: application/json" 2>/dev/null | jq -r ".result[] | select((.name == \"${RECORD_NAME}.${ZONE_NAME}\") and (.type == \"AAAA\")) | .id")" echo echo "7. RECORD_NAME.ZONE_NAME='${RECORD_NAME}.${ZONE_NAME}'" echo "8. RECORD_ID='${RECORD_ID}'" ### Set IPv6 curl -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${RECORD_ID}" -H "X-Auth-Email: ${EMAIL}" -H "X-Auth-Key: ${API_KEY}" -H "Content-Type: application/json" --data "{\"type\":\"AAAA\",\"name\":\"${RECORD_NAME}.${ZONE_NAME}\",\"content\":\"${IPv6}\",\"ttl\":${TTL},\"proxied\":${PROXIED}}" echo } #==============================================================================#
Selfhost
Wird dagegen der Internetzugang per Horizon-Box bereitgestellt, dann kann man dort keinen DynDNS-Account eintragen und muss sich einen DynDNS-Client selber bauen.
hierfür sind folgende Schritte abzuarbeiten:
- Home-Server mit fester IP im LAN (z.B. 192.168.0.2) konfigurieren, der Server darf keine DHCP-Adresse bekommen, da sich diese u.u. ändern kann;
- in der Horizon-Box muss unter
FORTGESCHRITTEN / Weiterleitungeine Port-Weiterleitung eingerichtet werden, z.B.:| 80 | 192.168.0.2 | 80 | TCP |
- sinnvoll wäre auch ein Portweiterleitung für den Port 443 aber natürlich nur, wenn man seine Web-Seite SSL-verschlüsselt hat
- jetzt wird ein DynDNS-Zugang benötigt, den kann man u.a. bei selfhost bekommen;
- beim DynDNS-Anbieter eine Umleitung einrichten und das vergebene Passwort merken, man kann sich bei selfhost auch schon eine Update-URL generieren, von der nur die IP entsprechend jedesmal angepasst werden muss;
- beispielsweise sieht das bei selfhost so aus:
- man kann es auch automatisieren, dann würde der Kommandozeilenaufruf von Linux aus so aussehen:
links -dump http://3075846:geheim@carol.selfhost.de/nic/update?myip=$(links -dump http://www.meine-aktuelle-ip.de/ | awk '/Ihre aktuelle IP Adresse:/{print $NF}')
- die Kommandozeile kann man dann in die
crontabeintragen und einmal am Tag ausführen lassen, damit wäre der selbst gebaute DynDNS-Client fertig;- Wichtig ist hierbei noch, dass er nicht zu oft ausgeführt wird, da einige Anbieter nur ein IP-Update pro Tag zulassen!
hier noch ein paar alternative Kommandozeilenaufrufe für Linux, die theoretisch alle das gleiche bewirken sollten:
links -dump http://3075846:geheim@carol.selfhost.de/nic/update?myip=$(links -dump http://www.ip-secrets.info/ | awk '/Ihre aktuelle IP-Adresse:/{print $NF}')
links -dump http://3075846:geheim@carol.selfhost.de/nic/update?myip=$(links -dump http://www.wieistmeineip.de/ | sed -n '/Ihre IP-Adresse lautet:/,/[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*/p' | awk '/[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*/{print $NF}')
links -dump http://3075846:geheim@carol.selfhost.de/nic/update?myip=$(links -dump http://www.meine-aktuelle-ip.de/ | awk '/Ihre aktuelle IP Adresse:/{print $NF}')
links -dump http://3075846:geheim@carol.selfhost.de/nic/update?myip=$(links -dump http://www.meineip.de/ | sed -n '/Meine IP-Adresse lautet:/,/[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*/p' | awk '/[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*/{print $NF}')
links -dump http://3075846:geheim@carol.selfhost.de/nic/update?myip=$(links -dump http://meineipadresse.de/ | fgrep 'Meine o:ffentliche' | tr -s ' ' '\n' | awk '/[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*/{print $NF}')
links -dump http://3075846:geheim@carol.selfhost.de/nic/update?myip=$(links -dump http://www.heise.de/netze/tools/meine-ip-adresse/ | awk '/Ihre Anfrage kommt von der IP-Adresse:/{print $NF}')
Statt "3075846" und "geheim" sind die eigenen Zugangsdaten für den DynDNS-Account anzugeben.
Und nicht vergessen!
Es muss unbedingt der PATH angegeben werden, denn sonst kann der CRON-Dienst das Programm links nicht finden.
Da diese Kommandos mit Linux und FreeBSD funktionieren sollen, kann ich hier den absoluten Pfad nicht angeben. Denn der links-Pfad ist bei Linux und FreeBSD unterschiedlich.
