[Andriod Emulator] privoxy + ssh dynamic port fowarding でIP制限をくぐり抜ける
背景
IP制限のかかったサイトに自宅からアクセスしたい場合、動的な自宅のIPをいちいち許可設定してもらうのは手間だということで、ssh で入れるオフィスまたは社用のサーバの静的IPを許可してもらい、ssh の Dynamic Port Forwarding を使って IP 制限のかかったサーバにアクセスする、ということをやってました。 [1]
- ssh の
-D
オプションで socks プロキシを作成
- ブラウザで socks プロキシを設定してIP制限のかかったサイトにアクセス
大抵のブラウザなら Socks プロキシを設定できるのでこれで良かったのですが、Andriod Emulator の場合は Socks プロキシでなく HTTP プロキシしか設定できません。
で、どうしたものかと方法を模索した結果 Privoxy を使ってみたらうまく行ったので記事にしました。
Privoxy
Privoxy はプライバシー保護のための広告ブロッキング・クッキー制御・アクセス制御などの機能を備えたHTTPプロキシですが、設定により socks プロキシにリクエストを転送できます。
Privoxy の設定
今回は、Android Emulator での一時的な動作確認で利用するため、適当な場所に設定ファイルを作成し、コマンドでプロキシを立ち上げます。
# privoxy-socks.config
debug 32768
forward-socks5 / localhost:8888 .
listen-address 127.0.0.1:8118
# 以下は /etc/privoxy/config からコピー
user-manual /usr/share/doc/privoxy/user-manual/
toggle 1
enable-remote-toggle 0
enable-remote-http-toggle 0
enable-edit-actions 0
enforce-blocks 0
buffer-limit 4096
enable-proxy-authentication-forwarding 0
forwarded-connect-retries 0
accept-intercepted-requests 0
allow-cgi-request-crunching 0
split-large-forms 0
keep-alive-timeout 5
tolerate-pipelining 1
socket-timeout 300
-
debug 32768
- とりあえず動作確認でログを出す設定なのでノイジーに感じたらオフにして問題ありません
-
forward-socks5 / localhost:8888 .
- これにより Privoxy が受け付けたすべてのリクエストを socks サーバに転送します(末尾のドットは必要)
-
listen-address 127.0.0.1:8118
- ポート 8118 でリクエストを受け付けます。
設定ファイルを書いたら、以下のコマンドで HTTP プロキシを立ち上げます。
$ privoxy --no-daemon privoxy-socks.config
curl でリクエストを飛ばして接続確認します。
$ https_proxy="http://localhost:8118" curl -v "https://private.org"
privoxy の標準出力にデバッグログが流れていれば、プロキシが正しく動作しています。
Andrioid Emulator からの接続
Emulator での HTTP プロキシの設定方法は複数あります
-
Andriod Studio の設定
Settings > Appearance & Behavior > System Settings > HTTP Proxy
-
Emulator の設定
Emulator の Extended Controls (エミュレータパネルのその他アイコン) > Settings > Proxy
-
Emulator の起動コマンドオプション
/path/to/emulator -feature -Vulkan -avd Pixel_foo --http-proxy 10.0.2.2:8118
-
Emulator の Andriod OS 上のネットワーク設定
OS の Settings > Network & Internet > Internet > AndriodWifi > 編集アイコン
-
Proxy: Manual
,Proxy hostname: 10.0.2.2
,Proxy port: 8118
を指定- ( 10.0.2.2 は Emulator を動かしているマシンのループバックアドレスです
-
このうち、1 は Android Studio 自体のプロキシ設定で Emulator とは直接関係せず、2,3 は手段が違うだけで同じ設定項目にあたるようなのですが、私の場合は 4 でのみ期待した通信ができました。ここは環境によって設定方法が違ってくるのかもしれません(よくわからない)。
参考
- Privoxy
- Privoxyでプロキシのブリッジを行う #SSH - Qiita
- Android emulator unreachable proxy on host windows - Stack Overflow
- Android Emulator のネットワークをセットアップする | Android Studio | Android Developers
-
最近は Session Manager 使うから ssh しないよという説も ↩︎
Discussion