先日、Raspberry Pi 4にて、SSL証明書の自動更新に対応した、Caddyリバースプロキシサーバを構築しました。
WordPressやNextcloud、Vaultwarden等のサービスをホスティングすることで、外出先から各種サービスをSSL暗号化して使用できるようになりました。
しかし、欠点が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
externalゾーンは、Raspberry PiでIPv4 PPPoE接続したときに、ppp0に割り当てたゾーンで、外部のインターネット側からのファイアウォール設定になります。
今回設定を変更するのは、おうちLAN側からのアクセスのため、publicゾーンになります。
httpsによる通信を許可しました。
sudo firewall-cmd --zone=public --add-service="https"
sudo firewall-cmd --zone=public --add-service="https" --permanent
sudo firewall-cmd --reload
おうちLAN機器側の設定変更
SSL通信はIPアドレスでは不可
先ほど、CaddyfileにIPアドレスを設定しましたが。
IPアドレスでは、SSL通信はできません。
理由は、証明書がドメイン名のため、URL(http://~)は必ずドメイン名である必要があるからです。
このような感じで「保護されていない通信」と表示され、SSLが無効になってしまいます。
その解決策ですが。
URLは「https://<ドメイン名>」を使用して、実際の接続先はおうちLAN内のCaddyサーバのIPアドレスにする必要があります。
アクセスする機器側のhostsファイル編集 Windows PCの場合
Windows PCの場合、hostsファイルを編集することで、「https://<ドメイン名>」の接続先のIPアドレスを指定することが可能です。
次の手順になります。
- 管理者権限でコマンドプロンプトを開きます。
- メモ帳でhostsファイルを開きます。
notepad c:\windows\system32\drivers\etc\hosts
- 末尾に1行追加します。
<CaddyサーバのIPアドレス> <sslドメイン名>
以上でCaddyサーバにインターネット経由ではなく、直接アクセスできるようになりました。
ping, tracertコマンドは、IPアドレスではなく、SSLドメイン名を指定しましょう。
ping <CaddyサーバのSSLドメイン名>
tracert <CaddyサーバのSSLドメイン名>
機器ごとではなくまとめて設定する場合はDNSが必要
機器ごとにhostsファイルを設定せずに、おうちLAN内の機器を、まとめて設定変更したい場合は。
おうちLAN専用のDNSサーバが必要になります。
わたしの自宅では、家庭用のWi-Fiルータを使用しています。
そして通常、Wi-Fiルータの中で動いている、下記のサービスを利用していると思います。
- ISP(インターネット・サービス・プロバイダ)への接続 IPv6 IPoEやIPv4 PPPoE
- DHCPサーバ(IPアドレス等、ネットワーク設定の配布機能)
- 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ファイルを設定しましょうか。
それではまた!