自宅サーバーを立てたv2。

現状2022/08現在のネットワークやサーバーの状態です。自宅サーバーを推奨するものでもなく、クラウドを卑下するものでもありません。お金があれば大容量のクラウドを契約したいです。

設備情報

  1. マンションに付属している無料のネット回線
  2. 残ったパーツで作った自作サーバー
  3. VPSサーバー1台

IPアドレスについて

マンションの無料ネット回線を使用しているので、プライベートアドレスが割り当てられます。プロバイダとの契約もマンションオーナーが行っているため、固定IPや公開IPが取得できません。一般的には固定IPを契約しておくのが無難。

自宅サーバーは趣味の領域

これを言うと元も子もないが、自宅サーバーを立てるよりも、VPSなり、クラウド契約した方が運用の可用性、セキュリティなどの点で優秀だと思います。

自宅サーバーの場合は、サーバー本体の初期費用が必ず必要になりますし、故障原因を除外するために停電、雷対策にUPSなど専用の機器が必要になります。私の自宅サーバーは趣味サーバーでほぼ対策はしていません。

ランニングコストは電気代のみになるので、それだけはVPSやクラウドより優位になる可能性があります。私のサーバースペックは8コア/16スレッド、メモリ16GB、SSD-256GBとなります。これと同じ要件ではありませんが、サクラVPSの仮想8コア、メモリ16GB、SSD-800GBを契約した場合、約1万円/月ほど掛かってしまいます。法人ではともかく、個人で固定費として出費するには高額です。

プライベートアドレスでも公開させる

プライベートアドレスを直接世界に公開する方法はありません。(公開できたらセキュリティ的に世界が混乱に陥りそう。)
※IPv6の場合はよくわからん。

しかし、VPNを利用し、外部に公開されているサーバーと繋ぐことでプライベートアドレスが設定されているPCを公開させることができます。

ユーザーがアクセスするのはあくまでVPSにあるサーバーであり、自宅サーバーの有無は気にしません。

ユーザーはVPSを介して自宅サーバーにアクセスする

このためVPSサーバーが必要となります。2度言いますが、ユーザーがアクセスするサーバーはすべてVPSになります。

仕組みの詳細

VPSサーバーは、OpenVPNnginxが動いています。

VPNの多くはセキュリティのために使用される事が多いのですが、ここでの使い方は、VPSと自宅サーバーを同じ仮想のネットワークに同居させるのが目的です。VPNで双方を繋ぐことにより、VPSと自宅サーバーは仮想的に同一ネットワークに存在するためお互いに疎通することができます。

nginxはProxyサーバーとして利用します。VPS本体にはWebサービス機能はありません。80ポート、443ポートのアクセスがあった場合に、すべて自宅サーバーにupstreamを利用してデータを流すようにしています。

nginx.confサンプルイメージ

upstream webserver {
    server 1.2.3.4:80;  ## 自宅サーバーの仮想IPアドレス
}
server {
    listen  0.0.0.0:80;
    proxy_pass webserver;
}
1
2
3
4
5
6
7
8

このような設定を行うことにより、VPSにWebリクエストが発生した場合、そのままの通信状態で自宅サーバーにパスすることができます。

nginxの注意点

サービスはすべてDocker化しています。docker-hubにあるnginxはWebサービスを特化しているようで、streamには対応していません。そのため自身でソースコードを取得し、コンパイル時にstreamを有効にするためのオプションが必要となります。

dockerファイルの一部抜粋

RUN wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz \
    && tar -zxvf nginx-${NGINX_VERSION}.tar.gz \
    && cd nginx-${NGINX_VERSION} \
    && ./configure --prefix=${NGINX_PREFIX} --user=nginx --group=nginx --with-http_ssl_module --with-threads --with-stream  --with-stream_ssl_module --with-stream_realip_module --with-http_v2_module \
         --conf-path=${NGINX_PREFIX}/nginx.conf \
         --sbin-path=/usr/sbin/nginx \
         --with-debug 
1
2
3
4
5
6
7

通信の暗号化は必要か?

upstreamにて通信を行っている訳ですから、平文での双方向の通信になります。しかしVPNにてトンネル化され、そこで暗号化されているので問題がないと言う認識です。

upstreamを暗号化すると、さらにVPNにて暗号化されてしまい通信が2重暗号化状態になってしまいます。これが良い選択なのかはわかりません