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を使用

[amazonjs asin=”B0891RC99L” locale=”JP” title=”Raspberrypi 正規代理店商品 Raspberry Pi 4 Model B (8GB) made in UK element14製 技適マーク入”]そういえば、2023年9月末に、Raspberry Pi 5が発表されました。

資料を拝見しましたが、Wi-Fi承認待ちであることと、5V 5Aという大容量の電源の国内での取り扱いが発表されておらず、普及はまだ時間がかかる印象でした。

今回作成するサーバはRaspberry Pi 4で構築しますが、SSDで起動した場合は、性能的にも特に問題ない感じがします。ちなみにmicroSDカードで起動した場合は、性能が大きく低下しますので、お勧めできませんです。[amazonjs asin=”B08N4F3CVY” locale=”JP” title=”【Amazon.co.jp限定】バッファロー SSD 外付け 250GB 超小型 コンパクト ポータブル PS5/PS4対応(メーカー動作確認済) USB3.2Gen1 ブラック SSD-PUT250U3-B/N”]


OSはRHEL9互換のRocky Linux 9を使用

https://denor.jp/raspberry-pi-4%E3%81%A7rocky-linux-9%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F

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

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


PPPoE接続はNetworkManagerを使用

https://denor.jp/ipv6-ipoe%e7%92%b0%e5%a2%83%e3%81%8b%e3%82%89networkmanager%e3%81%a7ipv4-pppoe%e6%8e%a5%e7%b6%9a%e3%81%99%e3%82%8b%e3%81%ab%e3%81%af

こちらの記事の手順で、IPv4 PPPoE接続を行い、グローバルIPアドレスを割り当てました。

PPPoE接続中はデフォルトルートがppp0に変わる設定を行ったため、グローバルIPアドレス側から、Raspbery Piへのアクセスが可能になります。

またfirewalldでグローバルIPアドレス側からくるパケットを、基本的に無視する設定に変更したため、セキュリティも問題ありません。


No-IPにホスト名を登録してIPアドレスを自動更新

ダイナミックDNSサービスである、No-IPにアカウントを登録しました。

[blogcard url=”https://www.noip.com/”]

無料プランの場合、30日おきにメールで通知が来ますので、その内容に従ってアカウント使用継続の操作が必要になります。

こちらの手順でNo-IP 3 DUC(Dynamic Update Client)を動かしまして、登録したホスト名に対してPPPoE接続したIPアドレスを自動登録します。

https://denor.jp/raspberry-pi%e3%81%a7%e3%83%80%e3%82%a4%e3%83%8a%e3%83%9f%e3%83%83%e3%82%afdns-no-ip%e3%82%92%e8%87%aa%e5%8b%95%e6%9b%b4%e6%96%b0%e3%81%99%e3%82%8b%e3%81%ab%e3%81%af-rocky-linux-9-no-ip-3-duc

既定の設定では5分おきに自動更新されます。ppp0にグローバルIPアドレスが割り当てられる→ppp0接続中はインターネット接続はppp0側のルート→割り当てられたグローバルIPアドレスがダイナミックDNSに登録される

このような動きになれば、外出先からダイナミックDNSに登録したホスト名でRaspbrery Piへのアクセスが可能になります。


Rocky Linux 9へのCaddyインストール

基本的に、公式の手順に従うかたちです。

[blogcard url=”https://caddyserver.com/docs/install”]

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

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

ではまた![amazonjs asin=”B087JFFK9V” locale=”JP” title=”詳解HTTP/2″]

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です