先日、Raspbery Pi 4にRed Hat Enterprise Linux 9互換のLinuxをインストールしまして。
PPPoE接続を行い、インターネットから直接アクセスできるようにしました。
No-IPによるダイナミックDNSに登録したホスト名を使いまして、SSLサーバを作成したいと思います。
SSLサーバの証明書は自動更新されますので、何か購入や契約する必要なく、今後もずっとSSL接続が可能です。
そして単にWebサーバとして使用するのではなく、リバースプロキシ、他のホストで動かしているWebサービスをSSLでホスティングすることが可能になります。
とりあえず、SSL対応のWebサーバとして起動するところまで、記録させて頂こうと思います。
目次
SSL証明書自動更新Caddyサーバ構築手順
マシンはRaspberry Pi 4を使用
そういえば、2023年9月末に、Raspberry Pi 5が発表されました。資料を拝見しましたが、Wi-Fi承認待ちであることと、5V 5Aという大容量の電源の国内での取り扱いが発表されておらず、普及はまだ時間がかかる印象でした。
今回作成するサーバはRaspberry Pi 4で構築しますが、SSDで起動した場合は、性能的にも特に問題ない感じがします。ちなみにmicroSDカードで起動した場合は、性能が大きく低下しますので、お勧めできませんです。
OSはRHEL9互換のRocky Linux 9を使用
こちらの記事の手順で、Rocky LinuxをスティックSSDにインストールして起動しました。
タイムゾーン等の初期設定のほか、サーバとして使用する前提で、静的IPアドレスの設定も行いました。
PPPoE接続はNetworkManagerを使用
こちらの記事の手順で、IPv4 PPPoE接続を行い、グローバルIPアドレスを割り当てました。
PPPoE接続中はデフォルトルートがppp0に変わる設定を行ったため、グローバルIPアドレス側から、Raspbery Piへのアクセスが可能になります。
またfirewalldでグローバルIPアドレス側からくるパケットを、基本的に無視する設定に変更したため、セキュリティも問題ありません。
No-IPにホスト名を登録してIPアドレスを自動更新
ダイナミックDNSサービスである、No-IPにアカウントを登録しました。
無料プランの場合、30日おきにメールで通知が来ますので、その内容に従ってアカウント使用継続の操作が必要になります。
こちらの手順でNo-IP 3 DUC(Dynamic Update Client)を動かしまして、登録したホスト名に対してPPPoE接続したIPアドレスを自動登録します。
既定の設定では5分おきに自動更新されます。ppp0にグローバルIPアドレスが割り当てられる→ppp0接続中はインターネット接続はppp0側のルート→割り当てられたグローバルIPアドレスがダイナミックDNSに登録される
このような動きになれば、外出先からダイナミックDNSに登録したホスト名でRaspbrery Piへのアクセスが可能になります。
Rocky Linux 9へのCaddyインストール
基本的に、公式の手順に従うかたちです。
dnfリポジトリ登録
dnfへ、caddyのリポジトリ登録しました。
sudo dnf install 'dnf-command(copr)'
sudo dnf copr enable @caddy/caddy
dnf search caddy
sudo dnf install caddy
特に問題なく、RHEL9向けのcaddy-2.7.4がインストールされました。
セキュリティが強力、かつインストールするパッケージの信頼性が高い、このあたり、RHEL9互換のLinuxを使用させて頂いた利点になります。
Caddyfileファイル編集
設定ファイルを編集しましょう。
sudo vi /etc/caddy/Caddyfile
ポート番号80を削除して、代わりにダイナミックDNSに登録したホスト名を入れます。動作確認ということで、まずはこのような内容にします。
Caddyサービス起動
パッケージから、systemdのユニットファイルとしてcaddy.serviceとcaddy-api.serviceがインストールされたようです。
caddy.serviceを有効化して起動しましょう。
sudo systemctl daemon-reload
sudo systemctl enable caddy.service --now
ファイアウォールの設定調整
今回のCaddyfileは、Webサーバとして動作して、https接続が有効になっています。
PPPoE接続側のファイアウォールのルール(external)を変更して、httpsパケットが通るようにします。
sudo firewall-cmd --zone=external --add-service="https"
sudo firewall-cmd --zone=external --add-service="https" --permanent
sudo firewall-cmd --reload
permanentオプション付きも更新しましたので、再起動後も有効になります。
以上でRaspberry Pi側の準備が完了しました。
SSL証明書の準備?さて?
WebブラウザからアクセスしてSSL接続を確認
Webブラウザを起動して、No-IPに登録したホスト名でhttps接続します。
https://<No-IPに登録したホスト名>
WebブラウザのURL欄を見ると、鍵のマークが付いていて、確かにhttps接続、SSLによる通信が行われています。
SSL証明書は自動ダウンロード・自動更新
そのSSL証明書は、このあたりに格納されているようです。
証明書の発行は、Let’s Encryptを使わせて頂くかたちになります。
ディレクトリの所有者がcaddyになっていることからわかる通り、caddyサービスがすべて自動で維持管理してくれるため、あまり気にする必要はないようです。
CaddyのWebサーバ側でLet’s Encrypt認証用の特別なディレクトリやファイルが作られていて、うまく整合を取ってくれている、程度に覚えておきましょう。(自分が知らないファイルを怪しんで消してはいけない
No-IPの無料プランでも、このくらいの手軽さで、SSLサーバを構築できることがよくわかりました。
またCaddyはhttp以外にも、http/2やhttp/3に対応しており、高速かつ効率の良い通信が可能です。
今回、とりあえずhttps対応のWebサーバとして動かしましたが、本当の使用目的は、リバースプロキシ、他のサーバのホスティングを考えています。
同じLAN内で動かしているサーバをそのサーバ内で直接https化するのではなく、https化はCaddyに自動でやってもらう。他のサーバのサービスを自動転送(ホスティング)する使い方になります。
そちらは別の記事にさせて頂こうと思いますが。まだ実験してないのですよね・・・本当に期待通りできるのでしょうか?
ではまた!