なりゆき
最近、マンションに共用の光回線が引かれて各部屋に無線APが設置されました。
接続したPCに振られたIP設定を見た感じ1 部屋のAPはブリッジモードで動作していて、マンション中の端末がひとつのプライベートネットワークに所属している構成のようです。
さすがに上流の通信がお隣さんにダダ漏れなんてことはないはずですが、どんな内容が上流に流れているのか気になるところです2。
ということで無線APと壁に設置されたLANポートとの間の通信をのぞいてみることにしました。
方針
NICが複数あるLinuxマシンは、NIC間にブリッジを構成する設定にすればハブとして使うことができます。
今回は無線APとLANポートが冷蔵庫の裏にあってPCから遠いので、Raspi 3を間にかまして通過するパケットをキャプチャしてWi-Fi経由でモニターします。
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ターゲットなんかを使えばできそうです。
それでは。