Nuro光回線の接続方式が「MAP-E方式(IPv4 over IPv6)」に変更され、自宅WEBサーバ公開が詰んでからの復旧までの道のり
昨今のIPアドレス枯渇問題の解決策として、各プロバイダーはIPv6への移管を徐々に進めてきています。
Nuroも同様であり、最近、Nuro光の回線が不調になり、調査したところルータが原因と判明。
電源入っているのに疎通しない。
そこでNuroサポートに問い合わせてONUルータ交換を依頼しました。
しかし届いたルータは利用中の機器とは別の機種(HG8045QからSGP200Wへ)となっており、ONU交換したことで、自宅のインターネット環境がこれまでの接続方式「IPv4/IPv6デュアルスタック」から「MAP-E(IPv4 over IPv6)」方式へ強制的に切り替わりました。
この結果、自宅で運用していたWebサーバのグローバル公開が不可能に!
この「MAP-E」方式は、従来のように自宅ごとに専用のグローバルIPv4アドレスが割り当てられず、プロバイダ側で多数ユーザーの通信をひとまとめにして“共有グローバルIP”でインターネットに接続する仕組みです(MAP-EではグローバルIPv4アドレスが割り当てられず、NAT越えも不可能になるため)

ルータ交換後、設定のために管理画面にログイン。写真の通りDMZ設定およびポートマッピング設定で「MAP-E機能動作中のため本機能は設定できません」との表示。これで「外部から自宅のWebサーバにつながらない」ことを理解。
回線を変えるか、IPv6で公開するか
そこでまず考えたのが、以下の通り、回線を変えるか、IPv6で公開するか、自宅サーバをやめるか。
A. 別の固定IP付き回線を新規契約
- GMOとくとくBB(v6プラス非対応プラン)やフレッツ光+固定IPサービス、**auひかり(ホームタイプ一部)**等で「固定IPv4」を再導入
- メリット: これまで通り自宅サーバ可
- デメリット: コスト増、回線切替・工事等の手間
B. オプションで固定IPv4アドレス契約(Nuroの場合は現状不可)
- Nuro光は基本的にMAP-E以降は個人向け固定IPv4非対応(2024年時点)
- 法人向けなら選択肢ありだがコスト・審査が重い
C. IPv6で外部公開(IPv6対応サーバとして運用)
- ルータ・サーバをIPv6対応し、外部からIPv6アドレスでアクセス
- メリット: 将来的な主流化に備えた先行対応
- デメリット:
- 訪問者(ユーザー)がIPv6ネットワークからアクセスしないと到達不可
- 独自ドメインでのDNS AAAA対応が必須
- クライアント側普及度は8〜9割だが、まだIPv6は「誰でも必ずOK」ではない
D. VPS/クラウド専有サーバ活用
- VPS(月500〜1,000円程度)やAWS EC2で専有サーバを用意
できれば、コストはかけたくないので、上記案は却下。
そこで、サーバレス案も検討してみる。
実現可能な「サーバレス」運用モデル
サーバレス化の方がコストは安価で済むので、以下を検討した。
A. WordPress静的化+サーバレス配信
フロー例
- WordPressはローカルで管理し、S3に吐き出し(投稿時はhosts切替でローカル更新)
- 記事やページの静的HTMLを生成(例:Simply Static/Plugnなど)
- S3+CloudFrontに静的ファイルとしてデプロイ=完全サーバレス配信
- 編集時のみWPサーバ起動、公開時は“ゼロ運用コスト”
メリット
- サーバレスのコスト・スケール・安定性
- セキュリティ(攻撃面少ない)
デメリット
- ダイナミックなプラグインやコメント機能は原則使えない(外部サービス連携で補える)
B. Headless CMS+サーバレス構成
- WordPress「ヘッドレス」化(=APIサーバ化)→
- 記事データをREST APIまたはGraphQL経由で公開
- フロントはNext.js, Nuxt.js等のJamstack(静的生成/SSR)
- AWS Amplify, Vercel, Netlify等で静的/SSR配信
- データはS3, DynamoDB, Aurora Serverless等に格納
C. AWS Lambda+PHPレイヤーでWP運用(チャレンジ枠)
- Lambda上にPHP実行環境を構築し、API Gateway+Aurora Serverless(MySQL互換)と連携
- 実現例:WordPress on Lambda Layer(非公式プロジェクト)
- 実運用は工夫・検証必須。日本語情報少なめ
D. 「WordPressライク」な完全サーバレスCMSを利用
- 例:Ghost(Node.js静的/Jamstack対応)
- Notion+Super.so等のノーコード静的CMS
- Netlify CMS, Contentful, Strapi, MicroCMS(API連携)
暫定対策としては、上記のS3+CloudFront案として進めることとした。
プラグインは使えず、表示を確認していたが、環境依存や記事が大量にある。
結局、自作スクリプトで公開ディレクトリをS3に手動同期することにした。
また日本語ページや画像で文字化けが発生したため、以下のように対処しました。
- S3アップ時に「Content-Type: text/html; charset=utf-8」をスクリプトで明示。
- ファイル名もURLエンコードで統一し、表示崩れを防止。
埋め込みリンクの文字化けやリンク切れがあり、埋め込みリンクだけ機能しないのが
修正しきれず残念ではあるが、これで一旦暫定とした。
マイIPというサービスを見つけた
インターリンク社のマイIPというサービスがあるのを発見。
https://www.interlink.or.jp/biz/aff/vpn/myip_3min.html
これ見ると、VPNサーバ経由でアクセスって話だった。
なるほど納得。

そこで、GCPのFreeTier(米国リージョン)を使えば、無料でサーバ立てられるので、
自前でVPNサーバ立てれば解決できそうだ。
というわけで、以下の通り進めることとした。
恒久対策:「GCP+WireGuard+Nginx+HAProxy」で自宅サーバを復活
1. GCPに「公開用サーバ(リバースプロキシ)」を新設(無料枠/米国リージョン)
- パブリックIP・必要なポート(UDP 51820, TCP 80/443)を開放。
- GCPの「無料枠(Free Tier)」を利用することで、サーバ費用はほぼゼロ。
2. GCPと自宅サーバ間にWireGuard VPNトンネルを構築
- GCPサーバと自宅サーバが仮想的に同一ネットワークに。
- 自宅側のWireGuardクライアントにはこれまで利用していたHAProxyのサーバを中継として挟むことで、
Nginx(GCP)→WireGuard→HAProxy(自宅)→OpenLiteSpeedのリバースプロキシ構成を実現。
WireGuardサーバ側の設定
[Interface]
PrivateKey = サーバーのプライベートキー
Address = 10.8.0.1/24 # VPN内のIPアドレス
ListenPort = 51820
[Peer]
PublicKey = クライアントのパブリックキー
AllowedIPs = 10.8.0.2/32
WireGuardクライアント側の設定
[Interface]
PrivateKey = クライアントのプライベートキー
Address = 10.8.0.2/24
[Peer]
PublicKey = サーバーのパブリックキー
Endpoint = GCPの外部IP:51820
AllowedIPs = 10.8.0.1/24
PersistentKeepalive = 25
3. GCP側Nginxでリバースプロキシ設定
- GCPグローバルIPへのアクセスをWireGuard越しで自宅のHAProxyへ中継。
- HAProxyが各種リクエストをOpenLiteSpeedサーバに振り分け。
Nginx設定
events {
worker_connections 768;
}
stream {
server {
listen 443;
proxy_pass 10.8.0.2:443;
}
server {
listen 80;
proxy_pass 10.8.0.2:80;
}
}
4. SSL証明書(Let’s Encrypt)はOpenLiteSpeed側で運用
- 外部からのリクエストはGCP-Nginxで一度受けたあとWireGuardトンネルを経由して自宅へ。
- SSL終端はOpenLiteSpeedで完結させているため、GCP側はリバースプロキシのみ。
5. DNS(Route53)でAレコードをGCPグローバルIPに変更
- AWS Route53で全ドメイン管理を一元化。
■ まとめ:MAP-E時代の“自宅サーバ運用”生存戦略
IPv6+MAP-E時代、従来方式の自宅サーバへのダイレクト公開は消滅に近い。マイIPサービスがヒントになった。
Nuro回線でもコストをかけずにGCP/AWS/VPS+VPNトンネル+Nginx+HAProxy+OpenLiteSpeed+Route53という組み合わせで「疑似グローバルIP・SSL化・マルチドメイン」全て維持し続ける道はある。
同じ悩みを持つ方のヒントや勇気になれば幸いです。