CentOS7 + DDNS + お名前.com
こんにちはHITS代表の原田です。
このサイトは仕事場にあるCentOS7のサーバにDockerを入れて、Docker上で稼働しています。ドメインは『お名前.com』で取得し、DNSなんかもお名前.comで登録しています。
いま使っているNEC製のルーターにはDDNS機能がついていて、それが『お名前.com』もサポートしていたので、ドメインに関してはその機能を使用してDNSレコードの更新をしていました。
が、メールサーバもこのサーバ上に立てて、MXレコードのIPも一緒に更新する必要があったのでちょっとシェルスクリプトとsystemdを使用して自動更新するような仕組みを作ってみました。
流れとしては、
〇 シェルスクリプトファイル(IP更新処理を実行するもの)を作成
〇 作成したシェルスクリプトを起動するサービスファイルを作成
〇 サービスを定期実行するためのタイマーファイルを作成
です。
具体的な手順は、
- 以下にある3ファイルを作成します。
シェルスクリプトの格納場所はどこでもいいのですが実行権限をつけておくこと。(chmod +x ファイル名)
サービスファイルとタイマーファイルは/etc/systemd/system/に置きます。 - サービスを有効化
systemctl enabled ddns
- タイマーを有効化
systemctl enabled ddns.timer
- タイマーを開始
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