WireGuardを使った、スマートフォンのOSに依存しないパケット操作の方法

はじめに

本稿は、主にスマートフォンにインストールされたアプリケーション(以下、スマホアプリ)から発生する通信に対してWebアプリケーション診断を後述する特定条件下において行う、という目的を達成するために書かれた文章です。

弊社の取り組みと併せ、うまく条件がマッチした方にとっては嬉しい内容かもしれませんのでご紹介します。

診断における特定条件

今回の特定条件とは、次の3つの条件をすべて満たした状態を指します。

  1. 診断対象の通信がOS標準のプロキシ設定を無視する
  2. スマートフォン端末の管理者権限を取得することが出来ない
  3. 診断端末では直接パケット操作を行わない

各条件について、詳しく見ていきます。

1. 診断対象の通信がOS標準のプロキシ設定を無視する

これは、独自の実装により通信を確立している場合や、特定の開発フレームワークによるデフォルトの挙動により、発生しうる条件です。 診断を行うためには欠かせない「通信の可視化」において、事前に把握しておきたい挙動の一つです。

2. スマートフォン端末の管理者権限を取得することが出来ない

弊社の場合、診断に利用する端末は管理者権限を取得しているケースがほとんどです。この場合、スマートフォン端末の管理者権限を利用したパケット操作が直接行えます。

しかし、診断の契約や利用するデバイスの制約上、「スマートフォン端末の管理者権限を取得することが出来ない」という本条件が課せられることがあります。

3. 診断端末では直接パケット操作を行わない

本条件は「診断端末のプラットフォームに依存しない」とも言えますので、1つのメリットにもなり得ます。

作業内容

端末一覧

端末名称 解説
スマートフォン端末 診断対象スマホアプリがインストールされた端末。
診断端末 スマートフォン端末が接続しているネットワークのゲートウェイとなる端末。
Linux端末 診断端末と同一ネットワークに属したLinuxがインストールされた端末。診断対象のWebアプリケーションに対してリクエストの送出を担当。

ネットワーク構成図

前準備

  1. スマートフォン端末診断端末が提供するネットワークLANに接続する

WireGuardサーバの環境構築

  1. Linux端末にWireGuardをインストールする

    curl -O https://raw.githubusercontent.com/angristan/wireguard-install/master/wireguard-install.sh
    chmod +x wireguard-install.sh
    
    sudo ./wireguard-install.sh
    
  2. 続けてWireGuardを次の内容でセットアップし、利用可能な状態にする

    • IPv4 or IPv6 public address:
      • スマートフォン端末から見た診断端末のIPアドレスを指定する
        • 例)192.168.1.1
    • Public interface:
      • Linux端末が、診断対象Webアプリケーションサーバへ接続しているインターフェースを指定
        • 例)10.0.2.15のIPアドレスを持つインターフェース
    • WireGuard interface name:
    • Server WireGuard IPv4:
    • Server WireGuard IPv6:
    • Server WireGuard port [1-65535]:
    • First DNS resolver to use for the clients:
    • Second DNS resolver to use for the clients (optional):
    • Allowed IPs list for generated clients (leave default to route everything):
      • いずれも初期値のまま
    • Client name:
      • WireGuardへ接続する端末が認識できる名前(ホスト名など)
    • Client WireGuard IPv4:
    • Client WireGuard IPv6:
      • いずれも初期値のまま
  3. 診断端末からLinux端末上でWireGuardが待ち受けているUDPポートへ転送する

    • 例)Linuxであれば、socatコマンドなどを利用する
    • 注)Windows標準のnetshコマンドは、UDPパケットの転送が出来ないため利用ができない

WireGuardアプリの導入と接続

  1. スマートフォン端末にWireGuardアプリをインストールする
  2. 続けてWireGuardアプリを立ち上げ、以下の手順に沿って接続を確立する
    1. 画面下部にある+アイコンをタップする
    1. QRコードをスキャンを選択する
    1. 「WireGuardサーバの環境構築」手順2を完了した際、Linux端末のコンソール上に表示されたQRコードをスキャンする
    2. 任意のトンネル名を入力し、トンネルを作成する
    1. 作成したトンネル横のトグルボタンをタップし接続する

※「QRコード」は株式会社デンソーウェーブの登録商標です。

任意のパケット操作

  1. Linux端末を使って、「いい感じ」にパケット操作を行う

    sudo iptables -t nat -A PREROUTING -i wg0 -p tcp --dport 443 -j REDIRECT --to-port 18080
    
    socat TCP4-LISTEN:18080,fork,reuseaddr TCP4:10.0.2.2:18080
    

おわりに

今回は、特定条件に限定されているものの、スマホアプリを使った弊社のWebアプリケーション診断において実際に利用している手順の一部をご紹介しました。

実際の手順では、診断作業による各種インシデントを防ぐためにさらなる対策を導入しているのですが、本質的な作業ではないため今回は割愛しています。

弊社では、診断作業を滞りなく行うことはもちろん、診断作業による各種インシデントを事前に防ぐことも重要だと考えています。このような対策の積み重ねが、さらなる「診断品質の向上」と「お客様からの信頼獲得」に繋がるということを信じて、今後も大切にしてきたい観点の1つです。

© 2016 - 2024 DARK MATTER / Built with Hugo / テーマ StackJimmy によって設計されています。