自宅サーバーを立てたv2。
現状2022/08現在のネットワークやサーバーの状態です。自宅サーバーを推奨するものでもなく、クラウドを卑下するものでもありません。お金があれば大容量のクラウドを契約したいです。
設備情報
- マンションに付属している無料のネット回線
- 残ったパーツで作った自作サーバー
- 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サーバーが必要となります。2度言いますが、ユーザーがアクセスするサーバーはすべてVPSになります。
仕組みの詳細
VPSサーバーは、OpenVPNとnginxが動いています。
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;
}
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
2
3
4
5
6
7
通信の暗号化は必要か?
upstreamにて通信を行っている訳ですから、平文での双方向の通信になります。しかしVPNにてトンネル化され、そこで暗号化されているので問題がないと言う認識です。
upstreamを暗号化すると、さらにVPNにて暗号化されてしまい通信が2重暗号化状態になってしまいます。これが良い選択なのかはわかりません。