# Wie kann ich die IP-Addresse mit meinem PI zu meiner 1&1 Domain senden?



## CosmoCortney (8. März 2018)

Hallo,
nachdem ich mir erst eine Domain bei Strato gekauft hatte und ich von denen keine eindeutige Information erhielt, ob meine persönlichen Daten von der WHOIS-Abfrage anonymisiert werden können (obwohl das eigentlich mölich ist), habe ich mir diese bei 1&1 geholt.
Bin deren Anleitung gefolgt mit der man einen Pi zu einem DNS-Server macht: So machen Sie aus dem Raspberry Pi einen DNS-Server - 1&1
Aber es wird nicht beschrieben, Wie und wo ich meinen Domain- und/oder meinen Nutzernamen und Passwort eintrage.


----------



## Stockmann (9. März 2018)

Der Pi steht bei dir zuhause oder?
Und du möchtest das deine Domain darauf verweist oder?

Da benötigst du eine Feste IPv4 Adresse und in den Einstellungen der Domain gibst du deine Feste IP Adresse an.
Danach nur noch die Firewall zuhause konfigurieren.

Wenn die Punkte korrekt sind, kann ich dir das gerne ausführlicher beschreiben, musst es nur sagen.


----------



## CosmoCortney (9. März 2018)

Stockmann schrieb:


> Der Pi steht bei dir zuhause oder?
> Und du möchtest das deine Domain darauf verweist oder?


Genau



Stockmann schrieb:


> Da benötigst du eine Feste IPv4 Adresse und in den Einstellungen der Domain gibst du deine Feste IP Adresse an.
> Danach nur noch die Firewall zuhause konfigurieren.
> 
> Wenn die Punkte korrekt sind, kann ich dir das gerne ausführlicher beschreiben, musst es nur sagen.


Wieso eine statische IP, wenn man die dynamische der Domain zuweisen kann?
Bei Strato und no-ip funktioniert das ja. Bei no-ip möchte ich aber nicht meine Domain kaufen, da man dann noch Premium-Services dazu kaufen muss (wenn ich das richtig erkannt habe). Bei Strato hatte ich das Problem, dass meine personenbezogenen Daten über die WHOIS-Abfrage erfasst werden konnten und ich so nervige Mails und Anrufe bekam. Ich habe mich auf Empfehlung eines Forenmitglieds an Strato gewendet, da er seine Daten dort hat anonymisiert bekommen. Ich habe aber diesbezüglich vom Support keine (für mich) eindeutige Information erhalten


----------



## Axiom (9. März 2018)

Ich glaub ich kann da helfen.
Ich habe selber eine 1und1 Domain, wobei eine Subdomain davon auf meine dynamische IP bei mir daheim läuft.
Ich benutze eine Kombination aus:
1und1 Domain, Cloudflare Free und DNS-O-Matic

Bei dir würde vielleicht auch nur 1und1 und Cloudflare reichen

Also Cloudflare Account erstellen > bei 1und1 Domain Cloudflare Nameserver eintragen >  Anleitungen über CloudFlare DDNS Raspberry folgen 

Bei mir ist nur der unterschied das mein Asus Router die IP an DNS-O-Matic weitergibt, einfach aus  den Grund damit ich DDNS mit Domain und OpenDNS gleichzeitig benutzen kann

Edit: Da die Domain immer noch über 1und1 registriert ist, wird sich an den WHOIS-Daten nichts ändern ^^
Edit2: Bei der CloudFlare habe ich die Domain (bei mir Subdomain) nicht durch die Cloud gejagt, habe ich also bei den DNS Einstellungen abgewählt


----------



## CosmoCortney (9. März 2018)

Axiom schrieb:


> Ich glaub ich kann da helfen.
> Ich habe selber eine 1und1 Domain, wobei eine Subdomain davon auf meine dynamische IP bei mir daheim läuft.
> Ich benutze eine Kombination aus:
> 1und1 Domain, Cloudflare Free und DNS-O-Matic
> ...


Okay, was genau ist Cloudflare?



Axiom schrieb:


> Also Cloudflare Account erstellen > bei 1und1 Domain Cloudflare Nameserver eintragen >  Anleitungen über CloudFlare DDNS Raspberry folgen
> 
> Bei mir ist nur der unterschied das mein Asus Router die IP an DNS-O-Matic weitergibt, einfach aus  den Grund damit ich DDNS mit Domain und OpenDNS gleichzeitig benutzen kann
> 
> ...


Also die WHOIS-Abfrage liefert nun keine meiner Daten zurück


----------



## Axiom (9. März 2018)

Naja, Cloudflare ist schwer zu erklären...
Vielleicht hilft dir die Wiki Seite weiter Cloudflare – Wikipedia
Eigentlich bräuchtest wahrscheinlich die meisten Funktionen nicht und ist für dich auch etwas überladen 
Für dich wäre wohl nur DNS interessant mit der Möglichkeit ne Dynamische IP auf die Domain zu binden. 

PS: Da fällt mir auf das die Webadresse "*www.pcgameshardware.de" *auch Cloudflare benutzt...


----------



## CosmoCortney (9. März 2018)

Achso okay, danke.
Ich hatte mal ne Zeit lang eine kostenfreie, anonyme Domain von no-ip, aber das ganze ist etwas sehr unflexibel. no-ip2 hat immer meine ip zur Domain gebunden.
Für 2 Wochen hatte ich mir eine bei Strato gekauft, aber wie gesagt, wieder gekündigt, da meine Daten auf WHOIS landeten und ich nervige Anrufe bekam. Außerdem möchte ich nicht, dass meine physikalische Addresse einsehbar ist (mit sowas hatte ich schon schlechte Erfahrung machen müssen). Da habe ich die IP via Cronjob geupdatet. Ein Forum-Mitglied half mir dabei.
Aber ich blicke nicht s ganz durch, wie ich das bei 1&1 einrichten kann.
Ich wäre sehr dankbar und glücklich, wenn wir schonmal alles so hinbekommen, dass ich wieder meine IP automatisch zur Domain gebunden bekomme 
Danach kümmere ich mich um Cloudflare


----------



## Axiom (9. März 2018)

Sorry, war ne weile im RealLife ^^
Wenn deine IP deiner Leitung nicht Öffentlich sein soll, einfach durch die Cloud (CDN) von Cloudflare jagen.
Die WHOIS-Abfrage wird gleich bleiben also mit 1und1 Adresse.
Also Cloudflare Account erstellen > Cloudflare mit der Domain verbinden und hier ne Anleitung für den Pi, für IP wechsel mit Cloudflare
How to Set Up Dynamic DNS from a Raspberry Pi * BitPi.co

Edit: Falls de die Mailserver von 1und1 in Kombination mit  Cloudflare benutzen möchtest, einfach ein MX Record erstellen.
Schaut bei 1und1 so aus:



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Die andere Sache wäre für was ist die Domain gedacht? Für Webseiten funktioniert die Cloudflare CDN ganz gut.
Für Sachen wie VPN-Server sollte es aber nicht durch die Cloud gejagt werden, da der VPN-Client nicht die richtige IP bekommt
Es gibt natürlich auch Anbieter die haben nur DDNS, aber bei jeden DDNS wird es wohl sein das deine IP sozusagen abrufbar ist. 
Also hat Cloudflare sozusagen den Vorteil das deine IP, sofern CDN aktiviert ist, nicht sichtbar ist.

Habe gerade ein Script zum Updaten gefunden, falls du nichts auf den Pi extra installen willst: (Habe ich aber nicht getestet)

```
[COLOR=#000000]#!/bin/shversion='0.2'
cfddns='[CloudFlareDDNS-'$version']'

#Get current public ip

MYIP=$(curl -s ipinfo.io/ip)
OLDIP=$(cat oldip.txt)


# Instructions:
# Define variables for API calls. Replace these with your own values!                  #
#################################################################################
token=12345678901234567890                                                  # CloudFlare token                    #
email=example@example.com                                                      # Cloudflare login account    #
z=example.com                                                                             # Domain Name                                #
id=1234567890                                                                              # CloudFlare Record ID            #
type=A                                                                                               # CloudFlare Record Type        #
ttl=1                                                                                              # TTL value                                    #
content=$MYIP                                                                              # IP address                                #
#################################################################################

if [ "$1" = "-f" ]
then
    echo 'cf-ddns called with -f, forcing update!'
    OLDIP=''
else
    echo 'No parameter found, normal run'
fi

if [ "$MYIP" = "$OLDIP" ]

then
  logger -s $cfddns "[INFO] No IP change detected" # Write to Syslog

else
  logger -s $cfddns "[INFO] IP change detected, updating CloudFlare trough API. Old IP was "$OLDIP" - New IP is " $MYIP             # Write to syslog


#########
# Instructions:
# Copy this block for the different hostnames you want to dynamically update, and insert unique id and name for the record.
########

# hostname: test.example.com
    id=51234567890
    name=test.example.com

    # Update record:
    curl -s -k  -L -X POST -H 'Content-Type: application/x-www-form-urlencoded' -d 'a=rec_edit&tkn='$token'&email='$email'&z='$z'&id='$id'&type='$type'&name='$name'&ttl='$ttl'&content='$content 'https://www.cloudflare.com/api_json.html'

# hostname: test2.example.com
    id=1234567891
    name=test2.example.com

    # Update record
    curl -s -k  -L -X POST -H 'Content-Type: application/x-www-form-urlencoded' -d 'a=rec_edit&tkn='$token'&email='$email'&z='$z'&id='$id'&type='$type'&name='$name'&ttl='$ttl'&content='$content 'https://www.cloudflare.com/api_json.html'


 echo $MYIP > oldip.txt
  logger -s $cfddns [INFO] "New IP is: " $MYIP
fi
```

Die Quelle des Codes


----------



## CosmoCortney (9. März 2018)

Axiom schrieb:


> Sorry, war ne weile im RealLife ^^


Auf dem Server war ich bis eben auch :p



Axiom schrieb:


> Wenn deine IP deiner Leitung nicht Öffentlich sein soll, einfach durch die Cloud (CDN) von Cloudflare jagen.
> Die WHOIS-Abfrage wird gleich bleiben also mit 1und1 Adresse.
> Also Cloudflare Account erstellen > Cloudflare mit der Domain verbinden und hier ne Anleitung für den Pi, für IP wechsel mit Cloudflare
> How to Set Up Dynamic DNS from a Raspberry Pi * BitPi.co
> ...



Die Domain soll für ne simple Website sein, die ich mir zusammengeschustert habe. Mit der Adresse, die ich anonymisiert haben will meine ich meine physikalische Postadresse (wo ich wohne) (Wäre Telefon und email ersichtbar, könnte ich damit leben. Aber Anschrift möchte ich einfach schon aus vergangenen Situationen nicht öffentlich einsehbar haben). Mache ich eine WHOIS-Abfrage mit meiner IP, kommt da nur Gedöns der Telekom.

Also, um Websites zu hosten ist schon alles eingerichtet (Apache2, MySQL, phpmyadmin etc). Mein Router (Speedport :/) leitet Anfragen zu Port 80 und 81 an den Pi weiter. 

Bei 1&1 kann ich diverse Einstellungen vornehmen.
Da muss ich doch den 1&1-Nameserver beibehalten, oder?
Die A/AAAA-Einträge sind doch meine IPv4 und IPV6-Addressen, oder? Genau diese sollten dann vom Pi automatisch z. B. alle 10 Minuten übermittelt werden (so wie es bei Strato mit einen Cronjob möglich ist). Aber ich weiß nicht, wie ich das bei 1&1 tun soll


----------



## CosmoCortney (10. März 2018)

Sorry, hab verpeilt, dass Du deinen Post bearbeitet hast lol
Hab nen Account bei CloudFlare und bei 1&1 die beiden Nameserver angegeben.
Nun bin ich mir mit dem Script ein wenig unsicher.
Was ist mit <i>token</i> und <i>CloudFlareID</i> gemeint bzw wo bekomme ich diese Information her? 
Ist eines davon die Zone-ID?

Zur Kontrolle:

```
#!/bin/sh
version='0.2'
cfddns='[CloudFlareDDNS-'$version']'

#Get current public ip

MYIP=$(curl -s ipinfo.io/ip)
OLDIP=$(cat oldip.txt)


# Instructions:
# Define variables for API calls. Replace these with your own values! #
#################################################################################
token=?????????????????????	# CloudFlare token #
email=***@***.***	# Cloudflare login account #
z=follow-the-white-rabbit.net	# Domain Name #
id=????			# CloudFlare Record ID #
type=A				# CloudFlare Record Type #
ttl=1				# TTL value #
content=$MYIP			# IP address #
#################################################################################

if [ "$1" = "-f" ]
then
    echo 'cf-ddns called with -f, forcing update!'
    OLDIP=''
else
    echo 'No parameter found, normal run'
fi

if [ "$MYIP" = "$OLDIP" ]

then
  logger -s $cfddns "[INFO] No IP change detected" # Write to Syslog

else
  logger -s $cfddns "[INFO] IP change detected, updating CloudFlare trough API. Old IP was "$OLDIP" - New IP is " $MYIP # Write to syslog


#########
# Instructions:
# Copy this block for the different hostnames you want to dynamically update, and insert unique id and name for the record.
########

# hostname: test.example.com
    id=???????????
    name=follow-the-white-rabbit.net

    # Update record:
    curl -s -k  -L -X POST -H 'Content-Type: application/x-www-form-urlencoded' -d 'a=rec_edit&tkn='$token'&email='$email'&z='$z'&id='$id'&type='$type'&name='$name'&ttl='$ttl'&content='$content 'https://www.cloudflare.com/api_json.html'


 echo $MYIP > oldip.txt
  logger -s $cfddns [INFO] "New IP is: " $MYIP
fi
```


----------



## Axiom (10. März 2018)

Habe gerade gesehen das Script ist etwas veraltet 

Hier ein neues:
Diesmal getestet 


```
[COLOR=#000000]#!/usr/bin/env bashset -o errexit
set -o nounset
set -o pipefail

# Automatically update your CloudFlare DNS record to the IP, Dynamic DNS
# Can retrieve cloudflare Domain id and list zone's, because, lazy

# Place at:
# /usr/local/bin/cf-ddns.sh
# run `crontab -e` and add next line:
# 0 * * * * /usr/local/bin/cf-ddns.sh >/dev/null 2>&1

# run /usr/local/bin/cf-ddns.sh in terminal to check all settings are valid

# Usage:
# cf-ddns.sh -k cloudflare-api-key \
#            -u user@example.com \
#            -h host.example.com \     # fqdn of the record you want to update
#            -z example.com \          # will show you all zones if forgot, but you need this

# Optional flags:
#            -i cloudflare-record-id \ # script will show this
#            -a true|false \           # auto get zone list and record id
#            -f false|true \           # force dns update, disregard local stored ip

# default config

# API key, see https://www.cloudflare.com/a/account/my-account,
# incorrect api-key results in E_UNAUTH error
CFKEY=

# Zone name, will list all possible if missing, eg: example.com
CFZONE=

# Domain id, will retrieve itself by default
CFID=

# Username, eg: user@example.com
CFUSER=

# Hostname to update, eg: homeserver.example.com
CFHOST=

# Cloudflare TTL for record, between 120 and 86400 seconds
CFTTL=120
# Get domain ID from Cloudflare using awk/sed and python json.tool
GETID=true
# Ignore local file, update ip anyway
FORCE=false
# Site to retrieve WAN ip, other examples are: bot.whatismyipaddress.com, https://api.ipify.org/ ...
WANIPSITE="http://icanhazip.com"

# get parameter
while getopts a:k:i:u:h:z:f: opts; do
  case ${opts} in
    a) GETID=${OPTARG} ;;
    k) CFKEY=${OPTARG} ;;
    i) CFID=${OPTARG} ;;
    u) CFUSER=${OPTARG} ;;
    h) CFHOST=${OPTARG} ;;
    z) CFZONE=${OPTARG} ;;
    f) FORCE=${OPTARG} ;;
  esac
done

# If required settings are missing just exit
if [ "$CFKEY" = "" ]; then
  echo "Missing api-key, get at: https://www.cloudflare.com/a/account/my-account"
  echo "and save in ${0} or using the -k flag"
  exit 2
fi
if [ "$CFUSER" = "" ]; then
  echo "Missing username, probably your email-address"
  echo "and save in ${0} or using the -u flag"
  exit 2
fi
if [ "$CFHOST" = "" ]; then 
  echo "Missing hostname, what host do you want to update?"
  echo "save in ${0} or using the -h flag"
  exit 2
fi

# If the hostname is not a FQDN
if [ "$CFHOST" != "$CFZONE" ] && ! [ -z "${CFHOST##*$CFZONE}" ]; then
  CFHOST="$CFHOST.$CFZONE"
  echo " => Hostname is not a FQDN, assuming $CFHOST"
fi

# If CFZONE is missing, retrieve them all from CF
if [ "$CFZONE" = "" ]; then
  echo "Missing zone"
  if ! [ "$GETID" == true ]; then exit 2; fi
  echo "listing all zones: (if api-key is valid)"
  curl -s https://www.cloudflare.com/api_json.html \
    -d a=zone_load_multi \
    -d tkn=$CFKEY \
    -d email=$CFUSER \
    | grep -Eo '"zone_name":"([^"]+)"' \
    | cut -d':' -f2 \
    | awk '{gsub("\"","");print "* "$1}'
  echo "Please specify the matching zone in ${0} or specify using the -z flag"
  exit 2
fi

# Get current and old WAN ip
WAN_IP=`curl -s ${WANIPSITE}`
if [ -f $HOME/.wan_ip-cf.txt ]; then
  OLD_WAN_IP=`cat $HOME/.wan_ip-cf.txt`
else
  echo "No file, need IP"
  OLD_WAN_IP=""
fi

# If WAN IP is unchanged an not -f flag, exit here
if [ "$WAN_IP" = "$OLD_WAN_IP" ] && [ "$FORCE" = false ]; then
  echo "WAN IP Unchanged, to update anyway use flag -f true"
  exit 0
fi

# If CFID is missing retrieve and use it
if [ "$CFID" = "" ]; then
  echo "Missing DNS record ID"
  if ! [ "$GETID" == true ]; then exit 2; fi
  echo "fetching from Cloudflare..."
  if ! CFID=$(
  curl -s https://www.cloudflare.com/api_json.html \
    -d a=rec_load_all \
    -d tkn=$CFKEY \
    -d email=$CFUSER \
    -d z=$CFZONE \
    | grep -Eo '"(rec_id|name|type)":"([^"]+)"' \
    | cut -d':' -f2 \
    | awk 'NR%3{gsub("\"","");printf $0" ";next;}1' \
    | grep -E "${CFHOST//./\\.}" \
    | grep -e '"A"' \
    | grep -Eo "(^|\s)([0-9]+)(\s|$)"
  ); then
    echo " => Incorrect zone, or zone doesn't contain the A-record ${CFHOST}!"
    echo "listing all records for zone ${CFZONE}:"
    (printf "ID RECORD TYPE\n";
    curl -s https://www.cloudflare.com/api_json.html \
      -d a=rec_load_all \
      -d tkn=$CFKEY \
      -d email=$CFUSER \
      -d z=$CFZONE \
      | grep -Eo '"(rec_id|name|type)":"([^"]+)"' \
      | cut -d':' -f2 \
      | awk 'NR%3{gsub("\"","");printf $0" ";next;}1'
    )| column -t
    exit 2
  fi
  echo " => Found CFID=${CFID}, advising to save this to ${0} or set it using the -i flag"
fi

# If WAN is changed, update cloudflare
echo "Updating DNS to $WAN_IP"
RESPONSE=$(
curl -s https://www.cloudflare.com/api_json.html \
  -d a=rec_edit \
  -d tkn=$CFKEY \
  -d email=$CFUSER \
  -d z=$CFZONE \
  -d id=$CFID \
  -d ttl=$CFTTL \
  -d type=A \
  -d name=$CFHOST \
  -d "content=$WAN_IP"
) 
if [ "$RESPONSE" != "${RESPONSE%success*}" ]; then
  echo "Updated succesfuly!"
  echo $WAN_IP > $HOME/.wan_ip-cf.txt
  exit
else
  echo 'Something went wrong :('
  echo "Response: $RESPONSE"
  exit 1 [COLOR=#000000]fi
```

Quelle des Codes


----------



## CosmoCortney (10. März 2018)

Danke 
wenn ich den Link zum API-Key folge (Cloudflare | Web Performance & Security), finde ich dort keinen
Was sollte ich bei zone-name eintragen?


----------



## Axiom (10. März 2018)

Zum API Key geht es hier Cloudflare | Web Performance & Security
Zone Name deine Domain ohne sub also z.b:  pcgh.de also ohne www oder so

Edit: Ich sehe gerade bei deiner WHOIS Abfrage, das bei deiner 1und1 Domain noch nicht die Cloudflare Nameserver eingetragen sind. Die sind Wichtig ^^


----------



## CosmoCortney (10. März 2018)

Axiom schrieb:


> Zum API Key geht es hier Cloudflare | Web Performance & Security
> Zone Name deine Domain ohne sub also z.b:  pcgh.de also ohne www oder so
> 
> Edit: Ich sehe gerade bei deiner WHOIS Abfrage, das bei deiner 1und1 Domain noch nicht die Cloudflare Nameserver eingetragen sind. Die sind Wichtig ^^



Danke^^
Also, da ich (noch) keine Subdomain habe, sind Zonename und Hostname identisch?
Hmm, ich habe die beiden Nameserver gestern schon eingetragen:



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Und was ist mit Domain-ID?


Hier das Script:

```
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail

# Automatically update your CloudFlare DNS record to the IP, Dynamic DNS
# Can retrieve cloudflare Domain id and list zone's, because, lazy

# Place at:
# /usr/local/bin/cf-ddns.sh
# run `crontab -e` and add next line:
# 0 * * * * /usr/local/bin/cf-ddns.sh >/dev/null 2>&1

# run /usr/local/bin/cf-ddns.sh in terminal to check all settings are valid

# Usage:
# cf-ddns.sh -k cloudflare-api-key \
#            -u user@example.com \
#            -h host.example.com \     # fqdn of the record you want to update
#            -z example.com \          # will show you all zones if forgot, but you need this

# Optional flags:
#            -i cloudflare-record-id \ # script will show this
#            -a true|false \           # auto get zone list and record id
#            -f false|true \           # force dns update, disregard local stored ip

# default config

# API key, see https://www.cloudflare.com/a/account/my-account,
# incorrect api-key results in E_UNAUTH error
CFKEY="****"

# Zone name, will list all possible if missing, eg: example.com
CFZONE="follow-the-white-rabbit.net"

# Domain id, will retrieve itself by default
CFID=???

# Username, eg: user@example.com
CFUSER="***@***.***"

# Hostname to update, eg: homeserver.example.com
CFHOST="follow-the-white-rabbit.net"

# Cloudflare TTL for record, between 120 and 86400 seconds
CFTTL=600
# Get domain ID from Cloudflare using awk/sed and python json.tool
GETID=true
# Ignore local file, update ip anyway
FORCE=false
# Site to retrieve WAN ip, other examples are: bot.whatismyipaddress.com, https://api.ipify.org/ ...
WANIPSITE="http://icanhazip.com"

# get parameter
while getopts a:k:i:u:h:z:f: opts; do
  case ${opts} in
    a) GETID=${OPTARG} ;;
    k) CFKEY=${OPTARG} ;;
    i) CFID=${OPTARG} ;;
    u) CFUSER=${OPTARG} ;;
    h) CFHOST=${OPTARG} ;;
    z) CFZONE=${OPTARG} ;;
    f) FORCE=${OPTARG} ;;
  esac
done

# If required settings are missing just exit
if [ "$CFKEY" = "" ]; then
  echo "Missing api-key, get at: https://www.cloudflare.com/a/account/my-account"
  echo "and save in ${0} or using the -k flag"
  exit 2
fi
if [ "$CFUSER" = "" ]; then
  echo "Missing username, probably your email-address"
  echo "and save in ${0} or using the -u flag"
  exit 2
fi
if [ "$CFHOST" = "" ]; then 
  echo "Missing hostname, what host do you want to update?"
  echo "save in ${0} or using the -h flag"
  exit 2
fi

# If the hostname is not a FQDN
if [ "$CFHOST" != "$CFZONE" ] && ! [ -z "${CFHOST##*$CFZONE}" ]; then
  CFHOST="$CFHOST.$CFZONE"
  echo " => Hostname is not a FQDN, assuming $CFHOST"
fi

# If CFZONE is missing, retrieve them all from CF
if [ "$CFZONE" = "" ]; then
  echo "Missing zone"
  if ! [ "$GETID" == true ]; then exit 2; fi
  echo "listing all zones: (if api-key is valid)"
  curl -s https://www.cloudflare.com/api_json.html \
    -d a=zone_load_multi \
    -d tkn=$CFKEY \
    -d email=$CFUSER \
    | grep -Eo '"zone_name":"([^"]+)"' \
    | cut -d':' -f2 \
    | awk '{gsub("\"","");print "* "$1}'
  echo "Please specify the matching zone in ${0} or specify using the -z flag"
  exit 2
fi

# Get current and old WAN ip
WAN_IP=`curl -s ${WANIPSITE}`
if [ -f $HOME/.wan_ip-cf.txt ]; then
  OLD_WAN_IP=`cat $HOME/.wan_ip-cf.txt`
else
  echo "No file, need IP"
  OLD_WAN_IP=""
fi

# If WAN IP is unchanged an not -f flag, exit here
if [ "$WAN_IP" = "$OLD_WAN_IP" ] && [ "$FORCE" = false ]; then
  echo "WAN IP Unchanged, to update anyway use flag -f true"
  exit 0
fi

# If CFID is missing retrieve and use it
if [ "$CFID" = "" ]; then
  echo "Missing DNS record ID"
  if ! [ "$GETID" == true ]; then exit 2; fi
  echo "fetching from Cloudflare..."
  if ! CFID=$(
  curl -s https://www.cloudflare.com/api_json.html \
    -d a=rec_load_all \
    -d tkn=$CFKEY \
    -d email=$CFUSER \
    -d z=$CFZONE \
    | grep -Eo '"(rec_id|name|type)":"([^"]+)"' \
    | cut -d':' -f2 \
    | awk 'NR%3{gsub("\"","");printf $0" ";next;}1' \
    | grep -E "${CFHOST//./\\.}" \
    | grep -e '"A"' \
    | grep -Eo "(^|\s)([0-9]+)(\s|$)"
  ); then
    echo " => Incorrect zone, or zone doesn't contain the A-record ${CFHOST}!"
    echo "listing all records for zone ${CFZONE}:"
    (printf "ID RECORD TYPE\n";
    curl -s https://www.cloudflare.com/api_json.html \
      -d a=rec_load_all \
      -d tkn=$CFKEY \
      -d email=$CFUSER \
      -d z=$CFZONE \
      | grep -Eo '"(rec_id|name|type)":"([^"]+)"' \
      | cut -d':' -f2 \
      | awk 'NR%3{gsub("\"","");printf $0" ";next;}1'
    )| column -t
    exit 2
  fi
  echo " => Found CFID=${CFID}, advising to save this to ${0} or set it using the -i flag"
fi

# If WAN is changed, update cloudflare
echo "Updating DNS to $WAN_IP"
RESPONSE=$(
curl -s https://www.cloudflare.com/api_json.html \
  -d a=rec_edit \
  -d tkn=$CFKEY \
  -d email=$CFUSER \
  -d z=$CFZONE \
  -d id=$CFID \
  -d ttl=$CFTTL \
  -d type=A \
  -d name=$CFHOST \
  -d "content=$WAN_IP"
) 
if [ "$RESPONSE" != "${RESPONSE%success*}" ]; then
  echo "Updated succesfuly!"
  echo $WAN_IP > $HOME/.wan_ip-cf.txt
  exit
else
  echo 'Something went wrong :('
  echo "Response: $RESPONSE"
  exit 1 fi
```


----------



## Axiom (10. März 2018)

gibt es nicht mal eine www. Subdomain?
einfach in Cloudflare erstellen ist ein A Record bei name einfach www eingeben.
wenn du dann deine Domain ohne www eingibst und nicht auf die www.domain.net umgeleitet wirst einfach bei Page Rules
Forwarding URL erstellen, also domain.net/* eingeben Forwarding URL auswählen mit Statuscode 301 und Destination URL domain.net

Edit mir ist gerade aufgefallen das, dass letzte fi nicht in der letzten Zeile ist ^^ Und das schon bei meinen Post ^^

```
[COLOR=#000000]#!/usr/bin/env bashset -o errexit
set -o nounset
set -o pipefail

# Automatically update your CloudFlare DNS record to the IP, Dynamic DNS
# Can retrieve cloudflare Domain id and list zone's, because, lazy

# Place at:
# /usr/local/bin/cf-ddns.sh
# run `crontab -e` and add next line:
# 0 * * * * /usr/local/bin/cf-ddns.sh >/dev/null 2>&1

# run /usr/local/bin/cf-ddns.sh in terminal to check all settings are valid

# Usage:
# cf-ddns.sh -k cloudflare-api-key \
#            -u user@example.com \
#            -h host.example.com \     # fqdn of the record you want to update
#            -z example.com \          # will show you all zones if forgot, but you need this

# Optional flags:
#            -i cloudflare-record-id \ # script will show this
#            -a true|false \           # auto get zone list and record id
#            -f false|true \           # force dns update, disregard local stored ip

# default config

# API key, see https://www.cloudflare.com/a/account/my-account,
# incorrect api-key results in E_UNAUTH error
CFKEY="****"

# Zone name, will list all possible if missing, eg: example.com
CFZONE="follow-the-white-rabbit.net"

# Domain id, will retrieve itself by default
CFID=???

# Username, eg: user@example.com
CFUSER="***@***.***"

# Hostname to update, eg: homeserver.example.com
CFHOST="www.dmain.net"

# Cloudflare TTL for record, between 120 and 86400 seconds
CFTTL=600
# Get domain ID from Cloudflare using awk/sed and python json.tool
GETID=true
# Ignore local file, update ip anyway
FORCE=false
# Site to retrieve WAN ip, other examples are: bot.whatismyipaddress.com, https://api.ipify.org/ ...
WANIPSITE="http://icanhazip.com"

# get parameter
while getopts a:k:i:u:h:z:f: opts; do
  case ${opts} in
    a) GETID=${OPTARG} ;;
    k) CFKEY=${OPTARG} ;;
    i) CFID=${OPTARG} ;;
    u) CFUSER=${OPTARG} ;;
    h) CFHOST=${OPTARG} ;;
    z) CFZONE=${OPTARG} ;;
    f) FORCE=${OPTARG} ;;
  esac
done

# If required settings are missing just exit
if [ "$CFKEY" = "" ]; then
  echo "Missing api-key, get at: https://www.cloudflare.com/a/account/my-account"
  echo "and save in ${0} or using the -k flag"
  exit 2
fi
if [ "$CFUSER" = "" ]; then
  echo "Missing username, probably your email-address"
  echo "and save in ${0} or using the -u flag"
  exit 2
fi
if [ "$CFHOST" = "" ]; then 
  echo "Missing hostname, what host do you want to update?"
  echo "save in ${0} or using the -h flag"
  exit 2
fi

# If the hostname is not a FQDN
if [ "$CFHOST" != "$CFZONE" ] && ! [ -z "${CFHOST##*$CFZONE}" ]; then
  CFHOST="$CFHOST.$CFZONE"
  echo " => Hostname is not a FQDN, assuming $CFHOST"
fi

# If CFZONE is missing, retrieve them all from CF
if [ "$CFZONE" = "" ]; then
  echo "Missing zone"
  if ! [ "$GETID" == true ]; then exit 2; fi
  echo "listing all zones: (if api-key is valid)"
  curl -s https://www.cloudflare.com/api_json.html \
    -d a=zone_load_multi \
    -d tkn=$CFKEY \
    -d email=$CFUSER \
    | grep -Eo '"zone_name":"([^"]+)"' \
    | cut -d':' -f2 \
    | awk '{gsub("\"","");print "* "$1}'
  echo "Please specify the matching zone in ${0} or specify using the -z flag"
  exit 2
fi

# Get current and old WAN ip
WAN_IP=`curl -s ${WANIPSITE}`
if [ -f $HOME/.wan_ip-cf.txt ]; then
  OLD_WAN_IP=`cat $HOME/.wan_ip-cf.txt`
else
  echo "No file, need IP"
  OLD_WAN_IP=""
fi

# If WAN IP is unchanged an not -f flag, exit here
if [ "$WAN_IP" = "$OLD_WAN_IP" ] && [ "$FORCE" = false ]; then
  echo "WAN IP Unchanged, to update anyway use flag -f true"
  exit 0
fi

# If CFID is missing retrieve and use it
if [ "$CFID" = "" ]; then
  echo "Missing DNS record ID"
  if ! [ "$GETID" == true ]; then exit 2; fi
  echo "fetching from Cloudflare..."
  if ! CFID=$(
  curl -s https://www.cloudflare.com/api_json.html \
    -d a=rec_load_all \
    -d tkn=$CFKEY \
    -d email=$CFUSER \
    -d z=$CFZONE \
    | grep -Eo '"(rec_id|name|type)":"([^"]+)"' \
    | cut -d':' -f2 \
    | awk 'NR%3{gsub("\"","");printf $0" ";next;}1' \
    | grep -E "${CFHOST//./\\.}" \
    | grep -e '"A"' \
    | grep -Eo "(^|\s)([0-9]+)(\s|$)"
  ); then
    echo " => Incorrect zone, or zone doesn't contain the A-record ${CFHOST}!"
    echo "listing all records for zone ${CFZONE}:"
    (printf "ID RECORD TYPE\n";
    curl -s https://www.cloudflare.com/api_json.html \
      -d a=rec_load_all \
      -d tkn=$CFKEY \
      -d email=$CFUSER \
      -d z=$CFZONE \
      | grep -Eo '"(rec_id|name|type)":"([^"]+)"' \
      | cut -d':' -f2 \
      | awk 'NR%3{gsub("\"","");printf $0" ";next;}1'
    )| column -t
    exit 2
  fi
  echo " => Found CFID=${CFID}, advising to save this to ${0} or set it using the -i flag"
fi

# If WAN is changed, update cloudflare
echo "Updating DNS to $WAN_IP"
RESPONSE=$(
curl -s https://www.cloudflare.com/api_json.html \
  -d a=rec_edit \
  -d tkn=$CFKEY \
  -d email=$CFUSER \
  -d z=$CFZONE \
  -d id=$CFID \
  -d ttl=$CFTTL \
  -d type=A \
  -d name=$CFHOST \
  -d "content=$WAN_IP"
) 
if [ "$RESPONSE" != "${RESPONSE%success*}" ]; then
  echo "Updated succesfuly!"
  echo $WAN_IP > $HOME/.wan_ip-cf.txt
  exit
else
  echo 'Something went wrong :('
  echo "Response: $RESPONSE"
  exit 1 
fi
```

Edit: Zum Nameserver und WHOIS www.whois.comhat anscheinend noch nicht geupdatet ein eine andere Whois seite gibt die Cloudflare Nameserver


----------



## CosmoCortney (10. März 2018)

Achso, ja, www gibt es. Ich dachte das bezieht sich nur auf soetwas wie das _extreme_ bei extreme.pcgameshardware.de.
Bei A-Record ist bereits www eingetragen.



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Also:

```
# API key, see https://www.cloudflare.com/a/account/my-account,
# incorrect api-key results in E_UNAUTH error
CFKEY="***"

# Zone name, will list all possible if missing, eg: example.com
CFZONE="follow-the-white-rabbit.net"

# Domain id, will retrieve itself by default
CFID=????????

# Username, eg: user@example.com
CFUSER="***@***.***"

# Hostname to update, eg: homeserver.example.com
CFHOST="www.follow-the-white-rabbit.net"
```
?


----------



## Axiom (10. März 2018)

jap, www ist eigentlich auch nur ne Subdomain wenn man es so sieht ^^


----------



## CosmoCortney (10. März 2018)

Irgendeine Einstellung scheint noch zu fehlen.
Wenn ich auf meinem 1&1& Profil bin, wird angezeigt, die Domain sei nicht aktiv.
Oder soll ich warten, weil: "Hinweis: Bei Änderungen der DNS-Einstellungen kann es bis zu 48 Stunden dauern, bis diese Änderungen im gesamten System umgesetzt sind."


----------



## Axiom (10. März 2018)

Ja könnte sein das es so lange dauert bis es übernommen wird.
Bei mir hat es auch so lange gedauert, bis die Profilseite aktualisiert wurde.
Aber Website war vorher schon erreichbar ^^


----------



## CosmoCortney (10. März 2018)

Axiom schrieb:


> Ja könnte sein das es so lange dauert bis es übernommen wird.
> Bei mir hat es auch so lange gedauert, bis die Profilseite aktualisiert wurde.
> Aber Website war vorher schon erreichbar ^^



Erreichbar über deine IP?
Das ist meine Website schon länger :p


----------



## Axiom (10. März 2018)

Über die Domain ^^
Meine Website war schon länger erreichbar. Ich meine vor den 48 Stunden, aber die Profilseite bei 1und1 wurde ne weile nicht aktualisiert ^^


----------



## CosmoCortney (10. März 2018)

Ohh achso..
Mir ist aufgefallen, dass meine IPv4-Addresse irgendwie nicht verfügbar ist. Im router kann ich sie einsehen. Mit curl ipinfo.io auch.
Aber nicht mit ipconfig /all, wieistmeineip.net oder http://icanhazip.com nicht. Letzteres wird ja im Script verwendet. (Ich glaube deswegen funktioniert noip2 auch nicht).
Sollte ich im Script nicht vielleicht auch curl ipinfo.io verwenden?


----------



## Axiom (10. März 2018)

Jap kannste,
einfach

```
WANIPSITE="http://icanhazip.com"
```
durch

```
WANIPSITE="ipinfo.io/ip"
```
ersetzen

Edit: habe gerade in einen deiner vorherigen Post gesehen, das bei deinen Code CFID Fragezeichenstehen, das kann man leer lassen, also

```
CFID=
```
Also CFID= und danach nichts in der Zeile

Was gibt das Script eigentlich für eine Rückmeldung wenn de es ausführst?

Denn wenn die CFID nicht eingetragen wird zeigt das Script die an und Updatet die IP trotzdem.
Die angezeigte CFID kannste dann auch in das Script einfügen


----------



## CosmoCortney (11. März 2018)

Effektiv hat sich noch nichts geändert.
Kann ich so das Script etwas ausgeben lassen?
*/1 * * * * /usr/local/bin/cf-ddns.sh >> /var/log/dyndns.log


----------



## Axiom (11. März 2018)

du kanns in das verzeichnis vom Script wechseln und 

```
./scriptname.sh -f true
```
eingeben das -f true ist dafür, das auch die IP geupdatet wird, falls die immer noch die gleiche IP wie vorher ist.

Das Script wird schon sagen wenn was Falsch ist

Edit habe es mal getestet, mit:
*/1 * * * * /usr/local/bin/cf-ddns.sh >> /var/log/dyndns.log
wird etwas ins log geschrieben.

PS: bei mir kommt:


```
Missing DNS record IDfetching from Cloudflare...
 => Found CFID=56778800 , advising to save this to [COLOR=#000000]/usr/local/bin/cf-ddns.sh or set it using the -i flag
Updating DNS to 188.186.36.77

Updated succesfuly!
```

Habe oben natürlich CFID und IP geändert 

Die CFID die dort angezeigt wird kannste dann auch im Script einfügen

Wenn die CFID im Script eingeben wurde kommt das:


```
Updating DNS to 188.186.36.77[COLOR=#000000]Updated succesfuly!
```

Wenn das hier kommt, dann hat sich die IP seit dem letzten ausführen nicht geändert:

```
WAN IP Unchanged, to update anyway use flag -f trueWAN IP Unchanged, to update anyway use flag -f true[COLOR=#000000]
```

mit

```
[COLOR=#000000]*/1 * * * * /usr/local/bin/cf-ddns.sh -f true [COLOR=#000000]>> /var/log/dyndns.log[COLOR=#000000]
```
Wird die IP immer geupdatet, egal ob die IP die gleiche ist wie beim letzten ausführen


----------



## CosmoCortney (11. März 2018)

Axiom schrieb:


> du kanns in das verzeichnis vom Script wechseln und
> 
> ```
> ./scriptname.sh -f true
> ...


Es sagt immer "Permission Denied"



Axiom schrieb:


> Edit habe es mal getestet, mit:
> */1 * * * * /usr/local/bin/cf-ddns.sh >> /var/log/dyndns.log
> wird etwas ins log geschrieben.
> 
> ...



Im log erscheint leider nichts. Wahrscheinlich, weil der Zugriff verweigert wird (bin doch root)


----------



## Axiom (11. März 2018)

xD daher weht der Wind ganz vergessen, mit


```
chmod +x ​/usr/local/bin/cf-ddns.sh
```

das Script ausführbar machen, sonst geht natürlich nichts 

Ach noch was, du kannst auch statt:
-f true
im Script auch das 

FORCE=false

in

FORCE=true

ändern


----------



## CosmoCortney (11. März 2018)

Okay :p

jetzt kommt:


> root@piserver:/#  /usr/local/bin/cf-ddns.sh
> WAN IP Unchanged, to update anyway use flag -f true
> root@piserver:/#  /usr/local/bin/cf-ddns.sh -f true
> Missing DNS record ID
> ...



Die A www ip wurde auf CloudFlare nun geupdated 
Aufrufbar ist die Seite über die Domain immernoch nicht


----------



## Axiom (11. März 2018)

die Domain zeigt 404 Not Found an, ich geh mal davon aus, das beim Pi etwas falsch eingestellt wurde.
Da wenn die Domain nicht gehen würde, höchstwahrscheinlich ne andere Fehlermeldung kommen würde

Vielleicht kein Virtual Host in Apache eingestellt oder falsch?
How To Set Up Apache Virtual Hosts on Ubuntu 14.04 LTS | DigitalOcean


----------



## CosmoCortney (11. März 2018)

habs zu FORCE = true geändert.
Über die IP (91.1.40.12) kann ich die Seite aufrufen.
Nur nicht über die Domain. Da kommt so eine default-Seite von 1&1



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Was könnte am PI falsch eingestellt sein?


----------



## Axiom (11. März 2018)

Habe mal von oben Kopiert
Vielleicht kein Virtual Host in Apache eingestellt oder falsch?
How To Set Up Apache Virtual Hosts on Ubuntu 14.04 LTS | DigitalOcean

Vielleicht auch was anderes

Also die Kurzform des Artikels:

```
[COLOR=#000000]cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/[COLOR=#E94849]deinedomain.net[COLOR=#000000].conf
```


```
[COLOR=#000000]nano /etc/apache2/sites-available/[COLOR=#E94849]deinedomain.net[COLOR=#000000].conf
```
Das hier ändern 

```
<VirtualHost *:80>    ServerName [COLOR=#E94849]deinedomain.net    ServerAlias [COLOR=#E94849]www.deinedomain.net    DocumentRoot /var/www/example.com/public_html  [COLOR=#E94849]<hier den Pfad zur Website auf deiner Pi    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>
```

und dann das ganze aktivieren

```
[COLOR=#000000]a2ensite [COLOR=#E94849]deinedomain.net[COLOR=#000000].conf
```

und danach Apache restarten


```
/etc/init.d/apache2 restart
```


----------



## CosmoCortney (11. März 2018)

habe keine 000-default.conf.
Liegt das vllt daran, dass ich Debian anstelle von Ubuntu nutze?

In apache2.conf befindet sich ganz unten:
# Include the virtual host configurations:
Include sites-enabled/
Include /etc/phpmyadmin/apache.conf

Im Ordner sites-enabled ist eine Verknüpfung zu 000-default.

EDIT: ok, habe nun wildcards mit follow-the-white-rabbit.net.conf


----------



## Axiom (11. März 2018)

Wohin geht die Verknüpfung genau?
Theoretisch ist wenn ne Verknüpfung da ist auch die Datei da, außer die geht ins leere
Ich habe mal schnell Apache installiert in meiner 000-default ist das hier


```
<VirtualHost *:80>    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    #ServerName www.example.com


    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html


    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn


    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined


    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>



# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
```


Also ganz anders ausgedrückt kann man theoretisch die Datei einfach mit diesen Inhalt erstellen:


```
[COLOR=#000000]<VirtualHost *:80>
    ServerName [COLOR=#E94849]deinedomain.net    ServerAlias [COLOR=#E94849]www.deinedomain.net    DocumentRoot /var/www/example.com/public_html  [COLOR=#E94849]<hier den Pfad zur Website auf deiner Pi    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
 [COLOR=#000000]</VirtualHost>
```


----------



## CosmoCortney (11. März 2018)

Bin der Verknüpfung gefolgt und konnte dem Tutorial etwas weiter folgen. Da es schon einen Ordner für alle Web-Dokumente gibt, musste ich es etwas anpassen.
Habe nun wildcards for follow-the-white-rabbit.net.conf angelegt:


```
root@piserver:/# sudo a2ensite                                                  Your choices are: default default-ssl follow-the-white-rabbit.net.conf
Which site(s) do you want to enable (wildcards ok)?
follow-the-white-rabbit.net.conf
Enabling site follow-the-white-rabbit.net.conf.
To activate the new configuration, you need to run:
  service apache2 reload
root@piserver:/# service apache2 reload
[....] Reloading web server config: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
. ok
```

Bin den Rest gefolgt, aber immernoch das selbe Problem


----------



## Axiom (11. März 2018)

Oh ich sehe, scheint wie auch immer, jetzt zu funktionieren 

Glückwunsch, wie das auch gelöst wurde


----------



## CosmoCortney (11. März 2018)

Axiom schrieb:


> Oh ich sehe, scheint wie auch immer, jetzt zu funktionieren
> 
> Glückwunsch, wie das auch gelöst wurde



Ich hab nixgemacht. Bin nur schlafen gegangen. (vllt ist das die Lösung aller Probleme)

Trotzdem Danke für die Hilfe 

Ich glaube das  Problem war, dass ich aus Gewohnheit immer die Domain ohne www davor angegeben hab. So funktioniert es immernoch nicht. Aber mit www. davor schon 
Ich teste gerade mal, ob der Cronjob auch wirklich funktioniert.. Hab ne random IP bei CloudFlare eingeben und schaue, ob sie vom Pi zurückgesetzt wird. Nicht wundern, wenn meine Website kurz nicht erreichbar sein sollte


----------



## Axiom (11. März 2018)

Du könntest auch das Script nochmal erstellen unter anderen Namen, das auch die Domain ohne www aktualisiert wird.

```
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail


# Automatically update your CloudFlare DNS record to the IP, Dynamic DNS
# Can retrieve cloudflare Domain id and list zone's, because, lazy


# Place at:
# /usr/local/bin/cf-ddns.sh
# run `crontab -e` and add next line:
# 0 * * * * /usr/local/bin/cf-ddns.sh >/dev/null 2>&1


# run /usr/local/bin/cf-ddns.sh in terminal to check all settings are valid


# Usage:
# cf-ddns.sh -k cloudflare-api-key \
#            -u user@example.com \
#            -h host.example.com \     # fqdn of the record you want to update
#            -z example.com \          # will show you all zones if forgot, but you need this


# Optional flags:
#            -i cloudflare-record-id \ # script will show this
#            -a true|false \           # auto get zone list and record id
#            -f false|true \           # force dns update, disregard local stored ip


# default config


# API key, see https://www.cloudflare.com/a/account/my-account,
# incorrect api-key results in E_UNAUTH error
CFKEY=


# Zone name, will list all possible if missing, eg: example.com
CFZONE=


# Domain id, will retrieve itself by default
CFID=


# Username, eg: user@example.com
CFUSER=


# Hostname to update, eg: homeserver.example.com
CFHOST=


# Cloudflare TTL for record, between 120 and 86400 seconds
CFTTL=120
# Get domain ID from Cloudflare using awk/sed and python json.tool
GETID=true
# Ignore local file, update ip anyway
FORCE=true
# Site to retrieve WAN ip, other examples are: bot.whatismyipaddress.com, https://api.ipify.org/ ...
WANIPSITE="ipinfo.io/ip"


# get parameter
while getopts a:k:i:u:h:z:f: opts; do
  case ${opts} in
    a) GETID=${OPTARG} ;;
    k) CFKEY=${OPTARG} ;;
    i) CFID=${OPTARG} ;;
    u) CFUSER=${OPTARG} ;;
    h) CFHOST=${OPTARG} ;;
    z) CFZONE=${OPTARG} ;;
    f) FORCE=${OPTARG} ;;
  esac
done


# If required settings are missing just exit
if [ "$CFKEY" = "" ]; then
  echo "Missing api-key, get at: https://www.cloudflare.com/a/account/my-account"
  echo "and save in ${0} or using the -k flag"
  exit 2
fi
if [ "$CFUSER" = "" ]; then
  echo "Missing username, probably your email-address"
  echo "and save in ${0} or using the -u flag"
  exit 2
fi
if [ "$CFHOST" = "" ]; then 
  echo "Missing hostname, what host do you want to update?"
  echo "save in ${0} or using the -h flag"
  exit 2
fi


# If the hostname is not a FQDN
if [ "$CFHOST" != "$CFZONE" ] && ! [ -z "${CFHOST##*$CFZONE}" ]; then
  CFHOST="$CFHOST.$CFZONE"
  echo " => Hostname is not a FQDN, assuming $CFHOST"
fi


# If CFZONE is missing, retrieve them all from CF
if [ "$CFZONE" = "" ]; then
  echo "Missing zone"
  if ! [ "$GETID" == true ]; then exit 2; fi
  echo "listing all zones: (if api-key is valid)"
  curl -s https://www.cloudflare.com/api_json.html \
    -d a=zone_load_multi \
    -d tkn=$CFKEY \
    -d email=$CFUSER \
    | grep -Eo '"zone_name":"([^"]+)"' \
    | cut -d':' -f2 \
    | awk '{gsub("\"","");print "* "$1}'
  echo "Please specify the matching zone in ${0} or specify using the -z flag"
  exit 2
fi


# Get current and old WAN ip
WAN_IP=`curl -s ${WANIPSITE}`
if [ -f $HOME/.wan_ip-cf2.txt ]; then
  OLD_WAN_IP=`cat $HOME/.wan_ip-cf2.txt`
else
  echo "No file, need IP"
  OLD_WAN_IP=""
fi


# If WAN IP is unchanged an not -f flag, exit here
if [ "$WAN_IP" = "$OLD_WAN_IP" ] && [ "$FORCE" = false ]; then
  echo "WAN IP Unchanged, to update anyway use flag -f true"
  exit 0
fi


# If CFID is missing retrieve and use it
if [ "$CFID" = "" ]; then
  echo "Missing DNS record ID"
  if ! [ "$GETID" == true ]; then exit 2; fi
  echo "fetching from Cloudflare..."
  if ! CFID=$(
  curl -s https://www.cloudflare.com/api_json.html \
    -d a=rec_load_all \
    -d tkn=$CFKEY \
    -d email=$CFUSER \
    -d z=$CFZONE \
    | grep -Eo '"(rec_id|name|type)":"([^"]+)"' \
    | cut -d':' -f2 \
    | awk 'NR%3{gsub("\"","");printf $0" ";next;}1' \
    | grep -E "${CFHOST//./\\.}" \
    | grep -e '"A"' \
    | grep -Eo "(^|\s)([0-9]+)(\s|$)"
  ); then
    echo " => Incorrect zone, or zone doesn't contain the A-record ${CFHOST}!"
    echo "listing all records for zone ${CFZONE}:"
    (printf "ID RECORD TYPE\n";
    curl -s https://www.cloudflare.com/api_json.html \
      -d a=rec_load_all \
      -d tkn=$CFKEY \
      -d email=$CFUSER \
      -d z=$CFZONE \
      | grep -Eo '"(rec_id|name|type)":"([^"]+)"' \
      | cut -d':' -f2 \
      | awk 'NR%3{gsub("\"","");printf $0" ";next;}1'
    )| column -t
    exit 2
  fi
  echo " => Found CFID=${CFID}, advising to save this to ${0} or set it using the -i flag"
fi


# If WAN is changed, update cloudflare
echo "Updating DNS to $WAN_IP"
RESPONSE=$(
curl -s https://www.cloudflare.com/api_json.html \
  -d a=rec_edit \
  -d tkn=$CFKEY \
  -d email=$CFUSER \
  -d z=$CFZONE \
  -d id=$CFID \
  -d ttl=$CFTTL \
  -d type=A \
  -d name=$CFHOST \
  -d "content=$WAN_IP"
) 
if [ "$RESPONSE" != "${RESPONSE%success*}" ]; then
  echo "Updated succesfuly!"
  echo $WAN_IP > $HOME/.wan_ip-cf.txt
  exit
else
  echo 'Something went wrong :('
  echo "Response: $RESPONSE"
  exit 1
fi
```
Wobei du erstmal bei CFHOST erstmal einen subdomain die nicht bei cloudflare  existiert angibst, Dadurch werden dir die ganzen verfügbaren CFHOST angezeigt mit CFID und Type. 

Nicht vergessen das Script ausführbar zu machen
Also:

```
chmod +x pfad/zum/script/cf_ddns2.sh
```

dann führste das Script ermal aus um
Dadurch werden dir erstmal, wie oben erwähnt, alle verfügbaren CFHOST und CFID angezeigt
Du brauchst die CFID von der Domain ohne www also z.B. pcgh.de, müsste als A Type angezeigt werden, die MX einfach ignorieren da die ja nicht geändert werden sollten.

Also CFID von domain.net also ohne www, muss diesmal wirklich im Script eingetragen werden, sonst geht nichts
CFHOST ist deine Domain ohne www

Die alte IP wird ja abgespeichert, weshalb man ja die Datei mit der alten IP im Script anpassen muss, habe ich oben schon getan


----------



## CosmoCortney (11. März 2018)

Das ist passiert:

```
root@piserver:~#  /usr/local/bin/cf-ddns-WO_www.sh
 => Hostname is not a FQDN, assuming follow-the-white-rabbiut.net.follow-the-white-rabbit.net
Missing DNS record ID
fetching from Cloudflare...
 => Incorrect zone, or zone doesn't contain the A-record follow-the-white-rabbiut.net.follow-the-white-rabbit.net!
listing all records for zone follow-the-white-rabbit.net:
ID          RECORD                                    TYPE
******42747  follow-the-white-rabbit.net               "A"
******42744  www.follow-the-white-rabbit.net           "A"
******42750  autodiscover.follow-the-white-rabbit.net  "CNAME"
******42756  follow-the-white-rabbit.net               "MX"
******42753  follow-the-white-rabbit.net               "MX"
```

Hab das Script ausgeführt und es wurde geupdated :3
DANKE!

Den Cronjob bekomm ich selbst eingestellt^^

EDIT: mir ist aufgefallen, dass ich die Seite auch über https:// aufrufen kann, Hat CloudFlare für mich schon eine SSL-Verschlüsselung aktiviert?


----------



## Axiom (11. März 2018)

Du brauchst die obere ID mit den A Type

könnte sein das bei Cloudflare unter Cripto SSL auf flexibel gestellt ist, bei flexibel wird die Verbindung zu den Cloudflare Servern verschlüsselt und von den Cloudflare Servern geht es unverschlüsselt weiter zu deinen Pi

Wenn du ein SSL Certificat hast kannste auf Full oder Full Strikt stellen
Full ist für selbst Signierte Certifikate
Full Strikt für von CA ausgestellte oder das Cloudflare Origin CA
Ich habe z.B. Full Strikt
unter Cripto SSL unter  Help kanste nachlesen


----------



## CosmoCortney (11. März 2018)

Bin dieser Anleitung gefolgt, um SSL zu aktivieren: Zertifikat erzeugen und SSL einrichten

Scheint soweit geklappt zu haben, glaube ich.. Aber die Seite ist nicht über https aufrufbar.
Ich stell es wieder auf "flexibel" um und schaue in 2 Wochen nochmal, wenn ich wieder zu Hause bin


----------



## Axiom (11. März 2018)

Ich habe mal die Anleitung angesehen.
Dort wird StartSSL benutzt, StartSSL wird nicht mehr als Trusted CA angesehen

Edit: ich benutze Let's Encrypt da es als Trusted eingestuft wird. Lässt sich recht einfach mit CertBot einrichten.

Edit Laudian war schneller xD


----------



## Laudian (11. März 2018)

Wenn du ein Zertifikat haben möchtest, dann hol es dir von letsencrypt. Geht extrem schnell und im Prinzip vollautomatisch. Und es ist trusted.


----------

