🌐

ddclient で 特定ネットワークインタフェースから Google Domains の DDNS レコードを更新する

2023/01/06に公開

複数の NIC が搭載されたマシン等で、特定のネットワークインタフェースを指定して DDNS レコードの更新が行えると便利なときがある[1]。本エントリでは Google Domains の DDNS レコードの更新に ddclient を使用して、その際に特定のネットワークインタフェースを指定する方法を紹介する。

Google Domains DDNS with ddclient

Google Domains の DDNS レコードは domains.google.com/nic/updatePOST リクエストまたは GET を行うことで API を使用して更新できる。従って一定間隔でリクエストを送り続けるように cron 登録しても同様のことができるが、専用ツールをつかったほうがなんとなく保守が楽そうなので、今回は Google Domains をサポートする ddclient というツールを使う。この config ファイルの設定等は下記ページに記載がある。

https://support.google.com/domains/answer/6147083

ddclient の設定

特定のネットワークインタフェースから(今回はリクエストを送るマシンがルータを使用しており、そのプライベート IP アドレスを通知しても意味がないので)https://checkip.dyndns.org などの外部ウェブサイトを使用してグローバル IP アドレスを取得する必要がある。これは、下記のように cmd= に直接取得コマンドを記載する方法が良さそうであった[2]

# Configuration file for ddclient generated by debconf
#
# /etc/ddclient.conf

daemon=300

ssl=yes
protocol=googledomains
use=cmd,cmd='curl -s ipv4.myonlineportal.net/checkip --interface hoge'
login=generated_username
password=generated_password
your_resource.your_domain.tld

なおデーモンとして動いて欲しいので、/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"

systemd ユニットになっているので、設定を変えた後は systemctl restart ddclient をお忘れなく。

更新確認

下記のようにして一旦手動で更新し、様子を伺うとよい。

sudo ddclient -daemon=0 -verbose -force

RECEIVE: good xxx.xxx.xxx.xxxと出力されれば更新できている。
管理画面や systemctl statusjournalctl -fuなどで確認するとよい。

脚注
  1. 例えば、一方のネットワークインタフェースで VPN に接続している等 ↩︎

  2. 特定ネットワークインタフェース上で use=web と記載した場合の挙動と同様に動作させる意図で use=if, if=hoge に続いて use=web と設定してみたが、これは意図通りの挙動とはならなかった ↩︎

Discussion