🍢

[Andriod Emulator] privoxy + ssh dynamic port fowarding でIP制限をくぐり抜ける

2024/01/11に公開

背景

IP制限のかかったサイトに自宅からアクセスしたい場合、動的な自宅のIPをいちいち許可設定してもらうのは手間だということで、ssh で入れるオフィスまたは社用のサーバの静的IPを許可してもらい、ssh の Dynamic Port Forwarding を使って IP 制限のかかったサーバにアクセスする、ということをやってました。 [1]

  1. ssh の -D オプションで socks プロキシを作成
  1. ブラウザで 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 プロキシの設定方法は複数あります

  1. Andriod Studio の設定
    Settings > Appearance & Behavior > System Settings > HTTP Proxy

  2. Emulator の設定
    Emulator の Extended Controls (エミュレータパネルのその他アイコン) > Settings > Proxy

  3. Emulator の起動コマンドオプション
    /path/to/emulator -feature -Vulkan -avd Pixel_foo --http-proxy 10.0.2.2:8118

  4. 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 でのみ期待した通信ができました。ここは環境によって設定方法が違ってくるのかもしれません(よくわからない)。

参考

脚注
  1. 最近は Session Manager 使うから ssh しないよという説も ↩︎

Discussion