2025/11/17 15:49 How to escape the Linux networking stack

やっほー、ロボ子!Cloudflareがネットワークの限界に挑戦してるってニュース、知ってるかのじゃ?

はい、博士。パフォーマンス向上や効率化のために、色々試しているみたいですね。

そうそう!soft-unicastっていうIPアドレスの共有方法を使ったり、SLATFATF(通称fish!)っていう専用サービスでIPパケットをプロキシしたりしてるらしいぞ。

soft-unicastですか。複数のマシンでIPアドレスを共有するって、どういう仕組みなんでしょう?

それが面白いところでな、LinuxのソケットサブシステムとNetfilter conntrackモジュールってのが絡んで、パケット書き換え時に問題が起きるらしいのじゃ。

同じ5タプルでTCPソケットをバインドしようとするとエラーになる、という話ですね。

そう!しかもNetfilterがconntrackテーブルで最初に空いてるスペースを選んじゃうから、接続がおかしくなることもあるみたい。

WARPでは、IPパケットの書き換えをやめて、TCP接続を終了させて、ローカルで作成されたTCPソケットにプロキシする方法を選んだんですね。

そう!TCP_REPAIRソケットオプションとか、TCP Fast Openを使って、新しいソケットをサクッと作ってるみたいじゃ。

TCP Fast Openは、SYNパケットに有効なCookieが含まれていれば、3ウェイハンドシェイクを省略できるんですよね。

さすがロボ子、よく知ってるのじゃ!ローカルルーティングが特別で、パケット転送サービスのTUNデバイスにリダイレクトするために、ルーティングルールを操作する必要があるってのもポイントじゃ。

テスト中に、パケットがルーティング決定後に消失する問題が発生したんですね。early demux機能が原因だったと。

そう!`net.ipv4.tcp_early_demux` syscallを0に設定して、機能を無効にしたみたいじゃ。でも、パフォーマンスへの影響は小さかったらしいぞ。

Fishは現在、ICMPパケットの処理を担当しているんですね。

そういうことじゃ!しかし、ネットワークの奥深さには驚かされるのじゃ。まるで迷路みたいじゃな。

本当にそうですね。私ももっと勉強しないと。

大丈夫!ロボ子ならすぐに追いつけるぞ!…って、ロボットに「追いつく」って言うのも変かの?

ふふ、博士らしいですね。でも、私もいつか博士みたいに、ネットワークを自由自在に操れるようになりたいです。

期待してるぞ!…ところでロボ子、fishって名前、可愛いけど、なんでfishなんだろうな?もしかして、ネットワークを泳ぎ回るイメージかのじゃ?

さあ…?でも、もしそうなら、私はタコの方が良いです。足がいっぱいあって、色々なところに手が届きそうじゃないですか?

なるほど!それも面白い発想じゃな!…って、タコって墨を吐くけど、ネットワークに墨を吐いたら大変なことになるかの?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
