dynamic dns with google domains using ddclient on debian

After putting it off for ages due a perceived PITA process, I finally decided to check out how to set up dynamic dns to point at one of my servers that’s behind a changing IP. I was pleased at how surprisingly easy it is.

prereqs

I’m running debian 8 in a kvm vm, using bridged networking to give my web server it’s own identity.
The only package required is ddclient

configure google domains

Jump to the synthetic records section under your google domain dns settings and add the subdomain you want to forward to your dynamic host:
google domains synthetic record

if you click on that blue “view credentials” link you’ll see the username and password google has randomly generated for you. you’ll need those details when you edit your ddclient.conf. note that until I’ve set up the config, the “data” section here shows 0.0.0.0 as my IP.

configure ddclient

for my setup, I’ve got several subdomains I want to forward to the same host. After checking out the ddclient manual, I’ve edited my ddclient.conf similar to the below:

protocol=dyndns2
use=web
server=domains.google.com
ssl=yes
protocol=dyndns2, login=host1login, password='host1password'
custom-subdomain.your-host1.com
protocol=dyndns2, login=host2login, password='host2password'
config{custom-subdomain.your-host1.com}{atime} : 0
config{custom-subdomain.your-host1.com}{backupmx} : 0
config{custom-subdomain.your-host1.com}{cacheable} : ARRAY(0x2a462e0)
config{custom-subdomain.your-host1.com}{cmd} :
config{custom-subdomain.your-host1.com}{cmd-skip} :
config{custom-subdomain.your-host1.com}{custom} : 0
config{custom-subdomain.your-host1.com}{fw} :
config{custom-subdomain.your-host1.com}{fw-login} :
config{custom-subdomain.your-host1.com}{fw-password} :
config{custom-subdomain.your-host1.com}{fw-skip} :
config{custom-subdomain.your-host1.com}{host} : custom-subdomain.your-host1.com
config{custom-subdomain.your-host1.com}{if} : ppp0
config{custom-subdomain.your-host1.com}{if-skip} :
config{custom-subdomain.your-host1.com}{ip} :
config{custom-subdomain.your-host1.com}{login} : host1login
config{custom-subdomain.your-host1.com}{max-interval} : 2592000
config{custom-subdomain.your-host1.com}{min-error-interval} : 300
config{custom-subdomain.your-host1.com}{min-interval} : 30
config{custom-subdomain.your-host1.com}{mtime} : 0
config{custom-subdomain.your-host1.com}{mx} :
config{custom-subdomain.your-host1.com}{password} : host1password
config{custom-subdomain.your-host1.com}{protocol} : dyndns2
config{custom-subdomain.your-host1.com}{script} : /nic/update
config{custom-subdomain.your-host1.com}{server} : domains.google.com
config{custom-subdomain.your-host1.com}{static} : 0
config{custom-subdomain.your-host1.com}{status} :
config{custom-subdomain.your-host1.com}{use} : web
config{custom-subdomain.your-host1.com}{warned-min-error-interval} : 0
config{custom-subdomain.your-host1.com}{warned-min-interval} : 0
config{custom-subdomain.your-host1.com}{web} : dyndns
config{custom-subdomain.your-host1.com}{web-skip} :
config{custom-subdomain.your-host1.com}{wildcard} : 0
config{custom-subdomain.your-host1.com}{wtime} : 30
config{custom-subdomain.your-host2.com}{atime} : 0
config{custom-subdomain.your-host2.com}{backupmx} : 0
config{custom-subdomain.your-host2.com}{cacheable} : ARRAY(0x2a6a6f0)
config{custom-subdomain.your-host2.com}{cmd} :
config{custom-subdomain.your-host2.com}{cmd-skip} :
config{custom-subdomain.your-host2.com}{custom} : 0
config{custom-subdomain.your-host2.com}{fw} :
config{custom-subdomain.your-host2.com}{fw-login} :
config{custom-subdomain.your-host2.com}{fw-password} :
config{custom-subdomain.your-host2.com}{fw-skip} :
config{custom-subdomain.your-host2.com}{host} : custom-subdomain.your-host2.com
config{custom-subdomain.your-host2.com}{if} : ppp0
config{custom-subdomain.your-host2.com}{if-skip} :
config{custom-subdomain.your-host2.com}{ip} :
config{custom-subdomain.your-host2.com}{login} : host2login
config{custom-subdomain.your-host2.com}{max-interval} : 2592000
config{custom-subdomain.your-host2.com}{min-error-interval} : 300
config{custom-subdomain.your-host2.com}{min-interval} : 30
config{custom-subdomain.your-host2.com}{mtime} : 0
config{custom-subdomain.your-host2.com}{mx} :
config{custom-subdomain.your-host2.com}{password} : host2password
config{custom-subdomain.your-host2.com}{protocol} : dyndns2
config{custom-subdomain.your-host2.com}{script} : /nic/update
config{custom-subdomain.your-host2.com}{server} : domains.google.com
config{custom-subdomain.your-host2.com}{static} : 0
config{custom-subdomain.your-host2.com}{status} :
config{custom-subdomain.your-host2.com}{use} : web
config{custom-subdomain.your-host2.com}{warned-min-error-interval} : 0
config{custom-subdomain.your-host2.com}{warned-min-interval} : 0
config{custom-subdomain.your-host2.com}{web} : dyndns
config{custom-subdomain.your-host2.com}{web-skip} :
config{custom-subdomain.your-host2.com}{wildcard} : 0
config{custom-subdomain.your-host2.com}{wtime} : 30
=== cache ====
cache{custom-subdomain.your-host1.com}{atime} : 1456077703
cache{custom-subdomain.your-host1.com}{backupmx} : 0
cache{custom-subdomain.your-host1.com}{custom} : 0
cache{custom-subdomain.your-host1.com}{host} : custom-subdomain.your-host1.com
cache{custom-subdomain.your-host1.com}{mtime} : 0
cache{custom-subdomain.your-host1.com}{mx} :
cache{custom-subdomain.your-host1.com}{script} : /nic/update
cache{custom-subdomain.your-host1.com}{static} : 0
cache{custom-subdomain.your-host1.com}{status} : nohost
cache{custom-subdomain.your-host1.com}{warned-min-error-interval} : 0
cache{custom-subdomain.your-host1.com}{warned-min-interval} : 0
cache{custom-subdomain.your-host1.com}{wildcard} : 0
cache{custom-subdomain.your-host1.com}{wtime} : 30
cache{custom-subdomain.your-host2.com}{atime} : 0
cache{custom-subdomain.your-host2.com}{backupmx} : 0
cache{custom-subdomain.your-host2.com}{custom} : 0
cache{custom-subdomain.your-host2.com}{host} : custom-subdomain.your-host2.com
cache{custom-subdomain.your-host2.com}{ip} : host-ip
cache{custom-subdomain.your-host2.com}{mtime} : 1456077746
cache{custom-subdomain.your-host2.com}{mx} :
cache{custom-subdomain.your-host2.com}{script} : /nic/update
cache{custom-subdomain.your-host2.com}{static} : 0
cache{custom-subdomain.your-host2.com}{status} :
cache{custom-subdomain.your-host2.com}{warned-min-error-interval} : 0
cache{custom-subdomain.your-host2.com}{warned-min-interval} : 0
cache{custom-subdomain.your-host2.com}{wildcard} : 0
cache{custom-subdomain.your-host2.com}{wtime} : 30
DEBUG: proxy =
DEBUG: url = http://checkip.dyndns.org/
DEBUG: server = checkip.dyndns.org
CONNECT: checkip.dyndns.org
CONNECTED: using HTTP
SENDING: GET / HTTP/1.0
SENDING: Host: checkip.dyndns.org
SENDING: User-Agent: ddclient/3.8.2
SENDING: Connection: close
SENDING:
RECEIVE: HTTP/1.1 200 OK
RECEIVE: Content-Type: text/html
RECEIVE: Server: DynDNS-CheckIP/1.0
RECEIVE: Connection: close
RECEIVE: Cache-Control: no-cache
RECEIVE: Pragma: no-cache
RECEIVE: Content-Length: 104
RECEIVE:
RECEIVE: Current IP CheckCurrent IP Address: host-ip
DEBUG: get_ip: using web, http://checkip.dyndns.org/ reports host-ip
SUCCESS: custom-subdomain.your-host2.com: skipped: IP address was already set to host-ip.
DEBUG:
DEBUG: nic_dyndns2_update -------------------
INFO: setting IP address to host-ip for custom-subdomain.your-host1.com
UPDATE: updating custom-subdomain.your-host1.com
DEBUG: proxy =
DEBUG: url = http://domains.google.com/nic/update?system=dyndns&hostname=custom-subdomain.your-host1.com&myip=host-ip
DEBUG: server = domains.google.com
CONNECT: domains.google.com
CONNECTED: using SSL
SENDING: GET /nic/update?system=dyndns&hostname=custom-subdomain.your-host1.com&myip=host-ip HTTP/1.0
SENDING: Host: domains.google.com
SENDING: Authorization: Basic dTNVZHlxS3kwTVRqcUgwMjpuUVN6Zk5RUmdJTlpTMWx3
SENDING: User-Agent: ddclient/3.8.2
SENDING: Connection: close
SENDING:
RECEIVE: HTTP/1.0 200 OK
RECEIVE: Strict-Transport-Security: max-age=31536000; includeSubDomains
RECEIVE: Content-Type: text/plain; charset=utf-8
RECEIVE: Date: Sun, 21 Feb 2016 18:27:33 GMT
RECEIVE: Expires: Sun, 21 Feb 2016 18:27:33 GMT
RECEIVE: Cache-Control: private, max-age=0
RECEIVE: X-Content-Type-Options: nosniff
RECEIVE: X-Frame-Options: SAMEORIGIN
RECEIVE: X-XSS-Protection: 1; mode=block
RECEIVE: Server: GSE
RECEIVE: Accept-Ranges: none
RECEIVE: Vary: Accept-Encoding
RECEIVE:
RECEIVE: good host-ip
SUCCESS: updating custom-subdomain.your-host1.com: good: IP address set to host-ip

In the above, my custom-subdomain.your-host1.com was a new host I added to the config, whereas custom-subdomain.your-host2.com is one which I’d already updated during a prior test.

ig{custom-subdomain.your-host1.com}{atime} : 0
config{custom-subdomain.your-host1.com}{backupmx} : 0
config{custom-subdomain.your-host1.com}{cacheable} : ARRAY(0x2a462e0)
config{custom-subdomain.your-host1.com}{cmd} :
config{custom-subdomain.your-host1.com}{cmd-skip} :
config{custom-subdomain.your-host1.com}{custom} : 0
config{custom-subdomain.your-host1.com}{fw} :
config{custom-subdomain.your-host1.com}{fw-login} :
config{custom-subdomain.your-host1.com}{fw-password} :
config{custom-subdomain.your-host1.com}{fw-skip} :
config{custom-subdomain.your-host1.com}{host} : custom-subdomain.your-host1.com
config{custom-subdomain.your-host1.com}{if} : ppp0
config{custom-subdomain.your-host1.com}{if-skip} :
config{custom-subdomain.your-host1.com}{ip} :
config{custom-subdomain.your-host1.com}{login} : host1login
config{custom-subdomain.your-host1.com}{max-interval} : 2592000
config{custom-subdomain.your-host1.com}{min-error-interval} : 300
config{custom-subdomain.your-host1.com}{min-interval} : 30
config{custom-subdomain.your-host1.com}{mtime} : 0
config{custom-subdomain.your-host1.com}{mx} :
config{custom-subdomain.your-host1.com}{password} : host1password
config{custom-subdomain.your-host1.com}{protocol} : dyndns2
config{custom-subdomain.your-host1.com}{script} : /nic/update
config{custom-subdomain.your-host1.com}{server} : domains.google.com
config{custom-subdomain.your-host1.com}{static} : 0
config{custom-subdomain.your-host1.com}{status} :
config{custom-subdomain.your-host1.com}{use} : web
config{custom-subdomain.your-host1.com}{warned-min-error-interval} : 0
config{custom-subdomain.your-host1.com}{warned-min-interval} : 0
config{custom-subdomain.your-host1.com}{web} : dyndns
config{custom-subdomain.your-host1.com}{web-skip} :
config{custom-subdomain.your-host1.com}{wildcard} : 0
config{custom-subdomain.your-host1.com}{wtime} : 30
config{custom-subdomain.your-host2.com}{atime} : 0
config{custom-subdomain.your-host2.com}{backupmx} : 0
config{custom-subdomain.your-host2.com}{cacheable} : ARRAY(0x2a6a6f0)
config{custom-subdomain.your-host2.com}{cmd} :
config{custom-subdomain.your-host2.com}{cmd-skip} :
config{custom-subdomain.your-host2.com}{custom} : 0
config{custom-subdomain.your-host2.com}{fw} :
config{custom-subdomain.your-host2.com}{fw-login} :
config{custom-subdomain.your-host2.com}{fw-password} :
config{custom-subdomain.your-host2.com}{fw-skip} :
config{custom-subdomain.your-host2.com}{host} : custom-subdomain.your-host2.com
config{custom-subdomain.your-host2.com}{if} : ppp0
config{custom-subdomain.your-host2.com}{if-skip} :
config{custom-subdomain.your-host2.com}{ip} :
config{custom-subdomain.your-host2.com}{login} : host2login
config{custom-subdomain.your-host2.com}{max-interval} : 2592000
config{custom-subdomain.your-host2.com}{min-error-interval} : 300
config{custom-subdomain.your-host2.com}{min-interval} : 30
config{custom-subdomain.your-host2.com}{mtime} : 0
config{custom-subdomain.your-host2.com}{mx} :
config{custom-subdomain.your-host2.com}{password} : host2password
config{custom-subdomain.your-host2.com}{protocol} : dyndns2
config{custom-subdomain.your-host2.com}{script} : /nic/update
config{custom-subdomain.your-host2.com}{server} : domains.google.com
config{custom-subdomain.your-host2.com}{static} : 0
config{custom-subdomain.your-host2.com}{status} :
config{custom-subdomain.your-host2.com}{use} : web
config{custom-subdomain.your-host2.com}{warned-min-error-interval} : 0
config{custom-subdomain.your-host2.com}{warned-min-interval} : 0
config{custom-subdomain.your-host2.com}{web} : dyndns
config{custom-subdomain.your-host2.com}{web-skip} :
config{custom-subdomain.your-host2.com}{wildcard} : 0
config{custom-subdomain.your-host2.com}{wtime} : 30
=== cache ====
cache{custom-subdomain.your-host1.com}{atime} : 1456077703
cache{custom-subdomain.your-host1.com}{backupmx} : 0
cache{custom-subdomain.your-host1.com}{custom} : 0
cache{custom-subdomain.your-host1.com}{host} : custom-subdomain.your-host1.com
cache{custom-subdomain.your-host1.com}{mtime} : 0
cache{custom-subdomain.your-host1.com}{mx} :
cache{custom-subdomain.your-host1.com}{script} : /nic/update
cache{custom-subdomain.your-host1.com}{static} : 0
cache{custom-subdomain.your-host1.com}{status} : nohost
cache{custom-subdomain.your-host1.com}{warned-min-error-interval} : 0
cache{custom-subdomain.your-host1.com}{warned-min-interval} : 0
cache{custom-subdomain.your-host1.com}{wildcard} : 0
cache{custom-subdomain.your-host1.com}{wtime} : 30
cache{custom-subdomain.your-host2.com}{atime} : 0
cache{custom-subdomain.your-host2.com}{backupmx} : 0
cache{custom-subdomain.your-host2.com}{custom} : 0
cache{custom-subdomain.your-host2.com}{host} : custom-subdomain.your-host2.com
cache{custom-subdomain.your-host2.com}{ip} : host-ip
cache{custom-subdomain.your-host2.com}{mtime} : 1456077746
cache{custom-subdomain.your-host2.com}{mx} :
cache{custom-subdomain.your-host2.com}{script} : /nic/update
cache{custom-subdomain.your-host2.com}{static} : 0
cache{custom-subdomain.your-host2.com}{status} :
cache{custom-subdomain.your-host2.com}{warned-min-error-interval} : 0
cache{custom-subdomain.your-host2.com}{warned-min-interval} : 0
cache{custom-subdomain.your-host2.com}{wildcard} : 0
cache{custom-subdomain.your-host2.com}{wtime} : 30om-subdomain.your-host2.com

test the ddclient configuration

the best way to test your configuration is by running the following command:
ddclient -daemon=0 -noquiet -verbose -debug
this will iterate all of your configured values and then give you pretty detailed debug output that should look something like:

=== opt ====
opt{cache} :
opt{cmd} :
opt{cmd-skip} :
opt{daemon} : 0
opt{debug} : 1
opt{exec} :
opt{facility} :
opt{file} :
opt{force} :
opt{foreground} :
opt{fw} :
opt{fw-login} :
opt{fw-password} :
opt{fw-skip} :
opt{geturl} :
opt{help} :
opt{host} :
opt{if} :
opt{if-skip} :
opt{ip} :
opt{login} :
opt{mail} :
opt{mail-failure} :
opt{max-interval} : 2592000
opt{min-error-interval} : 300
opt{min-interval} : 30
opt{options} :
opt{password} :
opt{pid} :
opt{postscript} :
opt{priority} :
opt{protocol} :
opt{proxy} :
opt{query} :
opt{quiet} : 0
opt{retry} :
opt{server} :
opt{ssl} :
opt{syslog} :
opt{test} :
opt{timeout} :
opt{use} :
opt{verbose} : 1
opt{web} :
opt{web-skip} :
=== globals ====
globals{daemon} : 60
globals{debug} : 1
globals{login} : a global login
globals{password} : a global password
globals{protocol} : dyndns2
globals{quiet} : 0
globals{server} : domains.google.com
globals{ssl} : 1
globals{use} : web
globals{verbose} : 1
=== config ====
config{subd.your-host1.com}{atime} : 0
config{subd.your-host1.com}{backupmx} : 0
config{subd.your-host1.com}{cacheable} : ARRAY(0x2a462e0)
config{subd.your-host1.com}{cmd} :
config{subd.your-host1.com}{cmd-skip} :
config{subd.your-host1.com}{custom} : 0
config{subd.your-host1.com}{fw} :
config{subd.your-host1.com}{fw-login} :
config{subd.your-host1.com}{fw-password} :
config{subd.your-host1.com}{fw-skip} :
config{subd.your-host1.com}{host} : subd.your-host1.com
config{subd.your-host1.com}{if} : ppp0
config{subd.your-host1.com}{if-skip} :
config{subd.your-host1.com}{ip} :
config{subd.your-host1.com}{login} : host1login
config{subd.your-host1.com}{max-interval} : 2592000
config{subd.your-host1.com}{min-error-interval} : 300
config{subd.your-host1.com}{min-interval} : 30
config{subd.your-host1.com}{mtime} : 0
config{subd.your-host1.com}{mx} :
config{subd.your-host1.com}{password} : host1password
config{subd.your-host1.com}{protocol} : dyndns2
config{subd.your-host1.com}{script} : /nic/update
config{subd.your-host1.com}{server} : domains.google.com
config{subd.your-host1.com}{static} : 0
config{subd.your-host1.com}{status} :
config{subd.your-host1.com}{use} : web
config{subd.your-host1.com}{warned-min-error-interval} : 0
config{subd.your-host1.com}{warned-min-interval} : 0
config{subd.your-host1.com}{web} : dyndns
config{subd.your-host1.com}{web-skip} :
config{subd.your-host1.com}{wildcard} : 0
config{subd.your-host1.com}{wtime} : 30
config{subd.your-host2.com}{atime} : 0
config{subd.your-host2.com}{backupmx} : 0
config{subd.your-host2.com}{cacheable} : ARRAY(0x2a6a6f0)
config{subd.your-host2.com}{cmd} :
config{subd.your-host2.com}{cmd-skip} :
config{subd.your-host2.com}{custom} : 0
config{subd.your-host2.com}{fw} :
config{subd.your-host2.com}{fw-login} :
config{subd.your-host2.com}{fw-password} :
config{subd.your-host2.com}{fw-skip} :
config{subd.your-host2.com}{host} : subd.your-host2.com
config{subd.your-host2.com}{if} : ppp0
config{subd.your-host2.com}{if-skip} :
config{subd.your-host2.com}{ip} :
config{subd.your-host2.com}{login} : host2login
config{subd.your-host2.com}{max-interval} : 2592000
config{subd.your-host2.com}{min-error-interval} : 300
config{subd.your-host2.com}{min-interval} : 30
config{subd.your-host2.com}{mtime} : 0
config{subd.your-host2.com}{mx} :
config{subd.your-host2.com}{password} : host2password
config{subd.your-host2.com}{protocol} : dyndns2
config{subd.your-host2.com}{script} : /nic/update
config{subd.your-host2.com}{server} : domains.google.com
config{subd.your-host2.com}{static} : 0
config{subd.your-host2.com}{status} :
config{subd.your-host2.com}{use} : web
config{subd.your-host2.com}{warned-min-error-interval} : 0
config{subd.your-host2.com}{warned-min-interval} : 0
config{subd.your-host2.com}{web} : dyndns
config{subd.your-host2.com}{web-skip} :
config{subd.your-host2.com}{wildcard} : 0
config{subd.your-host2.com}{wtime} : 30
=== cache ====
cache{subd.your-host1.com}{atime} : 1456077703
cache{subd.your-host1.com}{backupmx} : 0
cache{subd.your-host1.com}{custom} : 0
cache{subd.your-host1.com}{host} : subd.your-host1.com
cache{subd.your-host1.com}{mtime} : 0
cache{subd.your-host1.com}{mx} :
cache{subd.your-host1.com}{script} : /nic/update
cache{subd.your-host1.com}{static} : 0
cache{subd.your-host1.com}{status} : nohost
cache{subd.your-host1.com}{warned-min-error-interval} : 0
cache{subd.your-host1.com}{warned-min-interval} : 0
cache{subd.your-host1.com}{wildcard} : 0
cache{subd.your-host1.com}{wtime} : 30
cache{subd.your-host2.com}{atime} : 0
cache{subd.your-host2.com}{backupmx} : 0
cache{subd.your-host2.com}{custom} : 0
cache{subd.your-host2.com}{host} : subd.your-host2.com
cache{subd.your-host2.com}{ip} : host-ip
cache{subd.your-host2.com}{mtime} : 1456077746
cache{subd.your-host2.com}{mx} :
cache{subd.your-host2.com}{script} : /nic/update
cache{subd.your-host2.com}{static} : 0
cache{subd.your-host2.com}{status} :
cache{subd.your-host2.com}{warned-min-error-interval} : 0
cache{subd.your-host2.com}{warned-min-interval} : 0
cache{subd.your-host2.com}{wildcard} : 0
cache{subd.your-host2.com}{wtime} : 30
DEBUG: proxy =
DEBUG: url = http://checkip.dyndns.org/
DEBUG: server = checkip.dyndns.org
CONNECT: checkip.dyndns.org
CONNECTED: using HTTP
SENDING: GET / HTTP/1.0
SENDING: Host: checkip.dyndns.org
SENDING: User-Agent: ddclient/3.8.2
SENDING: Connection: close
SENDING:
RECEIVE: HTTP/1.1 200 OK
RECEIVE: Content-Type: text/html
RECEIVE: Server: DynDNS-CheckIP/1.0
RECEIVE: Connection: close
RECEIVE: Cache-Control: no-cache
RECEIVE: Pragma: no-cache
RECEIVE: Content-Length: 104
RECEIVE:
RECEIVE: Current IP CheckCurrent IP Address: host-ip
DEBUG: get_ip: using web, http://checkip.dyndns.org/ reports host-ip
SUCCESS: subd.your-host2.com: skipped: IP address was already set to host-ip.
DEBUG:
DEBUG: nic_dyndns2_update -------------------
INFO: setting IP address to host-ip for subd.your-host1.com
UPDATE: updating subd.your-host1.com
DEBUG: proxy =
DEBUG: url = http://domains.google.com/nic/update?system=dyndns&hostname=subd.your-host1.com&myip=host-ip
DEBUG: server = domains.google.com
CONNECT: domains.google.com
CONNECTED: using SSL
SENDING: GET /nic/update?system=dyndns&hostname=subd.your-host1.com&myip=host-ip HTTP/1.0
SENDING: Host: domains.google.com
SENDING: Authorization: Basic dTNVZHlxS3kwTVRqcUgwMjpuUVN6Zk5RUmdJTlpTMWx3
SENDING: User-Agent: ddclient/3.8.2
SENDING: Connection: close
SENDING:
RECEIVE: HTTP/1.0 200 OK
RECEIVE: Strict-Transport-Security: max-age=31536000; includeSubDomains
RECEIVE: Content-Type: text/plain; charset=utf-8
RECEIVE: Date: Sun, 21 Feb 2016 18:27:33 GMT
RECEIVE: Expires: Sun, 21 Feb 2016 18:27:33 GMT
RECEIVE: Cache-Control: private, max-age=0
RECEIVE: X-Content-Type-Options: nosniff
RECEIVE: X-Frame-Options: SAMEORIGIN
RECEIVE: X-XSS-Protection: 1; mode=block
RECEIVE: Server: GSE
RECEIVE: Accept-Ranges: none
RECEIVE: Vary: Accept-Encoding
RECEIVE:
RECEIVE: good host-ip
SUCCESS: updating subd.your-host1.com: good: IP address set to host-ip

In the above, my subd.your-host1.com was a new host I added to the config, whereas subd.your-host2.com is one which I’d already updated during a prior test.

verify google has your ip

The final step to make sure everything looks good here is to refresh your google domains dns settings page. what you should see, as I do, is the data section now reflecting the ip for your dynamic host.
dynamic host updated in google domains

I also verified my /etc/default/ddclient config to make sure it’s got run_daemon set to true. When I installed ddclient via aptitude this was done automatically but you may want to double check yours if you find your client doesn’t update regularly. my default config looks like this:

# Configuration for ddclient scripts
# generated from debconf on Sun Feb 21 12:51:42 EST 2016
#
# /etc/default/ddclient

# Set to "true" if ddclient should be run every time DHCP client ('dhclient'
# from package isc-dhcp-client) updates the systems IP address.
run_dhclient="false"

# Set to "true" if ddclient should be run every time a new ppp connection is
# established. This might be useful, if you are using dial-on-demand.
run_ipup="false"

# Set to "true" if ddclient should run in daemon mode
# If this is changed to true, run_ipup and run_dhclient must be set to false.
run_daemon="true"

# Set the time interval between the updates of the dynamic DNS name in seconds.
# This option only takes effect if the ddclient runs in daemon mode.
daemon_interval="300"

something to add?