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

Show HN: Whosthere: Go言語で書かれたモダンなTUIを持つLAN発見ツール

概要

Whosthere は、Goで開発された モダンなTUI型LAN探索ツールmDNS/SSDP/ARP など複数の手法で権限不要の高速スキャンを実現。 OUI参照 によるメーカー情報表示や ポートスキャナ 機能搭載。 デーモンモード でHTTP APIも提供、カスタマイズ性も高い。 Linux/macOS 対応、ネットワーク管理者向けの直感的な操作感。

Whosthereの特徴

  • Go製TUIアプリ による直感的な端末操作
  • mDNS/SSDP/ARP による並列デバイス探索
  • 管理者権限不要 のユーザースペース動作
  • OUI参照 でメーカー名を自動表示
  • 統合ポートスキャナ によるサービス発見(許可されたデバイスのみ推奨)
  • デーモンモード&HTTP API で他ツールとの連携容易
  • テーマ/設定 をYAMLで柔軟にカスタマイズ
  • Linux/macOS に対応(Windowsは今後対応予定)

インストール方法

  • Homebrew によるインストール
    • brew tap ramonvermeulen/whosthere
    • brew install whosthere
  • Go によるインストール
    • go install github.com/ramonvermeulen/whosthere@latest
  • ソースビルド
    • git clone https://github.com/ramonvermeulen/whosthere.git
    • cd whosthere
    • make build

基本的な使い方

  • TUIで対話的探索
    • whosthere
  • デーモンモード(HTTP API有効)
    • whosthere daemon --port 8080
  • 追加コマンドラインオプション
    • whosthere --helpで確認

サポートプラットフォーム

  • Linux
  • macOS
  • Windows (将来的に対応予定、貢献歓迎)

TUI キーバインド一覧

  • /:正規表現検索開始
  • k:上へ
  • j:下へ
  • g:先頭へ
  • G:末尾へ
  • y:選択デバイスのIPコピー
  • enter:デバイス詳細表示
  • CTRL+t:テーマ切替
  • CTRL+c:アプリ終了
  • ESC:検索クリア/戻る
  • p(詳細画面):ポートスキャン開始
  • tab(モーダル):ボタン選択切替

環境変数

  • WHOSTHERE_CONFIG:設定ファイルのパス指定
  • WHOSTHERE_LOG:ログレベル設定(debug, info, warn, error)

設定ファイル(YAML)

  • 優先読み込み順
    • WHOSTHERE_CONFIG環境変数で指定
    • $XDG_CONFIG_HOME/whosthere/config.yaml
    • ~/.config/whosthere/config.yaml
  • 主な設定項目
    • scan_interval:探索間隔(例:20s)
    • scan_duration:各探索の最大時間
    • splash:スプラッシュ画面表示設定
    • theme:テーマ名やカスタム色
    • scanners:mdns/ssdp/arpの有効化
    • port_scanner:タイムアウト/スキャンポートリスト
    • network_interface:特定インターフェース指定(省略可)

デーモンモード HTTP API

  • エンドポイント一覧
    • GET /devices:全デバイス一覧取得
    • GET /device/{ip}:特定デバイス詳細取得
    • GET /health:ヘルスチェック

テーマ設定

  • 設定ファイルまたはTUI(CTRL+t)で切替可能
  • 公式テーマ一覧 : https://github.com/ramonvermeulen/whosthere/tree/main/internal/ui/theme/theme.go
  • カスタムテーマ :色指定で独自テーマ作成可

ログ出力

  • TUI以外 :標準出力にも出力
  • ファイル出力先
    • $XDG_STATE_HOME/whosthere/app.log
    • ~/.local/state/whosthere/app.log(XDG未設定時)

既知の問題・注意事項

  • クリップボード機能要件
    • Linux(X11):libx11-6等クライアントライブラリ
    • Linux(Wayland):未サポート、XWayland推奨
    • macOS/Windows:追加依存なし
  • ビルド要件(Linux)
    • X11開発パッケージ(libx11-dev等)

利用上の注意

  • 許可されたネットワーク のみで利用推奨
  • 無断スキャンは違法・非倫理的 な場合あり
  • 必ず事前に権限を取得 すること

コントリビューション・開発参加

  • 機能要望・バグ報告・改善提案歓迎
  • GitHubリポジトリ でIssue/Pull Request受付
  • 大規模変更前には必ずIssueで相談 推奨

Whosthere は、誰がネットワーク上にいるのかを 直感的・安全に把握 したいネットワーク管理者のための 強力なLAN探索ツール です。

Hackerたちの意見

Goで完全に書かれたターミナルユーザーインターフェース(TUI)のLAN発見ツールを作ってるんだ。名前はWhosthereで、特権なしでローカルネットワークのデバイスを探索できるように設計されてるよ。いくつかの発見方法を組み合わせて動作するんだ:

  • mDNSとSSDPスキャン
  • ARPキャッシュの読み取り(TCP/UDPスイープでARP解決をトリガーした後)
  • デバイスメーカーを特定するためのOUIルックアップ

さらに、以下の機能も含まれてるよ:

  • 速くてキーボード駆動のTUI(tviewを使用)
  • オプションの組み込みポートスキャナー
  • デバイスを取得するためのシンプルなHTTP APIを持つデーモンモード
  • YAML設定ファイルを通じてカスタマイズ可能なテーマと動作

作った理由は主に学ぶためで、Goをプログラミングして約1年になるから、Goを学びながらネットワーキングについても学べるプロジェクトを作りたかったんだ。TUIアプリケーション、特にlazygitやk9s、diveが大好きで、LAN上のデバイスを表示するTUIアプリを作るアイデアが浮かんだんだ。ネットワーキングの専門家ではないけど、ARPの仕組みやmDNS、SSDPなどの発見プロトコルを理解するのは楽しかったよ。

使用例:

HomeBrew経由でインストール

brew tap ramonvermeulen/whosthere brew install whosthere

またはgo installで

go install github.com/ramonvermeulen/whosthere@latest

TUIとして実行

whosthere

デーモンとして実行

whosthere daemon --port 8080

フィードバックがあれば聞かせてほしいな。追加機能や改善案があれば大歓迎だよ!現在のプラットフォームサポートはLinuxとMacOSだよ。

すごくいいツールだね :-) IPの逆引きを表示できたら最高だな。LAN上のすべてのデバイスには名前が付いてるし、名前がないのはたぶん侵入者だろうから!

Raspbianにインストールしたけど、素晴らしい動作だよ。昨日作ったものよりずっと良い。1つの機能を追加してほしいな:新しい到着をログに記録して、すべての情報を含めて、ベアボーンのIDSとして使えるようにしてほしい。

これ、めっちゃいいね!ずっとこんなのを探してたんだ。他のスキャナーと比べて、ネットワーク上で見つけたことについてのフィードバックをあげるよ。ホスト名を見つけるのにAdvanced IP Scannerに勝るものは見たことがない。ARPやnmapを使ってもAdvanced IP Scannerに近づく方法すら見つけられなかった。いろんなコマンドを試したけど、全然ダメだった。スキャンの結果は以下の通り: 生存しているホスト数:309 不明:201 ホスト名あり:80 https://www.advanced-ip-scanner.com/ #################################### Angry IP Scannerというプログラムも試したよ: スキャンしたホスト数:510 生存しているホスト数:315 ホスト名あり:75 https://angryip.org/ #################################### whosthereのデバイス数:318 ホスト名あり:54

すごくいいね!!数日前に同じアイデアを思いついて、今これを投稿してくれて本当に嬉しい!使ってみるし、フィードバックも伝えるね。今のところ、私のネットワークでの動作は素晴らしいよ!

TUIなのにX11に依存する理由は何?ncursesを期待してたんだけど。

全体的に良い仕事だね。スキャンするインターフェースを指定するための-iコマンドラインパラメータをリクエストしたいな(すべてのパラメータがコマンドラインから読み取れるといいな)。最初はフルスキャンを実行してるみたいだけど、次のスキャンは成功しなかったり、TCP接続スキャンが含まれてなかったりする(最初のスキャン後にARPリクエストが見えない)。

その通りだね。ローカルネットワークの負荷を避けるために、初回スキャンには内蔵のセーフガードがあるよ:

  1. 設定されたネットワークインターフェースのサブネットだけをスキャンする。
  2. スキャンは最大/16サブネットのサイズに制限される。
  3. 5分ごとに1回だけ実行される(この間隔は設定可能にするべきで、現在はハードコーディングされてる)。/16より大きいサブネットが設定されている場合、whosthereは警告をログに記録し、そのサブネットの最初の/16部分だけをスキャンするよ。今のところ、ネットワークインターフェース自体はYAMLファイルで設定されてる。これらの設定を調整しやすくするために、コマンドラインフラグを追加するのは良いアイデアだと思う。

「whogoesthere」と名付けるチャンスを逃したね。

もっと「whodat」っぽい感じで考えてたんだ。

Goの標準ライブラリって、なんか特別にTUIサポートがいいの?新しいTUIがGoで書かれてるの、俺の勘違いかな?

標準ライブラリにはあんまりTUI向けのものはないけど、Bubble Teaが多くの良いGoのTUIの背後にあるよ。これ、https://github.com/rivo/tviewを使ってる。

いや、標準ライブラリにはTUIに特化したものは本当にないよ。理由は分かるけど、golang.org/x/に何か基盤になるようなものがあったらいいのに。このプロジェクトはgithub.com/rivo/tviewを使ってるみたいで、かなりしっかりしてるよ。

コンパイルが早いし、起動も早いし、特に面倒なこともない(Rustの借用チェッカーみたいなのもないし)。

Tailscaleで試してみた?めっちゃ便利そうだけど、残念ながらTSはmDNSをサポートしてないんだよね。https://github.com/tailscale/tailscale/issues/1013

「Whose LAN is it anyway?」って名前にするチャンスを逃したな。

有名な言葉があるよね。「nmapを覚えられない人は、うまく作り直すことを運命づけられている」って。 ルートレスのnmapスキャンで/24を10秒以内に終わらせる方法: nmap -T5 -sn -PR --script broadcast-dns-service-discovery,broadcast-upnp-info 10.0.0.0/24 …SNIP… nmap完了: 256のIPアドレス(30のホストがアップ)を9.99秒でスキャンしました。 https://nmap.org/book/toc.html

nmapが好きで、よく使ってるよ。リンク先のツールはnmapとは違うことをしてるみたいだね。なんでそれがnmapから学んでない、または覚えてないと思うの?

LLDPとCDPが話したがってるよ。

いい感じだね。画面上の何でも選択できる方法があったらいいな。もしくは、見つけたデバイスのメーカー名とか、もっと情報をコピーできるボタンがあれば最高。

すごくいいね。AppleやBonjourが多いネットワークを扱うなら、Discovery.appも便利だよ。 https://apps.apple.com/us/app/discovery-dns-sd-browser/id138...

  • MacとWindows両方で動くradmin VPNってできないかな?