Raspberry Piを3台買ってネットワークで遊ぶ

created: 2015/12/20 01:08

最近ネットワーク周りのことを調べて遊んでるんだけど、実際に動くものを見ないと面白くないのでRaspberry Piを3台集めて遊ぶことにした。
仮想マシンでも良かったけど、やっぱりLANケーブルがわーっと伸びてたり基板上のLEDが明滅したりする方が楽しい。

ルータっぽくする

とりあえずルータっぽくして遊ぼうかということで、USBで接続するタイプのLANアダプタを2本買って1台をルータに、残り2台をそのルータに接続して通信できるようにすることに。

ネットワーク

な感じ。
RaspiルータにLANアダプタを2つ接続してブリッジにする。
以下Raspiルータの設定。IPマスカレードされないとパケットがどう出て行くか見たいので、iptablesは弄らずためしてみる。

# IPフォワードを有効に
sudo sysctl -w net.ipv4.ip_forward=1
# /etc/network/interfaces を編集
# 追加した箇所だけ抜粋
allow-hotplug eth1
iface eth1 inet static
address 0.0.0.0

allow-hotplug eth2
iface eth2 inet static
address 0.0.0.0

# 192.168.1.0/24側のインターフェイスになるブリッジ

# auto br0でもいいのかな
allow-hotplug br0
iface br0 inet static
bridge_ports eth1 eth2
bridge_stp off
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.255
# ブリッジを有効化
sudo ifup br0

Raspiルータに接続するRaspi達も設定する。

# /etc/network/interfaces
# 2台ともIPアドレスが違うだけでほとんど同じ設定なので、
# IPアドレスが192.168.1.3の設定は省略
auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0
network 192.168.1.255
gateway 192.168.1.1
dns-nameservers 192.168.0.1

あとはRaspiルータのLANアダプタにその他のRaspi達を接続してあげるだけ。

パケットキャプチャしてみる

IPマスカレードが未設定なんだけど、192.168.1.2のRaspiから192.168.0.3のMac book Airに向かってping(ICMP)を飛ばしてみる。

以下はRaspiルータ上でのtcpdumpで、eth0から出て行く(192.168.0.0/24に向かっていく)パケットのキャプチャ。
ICMPエコー応答が返ってきていないので、エコー要求ばかりが出力される。

pi@raspberrypi:~ $ sudo tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:40:35.973102 IP 192.168.1.2 > 192.168.0.3: ICMP echo request, id 1009, seq 1, length 64
14:40:36.975451 IP 192.168.1.2 > 192.168.0.3: ICMP echo request, id 1009, seq 2, length 64
14:40:37.975299 IP 192.168.1.2 > 192.168.0.3: ICMP echo request, id 1009, seq 3, length 64
14:40:38.975263 IP 192.168.1.2 > 192.168.0.3: ICMP echo request, id 1009, seq 4, length 64
14:40:39.975247 IP 192.168.1.2 > 192.168.0.3: ICMP echo request, id 1009, seq 5, length 64
14:40:40.975262 IP 192.168.1.2 > 192.168.0.3: ICMP echo request, id 1009, seq 6, length 64
14:40:41.975301 IP 192.168.1.2 > 192.168.0.3: ICMP echo request, id 1009, seq 7, length 64
14:40:42.975272 IP 192.168.1.2 > 192.168.0.3: ICMP echo request, id 1009, seq 8, length 64
...

IPマスカレードしていないので、送信元IPアドレスが192.168.1.2のまま192.168.0.3に向かっていく。
今度は宛先になっている192.168.0.3のマシンでWiresharkを使ってICMPのパケットをキャプチャしてみる。

MacでICMPをキャプチャ1

MacでICMPをキャプチャ2

ちゃんとICMPエコー要求は届いていて、エコー応答も返してる。
エコー応答の宛先MACアドレスがNECのルータのものになっているのは、192.168.1.2がルーティングテーブルにないからデフォルトゲートウェイ(NECルータ)に向けて送信してるって感じなのかな。
で、NECルータは192.168.1.2をどこに送信すればいいかは知らないし、そもそもこれプライベートIPアドレスだから外に出したくないしでパケットを破棄しているって感じすかね。ココらへんの振る舞いはまだ細かく理解出来てない。

今度はiptablesでIPマスカレードの設定をしてパケットキャプチャしてみる。
Raspiルータ上で、

sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE

で192.168.0.0/24に出て行くパケットの送信元IPアドレスをRaspiルータのもの(192.168.0.7)に書き換えるようにする。
で再度Raspiルータ上でeth0から出て行くパケットと、Mac上でのICMP関連のパケットをキャプチャする。
以下はRaspiルータ上でのtcpdump。

pi@raspberrypi:~ $ sudo tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:22:27.222310 IP 192.168.0.7 > 192.168.0.3: ICMP echo request, id 1073, seq 1, length 64
15:22:27.223602 IP 192.168.0.3 > 192.168.0.7: ICMP echo reply, id 1073, seq 1, length 64
15:22:28.224137 IP 192.168.0.7 > 192.168.0.3: ICMP echo request, id 1073, seq 2, length 64
15:22:28.225262 IP 192.168.0.3 > 192.168.0.7: ICMP echo reply, id 1073, seq 2, length 64
15:22:29.225704 IP 192.168.0.7 > 192.168.0.3: ICMP echo request, id 1073, seq 3, length 64
15:22:29.226864 IP 192.168.0.3 > 192.168.0.7: ICMP echo reply, id 1073, seq 3, length 64
15:22:30.227221 IP 192.168.0.7 > 192.168.0.3: ICMP echo request, id 1073, seq 4, length 64
15:22:30.228399 IP 192.168.0.3 > 192.168.0.7: ICMP echo reply, id 1073, seq 4, length 64

IPマスカレードを設定したので、ICMPエコー要求の送信元IPアドレスがRaspiルータのもになって、エコー応答もちゃんと返ってくるようになってる。貼ってないけどping送信元のRaspiマシンにもちゃんと返ってきてるよ。
次はMac上でのWiresharkによるパケットキャプチャ。

MacでICMPをキャプチャ3

MacでICMPをキャプチャ4

送信元, 送信先はRaspiルータ上のものと同じで、今回はちゃんとIPマスカレードしてるのでICMPエコー応答の宛先MACアドレスがちゃんとRaspberry Piのものになってる。やったね。

ついで

IPマスカレードする以外に、NECのルータに静的ルーティングの項目があったのでこっちでもうまく出来ないかやってみる。

静的ルーティング

192.168.1.0/24のパケットが来たらRaspiルータに飛ばしてもらう。
これで同じように192.168.1.2から192.168.0.3にpingを実行すると、ICMPエコー応答はちゃんと返ってきたんだけど、ICMPエコー応答を返してるMacにICMPリダイレクトメッセージが来るようになった。しかもずっと。

ICMPリダイレクトメッセージの受信

MacがICMPリダイレクトメッセージを無視してんのかと思って調べると、不正なICMPリダイレクトメッセージをホストに送りつけてパケットの経路を改ざんして内容を盗聴するような攻撃があるらしく、これを防止するためにICMPリダイレクトメッセージを無視して外から経路を変えられないようにするのはベターな対応っぽい。
それにしてもずっとICMPリダイレクトメッセージが送られてくるのはどうなんだ。NECルータ側の設定で変えられるのかな。