ここのところ買い集めている小さな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.参考情報
- Linuxで簡易ネットワーク解析
基本的にこのページの内容はここに書かれている内容を辿ったものです。とても簡潔でわかりやすく書かれています。このページがあったからこそ、次のnetemの英語ドキュメントが理解できました。 - netem ドキュメント(英語)
正式なタイトルわかりません。上記ページの元ネタと思います。 - tcコマンドmanページ(英語)
タイトルのまんまですが、自分はわかりにくい(読みにくい)です。 - iptablesチュートリアル(日本語訳)
iptablesのチュートリアルだが、TCP/IPのおさらいから記載されていてとても勉強になりました - iptablesの解説
簡潔に書かれていて非常に勉強になりました - NICを二枚使用したブリッジ型ファイアウォール構築メモ
ブリッジとして動作させた上で、iptablesでフィルタリングを行うというもの - tcpdumpのフィルターのまとめ
例の形でいろいろ載ってます