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 トークンのページで取得できる。
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
のデフォルトのサーバを使用するので空欄でよい。
以降、次の情報を入力するよう要求される。
- 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 で実行するかは後で考える。