世界を動かす技術を、日本語で。

Show HN: 学生プロジェクトのWiresharkおもちゃ版

概要

Vanta は、Go言語で作られた 軽量ネットワークパケットアナライザーコマンドライン 上で動作し、HTTP・DNS・TLSなどの プロトコル解析 が可能。 依存関係なし ・単一バイナリで持ち運びやすい設計。 JSON形式 で動作ログを出力し、スクリプト連携や学習用途に最適。 開発者の 個人的な思い と感謝が込められたオープンソースプロジェクト。

Vanta: 軽量ネットワーク行動解析ツール 概要

  • VantaGo言語 製の軽量・高速な コマンドライン型ネットワーク行動解析ツール
  • プロトコルレベルのフロー再構築構造化されたアクティビティ抽出 に特化
  • Wireshark のようなGUIツールとは異なり、 明快さ・シンプルさ・構造性 を重視
  • スクリプト連携や最小構成環境 に最適化された設計
  • 単一バイナリ・依存なし で持ち運びやすい

主な特徴

  • プロトコル解析対応
    • HTTPDNSTLS (一部フィンガープリント対応)解析
  • コネクショントラッキング
    • 双方向フローの自動再構築 機能
  • 行動エクスポート
    • クリーンなJSON形式サマリー 出力
  • ポータブル&依存不要
    • 外部依存ゼロ の単一バイナリ配布

クイックスタート

  • 実行方法
    • go run main.go
  • 詳細な使い方
    • usage/フォルダに 中国語ドキュメント あり

開発環境

  • OS: macOS 15.5 (Apple Silicon)
  • エディタ: Visual Studio Code
  • 言語: Go
  • Goモジュール: go 1.23.0
  • ツールチェーン: go1.24.3
  • ターミナル: zsh(macOS標準)
  • 開発端末: MacBook Air M1(学部生による個人開発)

プロジェクト構成

  • main.go: メインエントリーポイント
  • capture.json: 入力例ファイル
  • internal/core/: パケットキャプチャ・フロー再構築
  • internal/decoder/: プロトコルデコーダ
  • internal/fuzz/: ファジングモジュール(実験的)
  • internal/export/: 行動エクスポートロジック
  • usage/: 利用方法ドキュメント

開発背景

  • 個人の思い感謝 を込めたプロジェクト
  • 政治的な圧力 の中、Harvard・MIT・CMUなど一部大学が 留学生を擁護 したことへのリスペクト
  • リソース・バックグラウンドなし の学部生による コードでの応答
  • Wiresharkの“おもちゃ版” としての位置付け(実運用ではWireshark利用)
  • 教授・大学への感謝率直な気持ち の表現

フィードバック・連絡先

  • メール: lixiasky@protonmail.com
  • GitHub: github.com/lixiasky

追記:開発者より

  • VantaGoで書かれた小型オープンソースネットワークアナライザー
  • TLS・DNS・HTTP などの 基本プロトコル解析 対応
  • ターミナル上でパケット内容を直接確認 可能
  • 出力はカラー表示 で可読性向上
  • 全体で約400行 のシンプルなコード構成
  • 学習・プロトコル理解 のための個人実験として開発
  • 本格運用はWireshark推奨、本ツールはあくまで“ネットワークおもちゃ”
  • 興味があればGitHubで公開中: https://github.com/lixiasky/vanta
  • 意見・感想・批評歓迎、どなたかの役に立てば幸い

このツールはシンプルながら、ネットワーク解析やGo言語学習に最適実運用ではWiresharkを推奨 しつつも、 個人の成長や感謝の証 として開発された点が特徴。

Hackerたちの意見

いいね!絶対に見てみるよ。なんでこのプロジェクトにGoを選んだのか気になるな。RustかGoでBurpの簡易版を作ろうと思ってるけど、まだ決めかねてるんだ。

俺がその状況でGoを選ぶ主な理由は、クロスコンパイル、静的バイナリ、そして主観的には生産性が高いからかな。すぐにMVPを動かせるようになるし、どこでも動くって分かって配布できるのがいいよね。

それ、俺もやってるよ! ;) https://github.com/redawl/gitm 静的バイナリのためにGoを選んだんだ(エンドユーザーにインストール手順がいらないからね)。最近Goプログラムを書くのがすごく楽しくて、シンプルなのに速度をあまり犠牲にしないところが気に入ってるんだ。

いい質問だね!Goを選んだのは、シンプルで効率的、しかも広く使われているからだよ。正直、今一番自分が使いやすい言語なんだ。まだ学生だし、大きな野望はないけど、完成させて理解できるものを作りたかったんだ。Rustは素晴らしいけど、まだ本格的には学び始めてないから、今はちょっと圧倒されてる感じ。いつか、もっと深く掘り下げる準備ができたらやってみたいな!君のBurpプロジェクトも頑張ってね!いつかシェアしてくれたら見てみたいな。

Goはこういうツールにぴったりだね。MITMプロトコルアナライザーを何回か作ったことがあるけど、ハンドリングや分析、デバッガーでのブレークを完全にカスタマイズできるのは、Wiresharkみたいな超高機能だけど汎用的なツールよりも役立つことが多いよ。

経験をシェアしてくれてありがとう!Goは本当に素晴らしいね。Vantaを作りながら学んでいる学生としても、意外とスムーズに進んだと感じたよ。君が言ってた機能、めっちゃいいね。後で試してみるかも—ストリームのブレークやデバッグコントロールをサポートするの、楽しそうだね。

これいいね、プロジェクトの名前を「babyshark」にしてみたら?

それか「Fanta」でもいいかも。

このプロジェクトは、このダジャレのためだけでも作る価値があると思うな。

そうだね、Vantaはすでに有名な会社だから特に。

ななななな

つまらないこと言うかもしれないけど、検索しやすさを犠牲にしないように気をつけてね。

名前は「dootdoodoodootdoodo」にしよう!

いいね!僕もGoを学びたかったときに似たようなことをしたよ。gopacketを使わずに自分でパーサーを作ったんだ。もっと低レベルなことを学びたいなら、自分でやってみるのをおすすめするよ。例えば、IPをパースするのはこんな感じだった:

type Addr [4]uint8
func (ip Addr) String() string {
    return fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3])
}

type Hdr struct {
    Version uint8
    IHL uint8
    DSCP uint8
    ECN uint8
    Length uint16
    Id uint16
    Flags uint8
    Fragoffset uint16
    TTL uint8
    Protocol uint8
    Checksum uint16
    Src Addr
    Dst Addr
}

func (hdr *Hdr) Parse(d []byte) error {
    hdr.Version = uint8(d[0] >> 4)
    hdr.IHL = uint8(d[0] & 0x0f)
    hdr.DSCP = uint8(d[1] >> 6)
    hdr.ECN = uint8(d[1] & 0x03)
    hdr.Length = uint16(binary.BigEndian.Uint16(d[2:4]))
    hdr.Id = uint16(binary.BigEndian.Uint16(d[4:6]))
    hdr.Flags = uint8(d[6] >> 5)
    hdr.Fragoffset = uint16(binary.BigEndian.Uint16(d[6:8])) & 0x1fff
    hdr.TTL = d[8]
    hdr.Protocol = d[9]
    hdr.Checksum = uint16(binary.BigEndian.Uint16(d[10:12]))
    hdr.Src = Addr{d[12], d[13], d[14], d[15]}
    hdr.Dst = Addr{d[16], d[17], d[18], d[19]}
    if hdr.IHL > 5 {
        fmt.Println("extra options detected") // TODO: extra optionsのサポート
    }
    return nil
}

それに賛成!低レベルのプロトコルをゼロから実装するのは、ネットワークプログラミングの素晴らしい入門だよね。(今の子たちはネットワークプログラミングやってるのかな?それともHTTPの上に15層のライブラリが積み重なってるだけ?)自分が使うシステムの基盤を理解するのは大事だし、下の方でどれだけ微妙に複雑になるかも知っておくといいよ。

これをシェアしてくれて本当にありがとう—すごく役立つよ!今はgopacketを使って、早く何かを動かすことを優先してるけど、プロトコルをもっと理解するために、自分でパーサーをゼロから書こうかなって考えてる。君のHdrの例は本当にきれいだね—参考にさせてもらうよ!直接的で読みやすいのがいいね。パケットレイヤーロジックを見直すときには、もっと低いレベルに挑戦してみるつもりだよ。改めてありがとう!

スクリーンショットお願い!

[オフトピック用のスタブ]

発表おめでとう!ちなみに、Vantaっていう有名なYCスタートアップがあって、企業がいろんなセキュリティコンプライアンスの認証を管理するのを手伝ってるんだ。もちろん、同じ名前のサービスがいくつかあるけど、Vantaは英語の実際の単語じゃないから、混乱する人もいるんじゃないかな。私の経験から言うと、最初にVanta(その会社)がShow HNをやってると思って、ちょっと混乱したよ。

なんでみんな名前のことばっかり言ってるの?作者はこれが教育目的のためのトイプロジェクトだって言ってるのに… GitHubには何千ものプロジェクトがあるし、これ以外にも「vanta」って名前のプロジェクトがあるよ(さっき確認したら、JavaScript用のアニメーションライブラリが「vanta」って名前だった)。だから、マジで誰が気にするの?もしOPが実際の会社だったら別だけど、これは文字通りトイプロジェクトなんだから。とにかく、OPおめでとう!あなたのプロジェクト、めっちゃクールだね。

ほんと、「Vantaの創業者/CEOです」って言わないでね :-D

人気のサイバーセキュリティ企業「Vanta」が商標を持ってるから、名前は混乱を避けるために変えた方がいいかもね。

これ、リーナスの最初の発表みたいだね。詳しくはここを見てね:https://en.wikipedia.org/wiki/History_of_Linux#:~:text=Hello... - 君に幸運を、いつ君が引き継ぐのか楽しみにしてるよ :)

このコメントで「Vanta」を「あなた」に置き換えたよ。名前に関するオフトピックのノイズを減らそうと思ってね。(詳しくは https://news.ycombinator.com/item?id=44161041 と https://news.ycombinator.com/item?id=44161144 を見てね。)これで大丈夫かな?別の選択肢としては、https://news.ycombinator.com/item?id=44161021 の下に移動することもできるけど、すごくいいコメントだからそれは避けたいな。

ありがとう!リナスの最初の投稿を前に読んだことがあって、まさか自分の小さなツールがそんな伝説的なものと比べられるなんて思ってもみなかった。私は中国の大学生で、残念ながらCS専攻じゃないけど、この小さなプロジェクトは、勇敢に立ち上がった学校への感謝の気持ちを表すためのものだった。あなたの優しい言葉、本当に感謝してるよ。次は何が起こるか楽しみだね。 :)

いいね!wireshark-liteって、ちょっと未開拓なニッチだなって感じてたから、これは嬉しい。

ありがとう!実はそこまで考えてなかったんだ。自分の能力の範囲内で、何か意味のあるものを作りたかっただけなんだよね。もしニッチを埋めることができたら、それはラッキーなボーナスだね。

https://github.com/thegoodduck/netsour

使用法: https://raw.githubusercontent.com/lixiasky/vanta/main/usage