Vous êtes sur la page 1sur 3

2017­5­21 Dynamic DNS Update Script for dynDNS ­ MikroTik Wiki

Dynamic DNS Update Script for dynDNS
in order to support dyndns i took some parts from the changeip script and made it work for.

1) add a script called dynDNS:

# Define User Variables 
:global ddnsuser "DYNDNSUSER" 
:global ddnspass "DYNDNSPASS" 
:global ddnshost "DYNDNSHOST" 

# Define Global Variables 
:global ddnsip 
:global ddnslastip 
:if ([ :typeof $ddnslastip ] = nil ) do={ :global ddnslastip "0" } 

:global ddnsinterface 
:global ddnssystem ("mt‐" . [/system package get system version] ) 

# Define Local Variables 
:local int 

# Loop thru interfaces and look for ones containing 
# default gateways without routing‐marks 
:foreach int in=[/ip route find dst‐address=0.0.0.0/0 active=yes ] do={ 
  :if ([:typeof [/ip route get $int routing‐mark ]] != str ) do={ 
     :global ddnsinterface [/ip route get $int interface] 
  } 

# Grab the current IP address on that interface. 
:global ddnsip [ /ip address get [/ip address find interface=$ddnsinterface ] address ] 

# Did we get an IP address to compare? 
:if ([ :typeof $ddnsip ] = nil ) do={ 
   :log info ("DynDNS: No ip address present on " . $ddnsinterface . ", please check.") 
} else={ 
  :if ($ddnsip != $ddnslastip) do={ 
    :log info "DynDNS: Sending UPDATE!" 
    :local str "/nic/update?hostname=$ddnshost&myip=$ddnsip&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG" 
    /tool fetch address=members.dyndns.org src‐path=$str mode=http user=$ddnsuser \ 
        password=$ddnspass dst‐path=("/DynDNS.".$ddnshost) 
    :delay 1 
    :local str [/file find name="DynDNS.$ddnshost"]; 
    /file remove $str 
    :global ddnslastip $ddnsip 
  } 

2) Add a scheduler entry to run every minute

/system scheduler add name=dynDNS interval=00:01 on‐event="/system script run dynDns\r\n" 

There is a thread  for further questions.

Getting it to work with 4.XX

# Set needed variables 
:local username "YourUsername" 
:local password "YourPassword" 
:local hostname "nohostset" 
:global systemname [/system identity get name] 

:if ($systemname  = "Site1" ) do= { 
:set hostname "yourdomain1.dyndns.org" 

:if ($systemname  = "Site2" ) do= { 
:set hostname "yourdomain2.dyndns.org" 

:if ($systemname  = "Site3" ) do= { 
:set hostname "yourdomain3.dyndns.org" 

:global dyndnsForce 
:global previousIP 

# print some debug info 
:log info ("UpdateDynDNS: username = $username") 
:log info ("UpdateDynDNS: password = $password") 
:log info ("UpdateDynDNS: hostname = $hostname") 
:log info ("UpdateDynDNS: previousIP = $previousIP") 

https://wiki.mikrotik.com/wiki/Dynamic_DNS_Update_Script_for_dynDNS 1/3
2017­5­21 Dynamic DNS Update Script for dynDNS ­ MikroTik Wiki

# get the current IP address from the internet (in case of double‐nat) 
/tool fetch mode=http address="checkip.dyndns.org" src‐path="/" dst‐path="/dyndns.checkip.html" 
:local result [/file get dyndns.checkip.html contents] 

# parse the current IP result 
:local resultLen [:len $result] 
:local startLoc [:find $result ": " ‐1] 
:set startLoc ($startLoc + 2) 
:local endLoc [:find $result "</body>" ‐1] 
:local currentIP [:pick $result $startLoc $endLoc] 
:log info "UpdateDynDNS: currentIP = $currentIP" 

# Remove the # on next line to force an update every single time ‐ useful for debugging, 
#  but you could end up getting blacklisted by DynDNS! 

#:set dyndnsForce true 

# Determine if dyndns update is needed 
# more dyndns updater request details http://www.dyndns.com/developers/specs/syntax.html 
:if (($currentIP != $previousIP) || ($dyndnsForce = true)) do={ 
    :set dyndnsForce false 
    :set previousIP $currentIP 
    /tool fetch user=$username password=$password mode=http address="members.dyndns.org" \ 
       src‐path="/nic/update?hostname=$hostname&myip=$currentIP" dst‐path="/dyndns.txt" 
    :local result [/file get dyndns.txt contents] 
    :log info ("UpdateDynDNS: Dyndns update needed") 
    :log info ("UpdateDynDNS: Dyndns Update Result: ".$result) 
    :put ("Dyndns Update Result: ".$result) 
} else={ 
    :log info ("UpdateDynDNS: No dyndns update needed") 

If have problems to run these scripts, try it:

:local ddnsuser "your user name" 
:local ddnspass "your password" 
:local theinterface "device to renove IP" 
:local ddnshost "yourhost.dyndns.org" 
:local ipddns [:resolve $ddnshost]; 
:local ipfresh [ /ip address get [/ip address find interface=$theinterface ] address ] 
:if ([ :typeof $ipfresh ] = nil ) do={ 
   :log info ("DynDNS: No ip address on $theinterface .") 
} else={ 
   :for i from=( [:len $ipfresh] ‐ 1) to=0 do={  
      :if ( [:pick $ipfresh $i] = "/") do={  
    :set ipfresh [:pick $ipfresh 0 $i]; 
      }  

  
:if ($ipddns != $ipfresh) do={ 
    :log info ("DynDNS: IP‐DynDNS = $ipddns") 
    :log info ("DynDNS: IP‐Fresh = $ipfresh") 
   :log info "DynDNS: Update IP needed, Sending UPDATE...!" 
   :local str "/nic/update?hostname=$ddnshost&myip=$ipfresh&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG" 
   /tool fetch address=members.dyndns.org src‐path=$str mode=http user=$ddnsuser \ 
         password=$ddnspass dst‐path=("/DynDNS.".$ddnshost) 
    :delay 1 
    :local str [/file find name="DynDNS.$ddnshost"]; 
    /file remove $str 
    :global ipddns $ipfresh 
  :log info "DynDNS: IP updated to $ipfresh!" 
    } else={ 
     :log info "DynDNS: dont need changes"; 
    } 
}  

another version of this script working in 5.x

# Set needed variables 
:local username "YOURUSER" 
:local password "YOURPASWORD" 
:local hostname "YOURHOSTNAME.dyndns.org" 

:global dyndnsForce 
:global previousIP  

# print some debug info 
:log info ("UpdateDynDNS: username = $username") 
:log info ("UpdateDynDNS: password = $password") 
:log info ("UpdateDynDNS: hostname = $hostname") 
:log info ("UpdateDynDNS: previousIP = $previousIP") 

https://wiki.mikrotik.com/wiki/Dynamic_DNS_Update_Script_for_dynDNS 2/3
2017­5­21 Dynamic DNS Update Script for dynDNS ­ MikroTik Wiki

# get the current IP address from the internet (in case of double‐nat) 
/tool fetch mode=http address="checkip.dyndns.org" src‐path="/" dst‐path="/dyndns.checkip.html" 
:delay 1 
:local result [/file get dyndns.checkip.html contents] 

# parse the current IP result 
:local resultLen [:len $result] 
:local startLoc [:find $result ": " ‐1] 
:set startLoc ($startLoc + 2) 
:local endLoc [:find $result "</body>" ‐1] 
:local currentIP [:pick $result $startLoc $endLoc] 
:log info "UpdateDynDNS: currentIP = $currentIP" 

# Remove the # on next line to force an update every single time ‐ useful for debugging, 
# but you could end up getting blacklisted by DynDNS! 

#:set dyndnsForce true 

# Determine if dyndns update is needed 
# more dyndns updater request details http://www.dyndns.com/developers/specs/syntax.html 

:if (($currentIP != $previousIP) || ($dyndnsForce = true)) do={ 
   :set dyndnsForce false 
   :set previousIP $currentIP 
   :log info "$currentIP or $previousIP" 
   /tool fetch user=$username password=$password mode=http address="members.dyndns.org" \ 
      src‐path="nic/update?system=dyndns&hostname=$hostname&myip=$currentIP&wildcard=no" \ 
      dst‐path="/dyndns.txt" 
   :delay 1 
   :local result [/file get dyndns.txt contents] 
   :log info ("UpdateDynDNS: Dyndns update needed") 
   :log info ("UpdateDynDNS: Dyndns Update Result: ".$result) 
   :put ("Dyndns Update Result: ".$result) 
} else={ 
   :log info ("UpdateDynDNS: No dyndns update needed") 

Debugged version for RoS 6.x:

:global ddnsuser "theddnsusername" 
:global ddnspass "theddnspassword" 
:global theinterface "interfacename" 
:global ddnshost blabla.dyndns.org 
:global ipddns [:resolve $ddnshost]; 
:global ipfresh [ /ip address get [/ip address find interface=$theinterface ] address ] 
:if ([ :typeof $ipfresh ] = nil ) do={ 
   :log info ("DynDNS: No ip address on $theinterface .") 
} else={ 
   :for i from=( [:len $ipfresh] ‐ 1) to=0 do={  
      :if ( [:pick $ipfresh $i] = "/") do={  
    :set ipfresh [:pick $ipfresh 0 $i]; 
      }  

  
:if ($ipddns != $ipfresh) do={ 
    :log info ("DynDNS: IP‐DynDNS = $ipddns") 
    :log info ("DynDNS: IP‐Fresh = $ipfresh") 
   :log info "DynDNS: Update IP needed, Sending UPDATE...!" 
   :global str "/nic/update\?hostname=$ddnshost&myip=$ipfresh&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG" 
   /tool fetch address=members.dyndns.org src‐path=$str mode=http user=$ddnsuser \ 
         password=$ddnspass dst‐path=("/DynDNS.".$ddnshost) 
    :delay 1 
    :global str [/file find name="DynDNS.$ddnshost"]; 
    /file remove $str 
    :global ipddns $ipfresh 
  :log info "DynDNS: IP updated to $ipfresh!" 
    } else={ 
     :log info "DynDNS: dont need changes"; 
    } 
}  

Scheduler:

/system scheduler 
add interval=1m name=DynDns on‐event=DynDns policy=ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api start‐time=startup

Reference: MikroTik Forum

https://wiki.mikrotik.com/wiki/Dynamic_DNS_Update_Script_for_dynDNS 3/3

Vous aimerez peut-être aussi