Cloudflare DDNSを使って動的IPアドレスでもホスト名でアクセスできるようにする。

はじめに

ドメイン管理サービスにCloudflareを使用しており、 また、DDNSに関して設定する機会が今後あるかなと思い調査しながら試してみることにする。

環境

Windows 10 Professional
AWS EC2
Cloudflare

準備

まずは、検証用のためにEC2のインスタンスを作成する。
EIPはつけないでおく。

OS: AmazonLinux2023
インスタンスタイプ: `t3.nano` (後に Dockerを使用する場合は、 t3.smallにする)
セキュリティグループ: 22,80を開放 (自分のIPのみ)
ディスク: 8GB

Cloudflare APIキーの取得

1. Cloudflareにログインし、「APIトークンを取得する」を押す。

cloudflare-dashboard-api-1

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

cloudflare-dashboard-api-2

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

cloudflare-dashboard-api-3

4. 以下のように設定し、「概要に進む」を押す。

※ゾーンの編集権限を与える。
cloudflare-dashboard-api-4

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

cloudflare-dashboard-api-5

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

cloudflare-dashboard-api-6

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

cloudflare-dashboard-api-7

EC2でDDNSの設定

DDNSの設定には、 timothymiller/cloudflare-ddns を使用する。
https://github.com/timothymiller/cloudflare-ddns

1. gitをインストールする

sudo dnf install git

2. git cloneをする

git clone https://github.com/timothymiller/cloudflare-ddns

3. 設定ファイルを用意する

cd cloudflare-ddns
cp config-example.json config.json

下記を設定する。

api_token (APIトークン)
zone_id (ゾーンID)
subdomains.name (ddnsという名前で設定)
"aaaa" (falseにする)

4. cronをインストールする

sudo dnf install cronie
sudo systemctl start crond
sudo systemctl enable crond

5. rsyslogをインストールする

sudo dnf install rsyslog

6. cronを編集する

crontab -e

以下のように記載する。

*/15 * * * * /home/ec2-user/cloudflare-ddns/start-sync.sh

※ 予め実行権限を付与しておくこと

chmod +x /home/ec2-user/cloudflare-ddns/start-sync.sh

7. 実行

/home/ec2-user/cloudflare-ddns/start-sync.sh

結果

更新されていることを確認できた! success

もしレコードに更新がある場合だと下記が出る。

Updating record {'type': 'A', 'name': 'ddns', 'content': '43.207.194.108', 'proxied': False, 'ttl': 300}

DDNSによってレコードが更新されるかの確認

EIPではないパブリックIPv4アドレスは、停止→起動することでIPアドレスが異なるものに割り当てられる。
そのためこれを利用して、DDNSが機能することを確認できる。

AWSのインスタンスを停止→起動する。

起動後にcronの時間で更新されることを確認する。

Updating record {'type': 'A', 'name': 'ddns.k-bushi.com', 'content': '18.183.246.181', 'proxied': False, 'ttl': 300}

オプション: DDNSでWebサーバにアクセスできることを確認したい。

1. Dockerをインストールする

sudo dnf install docker
sudo systemctl start docker
sudo systemctl enable docker

2. ログインユーザをDockerグループに入れる

sudo usermod -a -G docker $(whoami)

一旦この時点でログアウトしてログインし直す。

3. nginx を動かす

docker run --name hogehoge -d -p 80:80 nginx

t3.nano だと性能不足なので、 t3.small とかで実施すること

4. ddns.k-bushi.comにアクセスする。

option-1
アクセスできた・・・!

トラブルシューティング

config.jsonのミス

      "subdomains": [
        {
          "name": "",
          "proxied": false
        },
        {
          "name": "ddns",
          "proxied": false
        }
      ]

と書いていたのだが、これだとルートドメインも更新されてしまう。 なので以下のように更新されてしまった。

trouble-1 ちゃんとREADME.mdを読みましょう。

これは、

      "subdomains": [
        {
          "name": "ddns",
          "proxied": false
        }
      ]

とした。

IPv6の有無

config.json にて、下記の状態でスクリプトの実行をしたところ、IPv6(クアッドAレコードですね。) が有効になっているかどうか確認してねとエラーが出た。

  "a": true,
  "aaaa": true,
  "purgeUnknownRecords": false,
  "ttl": 300

使用しないので下記のようにOFFにした。

  "a": true,
  "aaaa": false,
  "purgeUnknownRecords": false,
  "ttl": 300

参考

おわりに

自宅サーバなどではよく使われるDDNSを設定してみた。
結構面白い機能なので仕組みも理解しておきたい…!   ※APIトークンはこれ以上使用しないので削除してます。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。