Benutzer-Werkzeuge

Webseiten-Werkzeuge


home-server

Dies ist eine alte Version des Dokuments!


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:

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)

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

Abhängigkeiten: links und jq

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:

  1. 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;
  2. in der Horizon-Box muss unter FORTGESCHRITTEN / Weiterleitung eine Port-Weiterleitung eingerichtet werden, z.B.:
    • | 80 | 192.168.0.2 | 80 | TCP |
  3. sinnvoll wäre auch ein Portweiterleitung für den Port 443 aber natürlich nur, wenn man seine Web-Seite SSL-verschlüsselt hat
  4. jetzt wird ein DynDNS-Zugang benötigt, den kann man u.a. bei selfhost bekommen;
  5. 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;
    1. beispielsweise sieht das bei selfhost so aus:
    2. man kann es auch automatisieren, dann würde der Kommandozeilenaufruf von Linux aus so aussehen:
    3. die Kommandozeile kann man dann in die crontab eintragen und einmal am Tag ausführen lassen, damit wäre der selbst gebaute DynDNS-Client fertig;
      1. 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.

/home/http/wiki/data/attic/home-server.1627566108.txt · Zuletzt geändert: von david