世界を動かす技術を、日本語で。

IPv4接続なしでインターネットを利用する

概要

  • 電源障害 後、ISPのIPv4接続が利用不可となる事象発生
  • IPv6接続 は正常、しかし多くのWebサイトが非対応でアクセス不可
  • Hetzner VPS を活用し、WireGuardトンネルでIPv4通信を復旧
  • NAT/CG-NAT/IPv6 の基礎と実践的な設定例を解説
  • Linux環境 での具体的な対策と構成例の紹介

電源障害とIPv4接続障害

  • ある朝、 ブレーカーが落ちて停電、復旧後もIPv4経由の通信が不能となる事象
  • GitHub等多くのWebサイト に接続できず、GoogleやMetaなど一部のみ利用可能
  • ping -6やtraceroute を利用し、IPv6は正常でIPv4のみ障害と特定
  • 問い合わせの結果、 CG-NAT(キャリアグレードNAT) の不具合が原因と判明
  • ISPの対応待ち は数日必要、業務や学業に支障が出るため早急な解決が必須

NATとCG-NATの仕組み

  • IPv4アドレス枯渇 問題への対策としてNATが利用される現状
    • 家庭内の複数端末が 1つのグローバルIPv4アドレス を共有
    • ルーターが 送信元IPアドレスとポート番号 を変換・管理
    • conntrackツール でNATテーブルの確認が可能
  • CG-NAT はISP側でさらにNATを重ねる技術
    • 各家庭ルーターの更に上位で 複数家庭をまとめてNAT
    • ポート開放やサーバ公開時の障壁
  • NATトラバーサル や回避策についてはTailscaleの解説記事が非常に有用

IPv6の特徴とNAT不要性

  • IPv6アドレス空間 の膨大さ(128bit、約3.4×10^38個)によりNAT不要
    • 一般家庭でも /64サブネット が割り当てられ、端末ごとに固有のグローバルアドレス
    • NATなし でインターネットから直接アクセス可能
  • 逆に ファイアウォール構成 の重要性が増す
    • 任意の外部からの接続を防ぐため、適切なルール設定が必須
  • IPv6非対応サイト が多く、IPv4通信の復旧が必要となる場合が多い

Hetzner VPSとWireGuardによるIPv4トンネリング

  • Hetzner VPS (IPv4/IPv6両対応)を既に所有していたことが幸い

  • WireGuard をVPSと自宅Linuxに導入し、 IPv6経由でトンネル を構築

    • VPS上で Arch Linux 環境を利用(HetznerはISOマウントにも対応)
  • WireGuardの設定例 を提示

    • サーバ側:IPv4/IPv6両方のアドレス付与、NAT設定、転送有効化
    • クライアント側:VPSのIPv6アドレス指定、全トラフィックをトンネル経由に設定
  • NATの細かい設定 (MASQUERADEとSNATの使い分け)や、 IPv6での直接アドレス指定 の利点も解説

    • 直接アドレス指定 :VPSで/64ブロックを持っていればNAT不要、各端末がグローバルIPv6を持てる
    • NAT利用時 :Unique Local Address(ULA)で内部アドレス割当、ip6tablesでSNAT/MASQUERADE設定

まとめと教訓

  • ISP障害時でもIPv6が活用できれば復旧策は多い
  • VPSとWireGuard の組み合わせで、 IPv6しか使えない環境でもIPv4通信が可能
  • NATやCG-NAT、IPv6の仕組み を理解しておくことの重要性
  • セキュリティ対策 としてファイアウォール設定の見直しも忘れずに

Hackerたちの意見

誰かがこれに遭遇したら、SSHプロキシの設定はすごく簡単だよ。ssh -D 8080 user@hostname ってやるだけ。接続ができたら、ブラウザの設定でlocalhost:8080をSOCKSプロキシとして使うようにすればOK。

同じアドバイスをしようと思ってたところだよ。これは一時的な問題に対するずっとシンプルな解決策だし、プロキシを使いたいときの永久的なツールでもある。これを使うには、sshd_configで「AllowTcpForwarding」を有効にするのを忘れないでね。

公共のWi-Fiを使うときはいつもこうしてるよ。VPNにお金を払う必要もないし、信頼する必要もないから、すべてを自分のinfomaniakサーバーにソックスフォワードしてる。

ちょっと誤解を招くタイトルだね。これは「VPSを通じてIPv6トンネル経由でIPv4インターネットにアクセスする」って感じ。4in6とも呼ばれてるし、面白いけどね!うちのISPでは、IPv4で何か壊すと、IPv6で壊すのとは全然違うサポートの問題が出ることがわかる。IPv4が壊れると、ざっくり言うと、結構厳しい「ダウン」状態になる。みんな不満はあるけど、少なくともシンプルなんだよね。IPv6が壊れると、変な感じになって部分的にダウンするから、ユーザーには部分的な障害や、フォールバックによる遅いスタートが見える。特に、ゲートウェイが存在しないのにIPv6があると思ってるときはね。

自分の経験と同じだな。IPv6の問題はトリアージや再現が難しくて、よく「うちでは動くのに」みたいなことになる。

確かにIPv4の長い尾はあるけど、最後にIPv4が家で壊れた時、妻は全然気づかなかったよ。GoogleやFacebook、Apple/iCloud、CloudFlareがホストしてるサイトは全部IPv6で動いてたからね。

最後にIPv4がダメになった時、Githubが使えなくなったから気づいたよ。最近はほとんどの消費者向けウェブサイトがIPv6で動いてるからね。とはいえ、ルーターがIPv4のDNSサーバーしか設定されてなかった人は完全にダウンしてたけど。もしMicrosoftが無能なことをやめてくれたら、私の一番の心配はルーターに割り当てたmDNSホスト名を思い出すことだったな。IPv4が戻ったか確認するためにログインしたいから。

ほとんどのISPは、まだIPv6を完全にブロックしてるよ。小規模なビジネスは一度IPv6を試して、その後AAAAレコードを更新するのを忘れちゃうみたいで、ユーザーにはお気に入りのニッチなものが動いているように見えるけど、実際には支払っているサービスでは動かないから問題が起こるんだ。ちょっと変な問題だよね。IPv4がいつか消え去ることを期待する以外に良い解決策があるかはわからない。Happy eyeballsがこれを解決するはずだったけど、問題はアプリケーション層で発生することが多くて、アプリケーションが何でもできるから、一般的なプロトコルで解決するのは難しいんだ。私がスムーズにするために妥協しているのは、ネットワークでIPv6を有効にして、すべてのブラウザでIPv6 DNSを無効にすることなんだけど、これはあんまり満足できないね。

AppleのApp Storeのルールで気に入ってるのは、すべてのアプリがIPv6専用ネットワークで動くことを求めているところ。これ、何年も前からあるルールなんだ。開発者として初めてこれに直面したときはちょっと驚いたけど、ユーザーとしてはあって嬉しい。

アプリを使っていれば、githubはIPv6でアクセスできるの?

そうだね、でもサーバーにIPv6アドレスは必要ないよ。

その神話のようなIPv6専用インターネットユーザー、実際に存在するんだね :) すごいネットワークエンジニアリングだ。昔、IPv4専用の接続の中でIPv6の作業をするために、そんな感じのが必要だったことがある。サーバーを完全にコントロールできるなら、もっと限定的だけど早い解決策があるよ。ssh -D 1080 -N myserver でSOCKS5プロキシを設定して、ブラウザをそれに合わせた。システム全体で設定できるかもしれないけど、元のSSH接続が壊れちゃうか心配だな :)

自分も同じ状況だよ。すごくイライラする。2週間前から「チケットはオープンで、技術者がすぐに見てくれる」って言われてるんだけど、こういうのは優先度が低いのかな?IPv6は動いてるし、完全な障害とは見なされてないのかも。ドイツでは、そういう場合に消費者に補償を与える法律があるけど、これが該当するかどうかはすぐにわかると思う。この記事の解決策の問題は、いろんなエンドポイントがデータセンターのIP範囲を完全にブロックしたり、いろんなキャプチャのハードルを設けたりすること。これには良い解決策がないんだ。一般的なVPNプロバイダーも同じ。家全体のネットワークを直したかったから、ルーターでもこれをやらなきゃいけなかった。そういう場合、Ubiquiti EdgeRouterみたいな非標準のデバイスがあると便利だよ。FritzBoxみたいなものでWireguardのルーティングやNATルールを設定するのはどうなってたか想像もつかない。唯一の欠点は、ルーターが多くの接続を処理するには力不足だから、ハードウェアオフロードがサポートされているIPSecに切り替えなきゃいけないこと。

FritzboxはVPN接続の設定に関して、かなり使いやすいGUIステップがあるよ。Fritzbox同士の接続を想定してるけど、互換性のあるVPNなら何でも使える。静的なIPv4/IPv6ルートの設定もできる(ホームネットワーク > ネットワーク > ネットワーク設定 > 追加設定 > IPv4ルート/IPv6ルート)。おそらく一番の問題は、ルーターが相手側から期待しているIPsec暗号化の設定を理解することだろうね(Wireguardの方がずっと簡単だけど、ハードウェアアクセラレーションの問題にぶつかるかもしれない)。もし本気でやりたいなら、Fritzboxの設定ファイルをバックアップして、ダンプを編集してVPNエンドポイントを手動で設定して、チェックサムを再計算して(そのためのツールもある)、設定ファイルを再インポートすることもできるよ。AVMにはユーザーがアクセスできない設定がたくさんあって、そうやって調整できるけど、ルーターを壊さないようにアクセスがちょっと難しくなってるんだ。

ドイツの状況はわからないけど、オランダでは、固定回線とモバイル回線を同じISPで契約していて、固定回線がダウンした場合、復旧するまで無料のモバイルデータを要求できるよ。これ、ISPに聞いてみる価値があるかもね。

仕事でいくつかのIPv6専用VPNを運営してるんだけど、内部インフラにアクセスするためにね。今のところ一番の問題は、WindowsとmacOSのクライアントがv6のDNSサーバーを必要とすること。そうじゃないと、v6onlyhost.vpn.example.comを解決しようともしないから。クライアントがv6対応ネットワークにいるかどうかわからないから、VPN内にDNSサーバーを立ててそれをクライアントにプッシュしなきゃいけない。VPNが切断されたときに、Wireguardアプリが何らかの理由でDNSを元のものにリセットできないと、いろんな問題が起こるんだよね。

ISPからのIPv4専用ネットワークとmacOSを使うと、DNSサーバーなしでIPv6専用ができることに気づいたよ。詳しいことは今は覚えてないけど、数年前に調べたとき、macOSはIPv6アドレスさえあれば問題なく動くってわかったんだ。ホストにULAアドレスを設定すれば、すぐに使えるよ。ただ、これにはユーザーがそのやり方を知っている必要があるし、VPNアプリケーションに依存してIPv6専用ネットワークにアクセスする場合は、ULAを追加するスクリプトを作れるかもしれないね(どんな種類でも、作り物でも)。作り物のULAを残しておくのは良くないよ。ユーザーがIPv6対応のネットワークに移動したときに問題が起こる可能性があるから。

もし本当にIPv6だけの環境でv4接続が必要になったら、パブリックDNS64+NAT64ゲートウェイを使うといいよ。リストはここで見つけられるよ: https://nat64.net/public-providers。普通の使い方なら、DNSサーバーを変えるだけで済むからね。これがそのコンボ。 ** 1. DNS64。AAAA DNSレコードがないものをNAT64ボックスに合成する。$ dig +short @2a00:1098:2c::1 AAAA github.com 2a01:4f8:c2c:123f:64:5:141a:9cd7 ** 2. NAT64。DNS64のおかげで送られてきたトラフィックを受け取って、プロトコルを変換してNATしてくれる。$ curl --resolve github.com:443:[2a01:4f8:c2c:123f:64:5:141a:9cd7] https://github.com/

Cloudflare WARPを使うと、もっと速くなるよ。WARP経由で直接IPv4アドレスに接続できるしね。

誰かがIPv6を試したいけど、ISPが提供してない場合、Hurricane Electric(HE)が何年もトンネルサービスを提供してるよ: * https://tunnelbroker.net * https://ipv6.he.net システム(またはルーター)でtunデバイスを立ち上げてトラフィックをルーティングするためのスクリプトもあるよ: * https://fedoraproject.org/wiki/IPv6_tunnel_via_Hurricane_Ele... * https://brandonrozek.com/blog/obtaining-ipv6-address-hurrica... * https://wiki.dd-wrt.com/wiki/index.php/IPv6_setup_Hurricane_... * https://forum.mikrotik.com/t/auto-update-script-for-hurrican... * https://docs.rockylinux.org/guides/network/hurricane_electri...

ここにいるのは「顧客」だけど、OpenBSDを通じて彼らの無料の6in4トンネルを約5年間使ってて、特に問題はなかったよ。自分のはOpenBSDのネットワークインターフェースファイルだけで設定してる。例えば、/etc/hostname.gif0: tunnel inet6 128 alias !route -n add -inet6 default。これを使って、パブリックIPv4アドレスなしで意図的に設定したAWSのVPSクラスターにアクセスしてる。そうしないと、Jeff BezosみたいなやつがIPv4アドレススペースを積極的にマネタイズしてるから、月々のコストが大きくなっちゃうんだ。

これに関してちょっと面倒な点があって、ストリーミングサービスを使う場合は、そのトンネルを無効にする方法を考えないといけないんだ。地域制限のコンテンツブロックを回避するためのVPNみたいにブロックされちゃうからね。それでも、全然問題なく動くけど。RAの力のおかげで、ルーターがHEトンネルをサポートしてなくても、ネットワーク内のどのデバイスでも/64をアドバタイズすれば、IPv6ルーターになれるよ(ルーターがセキュリティ上の理由でRAをフィルタリングしない限りね)。ポートフォワーディングのルールをいじらなくても、家庭内ネットワークからホスティングするのにすごく便利だよ。

注目すべき点として、私の知識ではHEのトンネルはISPから公衆IPv4が割り当てられている場合にしか機能しないよ。キャリアグレードNATの背後にいると、残念だけど、IPv6を家庭に持ってくるためには別の解決策が必要になるね。

ハリケーン・エレクトリックは素晴らしいけど、ISPが提供するIPv6を使う人が増えてきて、普通のユーザーはトンネルを使わなくなってるんだよね。それで、ネットワークサービスがhe.netのトンネルを悪用扱いしてる。多くのサイトが障壁を設けたり、単に動かなくなったりするから、ほとんどのネットワークでIPv6の使用をやめざるを得なかったよ。

トンネルを介してパブリックアドレスを使いたいとき、IPv6だと楽なんだ。特定のIPv4へのトンネルを設定して、デフォルトルートを削除して、その削除したルートを他のエンドポイントのIPv4ルートとして追加して、トンネルのもう一方のエンドのIPv4をデフォルトルートとして追加する代わりに、IPv6を介してトンネルエンドポイントに接続すればいいんだ。すべてのIPv4はトンネル内で設定されるからね。これ、よく使うよ。携帯ネットワークのIPv6は、著者と同じように、ネイティブIPv6とキャリアグレードNAT IPv4が一緒だから、ほとんどのNAT実装はイマイチなんだ(タイムアウトすることがあるし)。まだWireGuard(r)では試してないけど、近いうちにやってみるつもり(NetBSDのクリーンな再実装を使って)。でも、tincは本当に簡単だよ。[1] https://www.tinc-vpn.org

こんなに長い間、全てのマシンやホームラボをIPv6に切り替えるために何日も悩む理由が見当たらないんだよね。ポートフォワーディングやファイアウォールのルールの方が直感的だし、全てをトラブルシューティングして、ファイアウォールを再設定して、ネットワークの再番号付けをするのに何週間もかけるのはちょっと…何か見落としてるのかな?

それがそんなに難しくないってことを見落としてるよ。もし複雑な家庭用ネットワークを持っていなければ、IPv6の設定はせいぜい一晩で終わるはず。俺のネットワークとISP(コムキャスト)では、ルーターでIPv6をオンにするだけで、ISPからプレフィックスを取得してローカルに広告するだけ。それから外部からアクセスしたいものに対してファイアウォールのルールを追加するだけ(そんなに多くないけど)。

何もないよ。企業の世界では、IPv6を導入するメリットとデメリットが釣り合ってない。俺は約3500台のデバイスを管理していて、7つの建物があって、10ギガのWAN接続が2つと4ギガのWAN接続が1つあって、NATを使って約26のパブリックIPv4アドレスを持ってる。今のところ、IPv6を採用する明確な理由はないね。デュアルスタックの設定は、あまりメリットがないのに不必要なトラフィックと複雑さを加えるだけ。今でも静的IPv6アドレスのブロックを割り当ててもらうのは難しいし、2回申請して却下されたこともある。だから、メリットが少ないだけじゃなく、ブロックを割り当ててもらうのもまだ難しいんだ。