CaddyでSSLホスティングしたサービスに高速にアクセスするには

先日、Raspberry Pi 4にて、SSL証明書の自動更新に対応した、Caddyリバースプロキシサーバを構築しました。

WordPressやNextcloud、Vaultwarden等のサービスをホスティングすることで、外出先から各種サービスをSSL暗号化して使用できるようになりました。

https://denor.jp/pppoe%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%9Fraspberry-pi%E3%81%A7ssl%E8%A8%BC%E6%98%8E%E6%9B%B8%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E4%BB%98%E3%81%8Dweb%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E6%A7%8B

しかし、欠点が1つありました。

これらのサービスに、おうちLAN内のPCからアクセスしたいとき、わざわさ外部のインターネットを経由してアクセスします。このため転送速度は遅く(=帯域が狭い)、遅延(=遅れ、もっさり感)も発生していました。

Nextcloudで大量のファイルをアップロードしたい場合など、時間がかかってしまいます。インターネット回線が無駄に消費され、他のサービスへの影響も出ます。困ったものです。

設定を調整して、このあたりの問題を、なんとか改善しようと思います。


Caddyリバースプロキシへイントラネットから直接アクセスする設定手順

同じおうちLANからアクセスするPCのルーティングを改善

外出先=インターネットからCaddyリバースプロキシサーバ(以下、Caddyホスティングサーバ/Caddyサーバ)へアクセスする場合は、現状の設定で問題ありません。

問題は、同じ部屋にある、同じネットワークセグメントにある機器から、Caddyサーバにアクセスした場合に発生します。

SSL証明書のドメイン名を使用することから、直接アクセスしているのではなく、ぐるーっと遠回りが問題です。


速度が遅く遅延がある現状のルーティング

おうちLANのPCから、SSLホスティング用のRaspberry Pi(機器として見たときはRaspberry Pi、サーバとして見たときはCaddyサーバと表記します)への応答速度とルートを確認してみました。IPアドレス末尾58.9は、Raspberry Piに割り当てられたグローバルIPアドレスになります。

SSLのドメイン名でアクセスすると、応答に32~57msの時間がかかっています。(遅延

経路上に9個のルータが存在し、それぞれのルータで、8~59msの遅延が発生しています。

ホスティング用のRaspberry PiはIPv4 PPPoEでインターネットへ接続しています。

また自宅PCはtransix IPv6 IPoEでインターネットへ接続しています。

通信パケットは、Raspberry Piからいちどインターネットへ入り、そこから別の出口を経由して、自宅PCへアクセスしている状況⇒ルータを9個通って通信しています。

遅延が発生するほかに、アクセス帯域も細く、ファイルの転送に時間がかかっていると思います。

PCとRaspberry Piは、同じお部屋にありますが!

改善策は、インターネット経由している、その無駄をなくそう、という考え方になります。


速度が早く遅延がない理想のルーティング

こちらは、遠回りしないように設定を変更した場合のルーティングになります。

Raspberry Pi(Caddyサーバ)のIPアドレスが、192から始まる末尾18のアドレスになります。

遅延は1ms以下、ルータは通らず、直接同じセグメント内のホストと通信しています。

同じネットワークセグメントのためルータは経由せずに直接接続するため、帯域も最大限、フルスピードでファイルの転送が可能です。

こうなるように、Caddyリバースプロキシ+ファイアウォールの設定と、アクセスする側のPCの設定を変更します。


Caddyホスティングサーバの同一セグメントアクセス許可設定

Caddyfile変更

まずは、Caddyfileを編集して、SSLドメイン名以外に、おうちLAN内のIPアドレスでアクセスが可能なように設定を変更します。

# Caddyホスティングサーバにて
sudo vi /etc/caddy/Caddyfile

1行目、SSLドメイン名の隣に、Raspberry PiのIPアドレスを追加しました。

<Raspberry PiのIPアドレス>, <SSLドメイン名> {

これでIPアドレスでCaddyにアクセスできるようになります。

設定変更を反映します。

sudo systemctl reload caddy.service

次にRocky Linuxのファイアウォール設定を変更します。


ファイアウォール設定変更

使用しているゾーンを確認しました。

sudo firewall-cmd --list-all-zones |grep active

使用しているゾーンは2つ。

externalゾーンは、Raspberry PiでIPv4 PPPoE接続したときに、ppp0に割り当てたゾーンで、外部のインターネット側からのファイアウォール設定になります。

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

今回設定を変更するのは、おうちLAN側からのアクセスのため、publicゾーンになります。

httpsによる通信を許可しました。

sudo firewall-cmd --zone=public --add-service="https"
sudo firewall-cmd --zone=public --add-service="https" --permanent
sudo firewall-cmd --reload

以上で、SSLホスティングサーバ側の設定変更は完了ですが。


おうちLAN機器側の設定変更

SSL通信はIPアドレスでは不可

先ほど、CaddyfileにIPアドレスを設定しましたが。

IPアドレスでは、SSL通信はできません。

理由は、証明書がドメイン名のため、URL(http://~)は必ずドメイン名である必要があるからです。

このような感じで「保護されていない通信」と表示され、SSLが無効になってしまいます。

その解決策ですが。

URLは「https://<ドメイン名>」を使用して、実際の接続先はおうちLAN内のCaddyサーバのIPアドレスにする必要があります。


アクセスする機器側のhostsファイル編集 Windows PCの場合

Windows PCの場合、hostsファイルを編集することで、「https://<ドメイン名>」の接続先のIPアドレスを指定することが可能です。

次の手順になります。

  1. 管理者権限でコマンドプロンプトを開きます。
  2. メモ帳でhostsファイルを開きます。
    notepad c:\windows\system32\drivers\etc\hosts
    

  3. 末尾に1行追加します。
    <CaddyサーバのIPアドレス> <sslドメイン名>

以上でCaddyサーバにインターネット経由ではなく、直接アクセスできるようになりました。

ping, tracertコマンドは、IPアドレスではなく、SSLドメイン名を指定しましょう。

ping <CaddyサーバのSSLドメイン名>
tracert <CaddyサーバのSSLドメイン名>

この結果が、冒頭のこちらと同じになれば設定完了です。


機器ごとではなくまとめて設定する場合はDNSが必要

機器ごとにhostsファイルを設定せずに、おうちLAN内の機器を、まとめて設定変更したい場合は。

おうちLAN専用のDNSサーバが必要になります。

わたしの自宅では、家庭用のWi-Fiルータを使用しています。[amazonjs asin=”B0C9PVNJCL” locale=”JP” title=”【Amazon.co.jp限定】 バッファロー ルーター 無線 LAN Wi-Fi 6E 11ax 6GHz AXE5400 トライバンド 6ストリーム 2401 + 2401 + 573 Mbps 有線 2.5Gbps エコパッケージ 【 iPhone 15 Pro / 14 / 13 / Nintendo Switch / PS5 動作確認済み 】 WSR-5400XE6/N”]

そして通常、Wi-Fiルータの中で動いている、下記のサービスを利用していると思います。

  1. ISP(インターネット・サービス・プロバイダ)への接続 IPv6 IPoEやIPv4 PPPoE
  2. DHCPサーバ(IPアドレス等、ネットワーク設定の配布機能)
  3. DNS(ドメイン・ネーム・サービス)

このうち、3番のDNSを、Wi-Fiルータではなく、別途構築する必要があると思います。

IPv4のみでしたら、それほど大変ではなく、構築が可能かもしれません。Caddyサーバとして使用しているRaspberry Pi 4でサービスをインストールし、設定を調整して起動が可能です。

一方、前述の通り、私のおうちLANは、transixによるIPV6 IPoEサービスを利用してインターネットに接続しています。この場合、IPv6対応のDNSサーバを構築しないと、IPv6サービスが使用できなくなってしまいます。

さらに、NDプロキシを使用している場合は、そちらも考慮する必要があり、少し面倒です。

ここではDNSサーバの構築は保留致します。


以上で、おうちLANの機器から、SSLホスティングしているCaddyサーバへ直接接続できるようになりました。

一方、URL(https://<SSLドメイン名>)とIPアドレスの整合をとるために、機器ごとにhostsファイル等の設定が必要です。

まとめて設定変更したい場合は、DNS用のサーバが必要ですが、IPv6対応やNDプロキシを使用している場合、注意が必要です。

このあたりは、機会があれば挑戦してみたいと思います。(必要に迫られたら

さて。あと何台か、hostsファイルを設定しましょうか。

それではまた![amazonjs asin=”B09BQV3SNB” locale=”JP” title=”Raspberry Pi PoE HAT+ オフィシャルボード for Raspberry Pi 4 、 Raspberry Pi 3B”]

コメント

コメントを残す

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