« LINUX:DNS-GSLB » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
(21 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
---- | |||
''→ [[LINUX:Internet|retour au menu Internet]]'' | |||
---- | |||
=But= | =But= | ||
Le DNS mondial ressemble à un annulaire téléphonique. Sur internet, chaque machine est identifiée par une adresse IP (comme notre n° de téléphone). Pour que cette machine soit plus facilement accessible, on lui donne un nom (exemple: www.google.com). La fonction principale d'un serveur DNS est de faire la liaison entre ces deux informations. | Le DNS mondial ressemble à un annulaire téléphonique. Sur internet, chaque machine est identifiée par une adresse IP (comme notre n° de téléphone). Pour que cette machine soit plus facilement accessible, on lui donne un nom (exemple: www.google.com). La fonction principale d'un serveur DNS est de faire la liaison entre ces deux informations. | ||
Ligne 6 : | Ligne 9 : | ||
=Organisation d'un nom de domaine= | =Organisation d'un nom de domaine= | ||
Sur Internet, il y a de nombreux serveurs de noms de domaines. Quand on les interroge, ils sont chargés de répondre en interrogeant leur annuaire. | Sur Internet, il y a de nombreux serveurs de noms de domaines. Quand on les interroge, ils sont chargés de répondre en interrogeant leur annuaire. | ||
S'ils n'ont pas la réponse, ils transfèrent la question à un serveur qui est le dépositaire de l'information. En effet chaque serveur est le dépositaire de référence d'un certains nombres de noms de domaines. Les autres, en fonction des demandes gardent une copie en mémoire pendant un certain temps. Après ce temps limite, l'information risque de ne plus être à jour; il faut donc qu'il rafraichisse les | S'ils n'ont pas la réponse, ils transfèrent la question à un serveur qui est le dépositaire de l'information. En effet chaque serveur est le dépositaire de référence d'un certains nombres de noms de domaines. Les autres, en fonction des demandes gardent une copie en mémoire pendant un certain temps. Après ce temps limite, l'information risque de ne plus être à jour; il faut donc qu'il rafraichisse les informations auprès du serveur maître de l'information. | ||
Ces serveurs sont organisés de façon hiérarchique. Au dessus, il y a un serveur de noms de domaine central, racine, mondial. (note: pour une question d'efficacité et de disponibilité, ces serveurs sont plusieurs et redondants, idem éventuellement pour les serveurs maîtres) | |||
De la même façon les noms de domaines sont organisés de façon hiérarchique. Chaque niveau est séparé par un point. Au plus haut niveau, on a une liste fixée au niveau mondial de noeud ("fr" pour la France, "eu" pour l'Europe, "org" comme organisation,...). Par exemple le nom de la machine "www.google.com." correspond à la machine "www", serveur WEB, du nom de domaine "google" appartenant à la société Google qui lui appartient du nom de domaine primordial "com" comme "commercial". Le point final renvoie à la racine générale et donc aux serveurs racines. Autre exemple "mail.edf.fr" fait référence à la machine "mail" de la société Edf ("edf") située en France ("fr"). | De la même façon les noms de domaines sont organisés de façon hiérarchique. Chaque niveau est séparé par un point. Au plus haut niveau, on a une liste fixée au niveau mondial de noeud ("fr" pour la France, "eu" pour l'Europe, "org" comme organisation,...). Par exemple le nom de la machine "www.google.com." correspond à la machine "www", serveur WEB, du nom de domaine "google" appartenant à la société Google qui lui appartient du nom de domaine primordial "com" comme "commercial". Le point final renvoie à la racine générale et donc aux serveurs racines. Autre exemple "mail.edf.fr" fait référence à la machine "mail" de la société Edf ("edf") située en France ("fr"). | ||
Ligne 18 : | Ligne 23 : | ||
Nous avons choisi le site GSLB car, au contraire des autres sites gratuits, vous pouvez créer votre propre nom de sous-domaine. De plus au contraire des autres sites, vous pouvez introduire toute une séries de sortes d'enregistrement en plus du nom de machine. | Nous avons choisi le site GSLB car, au contraire des autres sites gratuits, vous pouvez créer votre propre nom de sous-domaine. De plus au contraire des autres sites, vous pouvez introduire toute une séries de sortes d'enregistrement en plus du nom de machine. | ||
Vous connectez à l'URL https://gui.gslb.me/GSLB.ME-GUI/ . L'image suivante vous présente l'écran de LOGIN. A ce stade, vous pouvez créer votre compte si vous n'en avez pas. Ce compte est gratuit. | Vous connectez à l'URL <nowiki>https://gui.gslb.me/GSLB.ME-GUI/</nowiki> . L'image suivante vous présente l'écran de LOGIN. A ce stade, vous pouvez créer votre compte si vous n'en avez pas. Ce compte est gratuit. | ||
Ligne 51 : | Ligne 56 : | ||
Le "Record value" a quatre paramètres. Les deux premiers ont peu d'importance dans notre cas: la priorité et le poids. Ils sont importants si vous avez plusieurs serveurs WEB. Le troisième par contre correspond au n° du port TCP: classiquement, pour HTTP, il a la valeur "'''80'''" et pour HTTPS, "'''443'''" . Ces valeurs peuvent être différentes en fonction de la configuration de votre serveur. Par exemple, si vous deux serveurs WEB hébergeant des sites WEB différents (un serveur WEB Linux et un serveur WEB Windows). Le premier aurait respectivement les services WEB sur les ports 80 et 443 et le second, sur les ports 81 et 444. | Le "Record value" a quatre paramètres. Les deux premiers ont peu d'importance dans notre cas: la priorité et le poids. Ils sont importants si vous avez plusieurs serveurs WEB. Le troisième par contre correspond au n° du port TCP: classiquement, pour HTTP, il a la valeur "'''80'''" et pour HTTPS, "'''443'''" . Ces valeurs peuvent être différentes en fonction de la configuration de votre serveur. Par exemple, si vous deux serveurs WEB hébergeant des sites WEB différents (un serveur WEB Linux et un serveur WEB Windows). Le premier aurait respectivement les services WEB sur les ports 80 et 443 et le second, sur les ports 81 et 444. | ||
Le quatrième renvoie vers la machine qui offre ce service: ici "''' | Le quatrième renvoie vers la machine qui offre ce service: ici "'''www'''". | ||
* Records pour un serveur de messagerie (Mail) | * Records pour un serveur de messagerie (Mail) | ||
Ligne 69 : | Ligne 74 : | ||
DKIM: | DKIM: | ||
Le serveur de messagerie émetteur va ajouter une clé cryptée au message. Le serveur qui reçoit le message va la vérifier sur base de la clé placée dans cet enregistrement de type TXT DKIM. C'est une autre façon de certifier son origine. | |||
Dans l'exemple, l'enregistrement DKIM a comme nom "mail._domainkey" et comme valeur "v=DKIM1; k=rsa; s=email; p=<CLE>;". | Dans l'exemple, l'enregistrement DKIM a comme nom "mail._domainkey" et comme valeur "v=DKIM1; k=rsa; s=email; p=<CLE>;". | ||
Les clés privée et publique sont générées sur votre serveur mail. La clé publique est mise sur le serveur DNS à la place de "<CLE>". La clé privée sert sur le serveur mail émetteur à générer la clé ajoutée au message. En ayant les deux, le serveur récepteur peut vérifier la validité de la clé. Sur le serveur émetteur, le paramétrage de DKIM doit correspondre au nom repris dans le DNS; (ici, "mail._domainkey"). | Les clés privée et publique sont générées sur votre serveur mail. La clé publique est mise sur le serveur DNS à la place de "<CLE>". La clé privée sert sur le serveur mail émetteur à générer la clé ajoutée au message. En ayant les deux, le serveur récepteur peut vérifier la validité de la clé. Sur le serveur émetteur, le paramétrage de DKIM doit correspondre au nom repris dans le DNS; (ici, "mail._domainkey"). | ||
Ligne 90 : | Ligne 95 : | ||
- IMAP pour le port 143 | - IMAP pour le port 143 | ||
- IMAPS pour le port 993 | - IMAPS pour le port 993 | ||
* Enregistrement de validité pour Google | |||
Cet enregistrement de type TXT, "google-site-verification", permet de vous authentifier comme propriétaire d'un site WEB auprès de Google. La clé associée est fournie par Google. | |||
=Mise-à-jour de l'adresse IP dans le serveur DNS= | =Mise-à-jour de l'adresse IP dans le serveur DNS= | ||
Comme vous avez une adresse IP dynamique, dès qu'elle change, elle doit être adaptée dans le DNS. | |||
Il existe deux méthodes pour y arriver: | |||
* le programme Java | |||
* l'utilisation de l'API | |||
=Programme Java= | |||
Le site de GSLB fournit une API et une application Java pour l'adapter à distance. | |||
L'explication de cette application se trouve à l'URL <nowiki>https://docs.gslb.me/clients/</nowiki> et l'application est téléchargeable à l'URL '''<nowiki>https://docs.gslb.me/files/20131227-GSLB.ME-RestClient.zip</nowiki>''' Cette application transforme les enregistrements de type "A" mais pas les autres. | |||
Dans nos exemples de scripts qui suivent, nous les placerons dans un répertoire nommé "/manager/gdlb.me". | |||
Nous y décompressons le fichier "20131227-GSLB.ME-RestClient.zip" téléchargé ci-dessous. Un sous-répertoire "GSLB.ME-RestClient" est alors créé dans le répertoire "/manager/gdlb.me". | |||
Notons que ce script "GSLB.me-RestClient.jar" est écrit en Java (version 1). Il faut donc que l'interpréteur Java soit installé. | |||
Sous Fedora 38, on ajoute le paquet "java-1.8.0-openjdk" grâce à la commande suivante: | |||
dnf install java-1.8.0-openjdk | |||
Si on installe la dernière version OpenJdk 17 ou 20, le script "GSLB.me-RestClient.jar" ne fonctionne pas. | |||
Voici un exemple de script qui permet la mise à jour des enregistrements de type "A" dans votre espace DNS. | |||
Nous l'avons nommé "update.bat" également placé dans le répertoire "/manager/gdlb.me". | |||
---- | |||
#!/bin/bash | |||
###################################################### | |||
# A ADAPTER | |||
# | |||
# nom de domaine | |||
NOMDNS="adbweb.gslb.eu" | |||
# liste totale : nom de domaine et serveurs | |||
LISTE="adbweb www.adbweb mail.adbweb" | |||
# ou | |||
#LISTE="adbweb.gslb.eu www.adbweb.gslb.eu mail.adbweb.gslb.eu" | |||
# nom de compte GSLB | |||
EMAIL="adresse@email" | |||
# mot de passe du compte GSLB | |||
PW="mot-de-passe" | |||
###################################################### | |||
cd /manager/gslb.me/GSLB.ME-RestClient/sbin | |||
# Récupération de l'adresse IP du modem | |||
IP=`/usr/bin/curl -s ifconfig.me/ip` | |||
# ou | |||
#IP=`/usr/bin/wget -qO- icanhazip.com` | |||
# Récupérer l'adresse IP reprise dans le DNS | |||
TRAV1=`/usr/bin/dig ${NOMDNS} +noall +answer` | |||
IPDNS=( $TRAV1 ) | |||
# si les deux adresses IP sont différentes, on exécute la procédure | |||
if [ "$IP" != "${IPDNS[4]}" ] | |||
then | |||
for DNS in ${LISTE} | |||
do | |||
echo ${DNS} mis à jour | |||
./sh.GSLB.ME-RestClient -u ${EMAIL} -p ${PW} -dyn ${DNS}.gslb.eu | |||
done | |||
fi | |||
---- | |||
Les paramètres du script "update.bat" sont à adapter selon vos besoins: | |||
* EMAIL correspond à votre nom de compte d'accès au site de GSLB | |||
* PW correspond au mot de passe de ce compte | |||
* NOMDNS reprend votre nom de domaine (la valeur reprise en exemple est celle du cas exposé plus haut) | |||
* LISTE reprend les différentes entrées des enregistrements de type A (les valeurs reprisent en exemple sont celles du cas exposé plus haut) | |||
Le script récupère l'adresse IP du modem puis celui repris dans le DNS. Il les comparent et s'ils sont différents, il effectue la mise-à-jour. | |||
Pour que ce script s'exécute automatiquement à intervalle régulier, il faut ajouter cet appel dans le CRON. | |||
Ajoutez cette entrée dans le fichier "/etc/crontab": | |||
---- | |||
# dyndns GSLB.ME | |||
5,20,35,50 * * * * root /manager/gslb.me/update.bat >& /manager/gslb.me/update.log | |||
---- | |||
<!-- | |||
Voici le contenu du script: | |||
---- | |||
#!/bin/bash | |||
###################################################### | |||
# | |||
# Test an IP address for validity: | |||
# Usage: | |||
# valid_ip IP_ADDRESS | |||
# if [[ $? -eq 0 ]]; then echo good; else echo bad; fi | |||
# OR | |||
# if valid_ip IP_ADDRESS; then echo good; else echo bad; fi | |||
# | |||
###################################################### | |||
function valid_ip() | |||
{ | |||
local ip=$1 | |||
local stat=1 | |||
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then | |||
OIFS=$IFS | |||
IFS='.' | |||
ip=($ip) | |||
IFS=$OIFS | |||
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \ | |||
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] | |||
stat=$? | |||
fi | |||
return $stat | |||
} | |||
# | |||
###################################################### | |||
# A ADAPTER | |||
# | |||
# nom de domaine | |||
NOMDNS="adbweb.gslb.eu" | |||
# liste totale : nom de domaine et serveurs | |||
LISTE="adbweb.gslb.eu www.adbweb.gslb.eu mail.adbweb.gslb.eu" | |||
# nom de compte GSLB | |||
EMAIL="adresse@email" | |||
# mot de passe du compte GSLB | |||
PW="mot-de-passe" | |||
###################################################### | |||
cd /manager/gslb.me/GSLB.ME-RestClient/sbin | |||
# Récupération de l'adresse IP du modem | |||
IP=`/usr/bin/curl -s ifconfig.me/ip` | |||
# ou | |||
#IP=`/usr/bin/wget -qO- icanhazip.com` | |||
#echo $IP | |||
# Récupérer l'adresse IP reprise dans le DNS | |||
TRAV1=`/usr/bin/dig ${NOMDNS} +noall +answer` | |||
IPDNS=( $TRAV1 ) | |||
IPL=${IPDNS[4]} | |||
# tests sur adresse IP | |||
if valid_ip $IP ; then | |||
if valid_ip $IPL ; then | |||
# Si elles sont différentes, effectuer le changement | |||
if [ "$IP" != "$IPL" ] | |||
then | |||
# Mettre à jour les enregistrements de type A selon la LISTE fournie | |||
for DNS in ${LISTE} | |||
do | |||
echo ${DNS} mis à jour | |||
./sh.GSLB.ME-RestClient -u ${EMAIL} -p ${PW} -dyn ${DNS} | |||
done | |||
# Créer un script utilisant l'API pour changer l'adresse IP contenue dans l'enregistrement SPF | |||
cd /manager/gslb.me | |||
/usr/bin/cat put1.txt > trav.bat | |||
echo '/usr/bin/curl --basic -u '${EMAIL}:${PW}' -o put.log --location --request PUT '<nowiki>https://api.gslb.me/2.0/record/adbweb.gslb.eu</nowiki>' \' >> trav.bat | |||
/usr/bin/cat put2.txt >> trav.bat | |||
echo ' "value": "v=spf1 mx a ip4:'${IP}' -all"' >> trav.bat | |||
/usr/bin/cat put3.txt >> trav.bat | |||
/usr/bin/chmod 700 trav.bat | |||
./trav.bat | |||
/usr/bin/rm -f trav.bat | |||
fi | |||
fi | |||
fi | |||
---- | |||
--> | |||
=API= | |||
Une approche alternative consiste à utiliser l'API mise à disposition par le site. | |||
Elle est documentée à l'URL <nowiki>https://docs.gslb.me/</nowiki> et avec des exemples sous l'onglet "Zones" sur le dessus de la page. | |||
Nous nous concentrerons sur la modification des adresses IP de nos enregistrements dans notre DNS. | |||
Cette alternative est incontournable quand on veut modifier des enregistrements autres que ceux de type "A", tel "SPF". Car le programme présenté ci-dessus ne peut le faire. | |||
Son principe est simple; il faut créer un fichier JSON que l'on envoie, après authentification, à l'interface API du site. | |||
Ceci se passe en trois phases: | |||
* Récupération des ID | |||
* Création du fichier JSON de base | |||
* Exécution du script | |||
==Récupération des ID== | |||
Chaque enregistrement dans notre DNS est identifié par un n° ou ID. Il nous faut le récupérer avant de pouvoir effectuer nos mises à jour. La procédure téléchargée au point précédent va nous y aider. | |||
Voici le script: | |||
---- | |||
#!/bin/bash | |||
###################################################### | |||
# A ADAPTER | |||
# | |||
# nom de domaine | |||
NOMDNS="adbweb.gslb.eu" | |||
# nom de compte GSLB | |||
EMAIL="adresse@email" | |||
# mot de passe du compte GSLB | |||
PW="mot-de-passe" | |||
###################################################### | |||
cd /manager/gslb.me/GSLB.ME-RestClient/sbin | |||
./sh.GSLB.ME-RestClient -u ${EMAIL} -p ${PW} -gr ${NOMDNS} >& /manager/gslb.me/record.txt | |||
cd /manager/gslb.me | |||
/usr/bin/python -m json.tool record.txt > record.json | |||
---- | |||
Comme ci-dessus, il faut adapter le nom DNS, l'adresse mail et le mot de passe. La procédure récupère sous format JSON tous les enregistrements de votre DNS. Mais comme il le fait sous forme d'une seule ligne, on utilise une procédure Python pour la rendre plus lisible. | |||
Voici un exemple réduit de sortie dans le fichier "record.json": | |||
---- | |||
{ | |||
"rrset": [ | |||
{ | |||
"id": "35377", | |||
"name": "_http._tcp", | |||
"readonly": "false", | |||
"ttl": "86400", | |||
"type": "SRV", | |||
"value": "30 1 80 www" | |||
}, | |||
{ | |||
"id": "35378", | |||
"name": "_https._tcp", | |||
"readonly": "false", | |||
"ttl": "86400", | |||
"type": "SRV", | |||
"value": "30 1 443 www" | |||
}, | |||
{ | |||
"id": "'''35395'''", | |||
"name": "www", | |||
"readonly": "false", | |||
"ttl": "86400", | |||
"type": "A", | |||
"value": "109.133.61.183" | |||
}, | |||
{ | |||
"id": "'''35396'''", | |||
"name": "@", | |||
"readonly": "false", | |||
"ttl": "86400", | |||
"type": "A", | |||
"value": "109.133.61.183" | |||
}, | |||
{ | |||
"id": "'''35473'''", | |||
"name": "mail", | |||
"readonly": "false", | |||
"ttl": "86400", | |||
"type": "A", | |||
"value": "109.133.61.183" | |||
}, | |||
{ | |||
"id": "'''35499'''", | |||
"name": "@", | |||
"readonly": "false", | |||
"ttl": "86400", | |||
"type": "TXT", | |||
"value": "v=spf1 mx a ip4:109.133.61.183 -all" | |||
} | |||
] | |||
} | |||
---- | |||
Nous avons mis en gras les ID des enregistrements liés à l'adresse IP. | |||
Si on ne peut utiliser ce programme Java, on peut opter pour l'approche utilisant l'API. | |||
Voici le script: | |||
---- | |||
#!/bin/bash | |||
###################################################### | |||
# A ADAPTER | |||
# | |||
# nom de domaine | |||
NOMDNS="adbweb.gslb.eu" | |||
# nom de compte GSLB | |||
EMAIL="adresse@email" | |||
# mot de passe du compte GSLB | |||
PW="mot-de-passe" | |||
###################################################### | |||
cd /manager/gslb.me | |||
/usr/bin/curl --basic -u ${EMAIL}:${PW} -o record.txt --location --request GET https://api.gslb.me/2.0/record/${NOMDNS} --data '' | |||
/usr/bin/python -m json.tool record.txt > record.json | |||
---- | |||
On obtient le même résultat dans le fichier "record.json". | |||
==Création du fichier JSON de base== | |||
A partir du fichier JSON extrait ci-dessus, on crée un fichier JSON spécial ne reprenant que les blocs où sont présents les adresses IP. On va remplacer les adresses IP par un code ("IPNEW") qui nous servira à la substitution par la nouvelle adresse IP. Nous y ajoutons une entête nécessaire pour la procédure d'envoi sur le site. | |||
Voici ce fichier que l'on nomme "base.json": | |||
---- | |||
'''--header <nowiki>'</nowiki>Accept: application/json<nowiki>'</nowiki> \''' | |||
'''--header <nowiki>'</nowiki>Content-Type: application/json<nowiki>'</nowiki> \''' | |||
'''--data-raw <nowiki>'</nowiki>{''' | |||
'''"records": [''' | |||
{ | |||
"id": "35395", | |||
"name": "www", | |||
"readonly": "false", | |||
"ttl": "86400", | |||
"type": "A", | |||
"value": "'''IPNEW'''" | |||
}, | |||
{ | |||
"id": "35396", | |||
"name": "@", | |||
"readonly": "false", | |||
"ttl": "86400", | |||
"type": "A", | |||
"value": "'''IPNEW'''" | |||
}, | |||
{ | |||
"id": "35473", | |||
"name": "mail", | |||
"readonly": "false", | |||
"ttl": "86400", | |||
"type": "A", | |||
"value": "'''IPNEW'''" | |||
}, | |||
{ | |||
"id": "35499", | |||
"name": "@", | |||
"readonly": "false", | |||
"ttl": "86400", | |||
"type": "TXT", | |||
"value": "v=spf1 mx a ip4:'''IPNEW''' -all" | |||
} | |||
''']''' | |||
'''}<nowiki>'</nowiki>''' | |||
---- | |||
==Création et exécution du Script== | |||
Maintenant voici le script qui va utiliser le fichier "base.json". Nous le nommerons "update.api.bat": | |||
---- | |||
#!/bin/bash | |||
###################################################### | |||
# A ADAPTER | |||
# | |||
# nom de domaine | |||
NOMDNS="adbweb.gslb.eu" | |||
# nom de compte GSLB | |||
EMAIL="adresse@email" | |||
# mot de passe du compte GSLB | |||
PW="mot-de-passe" | |||
###################################################### | |||
cd /manager/gslb.me | |||
# Récupération de l'adresse IP du modem | |||
IP=`/usr/bin/curl -s ifconfig.me/ip` | |||
# ou | |||
#IP=`/usr/bin/wget -qO- icanhazip.com` | |||
# Récupérer l'adresse IP reprise dans le DNS | |||
TRAV1=`/usr/bin/dig ${NOMDNS} +noall +answer` | |||
IPDNS=( $TRAV1 ) | |||
# si les deux adresses IP sont différentes, on exécute la procédure | |||
if [ "$IP" != "${IPDNS[4]}" ] | |||
then | |||
/usr/bin/cp -f base.json trav.json | |||
/usr/bin/sed -i <nowiki>'s/IPNEW/'${IP}'/g'</nowiki> trav.json | |||
echo "#!/bin/bash" > trav.bat | |||
echo <nowiki>'/usr/bin/curl --basic -u '${EMAIL}:${PW}' -o put.log --location --request PUT 'https://api.gslb.me/2.0/record/${NOMDNS}' \'</nowiki> >> trav.bat | |||
/usr/bin/cat trav.json >> trav.bat | |||
/usr/bin/chmod 700 trav.bat | |||
./trav.bat | |||
/usr/bin/rm -f trav.bat | |||
/usr/bin/rm -f trav.json | |||
fi | |||
---- | |||
Le script récupère l'adresse IP du modem puis celui repris dans le DNS. Il les comparent et s'ils sont différents, il effectue la mise-à-jour. | |||
Pour que ce script s'exécute automatiquement à intervalle régulier, il faut ajouter cet appel dans le CRON. | |||
Ajoutez cette entrée dans le fichier "/etc/crontab": | |||
---- | |||
# dyndns GSLB.ME | |||
5,20,35,50 * * * * root /manager/gslb.me/update.api.bat >& /manager/gslb.me/update.api.log | |||
---- | |||
---- | |||
''→ [[LINUX:Internet|retour au menu Internet]]'' | |||
---- | ---- | ||
__NOEDITSECTION__ | __NOEDITSECTION__ | ||
[[Category:LINUX]] |
Dernière version du 31 mai 2023 à 20:05
But
Le DNS mondial ressemble à un annulaire téléphonique. Sur internet, chaque machine est identifiée par une adresse IP (comme notre n° de téléphone). Pour que cette machine soit plus facilement accessible, on lui donne un nom (exemple: www.google.com). La fonction principale d'un serveur DNS est de faire la liaison entre ces deux informations. Pour faire connaitre votre serveur sur Internet, iIl faut donc effectuer ces deux étapes sur un serveur DNS sur Internet.
Organisation d'un nom de domaine
Sur Internet, il y a de nombreux serveurs de noms de domaines. Quand on les interroge, ils sont chargés de répondre en interrogeant leur annuaire. S'ils n'ont pas la réponse, ils transfèrent la question à un serveur qui est le dépositaire de l'information. En effet chaque serveur est le dépositaire de référence d'un certains nombres de noms de domaines. Les autres, en fonction des demandes gardent une copie en mémoire pendant un certain temps. Après ce temps limite, l'information risque de ne plus être à jour; il faut donc qu'il rafraichisse les informations auprès du serveur maître de l'information.
Ces serveurs sont organisés de façon hiérarchique. Au dessus, il y a un serveur de noms de domaine central, racine, mondial. (note: pour une question d'efficacité et de disponibilité, ces serveurs sont plusieurs et redondants, idem éventuellement pour les serveurs maîtres)
De la même façon les noms de domaines sont organisés de façon hiérarchique. Chaque niveau est séparé par un point. Au plus haut niveau, on a une liste fixée au niveau mondial de noeud ("fr" pour la France, "eu" pour l'Europe, "org" comme organisation,...). Par exemple le nom de la machine "www.google.com." correspond à la machine "www", serveur WEB, du nom de domaine "google" appartenant à la société Google qui lui appartient du nom de domaine primordial "com" comme "commercial". Le point final renvoie à la racine générale et donc aux serveurs racines. Autre exemple "mail.edf.fr" fait référence à la machine "mail" de la société Edf ("edf") située en France ("fr").
Création de votre domaine
Il faut donc avoir un nom reconnu au niveau mondial pour notre serveur. Soit vous avez payé pour avoir votre propre nom de domaine personnalisé par exemple chez OVH, soit vous allez sur des sites gratuits où vous pouvez déclarer le nom de votre serveur à l'intérieur d'un domaine existant. Il en existe de nombreux qui offrent une base de fonctions gratuites et d'autres fonction payantes plus avancées. Sur la majorité de ces sites, vous ne pouvez que déclarer que votre nom de machine et éventuellement un enregistrement "MX" pour votre serveur de messagerie.
Nous avons choisi le site GSLB car, au contraire des autres sites gratuits, vous pouvez créer votre propre nom de sous-domaine. De plus au contraire des autres sites, vous pouvez introduire toute une séries de sortes d'enregistrement en plus du nom de machine.
Vous connectez à l'URL https://gui.gslb.me/GSLB.ME-GUI/ . L'image suivante vous présente l'écran de LOGIN. A ce stade, vous pouvez créer votre compte si vous n'en avez pas. Ce compte est gratuit.
Après authentification, la page "Home" vous place au coeur du sujet. A gauche vous avez la liste des noms de domaines propriété de la société GSLB. Nous avons choisit de créer une sous-zone au niveau de l'Europe: "gslb.eu". En dessous en faisant appel au menu contextuel de la ligne "Customer zones", vous allez créer votre sous-zone ("Add zone (quick mode)").
Un écran apparaît. Vous devez renseigner une adresse mail et surtout votre nom de sous-domaine. Dans l'exemple, il se nomme "adbweb" de la zone maître "gslb.eu" ce qui donne au total "adbweb.gslb.eu". Une ligne s'ajoute correspondant à la nouvelle zone. En cliquant dessus, vous pouvez l'éditer.
- A Record
La première chose est d'ajouter votre machine en liaison avec votre adresse IP publique. Pour cela, vous allez dans le cadre "Create a new record". Une machine sous IPV4 est introduit via un enregistrement de type "A", le type "AAAA" est réservé à l'adressage IPV6. La "Record value" aura pour valeur votre adresse IP publique. Le "Record name" accueillera le nom de machine. Par exemple "www" pour votre serveur WEB; "mail" pour votre serveur de messagerie. L'entrée "@" correspond au nom de zone et donc à l'absence de nom. Cette entrée valide n'importe quelle machine en dessous.
- NS record
Les types "NS" alias de "Name Server" sont non éditables et correspondent aux serveurs de noms de domaine maître, c'est à dire, ceux de la société GSLB.
- SRV Record pour un serveur WEB
En option, pour notre serveur WEB (machine "www"), nous pouvons renseigner quels ports TCP sont utilisés. Pour cela nous pouvons ajouter des enregistrements de type SRV. Le nom d'enregistrement a la forme _<service>._tcp. Par exemple, pour le protocol HTTP, nous aurons ¨"_http._tcp" et pour HTTP sécurisé, HTTPS, nous aurons "_https._tcp" .
Le "Record value" a quatre paramètres. Les deux premiers ont peu d'importance dans notre cas: la priorité et le poids. Ils sont importants si vous avez plusieurs serveurs WEB. Le troisième par contre correspond au n° du port TCP: classiquement, pour HTTP, il a la valeur "80" et pour HTTPS, "443" . Ces valeurs peuvent être différentes en fonction de la configuration de votre serveur. Par exemple, si vous deux serveurs WEB hébergeant des sites WEB différents (un serveur WEB Linux et un serveur WEB Windows). Le premier aurait respectivement les services WEB sur les ports 80 et 443 et le second, sur les ports 81 et 444.
Le quatrième renvoie vers la machine qui offre ce service: ici "www".
- Records pour un serveur de messagerie (Mail)
Actuellement pour sécuriser de plus en plus son serveur Mail, il faut toute une panoplie d'enregistrements spécifiques.
- MX record
Le premier venu est l'enregistrement de type MX. Il spécifie que la machine nommée est un serveur de messagerie (SMTP au sens large). La "Record value" a deux paramètres. Le premier est la priorité et est secondaire dans notre cas. Si nous avons plusieurs enregistrements MX et si celui qui a la priorité est défaillant, le suivant est choisi. Le second paramètre renvoie vers la machine qui offre ce service: ici "mail".
- TXT record
Pour sécuriser et permettre de vérifier que le message vient bien d'un serveur de messagerie servant un domaine donné, on ajoute des enregistrements de type TXT pour les validations SPF, DKIM et DMARC. Pour plus d'informations, je vous renvoie vers les sites spécialisés. Le serveur mail autre qui reçoit un message de notre serveur mail, va voir ces enregistrements du domaine du serveur émetteur et les vérifier. Si les clauses ne sont pas vérifiées, le message sera refusé.
SPF: Dans l'exemple, l'enregistrement SPF est "v=spf1 mx a ip4:109.133.61.183 -all" pour toute machine ("@") Le paramètre "mx" spécifie que ce serveur doit avoir un enregistrement de type MX dans ce domaine. Le paramètre "a" spécifie que ce serveur doit avoir un enregistrement de type A dans ce domaine. Le paramètre "ip4" spécifie que ce serveur doit avoir l'adresse IP (IPV4) donnée. Le paramètre "all" spécifie la politique a adopter si les conditions ne sont pas remplies: ici refus.
DKIM: Le serveur de messagerie émetteur va ajouter une clé cryptée au message. Le serveur qui reçoit le message va la vérifier sur base de la clé placée dans cet enregistrement de type TXT DKIM. C'est une autre façon de certifier son origine. Dans l'exemple, l'enregistrement DKIM a comme nom "mail._domainkey" et comme valeur "v=DKIM1; k=rsa; s=email; p=<CLE>;". Les clés privée et publique sont générées sur votre serveur mail. La clé publique est mise sur le serveur DNS à la place de "<CLE>". La clé privée sert sur le serveur mail émetteur à générer la clé ajoutée au message. En ayant les deux, le serveur récepteur peut vérifier la validité de la clé. Sur le serveur émetteur, le paramétrage de DKIM doit correspondre au nom repris dans le DNS; (ici, "mail._domainkey"). Le paramètre "k" définit le type de cryptage. Le paramètre "s" définit le type de service.
DMARC: De façon simple, c'est une vérification conjointe SPF et DKIM. Dans l'exemple l'enregistrement DMARC a comme nom "_dmarc" et comme valeur "v=DMARC1; p=quarantine; pct=100; adkim=s; aspf=s".
- SRV Record pour un serveur MAIL
En option, pour notre serveur de messagerie (machine "mail"), nous pouvons renseigner quels ports TCP sont utilisés. Et la messagerie utilise nombre de services. Le principe est le même que pour le serveur WEB.
Les services et les ports TCP:
- SMTP pour le port 25 - SMTPS pour le port 465 - SUBMISSION pour le port 587 - POP pour le port 110 - POPS pour le port 995 - IMAP pour le port 143 - IMAPS pour le port 993
- Enregistrement de validité pour Google
Cet enregistrement de type TXT, "google-site-verification", permet de vous authentifier comme propriétaire d'un site WEB auprès de Google. La clé associée est fournie par Google.
Mise-à-jour de l'adresse IP dans le serveur DNS
Comme vous avez une adresse IP dynamique, dès qu'elle change, elle doit être adaptée dans le DNS.
Il existe deux méthodes pour y arriver:
- le programme Java
- l'utilisation de l'API
Programme Java
Le site de GSLB fournit une API et une application Java pour l'adapter à distance. L'explication de cette application se trouve à l'URL https://docs.gslb.me/clients/ et l'application est téléchargeable à l'URL https://docs.gslb.me/files/20131227-GSLB.ME-RestClient.zip Cette application transforme les enregistrements de type "A" mais pas les autres.
Dans nos exemples de scripts qui suivent, nous les placerons dans un répertoire nommé "/manager/gdlb.me".
Nous y décompressons le fichier "20131227-GSLB.ME-RestClient.zip" téléchargé ci-dessous. Un sous-répertoire "GSLB.ME-RestClient" est alors créé dans le répertoire "/manager/gdlb.me".
Notons que ce script "GSLB.me-RestClient.jar" est écrit en Java (version 1). Il faut donc que l'interpréteur Java soit installé.
Sous Fedora 38, on ajoute le paquet "java-1.8.0-openjdk" grâce à la commande suivante:
dnf install java-1.8.0-openjdk
Si on installe la dernière version OpenJdk 17 ou 20, le script "GSLB.me-RestClient.jar" ne fonctionne pas.
Voici un exemple de script qui permet la mise à jour des enregistrements de type "A" dans votre espace DNS.
Nous l'avons nommé "update.bat" également placé dans le répertoire "/manager/gdlb.me".
#!/bin/bash ###################################################### # A ADAPTER # # nom de domaine NOMDNS="adbweb.gslb.eu" # liste totale : nom de domaine et serveurs LISTE="adbweb www.adbweb mail.adbweb" # ou #LISTE="adbweb.gslb.eu www.adbweb.gslb.eu mail.adbweb.gslb.eu" # nom de compte GSLB EMAIL="adresse@email" # mot de passe du compte GSLB PW="mot-de-passe" ###################################################### cd /manager/gslb.me/GSLB.ME-RestClient/sbin # Récupération de l'adresse IP du modem IP=`/usr/bin/curl -s ifconfig.me/ip` # ou #IP=`/usr/bin/wget -qO- icanhazip.com` # Récupérer l'adresse IP reprise dans le DNS TRAV1=`/usr/bin/dig ${NOMDNS} +noall +answer` IPDNS=( $TRAV1 ) # si les deux adresses IP sont différentes, on exécute la procédure if [ "$IP" != "${IPDNS[4]}" ] then for DNS in ${LISTE} do echo ${DNS} mis à jour ./sh.GSLB.ME-RestClient -u ${EMAIL} -p ${PW} -dyn ${DNS}.gslb.eu done fi
Les paramètres du script "update.bat" sont à adapter selon vos besoins:
- EMAIL correspond à votre nom de compte d'accès au site de GSLB
- PW correspond au mot de passe de ce compte
- NOMDNS reprend votre nom de domaine (la valeur reprise en exemple est celle du cas exposé plus haut)
- LISTE reprend les différentes entrées des enregistrements de type A (les valeurs reprisent en exemple sont celles du cas exposé plus haut)
Le script récupère l'adresse IP du modem puis celui repris dans le DNS. Il les comparent et s'ils sont différents, il effectue la mise-à-jour.
Pour que ce script s'exécute automatiquement à intervalle régulier, il faut ajouter cet appel dans le CRON.
Ajoutez cette entrée dans le fichier "/etc/crontab":
# dyndns GSLB.ME 5,20,35,50 * * * * root /manager/gslb.me/update.bat >& /manager/gslb.me/update.log
API
Une approche alternative consiste à utiliser l'API mise à disposition par le site. Elle est documentée à l'URL https://docs.gslb.me/ et avec des exemples sous l'onglet "Zones" sur le dessus de la page.
Nous nous concentrerons sur la modification des adresses IP de nos enregistrements dans notre DNS. Cette alternative est incontournable quand on veut modifier des enregistrements autres que ceux de type "A", tel "SPF". Car le programme présenté ci-dessus ne peut le faire.
Son principe est simple; il faut créer un fichier JSON que l'on envoie, après authentification, à l'interface API du site.
Ceci se passe en trois phases:
- Récupération des ID
- Création du fichier JSON de base
- Exécution du script
Récupération des ID
Chaque enregistrement dans notre DNS est identifié par un n° ou ID. Il nous faut le récupérer avant de pouvoir effectuer nos mises à jour. La procédure téléchargée au point précédent va nous y aider.
Voici le script:
#!/bin/bash ###################################################### # A ADAPTER # # nom de domaine NOMDNS="adbweb.gslb.eu" # nom de compte GSLB EMAIL="adresse@email" # mot de passe du compte GSLB PW="mot-de-passe" ###################################################### cd /manager/gslb.me/GSLB.ME-RestClient/sbin ./sh.GSLB.ME-RestClient -u ${EMAIL} -p ${PW} -gr ${NOMDNS} >& /manager/gslb.me/record.txt cd /manager/gslb.me /usr/bin/python -m json.tool record.txt > record.json
Comme ci-dessus, il faut adapter le nom DNS, l'adresse mail et le mot de passe. La procédure récupère sous format JSON tous les enregistrements de votre DNS. Mais comme il le fait sous forme d'une seule ligne, on utilise une procédure Python pour la rendre plus lisible.
Voici un exemple réduit de sortie dans le fichier "record.json":
{ "rrset": [ { "id": "35377", "name": "_http._tcp", "readonly": "false", "ttl": "86400", "type": "SRV", "value": "30 1 80 www" }, { "id": "35378", "name": "_https._tcp", "readonly": "false", "ttl": "86400", "type": "SRV", "value": "30 1 443 www" }, { "id": "35395", "name": "www", "readonly": "false", "ttl": "86400", "type": "A", "value": "109.133.61.183" }, { "id": "35396", "name": "@", "readonly": "false", "ttl": "86400", "type": "A", "value": "109.133.61.183" }, { "id": "35473", "name": "mail", "readonly": "false", "ttl": "86400", "type": "A", "value": "109.133.61.183" }, { "id": "35499", "name": "@", "readonly": "false", "ttl": "86400", "type": "TXT", "value": "v=spf1 mx a ip4:109.133.61.183 -all" } ] }
Nous avons mis en gras les ID des enregistrements liés à l'adresse IP.
Si on ne peut utiliser ce programme Java, on peut opter pour l'approche utilisant l'API.
Voici le script:
#!/bin/bash ###################################################### # A ADAPTER # # nom de domaine NOMDNS="adbweb.gslb.eu" # nom de compte GSLB EMAIL="adresse@email" # mot de passe du compte GSLB PW="mot-de-passe" ###################################################### cd /manager/gslb.me /usr/bin/curl --basic -u ${EMAIL}:${PW} -o record.txt --location --request GET https://api.gslb.me/2.0/record/${NOMDNS} --data /usr/bin/python -m json.tool record.txt > record.json
On obtient le même résultat dans le fichier "record.json".
Création du fichier JSON de base
A partir du fichier JSON extrait ci-dessus, on crée un fichier JSON spécial ne reprenant que les blocs où sont présents les adresses IP. On va remplacer les adresses IP par un code ("IPNEW") qui nous servira à la substitution par la nouvelle adresse IP. Nous y ajoutons une entête nécessaire pour la procédure d'envoi sur le site.
Voici ce fichier que l'on nomme "base.json":
--header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --data-raw '{ "records": [ { "id": "35395", "name": "www", "readonly": "false", "ttl": "86400", "type": "A", "value": "IPNEW" }, { "id": "35396", "name": "@", "readonly": "false", "ttl": "86400", "type": "A", "value": "IPNEW" }, { "id": "35473", "name": "mail", "readonly": "false", "ttl": "86400", "type": "A", "value": "IPNEW" }, { "id": "35499", "name": "@", "readonly": "false", "ttl": "86400", "type": "TXT", "value": "v=spf1 mx a ip4:IPNEW -all" } ] }'
Création et exécution du Script
Maintenant voici le script qui va utiliser le fichier "base.json". Nous le nommerons "update.api.bat":
#!/bin/bash ###################################################### # A ADAPTER # # nom de domaine NOMDNS="adbweb.gslb.eu" # nom de compte GSLB EMAIL="adresse@email" # mot de passe du compte GSLB PW="mot-de-passe" ###################################################### cd /manager/gslb.me # Récupération de l'adresse IP du modem IP=`/usr/bin/curl -s ifconfig.me/ip` # ou #IP=`/usr/bin/wget -qO- icanhazip.com` # Récupérer l'adresse IP reprise dans le DNS TRAV1=`/usr/bin/dig ${NOMDNS} +noall +answer` IPDNS=( $TRAV1 ) # si les deux adresses IP sont différentes, on exécute la procédure if [ "$IP" != "${IPDNS[4]}" ] then /usr/bin/cp -f base.json trav.json /usr/bin/sed -i 's/IPNEW/'${IP}'/g' trav.json echo "#!/bin/bash" > trav.bat echo '/usr/bin/curl --basic -u '${EMAIL}:${PW}' -o put.log --location --request PUT 'https://api.gslb.me/2.0/record/${NOMDNS}' \' >> trav.bat /usr/bin/cat trav.json >> trav.bat /usr/bin/chmod 700 trav.bat ./trav.bat /usr/bin/rm -f trav.bat /usr/bin/rm -f trav.json fi
Le script récupère l'adresse IP du modem puis celui repris dans le DNS. Il les comparent et s'ils sont différents, il effectue la mise-à-jour.
Pour que ce script s'exécute automatiquement à intervalle régulier, il faut ajouter cet appel dans le CRON.
Ajoutez cette entrée dans le fichier "/etc/crontab":
# dyndns GSLB.ME 5,20,35,50 * * * * root /manager/gslb.me/update.api.bat >& /manager/gslb.me/update.api.log