Raspberry PiでWi-Fiアクセスポイントを立ててパケットキャプチャする!!

# Raspberry PiでWi-Fiアクセスポイントを立ててパケットキャプチャする!!
Raspberry Pi を使ってWi-FiのAPを作ります．ラズパイでAPを作ることで特にスマホやタブレットなどのパケットキャプチャができます．
~~たしか，Andorid，ios共に脱獄などしないとキャプチャできません.~~　VPNやxcodeを使って一応できるようです．個人的には最初の環境構築に時間がかかりますがそれ以降は簡単に取得できると思います，Windows，LinuxなどではWiresharkでキャプチャできますが...  
あとはロマンです．
## Wi-Fiについて
Wi-Fiは言わずもがなIEEE802.11の中で規定されている無線LANの１種である．
主なWi-Fiバージョンは以下の通り．
<table>
    <thead>
        <tr>
            <th>世代</th> <th>通称</th> <th>規格名</th> <th>最大通信速度</th> <th>周波数</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <th>第1世代</th> <th>-</th> <th>IEEE802.11</th> <th>2Mbps</th> <th>2.4GHz帯</th>
        </tr>
        <tr>
            <th>第2世代</th> <th>-</th> <th>IEEE802.11a</th> <th>54Mbps</th> <th>5GHz帯</th>
        </tr>
        <tr>
            <th></th> <th>-</th> <th>IEEE802.11b</th> <th>11Mbps</th> <th>2.4GHz帯</th>
        </tr>
        <tr>
            <th>第3世代</th> <th>-</th> <th>IEEE802.11g</th> <th>54Mbps</th> <th>5GHz帯</th>
        </tr>
        <tr>
            <th>第4世代</th> <th>Wi-Fi 4</th> <th>IEEE802.11h</th> <th>600Mbps</th> <th>5GHz帯</th>
        </tr>
        <tr>
            <th>第5世代</th> <th>Wi-Fi 5</th> <th>IEEE802.11ac</th> <th>6.9Gbps</th> <th>5GHz帯</th>
        </tr>
        <tr>
            <th>第6世代</th> <th>Wi-Fi 6</th> <th>IEEE802.11ax</th> <th>9.6Gbps</th> <th>5GHz帯</th>
        </tr>
    </tbody>
</table>

以上の表からもわかるようにWi-Fiには2.4GHz帯と5GHz帯の２つを用いている

### 2.4GHz帯と5GHz帯のそれぞれの良し悪し
<dl>
    <dt> 2.4GHz </dt>
    <dd>
        <li>長所：電波の到達距離が5GHz帯に比べてより遠く，遮蔽物に対しても強い</li><br>
        <li>短所：電子レンジ，Bluetoothなどと近接した周波数を用いているため干渉が起きやすい．特にラズパイなど安定感が欠ける製品だと如実．5GHz帯と比べると速度が遅い</li>
    </dd>
    <dt> 5GHz </dt>
    <dd>
        <li>長所：電波の干渉が起きにくく通信速度が2.4GHzと比べると速い</li><br>
        <li>短所：障害物や遮蔽物の影響を受けやすい．通信可能距離が2.4GHzと比べると短い．また，5GHz帯自体の欠点ではないがIoT機器などの低予算デバイスでは5GHz帯をサポートしていないことがある</li>
    </dd>
</dl>

## 実際に作ってみる
今回使用するものは**Raspberry Pi model 4B**です．他のバージョンでも可能かどうかは使用しているWi-Fiチップセットによって変わるので調べてみてください．ちなみに，Wi-FiのmodeをAP用のMasterにできればAP化可能です．

:::note Info
Raspberry PiではどうやらBROADCOMのチップセットが用いられているようです.
AP化できるかはチップセットのドライバでmode Masterをサポートしているかに依存しています．
また，IntelではすべてのチップセットでAP化できないようにされているようなのでラズパイ以外で試す方はご注意を  
[intelのWi-Fiチップセットについて](https://www.intel.co.jp/content/www/jp/ja/support/articles/000030429/wireless.html)
:::
### 用意するもの
* Raspberry Pi model 4B(結構発熱するので冷やすケースやファンがあるとなお良し)
* 有線LANケーブル(ラズパイではWi-Fi通信できますが，Wi-Fiでデータ通信を利用しつつAPにすることはできません)

### まずはRaspberry Piの環境構築
Raspberry Pi のOSをSDカードに焼きます．
ラズパイのOSを焼くツールとして公式からRaspberry Pi Imagerというものが配布されています．
以下からどうぞ↓
> [Raspberry Pi Imager](https://www.raspberrypi.com/software/)  

様々なOSをインストールできますが今回はRasberry Pi OS(other)からRaspberry Pi OS Lite(64bit)を選択しました．

:::note Info
Raspberry Pi OSはDebian系のLinux OSです．今後の設定は他のDebian系Linux OSであるUbuntuやdebianなどでも可能ですが，少し設定が異なる場合があります．debianではrfkillがNICをソフトブロックする，本記事ではrc.localを用いていますが他のディストリビューションでは無効にされていたりします．変わりが提供されているのでそちらを使ってください．
:::

ちなみにRaspberry Pi OS
![raspi imager](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858078/5f94ef4f-b43e-fc65-af2a-d3b85c840097.png)
![raspi OS](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858078/c6d202c9-c370-da75-4b41-13542df4fc84.png)

選択してSDカードに焼いてください．終了後，ラズパイにさして起動します．

指示通りに初期設定を済ませてください．もし，初期設定がわからない方はほかの方の記事を参照してみてください．そこを作成するのがめんどかった(小声)

:::note warn
注意
初期設定終了後必ずアップデートをかけてください．不具合でうまくAPできない場合があります．また，電源をとるときはできるだけコンセント直接から取ってください．電源が不安定だとうまく動作しません．
```bash:
sudo apt update
sudo apt upgrade
```
:::

### 実際にLinuxで設定をする
#### 使うソフトウェア
今回利用するLinuxでのソフトウェアは以下の通りです．
* dhcpcd：ネットワークインターフェースのIPアドレスの固定
* hostapd：Wi-Fiの送出
* dnsmasq：DHCPサーバ
* iptables；NAPT

#### dhcpcd
dhcpcdではWLAN用のNICのIPアドレスを固定します．固定しないとめんどくさくなります．
まずはインストール．(デフォで入っている場合もあります)
``` bash:
sudo apt-get install dhcpcd
```
インストールが完了できたら設定ファイルを編集していきます．
```bash:
sudo nano /etc/dhcpcd.conf
```
ファイルを開いたらwlan0のipアドレスを固定する旨を書きます．IPはお好きなプライベートIPをどうぞ．
```text:
interface wlan0
static ip_address=192.168.0.1/24
```

#### hostapd
hostapdは実際にWi-FiのAPについて設定をするソフトウェアです．まずは，インストール．
```bash:
sudo apt-get install hostapd
```
次に設定ファイルを開いて，設定ファイルを編集
```bash:
sudo nano /etc/hostapd/hostapd.conf
```
設定ファイルは以下の通り
```text:
interface=wlan0
driver=nl80211 #Wi-Fiなので
#IEEE802.11の中でどのモードを使うか．NICが対応する中で最新を選ぶと良い
hw_node=g #IEEE802.11nを使う場合でもg．model 4Bではacまで利用可能
channel=6 #2.4GHz帯と5GHz帯で使えるチャンネルが異なる．周辺環境を踏まえて選ぶとよい．
macaddr_acl=0 #MACアドレスのフィルタリングをするか(0=off/1=on)
auth_algs=1 #認証方法(1=WPA/2=WEP．WEPは脆弱性が確認されているのでWPAを使う)
ignore_broadcast_ssid=0 #SSIDを非表示にするか
wmm_enabled=1 #wmmの設定
country_code=JP #国設定．大文字なので注意
ieee80211d=1
ieee80211h=1
ieee80211ac=0
ieee80211n=0
#無線出力設定
local_pwr_constraint=3
spectrum_mgmt_required=1
#WPAのバージョン設定 WPA3には対応していない．1=WPA,2=WPA2，3=両方．理由がなければ2に
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
rsn_pairwise=CCMP
ssid = #お好きなSSIDを
wpa_passphrase = #お好きなWi-Fiパスワードを
```

ここで，設定したファイルをhostapdが読み込めるようにデーモンを設定する
```bash:
sudo nano /etc/default/hostapd
```
そしてファイルの13行目にある
```txt:
DEAMON_CONF="/etc/hostapd/hostapd.conf"
```
と書き換えて保存する．
保存ができたらhostapdを再起動します．
```bash:
sudo systemctl restart hostapd
```
再起動すると，
```text:
Failed to restart hostapd.service: Unit hostapd.service is masked
```
のようなメッセージが出てくるのでマスクを外します．ついでに自動起動できるようにします．
```bash:
sudo systemctl unmask hostapd
sudo systemctl restart hostapd
sudo systemctl enable hostapd
```
再起動すると
```text:
● hostapd.service - Access point and authentication server for Wi-Fi and Ethern>
```
的な長々とメッセージが出てきたら成功です．おかしいと赤文字エラーが出ます，エラーメッセージを読んで修正してください．

#### dnsmasq
dnsmasqではDHCPサーバーの役割を持たせる．
```bash:
sudo nano apt-get install dnsmasq
```
同様に設定ファイルを編集する．
```bash:
sudo nano /etc/dnsmasq.conf
```
で設定ファイルを開いて一番下に以下を追加．
```text:
interface=wlan0 #dhcpサーバの対象インターフェースを指定
dhcp-range=192.168.0.2,192.168.0.100,255.255.255.0,24h
#↑は先ほど固定したIPと対応するように．第1,2引数は配布するIPの範囲,第3引数はサブネットマスク,第4はリース時間
```

#### iptables
IPマスカレードを行うための設定です．LAN内でのプライベートIPアドレスから外部サイトなどにアクセスるために用いるパブリックIPへの変換を行うNAPTの役割を担います．
まずはiptablesをインストール
```bash:
sudo aot-get install iptables
```
実際にNAPTの設定を行う．
```bash:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
```

ここで書いた設定は電源を落とすと失ってしまいます，そこで，rc.localなどに記述しておくことで電源を落としても設定を保持できるようにします．

```bash:
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" #設定ファイルの書き出し
```

そしてrc.localに記述する．
```bash:
sudo nano /etc/rc.local
```
でrc.local設定ファイルを開いて,exit 0以前に以下の通り書く．
```text:
iptables-restore < /etc/iptables.ipv4.nat
```
パケットをフォワーディングできる設定をする
```bash:
sudo nano /etc/sysctl.conf
```
このファイルの中で
```text:
net.ipv4.ip_forward=1
```
と書き換えて設定を適用させる．
```bash:
sudo sysctl -p
```
でnet.ipv4.ip_forward=1がでてきたらOK.
#### 最後にネットワークインターフェースを作成する．
```bash:
sudo nano /etc/network/interfaces
```
に以下を追加
```text:
allow-hotplug wlan0
iface wlan0 inet static
  address 192.168.0.1
  netmask 255.255.255.0
```
保存できたら
```bash:
sudo reboot
```
でできあがり．
お疲れ様です．

## ２つのAPを出す
以上のように，Raspberry Piでは一つのAPしか建てられません(NICが一つだけなので)．しかしながら，2.4GHz,5GHzどちらも出したいという方もいるかと思います．  
その場合には**USBトングルを追加することで実現可能です!!!**
利用するUSBトングルはELECOMのWDC-150SU2Mを利用しました．linux自体はサポートしていませんが有志の方が作成したドライバを利用してAP化が可能です．とっても感謝です!!
>rtl8188euのドライバです  
>[ドライバのgithubページはこちらから](https://github.com/aircrack-ng/rtl8188eus)

:::note info
この製品ではrealtek社のrtl8188EUというチップが用いられています．
linuxにもデフォルトでこのチップに対応したドライバが入っていますがAPには対応していません．そこで，対応したドライバに入れ替えることで
AP化を行います．つまり，この製品以外でも，AP化に対応したドライバがあれば実現可能です，
:::

### ドライバの導入
```bash:
lssub #指しているUSB情報を取得
```
ドライバのソースコードを取得
```bash:
cd ~
mkdir tools && cd tools
git clone https://github.com/aircrack-ng/rtl8188eus
```
不要なドライバを読み込み対象から外す
```bash:
sudo echo 'blacklist r8188eu' | sudo tee -a 'etc/modprobe.d/realtek.conf'
```

同一名称のドライバを削除する
```bash:
cd /lib/modules/$(uname -r)/kernal/drivers/net/wireless
rm -rf ./realtek ~/tools
```
コンパイル，インストール
```bash:
cd ~/tools/rtl8188eus
make && sudo make install
```

以上を実行し再起動をかける
再起動後，読み込めているか確認
```bash:
sudo airmon-ng
```
ドライバが適用できているか確認

:::note info
airmon-ngがない時には
```bash:
sudo apt install aircrack-ng
```
でインストールできます．
:::

```bash:
sudo iwconfid wlan1 down
sudo iwconfig wlan1 mode master #modeをmasterに
sudo iwconfig wlan1 up
```
でwlan1のmodeをmasterに
### dhcpcd
```text:/etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.0.1/24
static routers=192.168.0.1

interface wlan1
static ip_address=192.168.1.1/24
static routers=192.168.1.1
```
### hostapd
```text:/etc/hostapd/wlan0.conf
interface=wlan0
driver=nl80211
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
wmm_enabled=1
country_code=JP
ieee80211d=1
ieee80211h=1
ieee80211ac=0
ieee80211n=0
local_pwr_constraint=3
spectrum_mgmt_required=1
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
rsn_pairwise=CCMP
ssid= #SSID
wpa_passphrase= #password
```

```text:/etc/hostapd/wlan1.conf
driver=nl80211
hw_mode=a
channel=36
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wmm_enabled=1
country_code=JP
ieee80211d=1
ieee80211h=1
ieee80211ac=0
ieee80211n=1
local_pwr_constraint=3
spectrum_mgmt_required=1
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
rsn_pairwise=CCMP
ssid= #SSID
wpa_passphrase= #password
```

そして，
```bash:
sudo systemctl stop hostapd
sudo systemctl disable hostapd
sudo systemctl start hostapd@wlan0
sudo systemctl start hostapd@wlan1
```
また，rc.localに以下を追加します.
```bash:
sudo systemctl start hostapd@wlan0
sudo systemctl start hostapd@wlan1
```

### dnsmasq
```bash:/etc/dnsmasq.conf
interface=wlan0
dhcp-range=wlan0,192.168.0.2,192.168.0.100,255.255.255.0,24h

interface=wlan1
dhcp-range=wlan1,192.168.1.2,192.168.1.100,255.255.255.0,24h
```

### iptables
上述の通りです．

### ネットワークインターフェース
```bash:/etc/network/interfaces
allow-hotplug wlan0
iface wlan0 inet static
  address 192.168.0.1
  netmask 255.255.255.0

allow-hotplug wlan1
iface wlan1 inet static
  address 192.168.1.1
  netmask 255.255.255.0
```
以上で再起動をすると動作します!!!

## パケットを収集する．
ここまで頑張ってAPを作成した後にはパケット情報を収集したいと思います．今回は**tcpdump**で収集を行います．
```bash:
sudo apt install tcpdump
```

```bash:
sudo tcpdump -i wlan0 -i wlan1
```
でリアルタイムにパケットを見ることができます．保存したい場合は-wオプションを付けてください．

## まとめ
今回は，ラズパイでAPを作成する手段についてまとめました，後半駆け足となってしまいました，  
必ずしもラズパイでないとできないわけではなく対応するNIC，ドライバ，Linuxがあれば可能です，~~スマホなどでは基本的にこのような手段でなければパケットキャプチャができないかと思います．~~ 
アプリなどでキャプチャできるようですが初期導入以降はアプリより簡単に取得できると思います．
  また，IoT機器などではこの手法かスイッチのポートミラーリングを用いる手法でしかキャプチャできません．
誰かのお役に立てたらうれしいです．