📡

Raspberry Piで作る!OSプロキシを無視するアプリ通信を丸裸にする透過型プロキシ構築ガイド

に公開

はじめに

アプリ開発において、Charlesは通信確認に欠かせないツールです。しかし、標準のHTTPクライアントがOSのプロキシ設定を参照しないFlutterアプリなどを相手にすると、途端に通信が見えなくなってしまい、困った経験はありませんか?

本記事では、そのようなプロキシ設定を回避するアプリの通信も、ネットワークレベルで傍受する「透過型プロキシ」という手法を使って解決します。

同様の解説記事はいくつか見つかりますが、iptablesのルールやDHCPサーバーの仕組みなど、ネットワーク関連の知識がないと難しく感じる部分もあり、できるだけ簡単に構築してみます。

完成図

iPhone/Android等クライアント → Raspberry Pi (mitmproxyで通信傍受) → インターネット

アプリケーション側には一切手を加えず、ネットワーク側で通信を解析するのがゴールです。


フェーズ1:OSの準備とWi-Fiの有効化

まずは、プロキシサーバーの土台となるRaspberry Pi OSを準備します。

1. OSのインストール

Raspberry Pi Imagerを使い、Raspberry Pi OS (64-bit) をSDカードに書き込みます。

このとき、「設定を編集する」からSSHの有効化、ユーザー名・パスワード、ホスト名などを設定しておくと後が楽です。

2. Raspberry PiへのSSH接続

OSを書き込んだSDカードをRaspberry Piに挿入し、LANケーブルを接続し、電源を入れます。1〜2分ほど待ってから、PCのターミナルで以下のコマンドを実行してSSH接続します。

ssh raspi@invisible-proxy.local

raspiとinvisible-proxyの部分は、ご自身で設定したユーザー名とホスト名に置き換えてください。
初めて接続する際は、フィンガープリントの確認を求められるので yes と入力してください。

3. Wi-Fi機能の有効化

クリーンインストール直後、SSHでログインすると以下のような警告が表示されることがあります。

Wi-Fi is currently blocked by rfkill.
Use raspi-config to set the country before use.

これは「使用国が設定されていないため、Wi-Fi機能がブロックされている」という状態です。以下のコマンドで設定ツールを起動し、日本を設定します。

sudo raspi-config

メニューを以下の順で選択してください。

  1. 5 Localisation Options
  2. L4 WLAN Country
  3. リストから JP Japan を選択

設定後、ラズパイを再起動 (sudo reboot) すると、Wi-Fiのブロックが解除されます。


フェーズ2:RaspAPによるアクセスポイント構築

手動でのネットワーク設定は非常に複雑なため、アクセスポイントの構築はRaspAPというツールに全て任せます。

1. RaspAPのインストール

以下のコマンド1行で、対話式のインストーラーが起動します。

curl -sL https://install.raspap.com | bash

基本的に全ての質問に**Y (Yes)** で答えて問題ありませんが、通信解析の邪魔になる可能性がある機能は無効にします。

  • Install Ad blocking? -> n
  • Install OpenVPN? -> n
  • Install WireGuard? -> n
  • Install and enable RestAPI? -> n

インストールが完了したら、指示に従って再起動します。

2. RaspAPの設定と接続確認

  1. 再起動後、hostname -IでラズパイのIPアドレスを確認します。

  2. PCのブラウザでそのIPアドレスにアクセスし、RaspAPの管理画面を開きます。

  3. デフォルト情報 (admin / secret) でログインします。

  4. 左メニューの「Hotspot」で、任意のSSIDパスワードを設定し、「Save settings」をクリックします。

  5. 「Restart Hotspot」をクリックしてアクセスポイントを起動します。

    接続用のQRコードが表示されます。便利ですね。

  6. 【重要】 iPhoneのWi-Fi設定で、作成したSSIDに接続し、Safariでインターネットが見られることを確認します。これが確認できれば、ルーター化は成功です。


フェーズ3:透過型プロキシの設定

いよいよ通信を解析するための設定です。

1. mitmproxyのインストール

Pythonのパッケージ管理ツールpipを使ってmitmproxyをインストールします。

# 1. pipをインストール
sudo apt update
sudo apt install python3-pip -y

# 2. pipでmitmproxyをインストール
# 最近のOSではシステムのPython環境保護のため--break-system-packagesが必要
pip3 install mitmproxy --break-system-packages

# 3. コマンドへのパスを通す
# これをしないと"mitmweb: command not found"エラーになる
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

2. iptablesによる通信リダイレクト

ラズパイのWi-Fi(wlan0)を通過するHTTP(ポート80)とHTTPS(ポート443)の通信を、mitmproxyが待つポート8080に強制転送します。

# HTTP通信(ポート80)をリダイレクト
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport 80 -j REDIRECT --to-port 8080

# HTTPS通信(ポート443)をリダイレクト
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport 443 -j REDIRECT --to-port 8080

3. mitmproxyの起動とiPhoneへの証明書インストール

  1. ラズパイでmitmproxyを透過モードで起動します。

    mitmweb --mode transparent --web-host 0.0.0.0
    
  2. iPhoneをラズパイのWi-Fiに接続します。

  3. Safariで http://mitm.it にアクセスし、プロファイルをダウンロードします。

  4. 「設定」アプリを開き、「プロファイルがダウンロード済み」からプロファイルをインストールします。


  1. 【最重要】 以下の手順で、インストールした証明書を信頼します。

    • 「設定」→「一般」→「情報」
    • 一番下の「証明書信頼設定」
    • mitmproxyのスイッチをオンにする

フェーズ4:通信の監視

全ての準備が整いました。

PCのブラウザで http://<ラズパイのIPアドレス>:8081 にアクセスすると、mitmwebの管理画面が開きます。

iPhoneで解析したいアプリを操作すると、リアルタイムで通信内容が管理画面に表示されます。リクエストやレスポンスをクリックすれば、SSLで暗号化されていたはずの通信内容が平文で確認できます。

お疲れ様でした!

Discussion