お名前.comのDDNSを自動更新させる for Linux

お名前.comでドメインを取得する方は多いことかと思います。
しかし、DDNSを自動更新してくれる公式ツールはWindows用しか用意されていません。
無いなら自分で用意しようということで、非公式ですがツールを作りました。

AWSのRoute53を利用する方法もあるようですが、なるべくお金を掛けたくないです。


一応の前提
・ AmazonLinux 2023

<br>

# ０，事前準備
AmazonLinux 2023 にはデフォルトではインストールされてない機能がちょくちょくありまして、必要な方は以下の物を事前にインストールしておきましょう。

### makeをインストール
makeはコンパイル型言語を簡単にビルドする機能です。
作成するツールのファイルはC++言語で書かれていますので、makeコマンドにてビルドします。
```console
$ sudo dnf -y install make
```

### gccとg++をインストール
これらはC++言語をコンパイルするのに必要な機能です。
makeするのに必要です。
gccとg++はバージョンが一致してないとエラーを起こします。
```console
$ sudo dnf -y install gcc g++
```
<br>

# １、お名前.comのDDNSを更新するためのツールをインストール
[お名前.comのDDNSを更新するためのツール](https://github.com/nozat80/Onamae_DDNS_AutoUpdater)は筆者が自作したツールです。
用法用量を守りつつお使いください。
このツールを使ったことによる一切の損害は補償いたしません。

### wgetを使ってツールをダウンロード
```console
//ダウンロード
$ wget https://github.com/nozat80/Onamae_DDNS_AutoUpdater/archive/refs/heads/main.zip

//解凍
$ unzip main.zip

//カレントディレクトリ移動（名前が長くてスミマセン）
$ cd Onamae_DDNS_AutoUpdater-main
```

### 各自の設定に合わせてソースコードを書き換え
お名前.comにアクセスするための「お名前ID」や「パスワード」など、その他設定が必要です。
解凍したファイルの中にあるddns.cppファイルがソースコードなので、それを開きます。

```console
//nanoで編集
$ nano ddns.cpp
```

開いたファイルの8行目辺りに以下のコードがありますので、各自に合わせて書き換えてください。

| 定数名 | 値 | 例 |
|:-:|:-:|:-:|
| USER_ID | お名前ID | 12345678 |
| PASS | パスワード | password |
| HOSTNAME | ホスト名 | www |
| DOMNAME | ドメイン名 | example.com |

```c++:ddns.cpp
//開いたファイルの8行目辺り
const char* USER_ID = "xxxxxxxx";
const char* PASS = "Password";
const char* HOSTNAME = "hostname";
const char* DOMNAME = "example.com";

...
```
書き換えましたら、保存してnanoを終了します。
<br>

### ビルドしてインストール
カレントディレクトリは Onamae_DDNS_AutoUpdater-main のままであることを確認してください。
カレントディレクトリにあるファイルをビルドして/usr/local/bin/ にインストールします。
※インストール先を変えたい人は解凍したファイルの「Makefile」を編集してからビルドしてください。

```console
$ sudo make install
```

この時点でインストールは完了し「onamae_ddns」というコマンドで実行可能になります。
試しにやってみましょう。なお、sudoを付けてあげないとエラーが起きます。
```console
$ sudo onamae_ddns
```

無事にIPアドレスが更新されれば、以下のような表示が出ます。
4つのSUCCESSFULがあれば成功です。
```
000 COMMAND SUCCESSFUL
.
000 COMMAND SUCCESSFUL
.
000 COMMAND SUCCESSFUL
.
000 COMMAND SUCCESSFUL
.
```
この時、更新されたIPアドレスを内部で記録していますので、次回以降では、IPアドレスが変化した時のみ更新作業を行うようになっています。
ちなみに、アドレスの保存先はインストール先の current_ip.txt ファイルです。
sudo権限を付けてあげないと、このファイルの上書きに失敗します。

:::note
インストール後に要らなくなったファイルを削除することがセキュリティ的にも大事です。
```console
// Onamae_DDNS_AutoUpdater-main の一つ上に移動する
$ cd ../

// Onamae_DDNS_AutoUpdater-main ディレクトリを削除
$ sudo rm -r Onamae_DDNS_AutoUpdater-main
```
:::

<br>

# ２，定期実行させる
大事なのは、IPアドレスが変わったことを自動で把握して、更新してくれることです。
なので、インストールしたツールを定期実行してくれるように設定します。

定期実行にはcrontabを頭に浮かべる方が多いかと思います。
しかしながら、Amazon Linux 2023 ではデフォルトで提供されておらず、代わりに[**systemd timer**への移行がお勧め](https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/cron.html)とのことです。
ここは素直に従いましょう。

### 設定ファイルの作成
`/etc/systemd/system`に`onamae_ddns.service`を作成します。
```console
$ sudo nano /etc/systemd/system/onamae_ddns.service
```
以下の内容を貼り付けてください。
```:onamae_ddns.service
[Unit]
Description=onamae_ddnsを実行

[Service]
Type=oneshot
User=root
ExecStart=/usr/local/bin/onamae_ddns

[Install]
WantedBy=multi-user.target
```

続けて、`/etc/systemd/system`に`onamae_ddns.timer`を作成します。
```console
$ sudo nano /etc/systemd/system/onamae_ddns.timer
```
以下の内容を貼り付けてください。
```:onamae_ddns.timer
[Unit]
Description=onamae_ddnsを定期実行します

[Timer]
OnCalendar=*-*-* *:00,05,10,15,20,25,30,35,40,45,50,55:00
Persistent=true

[Install]
WantedBy=timers.target
```
これはonamae_ddnsを毎日5分毎に実行するという内容です。
1分毎に監視したい人は
OnCalendarを`*-*-* *:*:00`
にしても良いのかもしれません。
その分、システムへの負担は増えますが。


### 設定ファイルの有効化
```console
//サービスの起動
$ sudo systemctl start onamae_ddns.timer

//サービス自動起動を有効に
$ sudo systemctl enable onamae_ddns.timer
```
これで、ずっと監視してくれますので、突然IPが変わっても安心です。