Cloudflare を DDNS として利用する

Published: 2021-09-28 21:00 +0900 by Chirimen

外部から自宅サーバを操作するのには Cloudflare で DDNS やるのが手っ取り早そうだった。

はじめに

自宅に設置した Ubuntu サーバを外部から ssh できるようにするには いろいろな方法があると思うのだけれど、

  • グローバルIP (IPv4) は動的に割り当てられる (IPv6 は動的なのか? 要確認)
  • プロバイダから貸与されてるルータでポートフォワード設定は可能
  • ドメインは取得していて、ネームサーバを Cloudflare に置いている
  • 外部に (仮想) サーバを借りていて、それなりに融通が利く

という環境で、 あまり手間をかけないで実現するには、 ルータで ssh のポートを Ubuntu サーバに転送しておいて、 Cloudflare を DDNS サーバとして運用することで対応するのが簡単そうである。

ポートを公開すると、侵入を試みるアクセスが増えそうだけど、 転送許可するアドレスを、外部のサーバに限定しておけばよいだろう。

DDNS での更新については、 Cloudflare を ddclient で DDNS 化する という記事を参考にした。

Cloudflare での準備

すでに Cloudflare にアカウントを持っていて、 自ドメインの DNS を運用しているという前提。

ddclient での操作には次のものが必要。

  • アカウント名 (メールアドレス)
  • Global API Key (後述するように Cloudflare から取得)
  • 操作対象のゾーン名 (ドメイン名)
  • 登録対象の A レコード (ダミーの IP アドレスであらかじめ作成しておく)

Cloudflare の Global API Key を取得

Cloudflare の Global API Key を取得しておく。 マイプロフィールの API トークンのページで取得できる。

Cloudflare の Global API Key を取得

ddclient のインストールと設定

インストール

記事 Cloudflare を ddclient で DDNS 化する によれば Ubuntu 20.04 LTS (Focal Fossa) の apt で提供されている ddclient 3.8.x では 現在の Cloudflare に対応できず ddclient 3.9.x が必要らしい。

なんてこった。

だが、先の記事では Launchpad から Groovy 用の ddclient 3.9.1 の deb を dpkg -i でインストールすればよい、とある。 難易度は高くなさそうだ。

Groovy とは Ubuntu 20.10 (Groovy Gorilla) のことだろう。 Launchpad には Ubuntu 21.04 (Hirsute Hippo) 用の 3.9.1-7 と Ubuntu 20.04 LTS (Focal Fossa) 用の 3.8.3-1.1ubuntu1 が提供されていて Groovy 用は見当たらない。

Hirsute Hippo 用の ddclient_3.9.1-7_all.deb をダウンロードし、 dpkg -i でインストールする。

herobox$ sudo dpkg -i ddclient_3.9.1-7_all.deb
(略)
dpkg: dependency problems prevent configuration of ddclient:
 ddclient depends on libdata-validate-ip-perl; however:
  Package libdata-validate-ip-perl is not installed.
(略)

依存関係でパッケージ libdata-validate-ip-perl がないとのエラーが出る。

GitHub: ddclient によれば、 以下のパッケージが必要とあるので、 それらを apt install でインストールしてから、 再度 ddclient のインストールを dpkg -i で実行する。

  • libdata-validate-ip-perl
  • libio-socket-ssl-perl
  • libjson-pp-perl
  • libio-socket-inet6-perl (IPv6 を使う場合)

インストール時の初期設定

dpkg -i で ddclient のインストールを行うと、 続けて次のような設定 UI が表示される。 設定 UI ではすべての情報を入力できず、後でファイルを編集することになるので、 ここでは分かる範囲で入力すればよい。 後でやり直したいときは dpkg-reconfigure ddclient_3.9.1-7_all.deb とする。

最初の画面で、利用する DDNS サービスを選択する。 表示されている選択肢に cloudflare はないので、 other を選ぶと次の画面で DDNS のプロトコルを選択できる。

インストール時の設定

プロトコルの選択画面で cloudflare を選択。

プロトコルの選択

続いて DDNS サーバーを入力する画面になるが、 先程選択したプロトコル cloudflare のデフォルトのサーバを使用するので空欄でよい。

DDNSサーバーの入力

以降、次の情報を入力するよう要求される。

  • HTTP プロキシの設定 (使用しない)
  • ユーザー名 (cloudflare のアカウント名でメールアドレス)
  • パスワード (取得した Global API Key)
  • グローバル IP の確認方法 (NAT 経由なので web-based を選択)
  • IPアドレスの問い合わせ先 (どこでもよいがデフォルトが https://api.ipify.org/)
  • 最短更新間隔 (デフォルトの5分 5m のままにしておく)
  • 更新対象のホスト名

設定が終わると /etc/ddclient.conf はこのようになる。

# Configuration file for ddclient generated by debconf
#
# /etc/ddclient.conf

protocol=cloudflare \
use=web, web=https://api.ipify.org/ \
login=[メールアドレス] \
password=[パスワード] \
[ホスト名]

設定

ddclient の動作には zone の設定が必要 (cloudflare の場合) なので、ファイルを編集して追加する。

# Configuration file for ddclient generated by debconf
#
# /etc/ddclient.conf

protocol=cloudflare \
use=web, web=https://api.ipify.org/ \
zone=[ゾーン名] \
login=[メールアドレス] \
password=[パスワード] \
[ホスト名]

動作確認

herobox$ sudo ddclient -v
CONNECT:  api.ipify.org
(略)
RECEIVE:  xxx.xxx.xxx.xxx   (api.ipify.org で確認したグローバル IP)
(略)
INFO:     setting IP address to xxx.xxx.xxx.xxx for YYY.example.com (更新対象ホスト名)
UPDATE:   updating YYY.example.com
CONNECT:  api.cloudflare.com
(略)
SUCCESS:  YYY.example.com -- Updated Successfully to xxx.xxx.xxx.xxx

運用

daemon で運用するか、 cron で実行するかは後で考える。

参考

Share

Latest Posts

Django Rest Framework のテストでハマったこと (4)

Django で既存データベースから inspectdb で作成した models.my は managed = False となっている。 そのままだと test を実行したときに、 テスト用データベースにモデルに対応したテーブルが作成されない。

Django Rest Framework のテストでハマったこと (3)

factory_boy の Faker() で、 取得した値を加工してから使用する話。

Django Rest Framework のテストでハマったこと (2)

Django のテスト用データを作成するのによく用いられる factory_boy で locale を指定して日本語圏用のデータを利用する話。