[Tuto] Ddns : Livebox + Duckdns sans spammer le WAN

Bambusa29

Chevalier Jedi
10 Avril 2022
321
144
83
Bonjour,

Objectif :

Je vous propose ce petit tuto pour mettre à jour votre Ddns en dialoguant uniquement avec votre Livebox, sans utiliser un service extérieur tiers pour récupérer son IP public.

Motivation :

J'ai mis en place cette solution, en remplacement de l'image Docker DuckDNS qui spam le réseau Wan tout les 3 à 7 minutes et fausse mes stats PiHole.

Solution :

Je vais présenter deux solutions :

- Une utilisant un Workflow n8n (un fichier JSON) : simple, il y a juste à remplacer les emails, mot de passe, token et chemin pour le stockage du fichier contenant votre ip actuelle dans le fichier JSON.
- Une méthode avec cURL ou il faudra bidouiller avec le cron et des scripts Bash sur votre machine.

Perso, j'utilise le Workflow sous n8n que j'ai créé n'ayant pas trouver d"équivalent sur le net (le seul que j'ai trouvé, spammait le WAN sans dialogue avec la Box)

- La méthode n8n :

Ce que cela donne graphiquement :

Le principe : Tous les deux minutes, il fait deux requêtes HTTP avec la Livebox pour récupérer son IP public et la compare avec l'IP actuel sauvegardée dans un fichier local.
Si l'IP est différente, on met à jour DuckDNS et on envoi un email. Même fonctionnement au 1er lancement (en cas d'absence du fichier local contenant l'IP).

n8n_duckdns.png

Et le fichier JSON :

Il est en pièce jointe ; DuckDNSUpdate.json.txt
Il faut simplement l'importer dans votre éditeur n8n.
Il est plus simple de personnaliser vos paramètres dans le fichier JSON avant de l'importer.
Vous pouvez le faire après coup aussi graphiquement, mais cela sera plus long.

- La méthode curl :

Pré-requis facultatif : commande rq (apt install rq)

Je vous donne les principales requêtes à effectuer :

- Identification avec la Livebox :

Code:
HTTP=$(curl --fail -i -S -s http://192.168.1.1/ws -H 'Authorization: X-Sah-Login' -H 'Content-Type: application/x-sah-ws-4-call+json' \
        -d '{"service":"sah.Device.Information","method":"createContext","parameters":{"applicationName":"webui","username":"'"admin"'","password":"'"passwd"'"}}')

La requête vas vous retourner cette séquence :

Code:
TTP/1.1 200 OK
Set-Cookie: cdda1e19/sessid=Tkht4SU2Sx/O/t3w2qFBSdfF; path=/; SameSite=Strict; HttpOnly
Cache-Control: no-cache
Pragma: no-cache
TE: chunked
Transfer-Encoding: chunked
Content-Type: application/x-sah-ws-4-call+json
X-Content-Type-Options: nosniff

{"status":0,"data":{"contextID":"BTWEBSEywSG3j6mdQnnMXuE4kzLFkiu//4gbeip4nwn1HFQw2vUsbD7LFOs8PMN9","username":"admin","groups":"http,admin"}}%

Il faut maintenant récupérer le cookie et le contextID pour former un 'token' pour la requête prochaine :

Le Token doit avoir cette forme là :

Code:
Cookie: cdda1e19/sessid=Tkht4SU2Sx/O/t3w2qFBSdfF; path=/; SameSite=Strict; HttpOnly
Authorization: X-Sah BTWEBSEywSG3j6mdQnnMXuE4kzLFkiu//4gbeip4nwn1HFQw2vUsbD7LFOs8PMN9

Les commandes en Bash que je faisais sous n8n à adapter :

Code:
COOKIE="{{ $json.headers['set-cookie'] }}"
printf '[{ "Cookie": "%s" , ' "$COOKIE"
AUTH="{{ $json.data }}"
TMP=$(echo $AUTH | cut -d':' -f 4)
AUTH=$(echo $TMP | cut -d',' -f 1)
printf '"auth" : "X-Sah %s" }]' "$AUTH"

Cela doit donner ca :

Code:
TOKEN=$(
    echo "$HTTP" | grep ^Set-Cookie | sed 's/^Set-//' | xargs -0 printf "%s"
    echo "$HTTP" | tail -n1 | jq -r .data.contextID | xargs -0 printf "Authorization: X-Sah %s"
)

Une fois le Token construit ($TOKEN dans la requête), on envoi la requête pour récupérer l'IP public :

Code:
HTTP=$(curl --fail -s -S -X POST "http://192.168.1.1/ws" -H "$TOKEN" -H "Content-Type: application/x-sah-ws-1-call+json" -d '{"service":"NMC","method":"getWANStatus","parameters":{}}')

La requête retourne :

JSON:
{"result":{"status":true,"data":{"WanState":"up","LinkType":"dsl","LinkState":"up","MACAddress":"64:66:24:CB:26:4E","Protocol":"dhcp","ConnectionState":"Bound","LastConnectionError":"None","IPAddress":"83.197.23.xxx","RemoteGateway":"83.197.16.1","DNSServers":"80.10.246.130,81.253.149.1","IPv6Address":"2a01:cb08:8dae:e900:6666:24ff:fecb:264e","IPv6DelegatedPrefix":"2a01:cb08:8dae:e900::/56"}}}

Puis il faut récupérer l'IP public sous le nom IPAddress :

Méthode rapide : vous rechercher l'IP précédant dans la chine avec un simple 'grep' et si vous le trouvez pas, il faut le mettre à jour chez DuckDNS.

Pour mettre à jour lIP public chez DuckDNS :

Code:
https://www.duckdns.org/update?domains={YOURVALUE}&token={YOURVALUE}[&ip={YOURVALUE}][&verbose=true][&clear=true]

A Terminer (script complet et cron à définir)
 

Pièces jointes

  • DuckDNSUpdate.json.txt
    16.5 KB · Affichages: 1
Dernière édition:
  • J'aime
Réactions: Nincha et FX Cachem
Je ne peux plus mettre à jour le post d'origine.

- La méthode curl :

Pré-requis :
- Commande 'rq' (apt install rq) pour récupérer facilement des données dans un flux JSON
- Postfix correctement configuré pour envoyer des emails via SMTP

Le script complet à modifier :

FILE_IP_WAN : Chemin vers le fichier qui contiendra l'IP public de votre box actuelle
EMAIL : votre email pour envoyer les notifications
DUCKDNS : Chaîne à modifier avec votre Token et votre domaine
passwd : Votre mot de passe de votre Livebox

Bash:
#!/usr/bin/sh

BOX=http://192.168.1.1/ws
FILE_IP_WAN=/var/www/secuProxmox/status/ipwan.box
EMAIL=votreemail@domaine.fr
DUCKDNS="https://www.duckdns.org/update?domains=domain.duckdns.org&token=votre toekn&ip="

# Login
RESPONSE=$(curl --fail -i -S -s $BOX -H "Authorization: X-Sah-Login" -H "Content-Type: application/x-sah-ws-4-call+json" \
  -d '{"service":"sah.Device.Information","method":"createContext","parameters":{"applicationName":"webui","username":"admin","password":"passwd"}}')

# Build Token
TOKEN=$(
    echo "$RESPONSE" | grep ^Set-Cookie | sed 's/^Set-//' | xargs -0 printf "%s"
    echo "$RESPONSE" | tail -n1 | jq -r .data.contextID | xargs -0 printf "Authorization: X-Sah %s"
)

RESPONSE=$(curl --fail -s -S -X POST $BOX -H "$TOKEN" -H "Content-Type: application/x-sah-ws-1-call+json" -d '{"service":"NMC","method":"getWANStatus","parameters":{}}')
IP=$(echo $RESPONSE | jq -r .result.data.IPAddress)

if [ -r $FILE_IP_WAN ]; then
  if grep -q $IP $FILE_IP_WAN ; then
    DUCKDNS_UPDATED=0;
  else
    DUCKDNS_UPDATED=1;
  fi
else
  DUCKDNS_UPDATED=1
fi

if [ "$DUCKDNS_UPDATED" = 1 ]; then
  echo $IP > $FILE_IP_WAN
  RESPONSE=$(curl $DUCKDNS$IP)
  BODY="La nouvelle adresse IP de la Livebox est "$IP" ("$RESPONSE")"
  echo $BODY | mail -s "[DuckDNS] Updated" $EMAIL
fi

Vous devez le mettre dans votre cron pour le lancer à intervalle régulier (ici 5 minutes) :

Créer ou utiliser un fichier dans "/etc/cron.d" avec le contenu suivant :

Bash:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
*/5 * * * * root /chemindevotrescript/updateDuckDNS.sh > /dev/null 2>&1

Vous recevrez un email à chaque changement d'IP public de votre box ou lors du 1er lancement :

Screenshot_20230531_113249.png