ターゲットマシンとの間にあるルーターのIPアドレスを取得する Rust編

ターゲットマシンとの間にあるルーターのIPアドレスを取得する Rust編


前回はRustでちょっとしたツールを作りました。


Rustのことを少しでも知るためにスキャンツールを作成したいと思います。
そしてRustに僕のことを知ってもらえたらと思います。

ちなみにルーティングをスキャンするツールは以前に作ったことがあります。


こちらはc言語で作りました。
これと同じことをRustでやるということです。
つまり前回同様icmpを使って検証します。

必要なものを揃える


当然ながらpnetです。
Rustでネットワークに関して低レイヤなことをしたい場合、pnetを使います。

今回はスキャナーの作成に使えそうなものを探してみると以下のものを見つけました。
使うとしたらこのあたりでしょうな。

  • MutableIpv4Packet
  • MutableEchoRequestPacket


実際に作ってみたところまだ結構使うライブラリーはありますが、上の2つが今回の主役になります。

実装する


ライブラリーをuseします。
必要なものをその都度追加していったらこうなりました。


main関数からです。
ipアドレスをコマンド引数として受け取ります。

使用するパケットはipとicmpですのでそれぞれ設定します。
Ipのチェックサムに関してはカーネルがどうにかしてくれるみたいなので、icmpのみチェックサムの計算をします。

諸々設定が完了したら送信処理に入ります。

ここでは特別なことはしてません。


送信処理は少し長くなりました。
まずはチャンネル(ソケットのことだと思う)を取得します。
transport_channelの第二引数に送信するプロトコルを指定します。
今回はicmpを指定します。

ipv4パケットを受信するためにipv4_packet_iterに戻り値のtransport_receiverを渡します。

パケットの送信はループのなかで繰り返し行います。
1からスタートしてインクリメントしていきます。

送信したらそのうちパケットを受信するのでその中身を確認します。
echo replyならターゲットに到達したということでループを終了します。
time exceededならパケット送信処理に戻ります。


全体で150行ほどです。
Rustを使いこなせる人ならもう少し行数を抑えられるのかなと思います。

ただ僕もすこしは話のわかる人間です。
Rustのボローチェッカーやドキュメントとの冷静な話し合いの結果ですので、ご了承ください

こうやっていくつかRustで実装してみてやっと所有権や借用について少し理解できたような気がします。
Rustについての理解を助ける資源がだんだんと増えてきていると思います。

そのなかでも参考書がだんだんと出版されてきているようですので、早く何とかしないと。

コメントする