Auteur Sujet: DNS dynamique + IPv6 + Docker  (Lu 1872 fois)

0 Membres et 1 Invité sur ce sujet

olivier29

  • Abonné Orange Fibre
  • *
  • Messages: 27
DNS dynamique + IPv6 + Docker
« le: 10 août 2023 à 21:28:33 »
Bonjour à tous,

Voici mon besoin : accéder à un mini site web, accessible de l'extérieur en DNS dynamique via IPv6, et, comble du luxe, via une image Docker.

Ce qui marche aujourd'hui :
- appli : petite appli qui tourne dans Docker sur mon Raspberry Pi 4, donc binaire en arm64
- ouverture du port : Merci le forum [Résolu] Serveur IPv6 et pare-feu Livebox


Je pourrais faire l'effort d'un .sh et l'ajout en crontab. Mais si quelqu'un a mieux, je suis preneur.

Servicemàj auto IPv6Commentaires
dynu.comNJ'arrive à mettre l'IPv6 à la main dans l'interface de gestion. J'ai essayé linuxserver/ddclient avant de réaliser que le support IPv6 est en draft.
duckdns.orgOFonctionne avec un script curl en crontab.  L'image Docker fonctionne par défaut en IPv4. Fonctionne avec curl.
ipv64.netOl'interface est en allemand, j'ai réussi tant bien que mal à me créer un record DNS. Fonctionne avec curl.


« Modifié: 12 août 2023 à 09:13:44 par olivier29 »

olivier29

  • Abonné Orange Fibre
  • *
  • Messages: 27
DNS dynamique + IPv6 + Docker
« Réponse #1 le: 12 août 2023 à 09:17:00 »
Script duckdns ipv6, sans ipv4, avec contrôles des paramètres
#!/bin/bash
# duckdns-ipv6.sh
# Example
# ~/duckdns/duckdns-ipv6.sh mydomain.duckdns.org 00000000-0000-0000-0000-000000000000
#
# Only IPv6 at the moment

basedir=$(dirname $0)

domain=$1
token=$2
logfile=${basedir}/duckdns.log

service=.duckdns.org
mintokenlength=30
expectedformat=00000000-0000-0000-0000-000000000000

currentdate=$(date -Is)
lastipv6file=${basedir}/lastipv6.txt


if [ -z "${logfile}" ]; then
        echo "empty log file name"
        exit 1
fi

# check TLD 
if [[ "${domain}" != *"${service}"* ]]; then
        echo -e "${currentdate} Expected format : mydomain${service}" >>${logfile}
        exit 1
fi

# min length
if [ ${#token} -lt ${mintokenlength} ]; then
        echo -e "${currentdate} Expected format : ${expectedformat}" >>${logfile}
        exit 1
fi
# contains - separator
if [[ "${token}" != *"-"* ]]; then
        echo -e "${currentdate} Expected format : ${expectedformat}" >>${logfile}
        exit 1
fi

# get ip
ipv6addr=$(curl -6 -s "https://api6.ipify.org")

if [ -z "${ipv6addr}" ]; then
        echo -e "${currentdate} empty IPv6 address" >>${logfile}
        exit 1
fi

apiurl="https://www.duckdns.org/update?domains=${domain}&token=${token}&ipv6=${ipv6addr}"

if [ ! -f "$lastipv6file" ]; then
        # update and store the last known IPv6 address
        curlresult=$(curl -s ${apiurl})
        echo -e "${currentdate} set  ${apiurl} ${curlresult}"  >>${logfile}
        echo ${ipv6addr} >${lastipv6file}
        exit 0
fi

echo -e "$lastipv6file exists." >>${logfile}
lastipv6value=$(<${lastipv6file})

if [[ "${lastipv6value}" == "${ipv6addr}" ]]; then
        # IPv6 unchanged : don't call the api   
        echo -e "${currentdate} $ipv6addr unchanged." >>${logfile}
else
        # IPv6 has changed
        curlresult=$(curl -s ${apiurl})
        echo -e "${currentdate} update ${apiurl} ${curlresult}"  >>${logfile}
        echo ${ipv6addr} >${lastipv6file}
fi

exit 0

Script d'appel
#!/bin/bash
~/duckdns/duckdns-ipv6.sh mydomain.duckdns.org 00000000-0000-0000-0000-000000000000

Crontab
# At minute 0 every 4 hours
0 */4 * * * ~/duckdns/duck.sh >/dev/null 2>&1

Aspect des logs générés
2023-08-12T00:00:01+02:00 https://www.duckdns.org/update?domains=mydomain.duckdns.org&token=00000000-0000-0000-0000-000000000000&ipv6=0000:0000:0000:0000:0000:0000:0000:0000 OK
2023-08-12T04:00:01+02:00 https://www.duckdns.org/update?domains=mydomain.duckdns.org&token=00000000-0000-0000-0000-000000000000&ipv6=0000:0000:0000:0000:0000:0000:0000:0000 OK
2023-08-13T16:00:02+02:00 0000:0000:0000:0000:0000:0000:0000:0000 unchanged
« Modifié: 13 août 2023 à 19:29:07 par olivier29 »

olivier29

  • Abonné Orange Fibre
  • *
  • Messages: 27
DNS dynamique + IPv6 + Docker
« Réponse #2 le: 12 août 2023 à 15:59:00 »
Interrogation IPv6 : la commande ci dessous me renvoie 2 adresses sur la carte Wifi de mon PC.
Elle marche sur l'ethernet de mon Raspberry.
ip addr show dev ${interface} | grep global | sed -e's/^.*inet6 \([^ ]*\)\/.*$/\1/;t;d'

Piste
https://askubuntu.com/questions/1064712/why-do-i-have-three-ip-v6-adresses#1064715

Edit :
J'abandonne l'obtention de l'IPv6 en local, je fais comme en IPv4, avec une commande curl.


Conclusion :
En IPv4, il me fallait un favori "mydomain.dynu.net" de l'extérieur, et un favori sur l'adresse locale du Raspberry
En IPv6, je n'ai plus qu'un seul favori en "mydomain.duckdns.org" et ça fonctionne.
« Modifié: 14 août 2023 à 16:48:59 par olivier29 »

lyapounov

  • Abonné Starlink
  • *
  • Messages: 127
  • 71
DNS dynamique + IPv6 + Docker
« Réponse #3 le: 11 novembre 2023 à 14:43:01 »
J'ai réussis à faire la MàJ Auto sur Dynu.com à partir d'un petit script php qui appelle curl, vérifie dans ma base de donnée locale si update et si c'est le cas update la base et appelle une api dynu.com

En revanche, je ne sais pas pourquoi, si j'ai une adresse IP V4 dynu.com la renvoie et si je mets rien ça me dit "cannot resolve" ?

Mais je ne suis pas pro de IPv6

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 092
  • Paris (75)
DNS dynamique + IPv6 + Docker
« Réponse #4 le: 11 novembre 2023 à 15:39:59 »
J'ai réussis à faire la MàJ Auto sur Dynu.com à partir d'un petit script php qui appelle curl, vérifie dans ma base de donnée locale si update et si c'est le cas update la base et appelle une api dynu.com

En revanche, je ne sais pas pourquoi, si j'ai une adresse IP V4 dynu.com la renvoie et si je mets rien ça me dit "cannot resolve" ?

Mais je ne suis pas pro de IPv6

il faudrait plus de contexte / details ?

la résolution dns local ne marche peut-etre pas en IPv6 ?

olivier29

  • Abonné Orange Fibre
  • *
  • Messages: 27
DNS dynamique + IPv6 + Docker
« Réponse #5 le: 11 novembre 2023 à 18:04:49 »
Pour ma part, j'ai abandonné dynu
Les autres services sont plus récents, basiques et basés sur curl uniquement.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 092
  • Paris (75)
DNS dynamique + IPv6 + Docker
« Réponse #6 le: 11 novembre 2023 à 19:00:49 »
curl et les ipv6 temporaires ca peut poser problème (décalage renouvellement / appel au service), a moins de forcer curl a utiliser la non temporaire (avec --interface ip) ou en passant l'ip dans l'appel curl si le service utilisé supporte cela.

pour obtenir cette ip non temporaire, avec jq:

ip -j  -6 a show up scope global -mngtmpaddr dev ${interface} | jq -r ".[] .addr_info.[].local | select( . != null )"
sans jq:

ip -br  -6 a show up scope global -mngtmpaddr dev ${interface} | tr -s ' '| cut -d" " -f3 | cut -d/ -f1
mais bon sur un serveur en général on désactive les temporaires pour éviter cette complexité. 

On peut aussi utiliser une ipv6 connue construite avec "ip token", du coup seul le préfix peut changer. En plus c'est plus facile pour ouvrir le firewall (on prend un token simple a mémoriser, par exemple 80 pour un serveur web, etc)

Egalement, au lieu d'un cron  on peut aussi utiliser "ip monitor" pour faire l'appel curl (ou networkd-dispatcher). sauf si le service utilisé requiert un appel curl de temps a autre.

lyapounov

  • Abonné Starlink
  • *
  • Messages: 127
  • 71
DNS dynamique + IPv6 + Docker
« Réponse #7 le: 13 novembre 2023 à 12:07:11 »
il faudrait plus de contexte / details ?

la résolution dns local ne marche peut-etre pas en IPv6 ?

Déjà, je découvre IPv6 et je ne suis pas à l'aise avec son usage.

Mon adresse IPv6 est mise à jour via un script php qui tourne sur un synology sur mon réseau local.

Ce script php récupère l'adresse ipv6 via un appel curl sur un des trois services: ifconfig, ipify ou ipv6test; une boucle toutes les 5 minutes. Si l'adresse a changé, le script met la nouvelle adresse IP dans une base de donnée sur mon synology, puis met à jour dynu via un autre appel curl. Ce script tourne 24h seulement, puis le cron du Synology relance le script toutes les 24 heures.

Tout ça fonctionne bien, et dynu met bien à jour l'IPV6 (en fait pour un sous-domaine de mon nom de domaine). Et sur Dynu j'ai mis le champs IPv4 à rien du tout.

En revanche, ce que je ne sais pas faire, c'est forcer tous les services qui utilisent ce sous-domaine (genre sftp, ou bien openvpn) à utiliser cette adresse IPv6. Lorsque je fais un ping ou traceroute vers ce sous domaine, ça ne résoud pas.

Après j'aurai d'autres problèmes à résoudre: mon réseau à qq adresse IP fixes en IPv4. Comment ça marche en IPv6 ? Je vois bien que l'adresse IPv6 contient une partie propre à Starlink, mais que le reste est sur mon réseau local. Dois-je créer un DHCP IPv6 ? Etc.. c'est pas clair pour moi

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 092
  • Paris (75)
DNS dynamique + IPv6 + Docker
« Réponse #8 le: 13 novembre 2023 à 12:54:33 »

En revanche, ce que je ne sais pas faire, c'est forcer tous les services qui utilisent ce sous-domaine (genre sftp, ou bien openvpn) à utiliser cette adresse IPv6. Lorsque je fais un ping ou traceroute vers ce sous domaine, ça ne résoud pas.

Ping/traceroute peut ne pas marcher si les icmpv6 sont bloquées et pour autant le service sftp ou autre peut fonctionner.

"ça ne résoud pas" n'est pas clair ...   "ping monsousdomaine.domaine.com" affiche quoi ?

Les services en principe 'écoutent' sur toutes les adresses de la machine (ca "bind" a 0.0.0.0 et :: par défaut) donc si ca ne marche pas c'est que l'adresse utilisée n'est pas gérée par la machine ou n'arrive pas jusqu'à la machine (firewall, routage) ou que les paquets de retour ne reviennent pas.

Après j'aurai d'autres problèmes à résoudre: mon réseau à qq adresse IP fixes en IPv4. Comment ça marche en IPv6 ? Je vois bien que l'adresse IPv6 contient une partie propre à Starlink, mais que le reste est sur mon réseau local. Dois-je créer un DHCP IPv6 ? Etc.. c'est pas clair pour moi

en IPv6 il n'y a pas de NAT (partage d'IP publique) donc chaque machine doit avoir une IPv6 globale (publique) pour accéder a Internet (ou etre accessible).

en principe le routeur fournit par Starlink ne gère pas d'IPv6 sur le réseau local, il faut donc le mettre en "bypass" et avoir son propre routeur derriere qui gère l'IPv6.

Si ce n'est pas ton cas ceci explique cela.

Si tu as déjà un routeur qui gère cela, ca veut dire que chaque machine de ton réseau local a au moins une IPv6 publique. donc un "curl  https://api6.ipify.org" depuis une machine devrait donner un résultat différent d'une autre (alors qu'en IPv4 on a le même résultat). Si ce n'est pas le cas ton réseau n'est pas correctement configuré pour IPv6.

Dans ce cas, il te faut peut-être en apprendre plus sur IPv6, notamment la configuration SLAAC. Tu n'a pas besoin de DHCPv6 (sauf cas tres particuliers).

Si tu essais de transposer ce que tu fais en IPv4 a IPv6 c'est le meilleur moyen de se planter...C'est vraiment différent.

lyapounov

  • Abonné Starlink
  • *
  • Messages: 127
  • 71
DNS dynamique + IPv6 + Docker
« Réponse #9 le: 13 novembre 2023 à 14:35:37 »
Si tu essais de transposer ce que tu fais en IPv4 a IPv6 c'est le meilleur moyen de se planter...C'est vraiment différent.

tout d'abord dix mille mercis de me répondre, je vais faire un effort pour comprendre IPv6.

Pour te répondre:

1) mon modem Starlink est en mode bypass, et j'ai un routeur Asus derrière (RT-AX86) qui gère mon réseau. J'ai activé le mode IPv6 sur ce routeur, et j'ai bien une adresse IPv6.

2) l'adresse IPv6 de mon routeur, celle de mon mac sur le réseau et celle de mon Synology ont bien la partie de gauche (le préfixe) en commun; c'est rassurant ;-)

3) sur dynu.com j'ai laissé le champ IPv4 libre; et j'ai l'IPv6 de mon synology qui y est enregistré.

4) sur un de mes serveur distant (kimsufi), lorsque je fais ping monsousdomaine.domaine.net *** j'ai comme réponse customer.lndngbr1.pop.starlinkisp.net et mon adresse IPv6

5) lorsque je fais depuis ce kimsufi ssh user@monsousdomaine.domaine.net -p le_port_externe; avec user étant bien entendu le bon user, et le port externe étant le port externe vers le ssh interne de mon synology, j'ai un timed out

6) j'essaye le même ssh en mettant comme port le port interne de mon synology, j'ai le même timed out


Alors, j'entends bien ce que tu dis pour ne pas appliquer la logique IPv4; d'où certaines questions que j'ai :

- l'adresse IPv6 enregistrée sur Dynu est celle associée au synology. Est-ce que ça signifie que tout paquet sur cette adresse ira uniquement à ce synology ? Et que si je veux aller sur un autre synology sur mon réseau (j'en ai deux), je dois déclarer un autre sous-domaine avec l'IPv6 complète de ce synology ?

- du coup, quid de la logique des ports, qui me permettait de choisir justement vers quel synology ssh (ou sftp, équivelent) allait ?

- quel mécanisme détermine la partie droite de l'adresse IPv6, surtout l'adresse de sous-réseau ? Est-ce mon routeur Asus qui le détermine ? Est-ce que c'est fixe ?

- que devient mon mécanisme de réservation d'adresses fixes v4 (j'en ai 25 en dehors du DHCP), surtout que certaines sont liées à des devices genre ampoule connectée qui probablement n'a pas IPv6 implémentée ?

Voilà; mais déjà si je pouvais faire marcher le ssh depuis l'extérieur, ce serait génial

Merci !!!

lyapounov

  • Abonné Starlink
  • *
  • Messages: 127
  • 71
DNS dynamique + IPv6 + Docker
« Réponse #10 le: 13 novembre 2023 à 14:39:59 »
Je viens de corriger, le ping me répond customer.lndngbr1.pop.starlinkisp.net suivi de la bonne adresse IPv6 de mon synology


lyapounov

  • Abonné Starlink
  • *
  • Messages: 127
  • 71
DNS dynamique + IPv6 + Docker
« Réponse #11 le: 13 novembre 2023 à 14:56:07 »
Et finalement, mon routeur asus a une adresse IPv6 légèrement différente des machines sur mon réseau. Les deux premiers groupes hexa sont identiques, mais pas le troisième :-(

(je teste en, faisant curl ifcongif.net