ddclient 4.0.0 + MyDNS 対応パッチ を作ってみた。

〇 環境

 RaspberryPi
  - Raspberry Pi OS
   - Debian 11 bullseye

〇 ddclient

 https://github.com/ddclient/ddclient
 - Releaseバージョン 4.0.0 をベースに変更

〇 作成目標

 ddclient 4.0.0 にて、IPv4のIPをMyDNSにて登録出来るようにしたい。
 ※ 本家ddclient(プログラム上)自体は、IPv6に対応しております。

〇 作成状況

 ベータ版

  • IPv4の動作を焦点にして変更。動作テストを経て、現在エージング中。
  • IPv4のグローバルIPアドレスは、WEB経由で取得している。
  • IP更新通知方式は、HTTP(s)-BASIC を採用。
  • IPv6部分に関しては当環境で不要の為、未確認。
  • 本家ddclientはGPLライセンスの為、当変更部分もGPLライセンスに準ずる

〇 適用方法

 (1) ddclient本家より、ddclient-4.0.0を入手する

  https://github.com/ddclient/ddclient/releases/tag/v4.0.0
  https://github.com/ddclient/ddclient/releases/download/v4.0.0/ddclient-4.0.0.tar.gz

$ wget "https://github.com/ddclient/ddclient/releases/download/v4.0.0/ddclient-4.0.0.tar.gz"

 (2) 当パッチを入手する

  パッチファイルはこちらに置いておきます。修正等の参考になれば幸いです。
  ※ オリジナルファイルかどうかの確認は、下記のハッシュ情報を参考にしてください。
      ※ 事前連絡なしにパッチファイルの公開を中止する場合がありますので、ご了承ください。

  [パッチ適用前] 

  4a38488128c3af00518cfe7e5d862a5c72455cc5f6346975c6e14f20452f0355 ddclient-4.0.0_MyDNS-Add-0.6.patch
  15796e39d8db448a77758aa3f691797bdfccbf613ec87d3b3aa4a8632cb0d963  ddclient.in.org
  8a01b0d7f0eb8f1da07244183945ee5ab264ac93eb2e5729b142175291afc297  ddclient.conf.in.org

  [パッチ適用後]

  8965ae9286bbd432a6a6faa461cfe5404c0bfb79ec713923eb8db3d981ff2a81  ddclient.in
  08afd19dd2582f121e27a7d7cc1f2f70267a5c066ebba63b3210f848cf4c70d9  ddclient.conf.in

 (3) パッチを適用後にビルドする

  当環境の管理方針は、ソースからビルドしたソフトやオリジナルスクリプトは、/opt 配下にインストールしているので、インストール先: /opt/ddclient とした。
 
 ./configure --help を参考に適時変更のこと。

$ tar zxfv ddclient-4.0.0.tar.gz
$ cp ddclient-4.0.0_MyDNS-Add.patch ddclient-4.0.0/
$ cd ddclient-4.0.0
$ patch < ddclient-4.0.0_MyDNS-Add-0.6.patch
$ ./autogen
$ ./configure --prefix=/opt/ddclient --with-confdir=/opt/ddclient/etc
$ make
# make install

  make install直後の展開ツリー

/opt/ddclient
  |-- bin
  |   |-- ddclient
  |-- etc
  |   `-- ddclient.conf
  `-- var
      |-- cache
      |   `-- ddclient

 (4) 諸設定

  [設定方針]

  • IPアドレスチェック間隔は5分毎
  • 1日1回はIPアドレスに変更が無くても、強制的に通知する
  • IPアドレス更新はIPv4のみ
  • daemon化は、systemdを利用
 (4-1) confの設定

* 注意 *

  • confサンプル(他のDDNSサイト用)では、行末に\を付けて1行で書かれているようになっている箇所もあるが、
    password= の行で、
    password=MyPassword, 
    と行末にカンマを入れると、パスワードが"MyPassword,"となって、IP通知処理におけるログインに失敗する。
    当環境では行末にカンマは使用していない。
  • 当環境では、「max-interval=1d」を入れている。
    5分毎のチェックにてIPが変更されれば、MyDNSのサイトへIP通知(変更)処理を行いつつ、
    24時間経過してもIPが変更されていない場合は、(強制的に)IP通知(変更)処理が行われる。
    デフォルト(max-intervalを指定しない場合)は、6d (6日) としている。
    ※ MyDNSサイト利用規定において継続的に利用する場合は、最低でも1週間(7日)に1度は通知を行わなければならない。

  • プログラム(ddclient)のオプション引数よりも、confファイルの設定値が優先されるので注意のこと。
    特に、オプション 'daemon' は注意。READMEでcron起動の際に、daemon=0 を指定するように       書かれているが、daemonの最小値はデフォルトで60となっている。
    以前のバージョン(3.8.1)の認識では、daemon=0 はフォークしない動きだったが、
    4.0.0ではプログラム内の値チェック機能により、最小値60として 'daemon=60' でフォークされる。

  • フォークせずにcron起動のみで動作させたい場合は、confに'daemon'の行は書かず、
    ddclientプログラムのオプション引数にも、'daemon'オプションは指定しないこと。

  • confには、不要な行(コメント行(#)を除く)を入れないこと。
    特に、設定値を見やすくする為に行頭での改行(空白行)を入れがちだが、confファイルの読み込みで、
    空白行が1つの設定と解釈され、エラーで起動に失敗する事象を確認した。
             
             daemon=300
             syslog=yes
             (空白行)
             protocol=xxx
         :
         :
    としてしまいがちだが、少なからず4.0.0を使う場合は、空白行は使用せずに詰めて記述するようにしたほうが良い。
    ※ MyDNSに関する処理部分に関しては一応対策したつもりだが、他のDDNS処理部分は不明。

    ※ 詳しくは、debugオプションで動作を確認してみてください。
 

 # cd /opt/ddclient/etc
 # mv ddclient.conf ddclient.conf.org
 # vi ddclient.conf
    以下を参考に入力

  protocol=mydns
server=ipv4.mydns.jp
login=xxxxxxxx
password=yyyyyyyy
max-interval=1d
myhost.example.jp
 
  (4-2) systemd ユニットファイルの設定

# mkdir /opt/ddclient/systemd
# cd /opt/ddclient/systemd
# vi ddclient.service

  [Unit]
Description=Dynamic DNS Update Client
Wants=network-online.target
After=network-online.target nss-lookup.target

[Service]
Type=simple
Environment=DAEMON_INTERVAL=5m
Environment=CNF_FILE=/opt/ddclient/etc/ddclient.conf
ExecStart=/opt/ddclient/bin/ddclient --daemon ${DAEMON_INTERVAL} --file=${CNF_FILE} --syslog --foreground
Restart=on-failure

[Install]
WantedBy=multi-user.target
 

 

# ln -s /opt/ddclient/systemd/ddclient.service /lib/systemd/system/ddclient.service
# systemctl enable ddclient.service
# systemctl start ddclient.service
# systemctl status ddclient.service

● ddclient.service - Dynamic DNS Update Client
     Loaded: loaded (/opt/ddclient/systemd/ddclient.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2025-01-31 09:30:36 JST; 1s ago
   Main PID: 31957 (ddclient - slee)
      Tasks: 1 (limit: 1595)
        CPU: 586ms
     CGroup: /system.slice/ddclient.service
             mq31957 ddclient - sleeping for 300 seconds

1月 31 09:30:36 hogehoge systemd[1]: Starting Dynamic DNS Update Client...
1月 31 09:30:36 hogehoge systemd[1]: Started Dynamic DNS Update Client.

 (4-3) 設定完了後の展開ツリー

/opt/ddclient
|-- bin
|   `-- ddclient
|-- etc
|   |-- ddclient.conf
|   `-- ddclient.conf.org
|-- systemd
|   `-- ddclient.service
`-- var
    |-- cache
    |   `-- ddclient
    |       `-- ddclient.cache
    `-- run

/lib/systemd/system/
`-- ddclient.service -> /opt/ddclient/systemd/ddclient.service

(5) Tips

  1. daemonとは別に、定時にもIP通知を行いたい場合

   daemon用confファイル、crond用confファイル、
   2つのconfファイルを準備して、それぞれ設定を行えば良さそう

  2. 設定初回時やテスト実行時は、バックグランドに不要なddclientが起動していない確認

   多重起動可能な作りとなっているので、conf設定時やテスト的にコマンド実行する場合は、
         作業終了後に、ps コマンドやpgrep コマンドなどで確認すべし