はじめに
ドメイン管理サービスにCloudflare
を使用しており、
また、DDNSに関して設定する機会が今後あるかなと思い調査しながら試してみることにする。
環境
1
2
3
| Windows 10 Professional
AWS EC2
Cloudflare
|
準備
まずは、検証用のためにEC2のインスタンスを作成する。
EIPはつけないでおく。
1
2
3
4
| OS: AmazonLinux2023
インスタンスタイプ: `t3.nano` (後に Dockerを使用する場合は、 t3.smallにする)
セキュリティグループ: 22,80を開放 (自分のIPのみ)
ディスク: 8GB
|
Cloudflare APIキーの取得
1. Cloudflareにログインし、「APIトークンを取得する」を押す。

2. 「トークンを作成する」を押す。

3. 「ゾーンDNSを編集する」の「テンプレートを使用する」を押す。

4. 以下のように設定し、「概要に進む」を押す。
※ゾーンの編集権限を与える。

5. 「トークンを作成する」を押す。

6. APIトークンを控える。

7. APIトークンが作成されていることを確認する。

EC2でDDNSの設定
DDNSの設定には、 timothymiller/cloudflare-ddns
を使用する。
https://github.com/timothymiller/cloudflare-ddns
1. gitをインストールする
2. git cloneをする
1
| git clone https://github.com/timothymiller/cloudflare-ddns
|
3. 設定ファイルを用意する
1
2
| cd cloudflare-ddns
cp config-example.json config.json
|
下記を設定する。
1
2
3
4
| api_token (APIトークン)
zone_id (ゾーンID)
subdomains.name (ddnsという名前で設定)
"aaaa" (falseにする)
|
4. cronをインストールする
1
| sudo dnf install cronie
|
1
2
| sudo systemctl start crond
sudo systemctl enable crond
|
5. rsyslogをインストールする
1
| sudo dnf install rsyslog
|
6. cronを編集する
以下のように記載する。
1
| */15 * * * * /home/ec2-user/cloudflare-ddns/start-sync.sh
|
※ 予め実行権限を付与しておくこと
1
| chmod +x /home/ec2-user/cloudflare-ddns/start-sync.sh
|
7. 実行
1
| /home/ec2-user/cloudflare-ddns/start-sync.sh
|
結果
更新されていることを確認できた!

もしレコードに更新がある場合だと下記が出る。
1
| Updating record {'type': 'A', 'name': 'ddns', 'content': '43.207.194.108', 'proxied': False, 'ttl': 300}
|
DDNSによってレコードが更新されるかの確認
EIPではないパブリックIPv4アドレスは、停止→起動することでIPアドレスが異なるものに割り当てられる。
そのためこれを利用して、DDNSが機能することを確認できる。
AWSのインスタンスを停止→起動する。
起動後にcronの時間で更新されることを確認する。
1
| Updating record {'type': 'A', 'name': 'ddns.k-bushi.com', 'content': '18.183.246.181', 'proxied': False, 'ttl': 300}
|
オプション: DDNSでWebサーバにアクセスできることを確認したい。
1. Dockerをインストールする
1
| sudo dnf install docker
|
1
2
| sudo systemctl start docker
sudo systemctl enable docker
|
2. ログインユーザをDockerグループに入れる
1
| sudo usermod -a -G docker $(whoami)
|
一旦この時点でログアウトしてログインし直す。
3. nginx を動かす
1
| docker run --name hogehoge -d -p 80:80 nginx
|
※ t3.nano
だと性能不足なので、 t3.small
とかで実施すること
4. ddns.k-bushi.comにアクセスする。

アクセスできた・・・!
トラブルシューティング
config.jsonのミス
1
2
3
4
5
6
7
8
9
10
| "subdomains": [
{
"name": "",
"proxied": false
},
{
"name": "ddns",
"proxied": false
}
]
|
と書いていたのだが、これだとルートドメインも更新されてしまう。
なので以下のように更新されてしまった。
ちゃんとREADME.mdを読みましょう。
これは、
1
2
3
4
5
6
| "subdomains": [
{
"name": "ddns",
"proxied": false
}
]
|
とした。
IPv6の有無
config.json
にて、下記の状態でスクリプトの実行をしたところ、IPv6(クアッドAレコードですね。) が有効になっているかどうか確認してねとエラーが出た。
1
2
3
4
| "a": true,
"aaaa": true,
"purgeUnknownRecords": false,
"ttl": 300
|
使用しないので下記のようにOFFにした。
1
2
3
4
| "a": true,
"aaaa": false,
"purgeUnknownRecords": false,
"ttl": 300
|
参考
おわりに
自宅サーバなどではよく使われるDDNSを設定してみた。
結構面白い機能なので仕組みも理解しておきたい…!
※APIトークンはこれ以上使用しないので削除してます。