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

インターネットの中央集権化とNATの原罪

概要

  • NATの普及 により、個人がサーバーを運用することが困難に
  • FTPサーバーやピアツーピア通信 が一般的でなくなった背景
  • ポートフォワーディングやSTUN/TURN/ICE などの回避策の限界
  • IPv6の導入遅延 と運用上の問題
  • インターネットの中央集権化 とその影響

NATがもたらした「普通の人がFTPサーバーを持てない理由」

  • xkcd #949 のコミックでは、一般人がFTPサーバーを持つ発想自体が珍しいと描写
  • 一般ユーザーにとって「他人が自分のPCに接続できる」という考え自体が 危険・異質 と感じられる現状
  • NAT(ネットワークアドレス変換) の導入が、個人サーバー運用の障壁となった歴史
  • NATは IPアドレス枯渇問題ルーティングのスケーラビリティ への短期的解決策としてRFC 1631で提案
  • 家庭用ルーターでは プライベートIPアドレスNAT が組み合わさって運用されることが一般的

NATの仕組みと通信の制約

  • 端末から外部サーバーへ通信時、NATにより 送信元IP/ポートが変換 される
  • 外部からの新規接続要求に対し、NATは どの端末へ転送すべきか判断できず通信が成立しない
  • 外部からの接続 が難しいため、FTPサーバーやゲームサーバーの運用が一般家庭で困難

回避策とその限界

  • ポートフォワーディング :特定ポートへの通信を指定端末に転送する手法
    • 1つの パブリックIP+ポート につき1台の端末しか割り当てられない制約
    • CGNAT (キャリアグレードNAT)環境下ではユーザーが設定できず、さらに困難
  • UPnP/NAT-PMP/PCP :ソフトウェアが自動でポート開放を要求する仕組み
    • セキュリティ上の懸念や初期実装のバグで 無効化されていることが多い
  • STUN :外部サーバー経由でNAT越しの自分のグローバルIP/ポートを確認
    • コーン型NAT では有効だが、 シンメトリックNAT では使えない場合が多い
  • TURN :中継サーバー経由で通信を実現( 遅延増加・サーバー運用コスト が発生)
  • ICE :あらゆる手法を順次試行し、どれかが成功すれば接続成立(WebRTC等で採用)

IPv6と本来の長期的解決策

  • IPv6 はグローバルユニークなアドレスを全端末に割り当て、NATを不要にするはずだった
  • IPv6導入が 想定より進まず、導入済みでも「慣習的なNAT的運用」や 不要なファイアウォール が残存
  • Unique Local Address (fc00::/7)をIPv4のプライベートアドレスのように使う運用も散見

インターネット中央集権化の進行

  • NATの普及 が「サーバー運用は特別なこと」という意識を生み、 クラウド・クライアントサーバーモデル が常識化
  • 個人が自宅PCでサービスを公開することが 困難・高コスト となり、 VPS等の外部サービス依存 が進行
  • 「NATはセキュリティ機能」と誤認され、 本質的な解決策(IPv6や本物のファイアウォール) の普及を妨げる一因に
  • 結果として、 分散・オープンなインターネット から 中央集権的なプラットフォーム へのシフトが加速
  • ファイル転送や個人サーバー運用が難しくなった根本的要因として NATの歴史的役割 が大きい

Hackerたちの意見

NATとSSLが登場する前のことを思い出すな。確かに、物を簡単に共有できたけど、誰でも簡単にハッキングされるリスクがあった。NATが導入されても、共有はまだ簡単で、いろんな「海賊版」アプリや、NATパススルーのメッセンジャーがあったし。前でも後でも、技術的な知識が必要だったよ。コンピュータに詳しくない人にFTPサーバーを設定してくれって頼むのは無理だし、もしやっても大変なことになるし、全ドライブを共有しちゃう可能性もある。どんなことでも同じだね。とにかく、IPv6での完全な非NATが来るから、どんなことになるか見てみよう。

それには、ユニークなアドレスを持つ各エンドポイントにファイアウォールが必要になるんだ。俺のスマホはよくIPv6アドレスを持ってるんだけど(この休暇に、誰も気づかなかった孤立したIPv6エントリのせいで、あるサイトが解決できなかった)、特に問題はないかな。ルーターにも「ファイアウォール」があるかもしれないし、スマホには受信接続ができないかも。よくわからないけど、いずれにせよ、スマホはうまく動いてるみたいだ。

とにかく、IPv6での完全な非NATが来るから、どんなことになるか見てみよう。実際に見てから信じるよ。今のところ、IPv6がすぐに勝つとは思えないね。

境界やローカルでのファイアウォールがこれを補ってくれたんだ。NATは関係ないよ。NATなしでもファイアウォールはちゃんと機能するし、ファイアウォールなしでNATもできる。NATはセキュリティのためのものじゃなくて、昔からそうじゃなかった。IPv4の供給を伸ばして、各エンドポイントが一つの貴重なV4 IPを持つためのものなんだ。

NATを「原罪」と呼ぶのは大げさすぎる。キャリアグレードNAT(CGNAT)は、本当に悪い概念で、CGNATされたユーザーの自由を制限する。でも、普通のNATは制御できる限り問題ないよ。「ポートフォワーディングを面倒に思う人はいない」ってのは、主に家庭用ゲートウェイの使い勝手が悪いせいだし、運営側の怠慢もある。UPnPも同じ。実際、NATのおかげで、未パッチの古いWindowsバージョンを使っている無防備なデバイスが、オープンなインターネットに接続した瞬間にハッキングされるのを防いでいるんだ。

実際、NATのおかげで、未パッチの古いWindowsバージョンを使っている無防備なデバイスが、オープンなインターネットに接続した瞬間にハッキングされるのを防いでいるんだ。NATが適当なアドホックファイアウォールとして機能しているとは思わないな。デバイスをある程度守ってはいるけど、開発者がセキュリティに無関心になるほどではないし、任意のホストに接続するのを止めるほどでもない。これが巨大なボットネットエコシステムを助長しているんだ。

実際、NATのおかげで、未パッチの古いWindowsバージョンを使っている無防備なデバイスが、オープンなインターネットに接続した瞬間にハッキングされるのを防いでいるんだ。逆に、NATがあるせいで人々はセキュリティを無視し始めたんだよ。「どうせNATされてるし」ってね。NATは本来セキュリティに重要なものではなかったのに。それがファイアウォールの役割なんだから。

そうだね、NATはまだ「どの家庭もパブリックIPアドレスを持つ」って感じだ。これはオープンなインターネットのための良い基盤だよ。家でサーバーをホストすることもできるし、子供の頃にたくさんやって、いろいろ学んだな。あんまり洗練されてはいないけど、ちゃんと機能してる。もし「パブリックIPアドレスはもらえない、すべてのトラフィックは他の人がホストするサーバーを通過しなきゃいけない」ってモデルになったら、オープンなインターネットは終わりだよ。携帯電話にはそれがうまく機能するけど、TCP/IPのローミングサポートがないのを回避するためのハックだから、住宅用インターネットとしては違法にすべきだと思う。

「ポートフォワーディングを面倒に思う人がいない」というのは、主に家庭用ゲートウェイ側のクソみたいなUXと、オペレーターの怠慢の問題だね。UPnPも同じ。ポートフォワーディングのハックを使おうとすると、すべてのソフトウェアが自分が見ているIPアドレスと、相手が見ているIPアドレスが違うことに対処しなきゃいけなくなる。そして、すべてのプロトコル設計がその可能性を考慮しなきゃいけない。UPnPを加えると、実際のアプリケーションと並行して、全く別の(デザインが悪い)プロトコルを実装しなきゃならなくなる。相手が見ているアドレスを見つけるのも簡単じゃないし、今でもそれをやるための信頼性のないハックがたくさんある。HTTPが全てじゃないんだよね。実際、HTTPが「全て」になること自体が問題の一部だった。

NATは、IPv4がアドレス空間を持っていないから、ジャンクなインバウンドデフォルト拒否として機能しているだけだよ。アドレス枯渇がない世界では、NATが解決することはほとんどない。思いつくのは、対称ルーティングが必要な企業環境でのリターンルーティングを強制するためのジャンクな方法くらいかな。別の宇宙(またはIPv6を持つ現在の宇宙)では、すべての家庭用ルーターがデフォルトでインバウンドセキュリティポリシーを拒否し、家庭の管理者がポートフォワーディングのように必要に応じて穴を開けられるようになっているはず。

NATとCGNATの境界を引くことはできないと思う。シングルNATがこれほど機能するのは、CGNATでダブルNATをすることが許容される理由の一つだ。NATの考え方は、ルーターを通るトラフィックの99%がクライアント‐サーバーで、残りの1%はルーターと別に交渉してインバウンドトラフィックを得ることができるというもの。例えば、私のISPであるXfinityはデフォルトでルーターをCGNAT空間(およびIPv6)に置くけど、モバイルアプリからポートフォワーディングをリクエストすると、上流のルーターがIPv4アドレスを割り当ててくれて、すべてがうまくいく。NATは、サーバーホスティングに障害を追加することが許容されるトレードオフとして問題ないと考えられている。彼らがこれほど柔軟でいられる理由は、IPv6のバックボーンがあって、すべての顧客にルーティングできるからで、IPv4はルーティングには使われず、IPv6アドレスの中にIPv4の48ビットとポートをパッキングするための追加サービスとして使われているからだと思う。

もし何かあるとしたら、NATはパッチが当たっていない古いWindowsバージョンを動かしている、めちゃくちゃ不安定なデバイスを、オープンなインターネットに接続した瞬間にハッキングされるのから守ってくれたってことだね。俺はそうは思わないけど。ポートNATをやってるデバイスは、ファイアウォールもやってることが多いから、ファイアウォールの方が簡単だし。

Hacker Newsで議論の続きを見る