Skip to content

QUIC

  • HTTP/3 のために UDP/443 で使われている
  • 最低限のヘッダとペイロードは TLS で暗号化されている
  • 複数の HTTP ストリームをまとめることができる

QUIC を阻害するネットワークトラブル

Section titled “QUIC を阻害するネットワークトラブル”
  • NAT や SPI のテーブル溢れ
  • NAT の送信元ポート番号枯渇
  • UDP 送信元番号フィルタリング

5-tuple で通信を区別して管理している src ip, dest ip, protocol, src port, dest port 通信が終わるとテーブルから削除する NAT テーブルには上限がある あふれると QUIC だけでなく新規通信ができなくなる これは多くの場合 TCP/UDP を区別せずにテーブルを共有しているため QUIC ではなぜ NAT テーブルがあふれるのか => たくさん使われていて UDP で中身が見えないから TCP の場合は FIN パケットでテーブルからエントリを消せる QUIC は UDP なので能動的にエントリを消せない NAT ルータは無通信時間(タイマー)を元にしかエントリを消せない => タイマーの時間だけエントリが残り続けるので NAT テーブルを圧迫する QUIC にはコネクション終了を知らせるフレームも暗号化されている

  1. IPv6 SPI 問題がある TCP/UDP/ICMP などのポート番号や通信状況を管理してファイアウォールの機能を実現する仕組み 5-tuple で管理していてテーブルサイズがある
  2. NAT UDP タイマーを短くする 2 分未満にしてはならず、デフォ値としては 5 分以上が推奨
  3. NAT アルゴリズム変更 LRU 方式にするのもありなのでは? ポート再利用間隔が 2 分未満になってしまう場合がある keepalive が長いプロトコルが割を食う可能性がある
  4. NAT テーブルサイズ増加 機器交換が必要になったり、コストに影響がある
  5. UDP443 を塞ぐ やったら負け

パブリック IP が 1 つのとき NAT で利用できるのは 64512 ポート 64512 = 65536 - 1024

  1. パブリック IP を増やす IPv4 アドレス枯渇問題
  2. CGN で割り当てポートを増やす サービスイン後の変更は難しい
  3. IPv6 を使う これしかなさそう

リフレクション攻撃対応としてフィルタリングしている場合がある HTTP/3 では well-known ポートを使わないが。。。 QUIC クライアントではよく攻撃に使われるポート番号を送信元として使わないようにする動きがある NAT されたときに送信元ポート番号として割り当て割れる可能性がある

IPv6 を使う(ry NAT をしなければ良いので

Chrome などは 1350 バイトが流れれば QUIC、流れなければ TCP を使う => PMTUD しない PMTUD を使う場合は UDP での PLPMTUD を利用する

途中経路で UDP443 が塞がられている場合

Section titled “途中経路で UDP443 が塞がられている場合”

QUIC と TCP どっちも試すので TCP フォールバックするので問題ないはず 接続確立後に落とされるとユーザ影響がある

策定者は起きそうな問題考えてなかったのか

Section titled “策定者は起きそうな問題考えてなかったのか”

TCP フォールバックがあるのでいいだろと考えていたと思う NAT を作っている人からのフィードバックがなかったと思う UDP のポートをたくさん使う問題は QUIC 自体の問題か実装の問題か議論がある

HTTP/3 での Proxy についてはクライアントに証明書があるので従来の感じでやろうと思えばできる 企業内であれば UDP/443 を落として TCP でやるというのは十分ありな選択肢