Raspberry Piをネットワークの試験に使う

ここのところ買い集めている小さなLinuxボードは結局はネットワークの試験のために購入したもので、元々はなるべく小さなtcpdumpが使えて動かしっぱなしで放置できるものを探していたものです。で、いろいろぐぐっていたら、linuxでEthernetインタフェースが2つある環境を使って、もっといろいろできることがわかってきました。具体的には、ブリッジとして動作させてた上で、遅延を挿入したりできるというものです。その環境もRaspberry PiにUSBイーサネットアダプタを追加してやれば、Raspberry Piでもできそうなことがわかったので、試してみました。

1.Raspbianのインストール

今回はGUIは不要なので、Raspbian Liteを適当なMicro SDに書き込んで、余っていたRaspberry Pi model B+に入れました。
起動して、User/Passwd=pi/raspberryでログインしたあと、コンソールから

$ sudo touch /boot/ssh
$ sudo reboot

として再起動。再起動後、linuxマシン側から

$ ssh pi@raspberrypi.local

としてsshでログイン、以降はリモートログインで作業します。リモートログインしたら、

pi@raspberrypi:~ $ sudo raspi-config

として、初期設定をします。今回は、

  • パスワード設定
  • ホスト名をraspinetに変更
  • ブートオプションをConsoleに設定
  • ローカライゼーションでLocaleにja_JP.UTF-8 UTF-8を追加、デフォルトはen_GB.UTF-8のまま。タイムゾーンはAsia/Tokyoを選択。
  • Advanced OptionでExpand Filesystemを選択、Memory Spiltは16MBに設定

で、設定後に再度、再起動。再起動後、Linuxマシン側から

$ ssh pi@raspinet.local

として再度ログインします。ログインしたら、

pi@raspinet:~ $ sudo apt-get update
pi@raspinet:~ $ sudo apt-get upgrade
pi@raspinet:~ $ sudo apt-get install tcpdump bridge-utils

として、アップデートを一通りかけた後、bridge-utilsとtcpdumpをインストールします。

2.スクリプトファイルを作成して起動時に実行させる

pi@raspinet:~ $ sudo vi /usr/local/bin/start-bridge

として、ブリッジを起動する以下の内容のスクリプトを作成しました。(実行タイミングをsleepで調整しているのでちょっと汚いですが・・・)

#!/bin/sh
# disable IPv6
sysctl -w net.ipv6.conf.all.disable_ipv6=1
# setup bridge
brctl addbr vbr0
brctl addif vbr0 eth0
brctl addif vbr0 eth1
sleep 5
# start interface
ifconfig eth0 0.0.0.0 up
ifconfig eth1 0.0.0.0 up
ifconfig vbr0 0.0.0.0 up
sleep 5
dhclient -r
dhclient vbr0
echo 0 > /sys/devices/virtual/net/vbr0/bridge/multicast_snooping

IPv6は今回禁止、IGMP snooping も禁止しました。作成後に、

pi@raspinet:~ $ sudo chmod a+x /usr/local/bin/start-bridge

として、実行権限を付与。起動時に実行させるため、/etc/rc.local を修正して、最後の exit 0 の前に以下の部分を追加しました。

if [ -e /usr/local/bin/start-bridge ]; then
  /usr/local/bin/start-bridge &
fi

これで、Raspberry Piを起動させると自動的にブリッジとして動作するようになります。

3.tcpdumpで通過パケットをモニタしてみる

Linuxホスト側から

$ ssh pi@raspinet.local

でブリッジに設定したRaspberry Piにログインします。その後、

pi@raspinet:~ $ sudo tcpdump -i vbr0 not port ssh

とか、

pi@raspinet:~ $ sudo tcpdump -i vbr0 not host `/sbin/ip -f inet -o addr show vbr0 | awk '( $2 == "vbr0" ) {print $4}' | cut -d/ -f 1`

で通過するパケットをモニタします。(後ろの方の長いのは vbr0 のIPアドレスを抽出しているだけです)
ポートやIPアドレスでRaspberry Piに接続しているsshのパケットを除外しています。除外しないと、表示した文字列をパケットキャプチャして、それを再度表示してしまいます。

4.参考情報

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)