Raspiをポートミラーリングハブにしてパケットキャプチャ

## なりゆき  ##

最近、マンションに共用の光回線が引かれて各部屋に無線APが設置されました。 
接続したPCに振られたIP設定を見た感じ[^1] 部屋のAPはブリッジモードで動作していて、マンション中の端末がひとつのプライベートネットワークに所属している構成のようです。

[^1]: IPが`172.16.120.13` サブネットマスクが `255.255.0.0` ゲートウェイが `172.16.110.254`でした

さすがに上流の通信がお隣さんにダダ漏れなんてことはないはずですが、どんな内容が上流に流れているのか気になるところです[^2]。
[^2]: もしかしたらAPはただのブリッジではなく何か認証が走っているかもしれないですし

ということで無線APと壁に設置されたLANポートとの間の通信をのぞいてみることにしました。

![here.jpg](https://qiita-image-store.s3.amazonaws.com/0/157224/465cb500-e196-9bc9-d406-a4680dc574ae.jpeg)

## 方針 ##

NICが複数あるLinuxマシンは、NIC間にブリッジを構成する設定にすればハブとして使うことができます。

> 参考: [brctl でLinuxマシンをHUBにする](http://www.usupi.org/sysad/162.html)

今回は無線APとLANポートが冷蔵庫の裏にあってPCから遠いので、Raspi 3を間にかまして通過するパケットをキャプチャしてWi-Fi経由でモニターします。

![capture.jpg](https://qiita-image-store.s3.amazonaws.com/0/157224/fae1adaf-7821-d736-7727-64869a053414.jpeg)

OSは執筆時点で最新の Raspbian Stretch Lite を使い、NetworkManagerでブリッジとWi-Fiを構成していきます。

## 用意したもの ##
- Raspberry Pi 3 Model B
- USB Ethernetアダプタ
- MicroSDカード
- LANケーブル

Raspi 3にはLANポートが1つしかないので USB Ethernetアダプタで増設します。

# セットアップ #
適当にRaspbianイメージをMicroSDに焼いてセットアップします(詳細略)。

一通り終わったらパッケージをインストールします。

```
sudo apt install network-manager tcpdump
```

NetworkManagerの設定を行っていきましょう。

## Wi-Fi APを立てる ##

ネットワーク経由で作業したいのでまずRaspiをAPにしておきます。

```
sudo nmtui
```
でTUIでNetworkManagerの設定ができます。

Edit a Connectionから Wi-Fi接続を追加します。

```
┌──────────────────────────┤ Edit Connection ├───────────────────────────┐
│                                                                        │
│         Profile name wlan0_ap________________________________          │
│               Device wlan0___________________________________         ▒│
│                                                                       ▒│
│ + WI-FI                                                       <Hide>  ▒│
│ |               SSID your-ssid_______________________________         ▒│
│ |               Mode <Access Point>                                   ▒│
│ |            Channel <Automatic>                                      ▒│
│ |                                                                     ▒│
│ |           Security <WPA & WPA2 Personal>                            ▒│
│ |           Password ************____________________________         ▒│
│ |                    [ ] Show password                                ▒│
│ |                                                                     ▒│
│ |              BSSID ________________________________________         ▒│
│ | Cloned MAC address ________________________________________         ▒│
│ |                MTU __________ (default)                             ▒│
│ \                                                                     ▒│
│                                                                       ▒│
│ - IPv4 CONFIGURATION <Shared>                                 <Show>  ▒│
│ - IPv6 CONFIGURATION <Ignore>                                 <Show>  ▒│
│                                                                       ▒│
│ [X] Automatically connect                                             ▒│
│                                                                        │
└────────────────────────────────────────────────────────────────────────┘
```

IPv4設定を `Shared` にしておくことでDHCPサーバーが有効になります。


なぜか`wpa_supplicant`が死んでいてNetworkManagerからwlan0をアクティベートできません。

```
pi@raspberrypi:~ $ sudo systemctl status wpa_supplicant.service 
● wpa_supplicant.service - WPA supplicant
   Loaded: loaded (/lib/systemd/system/wpa_supplicant.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

Mar 18 22:09:59 raspberrypi wpa_supplicant[2794]: ctrl_iface exists and seems to be in use - cannot override it
Mar 18 22:09:59 raspberrypi wpa_supplicant[2794]: Delete '/run/wpa_supplicant/wlan0' manually if it is not used anymore
Mar 18 22:09:59 raspberrypi wpa_supplicant[2794]: Failed to initialize control interface '/run/wpa_supplicant'.
                                                  You may have another wpa_supplicant process already running or the file was
                                                  left by an unclean termination of wpa_supplicant in which case you will need
                                                  to manually remove this file before starting wpa_supplicant again.

...
```

エラーメッセージに従って `/run/wpa_supplicant/wlan0` を削除し、wifiをonにしなおします。

```
sudo rm /run/wpa_supplicant/wlan0

sudo nmcli radio wifi off
sudo nmcli radio wifi on
```

APが有効になりました。

```
pi@raspberrypi:~ $ sudo nmcli dev
DEVICE  TYPE      STATE        CONNECTION
eth0    ethernet  connected    eth0
wlan0   wifi      connected    wlan0_ap
eth1    ethernet  unavailable  --
lo      loopback  unmanaged    --
```

作業PCからAPに接続し、Wi-Fi経由でssh接続し直します。

```
ssh pi@10.42.0.1
```

## ブリッジを構成 ##
`nmtui` で Bridge接続を追加します。
Slavesに eth0 と eth1 を追加しておきます。Slaveの設定はデフォルトのままです。


```
┌───────────────────────────┤ Edit Connection ├───────────────────────────
│                                                                        
│         Profile name br0_____________________________________          
│               Device br0_____________________________________          ▒
│                                                                        ▒
│ + BRIDGE                                                      <Hide>   ▒
│ | Slaves                                                               ▒
│ | ┌───────────────────────────────────────────────┐                    ▒
│ | │ eth0_slave                                    │ <Add>              ▒
│ | │ eth1_slave                                  ▒ │                    ▒
│ | │                                               │ <Edit...>          ▒
│ | │                                             ▒ │                    ▒
│ | │                                             ▒ │ <Delete>           ▒
│ | │                                               │                    ▒
│ | └───────────────────────────────────────────────┘                    ▒
│ |         Aging time 300_______ seconds                                ▒
│ | [X] Enable IGMP snooping                                             ▒
│ | [ ] Enable STP (Spanning Tree Protocol)                              ▒
│ |           Priority 32768_____                                        ▒
│ |      Forward delay 15________ seconds                                ▒
│ |         Hello time 2_________ seconds                                ▒
│ |            Max age 20________ seconds                                ▒
│ \                                                                      ▒
```

IPv4とIPv6はManualでアドレスを`0.0.0.0`,`::`にし、いちおうルーティングを無効にしておきます。


```
|
│ + IPv4 CONFIGURATION <Manual>                                 <Hide>   ▒
│ |          Addresses 0.0.0.0/32_______________ <Remove>                ▒
│ |                    <Add...>                                          ▒
│ |            Gateway _________________________                         ▒
│ |        DNS servers <Add...>                                          ▒
│ |     Search domains <Add...>                                          ▒
│ |                                                                      ▒
│ |            Routing (No custom routes) <Edit...>                      ▒
│ | [X] Never use this network for default route                         ▒
│ | [X] Ignore automatically obtained routes                             ▒
│ |                                                                      ▒
│ | [ ] Require IPv4 addressing for this connection                      ▒
│ \                                                                      ▒
│                                                                        ▒
│ + IPv6 CONFIGURATION <Automatic>                              <Hide>   ▒
│ |          Addresses ::/128___________________ <Remove>                ▒
│ |                    <Add...>                                          ▒
│ |            Gateway _________________________                         ▒
│ |        DNS servers <Add...>                                          ▒
│ |     Search domains <Add...>                                          ▒
│ |            Routing (No custom routes) <Edit...>                      ▒
│ | [X] Never use this network for default route                         ▒
│ | [X] Ignore automatically obtained routes                             ▒
│ |                                                                      ▒
│ | [ ] Require IPv6 addressing for this connection                      ▒
│ \                                                                      ▒
│                                                                        ▒
│ [X] Automatically connect                                              ▒
│ [X] Available to all users                                             ▒
│                                                                        ▒
│                                                           <Cancel> <OK>
│                                                                        
└─────────────────────────────────────────────────────────────────────────
```

最後にNetworkManagerを無視して自動でDHCP設定をするクライアント `dhcpcd.service` を無効にしておきます。

```
sudo systemctl disable dhcpcd.service 
```

リブートするとWi-Fiで接続を待ち受けつつ2つのLANポート間をブリッジするデバイスの完成です。

ちょっとステータスを確認します。

```
pi@raspberrypi:~ $ sudo nmcli dev
DEVICE  TYPE      STATE      CONNECTION
br0     bridge    connected  br0
eth0    ethernet  connected  eth0_slave
eth1    ethernet  connected  eth1_slave
wlan0   wifi      connected  wlan0_ap
lo      loopback  unmanaged  --

pi@raspberrypi:~ $ sudo route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.42.0.0       0.0.0.0         255.255.255.0   U     600    0        0 wlan0
```

RaspiからLANにパケットが流れるルートはなく、ブリッジを通過するパケットはEthernetフレームをそのまま転送するので通信の間に入っていることは検知できないはず?です。

## パケットキャプチャ ##
Wi-Fiからssh接続して

```
sudo tcpdump -i br0
```

でリアルタイムにパケットを監視できます。

作業PCにWiresharkをインストールしていればsshをパイプして

```
ssh pi@10.42.0.1 sudo tcpdump -i br0 -w - | wireshark -k -i -
```

とすればキャプチャしたパケットをWiresharkで解析できます。

`tcpdump` のオプションは

 - `-i br0`: キャプチャするインターフェースを指定
 - `-w -`: パケットを生のままファイルに出力(出力先は `-` で標準出力)


`wireshark` のオプションは

 - `-k`: セッションをすぐに開始
 - `-i -`: 開くファイルを指定(`-` で標準入力を開く)

です。

# おしまい #

さて、パケットを観測した結果、予想どうり新たに設置された無線APはただのハブとして動作していました。冷蔵庫の裏にあっては電波も悪いし、固定IPを振ったりプライベートDNSサーバーを立てたりもしにくいので、以前使っていたルーターを代わりに使っても良さそうですね。

ネットワーク構成はDHCPサーバーが上流にあって、マンション中の端末がひとつのプライベートネットワークに所属しているようです。近しいIPアドレスに片っ端からpingを打っても帰って来ないので、部屋同士の通信は遮蔽されているのでしょう。


今回できたのは厳密にはタイトルにあるポートミラーリングハブではないですが、まぁパケットをモニターすることはできるので許してください。厳密にポートミラーリングしたいならNICを追加してiptablesのTEEターゲットなんかを使えばできそうです。

それでは。