Rustで低レベルのネットワークプログラムをつくる

Rustで低レベルのネットワークプログラムをつくる


Rustでパケットをキャプチャするプログラムを作りたいと思います。

Rustで低レベルのネットワークプログラミングをする場合pnetというライブラリーを使うようですが、
このライブラリーを呼び出すためにCargoというパッケージ管理ツールを使用します。
Rustのチュートリアルサイトによると、
CargoとはRustのビルドシステムでありパッケージマネージャーとされています。
またプロジェクトの管理もしてくれるようです。


プロジェクト作成


Cargoを使ってプロジェクトを作成します。
以下のようにしてコマンドを実行します。
これはpnet_sampleというプロジェクトを作成するということです。

Cargo.tomlを修正


pnetを使えるようにしましょう。
以下のように記述します

実装

ネットワークインターフェース取得


マシンにあるインターフェースのうち、引数で指定したネットワークインターフェースと一致するものを取得します。
処理自体はコメントに書いたとおりです。

受信処理


こちらが実際の受信処理です。
パケットを受信している部分はrx.next()です。
そしてmatch構文で正常に受信できたかを確認します。
受信できた場合capture_packet()にデータを渡し、パケットを解析しています。

これをビルドします。


このプログラムはrawソケットを使います。
root権限が必要ですのでこのように実行します。


引数のwlp2s0がインターフェース名です。
これは僕の場合の話ですので、人によって変わります。
インターフェース名はifconfigで確認できます。

最後に


こういう系のプログラムはc言語でしかつくったことがないのですが、
Rustだと割と短く簡単につくることができました。
今回はipアドレスとポート番号を表示するだけですが、
ここにいろいろ情報が載っていますので本格的なものも作れそうです。
https://docs.rs/pnet/0.12.0/pnet/packet/index.html