はじめに
ドメイン管理サービスに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トークンを取得する」を押す。
2. 「トークンを作成する」を押す。
3. 「ゾーンDNSを編集する」の「テンプレートを使用する」を押す。
4. 以下のように設定し、「概要に進む」を押す。
5. 「トークンを作成する」を押す。
6. APIトークンを控える。
7. APIトークンが作成されていることを確認する。
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
結果
もしレコードに更新がある場合だと下記が出る。
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にアクセスする。
トラブルシューティング
config.jsonのミス
"subdomains": [
{
"name": "",
"proxied": false
},
{
"name": "ddns",
"proxied": false
}
]
と書いていたのだが、これだとルートドメインも更新されてしまう。 なので以下のように更新されてしまった。
これは、
"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
参考
- timothymiller/cloudflare-ddns| GitHub
https://github.com/timothymiller/cloudflare-ddns - BashとCloudflareでつくる 無料Dynamic DNS
https://b.muo.jp/2020/03/27/cloudflare-dyndns.html
おわりに
自宅サーバなどではよく使われるDDNSを設定してみた。
結構面白い機能なので仕組みも理解しておきたい…!
※APIトークンはこれ以上使用しないので削除してます。