ノートパソコンのイーサネット ポートにイーサネットが接続された組み込みボードがあるとします。そのネットワーク構成については (まだ) 何も知りません。起動することはわかっていますが、ヘッドレスで、イーサネット ポートしかありません。IP アドレスはまだありません。
デバイスの MAC アドレスをどのように検出しますか?
arp、arping、arp-scan、arpwatch を調べました。私が見つけた唯一の方法は、tshark を使用して、吐き出されたものを手動で調べることです。
答え1
プレーンtshark
またはを実行するとtcpdump
、マシンから発信されるすべてのトラフィックもログに記録されるため、乱雑な出力が生成されます。
試す
tcpdump -i eth0 -lenq 'ether src not <your_mac>'
-e
イーサネットフレームもキャプチャする-l
stdout バッファを直ちにフラッシュします。-n
ホスト名を解決しない-q
もっと静かにしてください。<your_mac>
たとえば、次のようにして見つかったローカル インターフェイスの MAC アドレスに置き換えますip addr show
。- 当然、
eth0
正しいインターフェースに置き換えてください。Windows の場合は、 を使用してtshark -D
すべてのインターフェースを一覧表示します。 - (編集)Linux では、パッケージ全体のインストールが必要な の
tcpdump
インストールの代わりに を使用できます。は Ubuntu にプリインストールされているはずです (メタパッケージ内にあります)。tshark
wireshark
tcpdump
ubuntu-standard
代替:送信元MACアドレスを出力のみにしたい場合は、(以下のOPのコメントに触発され、恥ずかしげもなく改変しました)
ETH=eth0;MAC=$(cat /sys/class/net/$ETH/address); tcpdump -lenq -i $ETH "ether src not $MAC" | awk '{print $2}'
リンクなしでキャプチャを開始し、その後ケーブルを接続するのが最適です。
トラフィックをスニッフィングする方法はないと思います。ARP が失敗する理由は、デバイスに IP アドレスがなく、ARP 要求に応答しないからです。
別の解決策としては、デバイスを管理対象スイッチに接続し、MAC アドレス テーブルを読み取ることが考えられますが、これは選択肢ではないと思います。
いずれにせよ、検出可能にするには、デバイスは送信する必要がありますいくつかのイーサネット トラフィックの一種です。運が良ければ、スニッフィング可能な DHCP/Bootp 検出が送信されます。
(編集)ホストはなぜスイッチのように MAC テーブルを保持しないのでしょうか? ホストはスイッチではないので、その必要はありません。スイッチとは異なり、どのインターフェイスがイーサネット フレームを送信するかは、ルーティング テーブルに従って事前に決定されます。IP パケットは、ARP ルックアップ後に適切なフレームにラップされます。
もちろん、マシンを適切な L2 スイッチに変えることができます。複数の物理インターフェイス間にブリッジを作成することもできます。私はこれを少しいじってみましたが、その方法で優れた MAC テーブルを取得できることが分かりました。
bridge-utils
リポジトリからインストールします。新しいイーサネットブリッジを作成する
/etc/network/interfaces
auto br0 iface br0 inet static # dhcp goes as well address ... network ... bridge_ports eth0 up /sbin/brctl setageing br0 300 up /sbin/brctl stp br0 0
これは、スパニングツリーのない「ブリッジ」を定義します (実際にはブリッジはなく、インターフェイスは 1 つだけです) stp br0 off
。アドレスは 300 秒後に期限切れになります。好みに合わせて設定しますが、あまり低くしすぎないようにしてください。
ブリッジを上げます:
ifup br0
稼働しているかどうかを確認し
brctl show
、MAC テーブルを表示します。brctl showmacs br0
利益 (?)
答え2
Wireshark を使用してすべてのトラフィックをキャプチャし、bootp でフィルタリングするか、-e
オプションを使用して tcpdump でリンク層情報と bootp フィルタを印刷することができます。
http://www.tcpdump.org/tcpdump_man.html
sudo tcpdump -i any port bootps -e