PPPoE接続したRaspberry PiでSSL証明書自動更新付きWebサーバを構築するには

先日、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を使用

Raspberry Pi 4でRocky Linux 9を起動してみました
Red Hat Linuxとバイナリ互換のあるOSとしまして、CentOS LinuxやCentOS Streamが挙げられますが。 ...

こちらの記事の手順で、Rocky LinuxをスティックSSDにインストールして起動しました。

タイムゾーン等の初期設定のほか、サーバとして使用する前提で、静的IPアドレスの設定も行いました。


PPPoE接続はNetworkManagerを使用

IPv6 IPoE環境からNetworkManagerでIPv4 PPPoE接続するには
IPv6 IPoE接続した環境の中から、PPPoEパススルー機能を使用して、IPv4 PPPoE接続したい場合。 NetworkMan...

こちらの記事の手順で、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アドレスを自動登録します。

Raspberry PiでダイナミックDNS No-IPを自動更新するには Rocky Linux 9 + No-IP 3 DUC版
先日、Raspberry Pi 4にRHEL9互換OSのRocky Linux 9をインストールしまして。 transixのI...

既定の設定では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

問題は、aarch64版があるかですが。

問題無さそうです。

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に自動でやってもらう。他のサーバのサービスを自動転送(ホスティング)する使い方になります。

そちらは別の記事にさせて頂こうと思いますが。まだ実験してないのですよね・・・本当に期待通りできるのでしょうか?

ではまた!

スポンサーリンク

フォローする

スポンサーリンク