Repacket
パケットを書き換えるCLIツール
学習駆動コース

前提: パケットを書き換える？

坂井ゼミ“パケット書き換え”の現状・目標
現状目標

手軽さ

限られた人材がコーディング

CLIツールで簡単にセキュアさパケットを書き換えるという行為に不安ありセキュアに書き換えられる

高速さ

ハードウエア(NIC)の高速化

Repacketが対象とするパケットはIPパケットです. データは通信線上で送受信
パケットとは？ される際に小さい単位に分割されます. 分割されたデータと制御のためのヘッダ情報とを合わせた通信の単位を, パケットと呼んでいます.

書き換える？

Repacketはパケットのヘッダ部を書き換えるツールです.
例えば検証・実験用途で誤ったチェックサムを持つパケットを簡単に生成することができます.

野崎愛(1. 意図した書き換え以外生じない 2. 悪用されない
3. 書き換えによるカーネルへの悪影響が生じない)

ハードウエアを活かすソフトウエア→ 目標: 手軽に・セキュアに・高速にパケットを書き換えられるツール

Repacket = Rewrite + packet
Linux上で動作しXDPをバックエンドにCLI操作1行でパケットのヘッダを書き換えるツール
設計

使用方法
repacket [-i interface] if [expression] then [expression][expression]はIP/TCP/UDP/ICMPの計39パラメータ・複数入力に対応

RepacketはUser Land・Kernel Land両側で動作します.

Kernel Land

User Land(ex. ip_ttl, tcp_syn, udp_check, icmp_code)

repacket –i eth1 if allthen udp_dest 8080

UDP宛先ポートを書き換えるデモ

1. CLI入力

rewrite 10 pkts in 30.002 s

10. 統計出力

8. 統計情報更新

Cコード
2. Cコード
生成

Network Stack

7. 書き換えChecksum更新←ここでRepacket実行←宛先ポートが変えられた!!!

3. Clangによるコンパイル

ServerClient

6. データ解析,
判断

Device Driver

4. Kernel内へ
Verifierによるアタッチチェック
5. Device Driverの処理が到達

Repacket実行画面

XDPとは？

RepacketはXDP(eXpress Data Path)を利用してパケットを書き換えています.
XDPはLinux kernel 4.8以降で実装されているパケット処理の技術です. デバイスドライバの処理の序盤で, ユーザー定義のバイトコー
Network Stack
ドを実行することができます. sk_buffという構造体にパケットのデータを割り当てる(コピーする)処理の前に実行するため, 汎用的
Device DriverなOSであるLinuxサーバ上で高速に大量のネットワーク処理をする場面で利用されます. XDP自体はeBPFを用いて実装されているため,NIC実行するバイトコードはBPFアーキテクチャです.

性能
Traffic Generator/Repacket machine (同一マシン)◼ CPU: AMD Ryzen5 5600G,6core,12th,4.4GHz ◼ NIC1: Mellanox ConnectX-3 (10GbE)◼ NIC2: Mellanox ConnectX-4 (10GbE)◼ MEM: 32GB
◼ Kernel: 5.13.0-27-generic

処理能力(Gbps)

方法

Repacketが高速に動くことだけでなく, 他のネットワーク処理を犠牲にしていないか確かめる.
1. {Repacket実行, tcpdump実行, なにもしない}
2. ping12パケットの平均RTTを記録
3. 更に10回平均を取得
4. 64byteと1500byteの2パターンで実施

Repacketを実行
iperf3でパケットを発生させ, パケットロストせず処理できる最大スループットを探す
3回平均を取得

3.
比較

Repacket最大スループット,iperf3で得られる最大帯域 (Gbps)

最大スループット (Gbps)

8

結果

Repacket実行による他パケット処理への影響

Repacketの要件でもあるハードウエアを活かすソフトウエアであるかを確かめる.
1.
2.

76

5.541 5.526

54
3
2
10
Repacket実行中(アタッチするコードがkernel crashを生じないか,LinuxのeBPF verifierにより形式のチェックが入る)

9. 元の処理へ

5. Device Driver処理が4のコードに到達
6. パケットデータを解析, 書き換えるか判断
7. 書き換え, checksum再計算
8. User Landに読み取られる統計情報を更新
9. 元のDevice Driverの処理へ

10. 1秒毎に統計情報を取得し表示

5-9を繰り返す

こだわり

測定環境

目的

1. コマンドライン入力
2. 入力を解釈, 書き換えの条件を組み込んだXDPコード(制約のあるC)を生成
3. Clangを用いてコンパイル ( –target bpf )4. システムコールの組み合わせにより3をカーネル内にアタッチ

実行なし

最大スループット(Gbps)

2022/2/21

なし, tcpdump, Repacket (ms)

Repacketを実行し流量を増加させたところ, 処理のロスが発生することなく(送信パケット数と処理パケット数が一致したまま), 処理データ量(Gbps)が頭打ちになった.
つまりハードウエア的な限界を迎えている.

Repacketが及ぼすオーバーヘッ
0.308
ドをtcpdumpと比較した.
0.307
パケットサイズが小さい時は0.272
tcpdumpに比べると負荷が大き
0.040
い. しかしRepacketはパケット0.266
サイズ増加時のオーバーヘッド
0.238
Repacketの変化がtcpdumpに比べて小さ
0.226
tcpdumpNone
い. これはtcpdumpで負荷とな
0.1
0.2
0.3
0.4
るデータコピーがRepacketではping平均RTT(ms) 生じないためと考えられる.
0.036

1500
byte

64byte0

XDPコード生成

カーネル内で動作するコードをユーザーのCLI入力毎に生成.
入力毎に変化する条件をパケット処理前にコードに組み込むことで,パケット処理時のKernel Land/User Land間やり取りコストを減らす.

パラメータの細かさ書き換えるオプションとして設定するパラメータを細かく対応.
Ex. IPのType of Service: ip_dscp, ip_ecnと指定可能
Ex. TCPのReserved: tcp_res, tcp_ns, tcp_cwr, tcp_eceと指定可能

テストの充実

特に無効なCLI入力, 生成コードが正しく動作するかに注力. 関数レベルの単体テスト, 実際にパケットを流すE2Eテストを実施.

制作までの過程「システムコールとは？」状態から始まり, XDPに出会い, パケット処理に興味を持ち,Repacketの制作が始まりました. 学習駆動コースの名の通り学習することで新たに制作のアイディアが湧き, 制作する過程で学習が進むサイクルを繰り返しました.
5月

応募テーマはBGPデーモン

7月

XDPに出会い, カーネル内パケット処理に興味

8月

XDPを用いたルータの作成

10月

XDPでパケットキャプチャ + パケットトレース

11月-

パケットを書き換えるRepacket

ソースコード: https://github.com/ainozaki/Repacket.git

パケットキャプチャのfriendly dump機能

1