イメージはこんな感じ

使ったRaspberry Pi
 

 
と、無線LANドングルが2個

これらを使って、一般的な家庭用無線ルーターとスマフォとの間にRaspberry Piをアクセスポイントにして、無線LANを中継する。
Raspbianの最新バージョンでやろうとしたがネットワークの設定ではまってしまったので、少し古いDEBIAN JESSIE WITH RASPBERRY PI DESKTOPの2017-03-02版で進める。

Raspberri Piの立ち上げなどはここでは割愛。適当に初期設定を済ませて、無線LANドングルを2個刺す。
直接本体に刺すとUSBの電源の問題でネットワークが不安定になる場合があるので、ACアダプタ付きのUSBハブを使った方が良さそう。

無線LANドングルを刺すとwlan0とwlan1で自動で認識された。

  • wlan0を無線ルーター側(インターネット側)
  • wlan1をスマフォ側(アクセスポイントに設定する)

として進める。同じドングルなのでどちらがどっちかわからないのでMACアドレスを使ってデバイス名とMACアドレスを対応付ける。

$ sudo vi /etc/udev/rules.d/70-network_interfaces.rules
----------------------------
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="cc:e1:d5:4f:a8:ec", NAME="wlan0"
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="cc:e1:d5:4d:e5:36", NAME="wlan1"
----------------------------

次にネットワークの設定を”/etc/network/interfaces”に書く
↓こんな感じ

$ sudo vi /etc/network/interfaces
----------------------------
# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

# 管理LAN
auto eth0
iface eth0 inet dhcp
# デフォルトGWの設定を削除
post-up /sbin/ip route del default dev eth0

# インターネット側 
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "home-ap"
wpa-psk "パスワード"

# アクセスポイント側
auto wlan1
allow-hotplug wlan1
iface wlan1 inet static
address 192.168.99.1
netmask 255.255.255.0
----------------------------

ここまで設定して、一度再起動して、wlan0が無線LANルーターに接続してインターネットに出れる事と、wlan1に固定IPアドレスが振られていることを確認する。

DHCPサーバーをインストールする

以下のコマンドでDHCPサーバーをインストールする。

$ sudo apt-get update
$ sudo apt-get install isc-dhcp-server

設定ファイルを変更して、AP側(wlan1)のネットワーク設定を行う。

$ sudo vi /etc/dhcp/dhcpd.conf
----------------------------
#option domain-name "example.org";           <--- コメント化
#option domain-name-servers ns1.example.org, ns2.example.org;  <--- コメント化

authoritative                    <--- コメント解除

 ↓ ファイルの最後に以下を追加# add theses lines
subnet 192.168.99.0 netmask 255.255.255.0 {
  range 192.168.99.10 192.168.99.250;
  option broadcast-address 192.168.99.255;
  option routers 192.168.99.1;
  option domain-name "local";
  option domain-name-servers 8.8.8.8, 8.8.4.4;
}
----------------------------

dhcpサーバーで使用するインターフェースをwlan1に変更する

$ sudo vi /etc/default/isc-dhcp-server
----------------------------
INTERFACES="wlan1"
----------------------------

hostapdをインストールする

$ sudo apt-get install hostapd
設定ファイルを展開してアクセスポイントの設定を行う。
$ cd /etc/hostapd/
$ sudo cp /usr/share/doc/hostapd/examples/hostapd.conf.gz .
$ sudo gunzip ./hostapd.conf.gz
$ sudo vi /etc/hostapd/hostapd.conf
----------------------------
interace=wlan1    # wlan1に変更
ssid=dmy_ap        # 好きなSSIDを指定
channel=3
auth_algs=1
macaddr_acl=0
wpa=2
wpa_passphrase=passwo@rd  # 好きなパスワードを設定
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
----------------------------
$ sudo vi /etc/default/hostapd
----------------------------
DAEMON_CONF="/etc/hostapd/hostapd.conf"
----------------------------
wlan1のトラフィックをwlan0へリダイレクトする
$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
$ sudo iptables -A FORWARD -i wlan0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -A FORWARD -i wlan1 -o wlan0 -j ACCEPT
$ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
フォワードを有効にする。
$ sudo vi /etc/sysctl.conf
----------------------------
net.ipv4.ip_forward = 1
----------------------------
起動時にiptableの設定が有効になるように”/etc/network/interfaces”に1行追加する。
$ sudo vi /etc/network/interfaces
----------------------------
up iptables-restore < /etc/iptables.up.rules
----------------------------
mitmproxyのインストール
mitmproxyの最新版を利用するためにはPythonが3.5以上を要求するので、Python3.6を先にインストールしておく。(※コンパイルに1時間ぐらいかかった)
$ sudo apt-get install build-essential libc6-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev
$ cd $home
$ mkdir tmp
$ cd tmp
$ wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz$ tar -zxvf Python-3.6.2.tgz
$ cd Python-3.6.2
$ ./configure
$ make
$ sudo make altinstall

python3のリンクを張りなおす

$ sudo mv /usr/bin/python3 /usr/bin/python3.old
$ sudo mv /usr/bin/python3-config /usr/bin/python3-config.old
$ sudo mv /usr/bin/python3m /usr/bin/python3m.old
$ sudo mv /usr/bin/python3m-config /usr/bin/python3m-config.old
$ sudo ln -s /usr/local/bin/python3.6 /usr/bin/python3
$ sudo ln -s /usr/local/bin/python3.6m /usr/bin/python3m
$ sudo ln -s /usr/local/bin/python3.6m-config /usr/bin/python3m-config

pipをアップグレードした後に、mitmproxyをインストールする。

$ sudo pip3 install -U pip
$ sudo pip3 install mitmproxy

wlan1側からのwebアクセスがmitmproxyに転送されるようにiptablesの設定変更を行う。

$ sudo vi /etc/iptables.up.rules
----------------------------
*filter
INPUT ACCEPT [191:79895]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [224:45790]
-A FORWARD -i wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i wlan1 -o wlan0 -j ACCEPTCOMMIT
*nat
:PREROUTING ACCEPT [10:625]
:INPUT ACCEPT [8:480]
:OUTPUT ACCEPT [14:833]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i wlan1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080           <--- ここを追加
-A PREROUTING -i wlan1 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8080          <--- ここを追加
-A POSTROUTING -o wlan0 -j MASQUERADE
COMMIT
----------------------------

mitmproxyを起動する

$ mitmproxy -T --host

一度起動すると”~/.mitmproxy/”の下に証明書ができる。
そのファイル” mitmproxy-ca-cert.pem”を取り出してメール等で端末に送ってインストールしておく。

【Androidの場合】

  • メールで証明書を端末に送信し、端末内にダウンロードする
  • [設定]->[セキュリティ]->[ストレージからのインストール]でダウンロードを開き、保存した証明書を選択する
  • 「証明書の名前を指定する」という画面が表示されるので、適当な名前を指定して[OK]ボタンを押すと、証明書がインストールされる

【iOSの場合】

iOSの場合は、メール添付の証明書を開くとインストール画面になるので。そのままインストールすればOK。(けどなぜかうまくhttpsでの接続ができない。httpなら問題なし)

これで、スマフォ側から接続したときの情報がmitmproxy画面に表示される。あとは、適当に遊んでみるだけ。