私はアパートに住んでいる時、共用LAN環境で固定IPが他の居住者と共用ということがありました。その場合、例えばAWSでアクセス制限をする際にそのグローバルIPで許可をすると、セキュリティホールになる可能性があります。
特に昨今のアパートの共用LANは施設で一括で導入し配信しているため、通信を上流でどのようにあつかっているのかがわからないというリスクがあります(複数棟で共有しているケースもあり、顔を知らない人と通信を共用することになることがある)。
どうにかできないか?考えて見た結果、VPSにサーバーを立てて、そこにnginxプロキシとインターネットゲートウェイを設ける構成で抜けることができましたので、そのお話を書こうと思います。
構成図
VPSはConoha VPSを使用し、Ubuntuイメージで構築しています。
ネットワーク関連の機能のみに特化して使用するため、Ubuntuが使用できる最小構成であるメモリ1GB構成で使用しています。
VPN対応ルーターには、メルカリでも安く購入できるRTX1200を使用しています。ただ、Webサーバー公開以外の用途(VPNでVPSから全て通信させたい)で使用する場合には通信が非常に低速になりやすいので、FQDNブレークアウト機能に対応したバージョンのYAMAHAルータを使用することをお勧めします。


何をやりたかったのか
- Jenkinsなどの開発サーバーを、Github Actionに接続したかった。
- 試験構築の個人プロジェクトを、サーバーにホスティングしたかった。が、サービスごとに構築するのはコスト的にハードルが高かった。
- 個人で安価にというとサーバーレス構成がメインとなるが、クラウドサービスへの依存を減らした状態で運用したく、サーバーを設ける構成としたかった。
- 当時の自分はPHPerであり、サーバーレスは取ることができない選択肢だった。
- サービスをコンテナ化しており、VPSで安価で構築することはできなかった(メモリ、CPUを多く使用する。メモリ4GB以上が最低限の要件であり、VPSだとさくらのVPSで見ると月額3000円を超えてしまう)
- 業務で使用しているWEBサイトのアクセス制限に固定IP制限が要素の一つとして存在し、自宅のIPを申告する必要があった。
- ただ、外出先(出張先)などで閲覧できない問題があった。
- 業務的に言えば、所属会社からVPNは公開されていた(ただし、線が非常にほそく、常時接続を推奨するようなアナウンスはなかった)、かつ、ガイドライン上も問題なかった。そのため(本来はよくないが)特定IPからの通信を許可する設定が開発者向けに許可されていた時期があった。
設定内容
ローカルで動作している端末のIPを固定する
せっかくVPNを設定してもIPが変わっては問題のため、プライベートIPを固定します。
ここの内容については、説明をスキップします。
参考までに、Linuxでの設定方法のリンクを掲載します。
VPS上のNGINXに、設定したIPに通信を飛ばすように設定する
続いて先ほど設定したホストに対し転送する設定を入れます。
server {
server_name (公開ホストDNS名);
location / {
proxy_bind 192.168.0.1;
proxy_pass http://(WEBサービスがホストされているサーバーのローカルIP):(ホストされているポート);
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
WEBサービス公開SSLを使用するため、Certbotが使用するディレクトリはVPS内の領域を参照するように設定する
現代では、基本的にWEBサービスはすべてSSL通信となっていると思われます。これに対応するために、CertbotでLet’s EncryptのSSLを取得します。
Certbotはローカルにチャレンジファイルを置き、それがインターネット上からアクセス可能であることを確認することでSSLを発行します。そのため、Nginxが作動しているサーバー上でCertbotを起動した際にVPS上に生成されたチャレンジファイルが見えるよう、Certbotが使用するファイルのみはVPSの領域を見るように調整します。
# --- 80 (HTTP) ブロック(統合版) ---
server {
listen 80;
server_name (公開ホストDNS名);
# SSL更新用のパスだけは残しておく
location /.well-known/acme-challenge/ {
root /usr/share/nginx/html;
}
# それ以外はすべてHTTPSへリダイレクト
location / {
return 301 https://$host$request_uri;
}
}
DNSを設定する
VPSのIPを、ネームサーバーに登録します。
通常はドメインを取得したサービスにて提供されているネームサーバーの設定変更となりますが、Microsoft365などを使用しネームサーバーを設定変更している場合には、そちらのネームサーバーへ設定してください。
現在設定されているネームサーバーは、NSレコードを参照することで確認できます。Linuxでは、下記コマンドで調べられます。
nslookup -type=ns (対象ドメイン). 8.8.8.8
Certbotを使用してSSL証明書を取得する
基本的にはウィザードに従って操作すれば、Nginxの設定ファイルに必要な情報を追記の上、証明書の取得・定期的な更新が行われます。公式サイトのリンクを掲載します。
そもそも:固定IP提供サービスはなかったのか?
固定IPをアパートのネット回線業者に依頼すると発行してくれるサービスもありましたが、その場合月額費用(筆者環境では、月額1100円)がかかってしまいます。またゲーム用のサービスのため、発信元IPを固定する以外の用途では使用できないため、以下のようなことができません。
- 外出先では作業することができません(サーバーを立ててはいけないと利用規約にあり、VPNサーバーももちろんNG)。
- WEBサービスを外部に公開することができません(サーバーを立ててはいけないと利用規約にあり、もちろんNG。できるのであれば、Github Actionなどに簡単に接続させられますが…)。
- 引っ越しのたびに各サービスのIP制限フィルタ内容を変更しないで運用したい。


コメント