ddclinetシェルを利用してDDNS(dynu.com)にIPアドレスを登録する

Linux

Rock Linuxにddclientパッケージをインストールして、DDNS(dynu.com)にバッファロー Wi-Fi ルータの外部IPアドレスを登録する。
前提として、以下の設定が完了していること。
 1.dynu.comにユーザ登録して、 ルータの外部IPアドレスが登録できる環境であること。
 2.ルータのログ情報がrsyslogサーバに転送されて、ログ内容が参照可能なこと。
 3.ルータのログ情報が日単位で、ログローテートされていること。

ddclientパッケージをインストールする。

# dnf -y install ddclient

Wi-Fi ルータの外部IPアドレス取得シェルを作成する。

ルータのログからルータの外部IPアドレスが更新された情報を取得するシェルである。
本シェルをddclientシェル内で実行してDDNSに外部IPアドレスを登録させる。
前提:
1./var/log/router/messages.logが最新のルータログ
2.ログローテートされた前日のルータログのパスは以下である。
  /var/log/router/messages.log-YYYYMMDD
3.ログローテートされた2日前以上のルータログのパスは以下である。
  /var/log/router/messages.log-YYYYMMDD.gz

# vi /usr/local/sbin/get_router_ip.sh
# cat /usr/local/sbin/get_router_ip.sh
#!/bin/bash

CHECKWORD="DHCPC: bound to"  ・・・・・・・・・・・・・・・・・・・・・・・①
SYSLOG=/var/log/router/messages.log  ・・・・・・・・・・・・・・・・・・・②
OLDSYSLOG=ls /var/log/router/messages.log-* | grep -v .gz$ |tail -n 1  ・・③
RESULT=""

RESULT=`cat ${OLDSYSLOG} ${SYSLOG} | grep "${CHECKWORD}" | tail -n 1 | awk '{ print $11 }}'`  ・・④
if [ X"${RESULT" != X"" ]; then
 echo ${RESULT} > /var/tmp/get_router_IP ・・・・・・・・・・・・・・・・ ⑤
fi
cat /var/tmp/get_router_IP

 ① Wi-Fi ルータが外部 IP アドレスを取得した時に表示されるメッセージの一部。
 ② Wi-Fi ルータの最新ログのパス。
 ③ ログローテートした前日のルータログを取得する。
 ④ 前日のログと最新のログから外部IPアドレスが更新された最新のメッセージを
  取得して、更新されたIPアドレス($11)を取得する。
 ⑤ 取得したIPアドレスをファイルに書き込む。
  ルータの外部IPアドレスが更新されない時は、ファイルを更新しない。

Wi-Fi ルータを再起動する。

シェルの動作確認のためWi-Fi ルータを再起動する。
Wi-Fi ルータにログインして、外部IPアドレスを確認する。

シェルの動作を確認する。

# bash -x /usr/local/sbin/get_router_ip.sh
+ CHECKWORD='DHCPC: bound to'
++ ls /var/log/router/messages.log /var/log/router/messages.log-20240216.gz /var/log/router/messages.log-20240217.gz /var/log/router/messages.log-20240218.gz /var/log/router/messages.log-20240219.gz /var/log/router/messages.log-20240220.gz /var/log/router/messages.log-20240221 /var/log/router/messages.log-20240222
++ grep -v '.gz$'
++ tail -n 1
+ OLDSYSLOG=/var/log/router/messages.log-20240222
+ RESULT=
++ cat /var/log/router/messages.log-20240222 /var/log/router/messages.log
++ grep 'DHCPC: bound to'
++ awk '{ print $11 }'
++ tail -n 1
+ RESULT=123.87.999.999
+ '[' X123.87.999.999 '!=' X ']'
+ echo 123.87.999.999
+ cat /var/tmp/get_router_IP
+ 123.87.999.999
#
# chmod 755 /usr/local/sbin/get_router_ip.sh

ddclientを設定する。

# cp -p /etc/ddclient.conf /etc/ddclient.conf_org
# vi /etc/ddclient.conf
# diff -c /etc/ddclient.conf_org /etc/ddclient.conf
*** /etc/ddclient.conf_org 2024-02-01 22:22:44.564400025 +0900
--- /etc/ddclient.conf 2024-02-22 22:26:36.356142939 +0900
***************
*** 21,27 ****
  #mail=root                            # mail all msgs to root
  mail-failure=root                     # mail failed update msgs to root
  pid=/run/ddclient/ddclient.pid                # record PID in file.
! ssl=yes                                       # use ssl-support.  Works with
                                        # ssl-library
  # postscript=script                   # run script after updating.  The
                                        # new IP is added as argument.
--- 21,27 ----
  #mail=root                            # mail all msgs to root
  mail-failure=root                     # mail failed update msgs to root
  pid=/run/ddclient/ddclient.pid                # record PID in file.
! ssl=no   ・・①                                # use ssl-support.  Works with
                                        # ssl-library
  # postscript=script                   # run script after updating.  The
                                        # new IP is added as argument.
***************
*** 58,73 ****
  #use=if,                     if=eth0          # via interfaces
  #use=web                                      # via web
  #
! #protocol=dyndns2                             # default protocol
  #proxy=fasthttp.sympatico.ca:80                       # default proxy
  #server=members.dyndns.org                    # default server
  #server=members.dyndns.org:8245                       # default server (bypassing proxies)

! #login=your-login                             # default login
! #password=test                                        # default password
  #mx=mx.for.your.host                          # default MX
  #backupmx=yes|no                              # host is primary MX?
  #wildcard=yes|no                              # add wildcard CNAME?

  ##
  ## dyndns.org dynamic addresses
--- 58,78 ----
  #use=if,                     if=eth0          # via interfaces
  #use=web                                      # via web
  #
! protocol=dyndns2    ・・②                       # default protocol
  #proxy=fasthttp.sympatico.ca:80                       # default proxy
  #server=members.dyndns.org                    # default server
  #server=members.dyndns.org:8245                       # default server (bypassing proxies)
+ server=api.dynu.com

! use=cmd,cmd='/usr/local/sbin/get_router_ip.sh'   ・・③
!
! login=test000      ・・④                      # default login
! password=abcd1234  ・・⑤                     # default password
  #mx=mx.for.your.host                          # default MX
  #backupmx=yes|no                              # host is primary MX?
  #wildcard=yes|no                              # add wildcard CNAME?
+ hoge.hogehoge.com  ・・⑥

  ##
  ## dyndns.org dynamic addresses
#

 ① SSL接続を無効化する。
 ②プロトコルとしてdyndns2を有効化する。
 ③作成したシェルの出力するIPアドレスを利用する。
 ④⑤DDNSにログインするためのユーザIDとパスワードを記述する。
 ⑥IPアドレスを設定するDDNSに登録しているドメインを記述する。
  複数のWEBサイトが有るのなら複数記述することも可能である。

ddclientをデバックモードで実行する。

# /usr/sbin/ddclient -daemon=0 -debug -verbose -noquiet
=== 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-banlocal} :
opt{fw-login} :
opt{fw-password} :
opt{fw-skip} :
opt{geturl} :
opt{help} :
opt{host} :
opt{if} :
opt{if-skip} :
opt{ip} :
opt{ipv6} :
opt{login} :
opt{mail} :
opt{mail-failure} :
opt{max-interval} : 2160000
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{cmd} : /usr/local/sbin/get_router_ip.sh
globals{daemon} : 60
globals{debug} : 1
globals{login} : tkusama
globals{mail-failure} : root
globals{password} : telchan0
globals{pid} : /run/ddclient/ddclient.pid
globals{protocol} : dyndns2
globals{quiet} : 0
globals{server} : api.dynu.com
globals{ssl} : 0
globals{syslog} : 1
globals{use} : cmd
globals{verbose} : 1
=== config ====
config{lnxdvr.com}{atime} : 0
config{lnxdvr.com}{backupmx} : 0
config{lnxdvr.com}{cacheable} : ARRAY(0x55ae0fff08)
config{lnxdvr.com}{cmd} : /usr/local/sbin/get_router_ip.sh
config{lnxdvr.com}{cmd-skip} :
config{lnxdvr.com}{custom} : 0
config{lnxdvr.com}{fw} :
config{lnxdvr.com}{fw-banlocal} : 0
config{lnxdvr.com}{fw-login} :
config{lnxdvr.com}{fw-password} :
config{lnxdvr.com}{fw-skip} :
config{lnxdvr.com}{host} : lnxdvr.com
config{lnxdvr.com}{if} : ppp0
config{lnxdvr.com}{if-skip} :
config{lnxdvr.com}{ip} :
config{lnxdvr.com}{ipv6} : 0
config{lnxdvr.com}{login} : hoge
config{lnxdvr.com}{max-interval} : 2160000
config{lnxdvr.com}{min-error-interval} : 300
config{lnxdvr.com}{min-interval} : 30
config{lnxdvr.com}{mtime} : 0
config{lnxdvr.com}{mx} :
config{lnxdvr.com}{password} : hogehoge
config{lnxdvr.com}{protocol} : dyndns2
config{lnxdvr.com}{script} : /nic/update
config{lnxdvr.com}{server} : api.dynu.com
config{lnxdvr.com}{static} : 0
config{lnxdvr.com}{status} :
config{lnxdvr.com}{use} : cmd
config{lnxdvr.com}{warned-min-error-interval} : 0
config{lnxdvr.com}{warned-min-interval} : 0
config{lnxdvr.com}{web} : dyndns
config{lnxdvr.com}{web-skip} :
config{lnxdvr.com}{wildcard} : 0
config{lnxdvr.com}{wtime} : 30
=== cache ====
cache{lnxdvr.com}{atime} : 0
cache{lnxdvr.com}{backupmx} : 0
cache{lnxdvr.com}{custom} : 0
cache{lnxdvr.com}{host} : hoge.hogohoge.org
cache{lnxdvr.com}{ip} : 123.87.999.999
cache{lnxdvr.com}{mtime} : 1707309351
cache{lnxdvr.com}{mx} :
cache{lnxdvr.com}{script} : /nic/update
cache{lnxdvr.com}{static} : 0
cache{lnxdvr.com}{status} : good
cache{lnxdvr.com}{warned-min-error-interval} : 0
cache{lnxdvr.com}{warned-min-interval} : 0
cache{lnxdvr.com}{wildcard} : 0
cache{lnxdvr.com}{wtime} : 30
DEBUG: get_ip: using cmd, /usr/local/sbin/get_router_ip.sh reports 123.87.999.999
SUCCESS: hoge.hogehoge.org: skipped: IP address was already set to 123.87.999.999
#

ddclientコマンドを再起動時に自動起動させる。

システム起動時に実行される「/etc/rc.local」ファイルに登録することにより、自動起動される。
daemonモード(常駐モード)で起動し、300秒(5分)ごとに実行させる。

# cp -p /etc/rc.local /etc/rc.local_org
# vi /etc/rc.local
# diff /etc/rc.local_org /etc/rc.local
17a18,19
>
> /usr/sbin/ddclient -daemon 300 -syslog
#

daemonモードで起動する。

現在ddclientが起動していないので、ddclientをdaemonモードで実行する。

# /usr/sbin/ddclient -daemon 300 -syslog