Ultime Notizie

Dns dinamico con godaddy

In questo articolo mostrerò come realizzare un dns dinamico tramite uno script python e le api sviluppatore di godaddy su un server macOS

Il servizio di ip dinamico viene offerto a pagamento da vari fornitori , es : https://dyndns.it , spesso viene offerta una sorta di demo gratuita che però ha varie limitazioni; il servizio serve ad accedere ad un server a casa , in cui viene utilizzato un provider che non offre un servizio di ip fisso , tramite nome dns ; l'utilizzo dei dns di godaddy non ha limitazioni , è molto più efficiente, ed è anche gratuito ( il che non guasta )

 

lo script python originale e stato scaricato da qui :

 

https://github.com/CarlEdman/godaddy-ddns

 

dovrebbe supportare sia versione 2.7 che 3 di python, in realtà su macOS non andava per cui ho utilizzato le librerie requests in luogo della Request utilizzate nell'esempio;

 

per installare requests, va prima installato pip , e poi si utilizza pip per installare il resto ( entrambe le operazioni vanno fatte con proivilegio di root )

>easy_install pip

>pip install requests

 

Nel dettaglio, queste sono le modifiche apportate allo script python :

 

#if sys.version_info > (3,):
# from urllib.request import urlopen, Request
# from urllib.error import URLError, HTTPError
#else:
# from urllib2 import urlopen, Request
# from urllib2 import URLError, HTTPError

import requests
from urllib2 import URLError, HTTPError

...

 

questa è la parte che determina l'ip da assegnare poi al record dns :

req = requests.get("http://ipv4.icanhazip.com/")
args.ip = req.content.strip()

 

e questa è la parte che richiama l'api di godaddy per cambiare il record dns :

url = 'https://api.godaddy.com/v1/domains/{}/records/A/{}'.format('.'.join(hostnames[1:]),hostnames[0])
data = json.dumps([ { "data": args.ip, "ttl": args.ttl, "name": hostnames[0], "type": "A" } ])
if sys.version_info > (3,): data = data.encode('utf-8')
headers = {"content-type": "application/json", "Authorization": "sso-key {}:{}".format(args.key,args.secret),
     "Accept":"application/json" }
req = requests.put(url, data=data, headers=headers)

per richiamare l'api di godaddy è necessaria una KEY e un SECRET , per ottenere i quali bisogna registrarsi come sviluppatore su :

developer.godaddy.com

 

per richiamare lo script python ho utilizzato un semplice script di una riga in bash :

python /Users/alessandrotrebbi/Desktop/godaddy-ddns/godaddy_ddns.py --key 9QC......Nue --secret 8V....1Hi --ttl 600 $HOSTNAME.3bsoft.com 

( modifico il record $HOSTNAME , nello specifico aleforever , del dominio 3bsoft.com ; provatelo anche manualmente per verificare di avere installato correttamente la libreria requests di python ) 

 

questo script l'ho schedulato per richiamarlo ogni 10 minuti , per fare questo in macos si utilizza un file plist da copiare in una specifica directory ( ce ne sono diverse ), in particolare ho utilizzato la directory :

/Library/LaunchDaemons

perchè il job dovrà funzionare anche ad utente non loggato 

attenzione al nome del plist ( per evitare conflitti , scegliere un nome con namespace , es : com.bbbsoft.godaddy-ddns.plist

usare poi full path per ProgramArguments , StandardErrorPath e StandardOutPath

)

 

Alla fine , attivare ed avviare il servizio con :

launchctl load com.bbbsoft.godaddy-ddns.plist

( il comando unload serve invece per disattivarlo , in questo caso va dato però il full path del plist )

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

  <key>Label</key>

  <string>com.bbbsoft.godaddy-ddns</string>

  <key>ProgramArguments</key>

  <array>

    <string>/Users/alessandrotrebbi/Desktop/godaddy-ddns/mydns.sh</string>

  </array>

  <key>Nice</key>

  <integer>1</integer>

  <key>StartInterval</key>

  <integer>3600</integer>

  <key>RunAtLoad</key>

  <true/>

  <key>StandardErrorPath</key>

  <string>/Users/alessandrotrebbi/Desktop/godaddy-ddns/mydns.err</string>

  <key>StandardOutPath</key>

  <string>//Users/alessandrotrebbi/Desktop/godaddy-ddns/mydns.out</string>

</dict>

</plist>