メインコンテンツへスキップ
見出し画像

NuroのMAP-E化で詰んだ自宅公開WEBサーバをVPN(WireGuard)経由で完全復旧した話

    ■ はじめに

    Note書くのは久しぶりです。今回はタイトルのお話です。

    自宅の光回線が不調になり、Nuro光のONUIルータが原因と判明。サポートに依頼し、ルータ交換を依頼したが、ここで機種がこれまでのHG8045QからSGP200Wへと変更となった。
    これによりNuroのネットワーク構成が「デュアルスタック(IPv4/IPv6)」から**MAP-E(IPv4 over IPv6, DS-Lite)**へと自動的(強制的に)に切り替わりました。

    この「MAP-E」方式は、従来のように自宅ごとに専用のグローバルIPv4アドレスが割り当てられず、プロバイダ側で多数ユーザーの通信をひとまとめにして“共有グローバルIP”でインターネットに接続する仕組みです(いわゆる“キャリアグレードNAT”)。

    その結果、筆者の自宅Webサーバに外部からアクセスできなくなりました。(MAP-Eはポート開放も不可、サーバ公開もほぼ機能しない)

    画像
    DMZ設定は不可
    画像
    ポートマッピング設定は不可

    ルータ交換後、設定のために管理画面にログイン。DMZ設定およびポートマッピング設定で「MAP-E機能動作中のため本機能は設定できません」との表示。これで「外部から自宅のWebサーバにつながらない」ことを理解。MAP-E特有の**“NAT越え不能・グローバルIP未割当”**問題に直面。サーバ運用者なら一度は遭遇する「公開不可」という“詰み”状態に陥りました。


    ■ “疑似グローバルIP”公開の鍵は「GCPの無料枠(米国リージョン)」だった

    自宅サーバ公開を復旧させるため、Google Cloud Platform(GCP)の無料枠(Free Tier)──米国リージョンの最小スペックVM(f1-micro)を活用。
    これでコストをかけずに「固定グローバルIP付きの公開用サーバ」を用意し、このVPNサーバを経由することで再び外部公開が可能
    となりました。
    こちらのWEBサイトです。


    ■ サーバ公開“詰み”からの再構築ロードマップ

    1. まずはAWS S3で“静的サイト”として退避

    • ルータ設定の際にWEBサーバ公開不能に気付いたタイミングで、急遽「**静的サイトとしてS3に逃がす」**作戦を決行。

    • S3は手軽・堅牢だが、そのままではSSL(HTTPS)が使えないため、独自ドメイン+HTTPSの運用が困難。

    2. CloudFront導入でSSL&高速配信に対応

    • S3直アクセスではSSL不可なため、AWS CloudFront(CDN)をS3前段に設定。

    • CloudFront経由でSSL証明書自動発行+HTTPS公開を実現。

    • DNS(Route53)でA/CNAMEレコードをCloudFrontに切替。

    3. 静的サイト化プラグインが使えず、独自スクリプトでS3転送・文字化けも手作業で回避

    • 本来はWordPressの「Simply Static」等のプラグインで一括静的出力したかったが、環境依存や大量記事でエラー多発、断念。

    • 結局、自作スクリプトで公開ディレクトリをS3に手動同期。

    • ここで日本語ページや画像の文字化け発生。
       - S3アップ時に「Content-Type: text/html; charset=utf-8」をスクリプトで明示。
       - ファイル名もURLエンコードで統一し、表示崩れを防止。

    <構成>
    インターネット
    |
    v
    [ CloudFront (CDN, SSL対応) ]
    |
    v
    [ AWS S3 (静的サイト, 文字コード/エンコード対策済) ]


    ■ 恒久対策:「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のリバースプロキシ構成を実現。

    3. GCP側Nginxでリバースプロキシ設定

    • GCPグローバルIPへのアクセスをWireGuard越しで自宅のHAProxyへ中継。

    • HAProxyが各種リクエストをOpenLiteSpeedサーバに振り分け。

    4. SSL証明書(Let’s Encrypt)はOpenLiteSpeed側で運用

    • 外部からのリクエストはGCP-Nginxで一度受けたあとWireGuardトンネルを経由して自宅へ。

    • SSL終端はOpenLiteSpeedで完結させているため、GCP側はリバースプロキシのみ。

    5. DNS(Route53)でAレコードをGCPグローバルIPに変更

    • AWS Route53で全ドメイン管理を一元化。

    <構成>
    インターネット
    |
    v
    [ GCP (無料枠VM, 米国リージョン) ]
    | (Nginxリバースプロキシ)
    v
    ===[ WireGuard VPNトンネル ]===
    v
    [ 自宅サーバ群 ]
    ├─> [ HAProxy (中継) ]
    | |
    | v
    | [ OpenLiteSpeed ]
    | (WordPress, SSL終端)


    ■ なぜこの構成で自宅サーバ公開ができるのか?

    • 独自ドメインはRoute53上で管理。GCP(無料枠)のグローバルIPをAレコードに設定。GCPが“公開窓口”となり、インターネット経由のアクセスを受付。

    • WireGuard(VPN)でGCPと自宅LANが内部IPで安全に直結。

    • GCP-Nginxは「公開窓口」、HAProxyで細かいリクエスト制御、最終的にOpenLiteSpeed(自宅サーバ)に到達。

    • SSLは自宅サーバ側(OpenLiteSpeed)で完結しているため、証明書管理もシンプル。


    ■ 運用Tips・注意点

    • SSL証明書(Let’s Encrypt)はOpenLiteSpeed側で自動取得・更新。

    • GCPコストは無料枠・microプラン活用で実質ゼロ運用が可能。

    • 自宅サーバはグローバル公開不要、セキュリティも向上。

    • Route53管理なら複数ドメインの一元化も容易。

    • 静的サイト退避時は**「ファイル名のエンコード」「文字コード・Content-Type」指定**も要チェック。


    ■ エピソード:プラグイン断念、自作スクリプトで地道に転送

    ルータ交換後しばらくして「外から自宅サイトが見えない」ことに気付く。
    WordPress静的化プラグインではうまく変換できず、独自スクリプトでS3に手動転送&Content-Type修正を地味に繰り返す日々。
    CloudFrontとRoute53連携でSSLも維持し、Web公開はギリギリ継続。
    最終的にはGCP無料枠+WireGuard+Nginx+HAProxy+OpenLiteSpeedという「現代的で安全な公開経路」を獲得できた。


    ■ まとめ:MAP-E時代の“自宅サーバ運用”生存戦略

    IPv6+MAP-E時代、従来方式の自宅サーバへのダイレクト公開は消滅に近い。でもGCP/AWS/VPS+VPNトンネル+Nginx+HAProxy+OpenLiteSpeed+Route53という組み合わせで
    「疑似グローバルIP・SSL化・マルチドメイン」全て維持し続ける道はある。

    同じ悩みを持つ方のヒントや勇気になれば幸いです。


     
     
    AIベンチャーに勤務するプロジェクトマネージャー Hackintosh好きなmacOSXマニア 元フルスタックエンジニア ▼Blog▼ https://osmaniax.1banzaka.com

    あなたへのおすすめ