見出し画像

[dd-wrt]ルータでwebサーバ(4)

首尾よくルータをwebサーバにできた、、、 として。

IPアドレスが固定されてない場合、都度都度調べて http://210.x.x.x とか打ち直すのはそこそこめんどくさい。まして 外向きにアドレスを教えなければならない場合は半ば自宅住所を教えるに等しいので好ましくない。

こんなときにはドメインを取得して http://x.com と打ち込めば自宅サーバにつながる状態が望ましいですよね。

これをタダで実現するのがDDNSと呼ばれるサービスです。

DDNS

DDNSを使うにあたり、上記でいうところの http://x.com と 210.x.x.x を紐づける必要があります。
dd-wrtでは、web-GUI画面で、[setup]→[DDNS]から主だったDDNS業者に対して更新通知を行う機能があります。うーん、あらためてすばらしい。

ところが、これはイマイチ。以下は最もメジャーなDDNSのno-ipの更新に準拠した書式に対応してみます。

curl "https://YOUR-USERNAME:YOUR-PASSWORD@dynupdate.no-ip.com/nic/update?hostname=YOUR-HOSTNAME"

これを、web-GUI画面の[Administration]→[Commands]の[Startup]に記述してあげればグローバルipアドレスが変更になるルータ再起動の際にDDNSに通知できます。

SSL

どこかのタイミングでDDNSで取得したアドレスを http://x.com と https://x.com に対応させる必要が生じます。

「おれんことおいでよ、SSL対応済だよ」といったところでしょうか。

ここで必要なssl証明書をつくるのも更新するのもそんなに難しいことではないんですけど、dd-wrtでやるとなると中1日ぐらいがんばる必要があります。

わたしはひよって証明書は別のLinuxサーバから取っちゃいました… このへんのやりかたは趣旨ではないので割愛します。

ので更新について・・・

これにはそんなに選択肢はなくて、centosなどではパッケージで可能。そうじゃない場合はACMEという仕組みを使います。

dd-wrt内でSSL更新するにはこちらのACMEでやることになります。ゴールはhttpdにSSL証明書のパスを記述して自動的にSSL証明書を更新すること。

[追記]
思い出し思い出しで追記します。
ACMEのインストール方法は、公開先からcurlやwgetで引っ張ってきて、展開。本体を走らせる、、、 といった流れだと記憶しますが、dd-wrtはデフォルトの状態ではcurlやwgetがSSL通信できません。

わたしは、力ワザで本体の中に置いてあるcertファイルを使ってSSL認証させたりcurlにkオプション(SSLのエラーを無視して処理を継続)を駆使したり非SSLなgitで引っ張ってみたり、といったことをした記憶があります。

確実なのはそういう制約のない環境で引っ張ってきて、SSHなりでdd-wrtルータに流しこむことでしょうか。もう一度やるならわたしはそうします。

首尾よくACMEを入手し、走らせてみると、証明書ファイルは/root/tmpに発行されます。ここは揮発領域なため、リブートすると証明書自体が消えてしまうという問題が。

そのため、ACMEを走らせた後には/opt以下の記憶域にコピーする処理が必要になります。わたしは以下のようなバッチファイルをcronで10日ごとに実行しています。

cd /opt/etc/acme.sh/
./acme.sh --issue -d x.com -w /opt/share/nginx/html/cert/x --server letsencrypt
#上のスクリプトだと/tmp/root以下に認証ファイルが発行される
cp -a /tmp/root/.acme.sh/* /opt/etc/nginx/cert/

うまくいかなかったらごめんなさい。

この記事が気に入ったらサポートをしてみませんか?