CentOS7 + DDNS + お名前.com | Harada IT Support

CentOS7 + DDNS + お名前.com | Harada IT Support

こんにちはHITS代表の原田です。
このサイトは仕事場にあるCentOS7のサーバにDockerを入れて、Docker上で稼働しています。ドメインは『お名前.com』で取得し、DNSなんかもお名前.comで登録しています。

いま使っているNEC製のルーターにはDDNS機能がついていて、それが『お名前.com』もサポートしていたので、ドメインに関してはその機能を使用してDNSレコードの更新をしていました。

が、メールサーバもこのサーバ上に立てて、MXレコードのIPも一緒に更新する必要があったのでちょっとシェルスクリプトとsystemdを使用して自動更新するような仕組みを作ってみました。

流れとしては、
  〇 シェルスクリプトファイル(IP更新処理を実行するもの)を作成
  〇 作成したシェルスクリプトを起動するサービスファイルを作成
  〇 サービスを定期実行するためのタイマーファイルを作成
です。

具体的な手順は、

  1. 以下にある3ファイルを作成します。
    シェルスクリプトの格納場所はどこでもいいのですが実行権限をつけておくこと。(chmod +x ファイル名)
    サービスファイルとタイマーファイルは/etc/systemd/system/に置きます。
  2. サービスを有効化 systemctl enabled ddns
  3. タイマーを有効化 systemctl enabled ddns.timer
  4. タイマーを開始 systemctl start ddns.timer

※癖でサービスファイルにrestart=alwaysをつけて、サービスを開始してしまったら、start request repeated too quickly for ddns.serviceというエラーが発生しました。
これはサービスを何回も繰り返し実行した場合に発生するエラーのようですので、もしこのエラーが発生していたら、serviceをstartしてしまっているのかもしれません。

あと、10分間隔でタイマー起動するようにしましたが、DNSの更新が反映されるまで20分程度かかるみたいです。ログ(/var/log/messages)を見たら更新が2回実行されていました。
最初の1回(これがIPが変わった時に実行されるもの)次の10分後にもう1回(反映中だと思われる)、次の10分後の時は更新されていました。

シェルスクリプト(ddns.sh)

#!/bin/bash    # Global IPアドレス取得  gip=$(curl inet-ip.info)  domip=$(dig 更新したいホスト名.ドメイン名 +short)    # IPアドレス更新  if [ "$gip" != "$domip" ]; then    {      echo "LOGIN"      echo "USERID:お名前.comのログイン名"      echo "PASSWORD:お名前.comのパスワード"      echo "."      echo "MODIP"      echo "HOSTNAME:更新したいホスト名"      echo "DOMNAME:更新したいドメイン名"      echo "IPV4:$gip"      echo "."      echo "LOGOUT"      echo "."    } > input.txt    openssl s_client -connect ddnsclient.onamae.com:65010 -quiet < input.txt  else    echo "IPは更新の必要がありませんでした。"  fi    exit 0

サービス(ddns.service)

[Unit]  Description = ddns for mx record    [Service]  ExecStart = シェルスクリプトへのフルパス  Type = simple    [Install]  WantedBy = multi-user.target

タイマー(ddns.timer)

[Unit]  Description=Runs ddns service    [Timer]  # ブート後、この時間後にこのタイマーを開始する  OnBootSec=1min    # 実行する時間の間隔  OnUnitActiveSec=10min  Unit=mail_ddns.service    [Install]  WantedBy=multi-user.target

Follow me!

follow us in feedly