Script de mise à jour du DynHOST d’OVH (Router OS)

Mise à jour du 23 juin 2017 : Je viens de publier un nouvel article qui propose une solution encore plus simple : https://zebratux.com/routeros-pointez-facilement-votre-propre-sous-domaine-vers-son-ip-dynamique/

Avec un nom de domaine qui est enregistré chez OVH et qui a sa configuration DNS sur les serveurs DNS d’OVH, il est possible de configurer un sous-domaine qui pointe vers une IP dynamique. Ce service gratuit proposé par OVH est appelé DynHOST (plus couramment appelé Service DynDNS). Voici un lien vers la page qui explique comment configurer ce sous-domaine et qui explique aussi comment définir un identifiant et un mot de passe pour la mise à jour de ce DynHOST: http://guides.ovh.com/DynDns

J’ai trouvé plusieurs scripts de mise à jour DynDNS pour RouterOS mais aucun ne supportait directement la mise à jour DynHOST d’OVH, plusieurs avait été écrits pour de vieilles version de Router OS, et d’autres ne fonctionnait pas comme je le souhaitais, j’ai donc écris mon propre script Router OS (mon tout premier d’ailleurs).

Script de mise à jour du DynHOST d’OVH pour Router OS

Voici le script de mise à jour du DynHOST d’OVH pour Router OS, le système d’exploitation des routeurs de Mikrotik qui est aussi disponible pour la plateforme x86 :

#####################
### Configuration ###
#####################

# Envoyer l'IP publique a l'adresse email suivante
:local MonEmail "mon@email"

# DynDNS Auth
:local DynDNSUsername "votrenomdedomaine.tld-sousdomaine";
:local DynDNSPassword "motdepassedyndnsovh";

# DynDNS Hostname
:local DynDNSHostname "sousdomaine.nomdedomaine.tld";

# DynDNS Service Provider
:local DynDNSServiceProvider "www.ovh.com";

# Method to retrieve your public IP (interface or web)
:local GetPublicIpFrom "interface";

# "web": will get your IP from a web page
:local GetPublicIpFromWebUrl "http://www.votresiteweb.tld/monip.php";

# "interface": will get the IP of your WAN interface
:local GetPublicIpFromInterfaceName "ether1-gateway";

##########################
### Retrieve public IP ###
##########################

# LastPublicIP contain the public IP shown from the last previous run of this script
:global LastPublicIP;
:local DynDNSUrl;
:local CurrentPublicIP;

# Retrieve public IP from the web
:if ($GetPublicIpFrom = "web") do={
	/tool fetch dst-path="/publicIP.txt" url=$GetPublicIpFromWebUrl;
	:set CurrentPublicIP [/file get publicIP.txt contents];
	:file remove publicIP.txt;
}

# Retrieve public IP from the WAN interface
:if ($GetPublicIpFrom = "interface") do={
	:set CurrentPublicIP [/ip address get [find interface=$GetPublicIpFromInterfaceName] address];
	:set CurrentPublicIP [:pick $CurrentPublicIP 0 [:find $CurrentPublicIP "/" -1]];
}

#######################
### Updating DynDNS ###
#######################

# Check if public IP as changed
:if ($LastPublicIP != $CurrentPublicIP) do={

# 	Update DynDNS with the new IP
	:set DynDNSUrl ("http://".$DynDNSUsername.":".$DynDNSPassword."@".$DynDNSServiceProvider."/nic/update?system=dyndns&hostname=".$DynDNSHostname."&myip=".$CurrentPublicIP."&wildcard=no");
	/tool fetch url=$DynDNSUrl dst-path="/dyndns.txt";

#	:delay 1;

#	Read result
	:local result [/file get dyndns.txt contents];
	:file remove dyndns.txt;
	:local resultCode [:pick $result 0 [:find $result " " -1]];

#	"good" mean "DynDNS updated successfully and IP was a new IP"
	:if ($resultCode="good") do={
		:log info ("DynDNS-OVH: OK (!! New IP !! => ".$CurrentPublicIP.")");		
		:set LastPublicIP $CurrentPublicIP;
		/tool e-mail send to="$MonEmail" subject="New Public IP" body="$CurrentPublicIP";
	} 

#	"nochg" mean "DynDNS already up-to-date (same IP last before)"
	:if ($resultCode="nochg") do={
		:log info ("DynDNS-OVH: OK (already up-to-date => ".$CurrentPublicIP.")");		
		:set LastPublicIP $CurrentPublicIP;
	}

#	Others cases / error
	:if (($resultCode!="good") && ($resultCode!="nochg")) do={
		:log info ("DynDNS-OVH: PAS OK (RawResult: ".[:pick $result 0 ([:len $result] - 1) ].")");
	}
} else={
	:log info ("DynDNS-OVH: OK (Nothing to do => ".$CurrentPublicIP.")");
}

Configuration du script de mise à jour du DynHOST d’OVH pour Router OS

Vous devrez configurer plusieurs éléments au tout début de ce script :

# DynDNS Auth
:local DynDNSUsername "votrenomdedomaine.tld-sousdomaine";
:local DynDNSPassword "motdepassedyndnsovh";
  • DynDNSUsername : mettre l’identifiant DynHOST créé chez OVH qui est en général au format suivant : votrenomdedomaine.tld-sousdomaine
  • DynDNSPassword : mettre le mot de passe correspondant à l’identifiant DynHOST créé chez OVH
# DynDNS Hostname
:local DynDNSHostname "sousdomaine.nomdedomaine.tld";
  • DynDNSHostname : mettre le sous-domaine au format suivant : sousdomaine.nomdedomaine.tld
# Method to retrieve your public IP (interface or web)
:local GetPublicIpFrom "interface";

# "web": will get your IP from a web page
:local GetPublicIpFromWebUrl "http://www.votresiteweb.tld/monip.php";

# "interface": will get the IP of your WAN interface
:local GetPublicIpFromInterfaceName "ether1-gateway";
  • GetPublicIpFrom :
    • « interface » : indique au script de récupérer l’adresse IP d’une interface du routeur en tant qu’adresse IP sur laquelle pointer le sous-domaine (cas d’un routeur directement connecté à Internet)
      • GetPublicIpFromInterfaceName : indiquer le nom de l’interface oqui est directement connecté à Internet (en général : au modem câble ou au routeur DSL)
    • « web » : indique au script d’interroger une page Web afin de connaître l’adresse IP publique sur laquelle pointer le sous-domaine (cas d’un routeur qui n’est pas directement connecté à Internet)
      • GetPublicIpFromWebUrl : indiquer l’adresse du script permettant au routeur de connaître son adresse IP publique (cas voir un exemple du contenu de ce script ci-dessous)

Exemple de script PHP permettant de connaître l’adresse IP publique de son routeur

Voici un simple exemple pour le script « monip.php » (qui doit donc être hébergé sur un serveur qui permet l’exécution de scripts PHP)
<?php
header("Content-Type: text/plain");
echo $_SERVER["REMOTE_ADDR"];
?>