F@N Ad-Tech Blog

株式会社ファンコミュニケーションズ nend・nex8・viidleのエンジニア・技術ブログ

tcpdumpをGolangで作成しながら低レイヤに触れた

はじめまして!F@Nでバイトをしている友人からの誘いにより4月から2ヶ月間インターンで来ていた島仲です。
今回は、このインターン(通称:何でもインターン)でしたことの紹介とファンコミュニケーションズさんでインターンをしての感想を紹介します。

  • 制作物の紹介
  • 実装から得られたこと
  • 実装で躓いた所
  • 今後の課題
  • インターンの感想

制作物の紹介

タイトルにもある通りtcpdumpというキャプチャツールをGolangを使用して再実装してみました。
github.com

目的

・低レイヤの実装について理解を深める

具体的に行ったことは、外部パッケージの使用を極力控えて実装できる部分は最も低い部分から調べ、実装する形をとりました。主にGo側からシステムコールを叩いて実装しています。わからないところは外部パッケージのソースコードを読み、紐解いていきました。

差別化

ただtcpdumpを再実装するのは車輪の再発明なため、独自の機能を実装したりしました。

機能

・キャプチャ機能
・Pcapファイルの読み書き
・フィルタリング
・ブリッジキャプチャモード(差別化を図った所)

実装から得られたこと

バイナリの扱い方

・パケットの生データ(バイナリ)の扱い方に慣れた。
・Wiresharkなどで扱われるpcapファイルの仕様について理解できた。

システムコール

カーネルの機能を使用したい時には、システムコールを発行する。
また、同時期にDPDKを勉強していたのでカーネルを介した割り込み処理などに関しても詳しく知ることができた。

キャプチャ

・パケットをキャプチャする際のタイプやオプションがあることを知れた。
・フィルタの実装がkernelに実装されていることを知った(BPF)。

アライメント

・他アーキテクチャへの対応は時間の都合上できませんでしたが、アライメントなどを実際に意識する部分をコード・リーディング中に見ることができた。

実装で躓いた所

f:id:fan_y_shimanaka:20180715170421p:plain
BPF(Berkeley Packet Filter)を使用したパケットフィルタリングを実装するには、フィルタから写真のようなレジスタマシンの配列を生成しソケットにアタッチしなければならないのですが、このレジスタマシンの生成方法がわからず最終的に
github.com
を使用することになってしまいました。(できれば自分で実装したかった…)

今後の課題

・BPFの実装を読む(カーネルコードリーディングになるのかも…)
・UIの作成を行う

今後の目標

インターンを通して、ますます低レイヤ部分に興味が湧いてきたので、システムプログラミングとまでは行きませんが知識をつけ低レイヤ沼に溺れて行きたい所存です。

インターンの感想

技術的な感想

このインターンを通して、改めて理解を深めるためには自分で実装してみるのが大事だと言うことを実感しました。

全体的な感想

オフィスを初めて見学させてもらった時は割と自分の想像してた雰囲気(人も含めて)だったのですが、2ヶ月間のインターンで社内イベントやランチなどに参加させてもらったりと想像を超えるアットホームさでした(笑)
最終日には全体会議での発表にも参加させてもらい、このインターンを通して会社がどう動いているかなどを少しは感じ取ることができたと思っています。
貴重な体験ありがとうございました!