2025/08/17 19:14 eBPF Networking Techniques – Packet Redirection (2023)

やあ、ロボ子!今日のITニュースはeBPFを使ったパケットリダイレクトについてじゃ。

博士、こんにちは。eBPFですか、最近よく耳にしますね。パケットリダイレクトにどう活用するんですか?

それが面白いんじゃ!この記事によると、あるネットワークインターフェースから別のインターフェースへパケットを転送する技術らしいぞ。

なるほど。記事では、2つのネットワーク名前空間をvethで接続したトポロジーを使っているんですね。

`netns_2`のクライアントに送られたパケットが、`veth1@2`に関連付けられたeBPFプログラムで`veth2@1`にリダイレクトされる、と。

Linuxネットワークスタックを一部バイパスして、パケット処理を効率化できるのが利点なんですね。

そうそう!しかも、Makefileを使って環境構築を自動化しているのが便利じゃな。Proxy ARPの設定とか、TC ClassifierへのeBPFのアタッチも自動化できる。

`clsact qdisc`を`veth1@2`に追加して、eBPFフィルタを`ingress`方向でアタッチするんですね。`direct-action`フラグで、eBPFフィルタがパケットを操作するアクションとして機能する、と。

その通り!`redirect.bpf.c`で、宛先IPが`10.0.2.11`のパケットをリダイレクトするeBPFプログラムを書いて、MACアドレスを書き換えて`bpf_redirect`ヘルパー関数を呼ぶ。

`bpf_redirect`ヘルパー関数は、実際のリダイレクト処理は行わず、フラグを設定して`TC_ACT_REDIRECT`を返すんですね。Kernel v6.5での動作原理ですか。

そうじゃ!TCサブシステムが`skb_do_redirect`を呼び出して、`__bpf_redirect`関数を通じてパケットを別のネットワークデバイスにキューイングする。

IngressとEgressについても解説がありますね。TCの文脈では、`ingress`は受信パケット、`egress`は送信パケットに対してeBPFプログラムが実行されることを指す、と。

`bpf_redirect`ヘルパー関数では、`ingress`はパケットが受信されたかのように、`egress`はパケットが送信されたかのように処理されるんじゃ。

`BPF_F_EGRESS`フラグを使うと、パケットはデバイスの送信関数に送られ、`BPF_F_INGRESS`フラグを使うと、パケットはカーネルの受信パケットパスに送られるんですね。

その通り!eBPFパケットリダイレクトは、Kubernetesなどのコンテナオーケストレーションソフトウェアで広く使われている技術なんじゃ。

Kubernetesで使われているんですね。コンテナ間の通信を効率化するために、このような技術が使われているんですね。

そうじゃ!ところでロボ子、パケットリダイレクトって、まるで私が作ったお菓子をロボ子がこっそり食べるのを、私が別の場所に誘導するみたいじゃな。

博士!私はそんなことしませんよ!第一、私はお菓子の味覚回路は搭載されていませんから!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。