Mac + Polipoで、SSHの動的フォワード(SOCKS) に HTTP Proxy をつなげてみた

よく分からないタイトルですが...

同一LAN内で、以下の論理構成とした時に、AndroidでアクセスしたときもRaspberry Piからのアクセスに見えるかどうかを試した時のメモです。

Android
|
(HTTP Proxy、ポート 23000)
|
Mac + polipo
|
(ssh -N -D 0.0.0.0:16000)
|
Raspberry Pi
|
Windows (Web Server)

 
物理的な構成は、

Android
|
(WiFi)
|
WiFiアクセスポイント
|
(有線LAN)
|
スイッチングハブ
|
(有線LAN)
|
Raspberry Pi, Windows, Mac

です。

 
目次

 

環境

  • Android 7.0系
    • 192.168.10.100
  • Mac OS X 10.11.6
    • LUA4-U3-AGTにて有線化
    • 192.168.10.99
    • Polipo 1.1.1
  • Raspberry Pi 2 Model B
    • Rasbpian
    • Macからssh可能
    • 192.168.10.201
  • Windows10
    • Python 3.6系
    • Webサーバは、Pythonpython -m http.server 9000 で実行中
    • 192.168.10.105

 
polipoを選んだ理由ですが、SOCKSをHTTPに変換できるProxyを探してみたらヒットした、というだけです。

ただ、今はメンテナンスも終了しているため、他に同じようなのがあれば、教えていただけるとありがたいです。
https://github.com/jech/polipo

 

準備

MacからRaspberry PiSSH可能にする

以前と同じようにセットアップします。
Raspberry Pi 2 Model B + docker-compose上に、Django + PostgreSQLなアプリをデプロイしてみた - メモ的な思考的な

 
内容としては

です。

 

Polipo

Macの場合、Homebrewでインストールします。

$ brew install polipo

 

Polipoの設定ファイルを作成

今回は

  • SOCKS5をHTTPにする、HTTP Proxyを作成
    • HTTP Proxyのポートは、 23000
  • キャッシュしない
  • 設定ファイルは ~/polipo_config/config として保存

とします。

# IPv4のみ接続可能
proxyAddress = "0.0.0.0"

# HTTP Proxyのポート
proxyPort = 23000

proxyName = "localhost"

# SOCKS Proxyの設定:SOCKSのポートは16000
socksParentProxy = "127.0.0.1:16000"
socksProxyType = socks5

# キャッシュをしない
maxDiskCacheEntrySize = 0 
diskCacheUnlinkTime = 0 

# 名前解決にシステムデフォルトのDNSを使う
dnsUseGethostbyname = true

# リダイレクトキャッシュをしない
dontCacheRedirects = true

# Cookieキャッシュをしない
dontCacheCookies = true

 
設定ファイルの詳細は、以下が参考になりました。

 

各機器の起動

Windows上のWebサーバ起動
python -m http.server 9000

 
Webサーバが動作しているか、Macからcurlでアクセスしてみます。

$ curl http://192.168.10.105:9000
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
...

 
Windowsコマンドプロンプト上にも、アクセスした時のMacIPアドレスが記録されました。

Serving HTTP on 0.0.0.0 port 9000 (http://0.0.0.0:9000/) ...
...
192.168.10.99 - - [12/Jun/2018 21:30:53] "GET / HTTP/1.1" 200 -

 
Androidもブラウザでアクセスしてみると、Windowsコマンドプロンプト上にログが残ります。

192.168.10.100 - - [12/Jun/2018 21:32:54] "GET / HTTP/1.1" 200 -
192.168.10.100 - - [12/Jun/2018 21:32:54] code 404, message File not found
192.168.10.100 - - [12/Jun/2018 21:32:54] "GET /favicon.ico HTTP/1.1" 404 -

 

MacからRaspberry PiSSH + 動的フォワード(SOCKS)

動的フォワード(SOCKS)となるように、SSHします。念のため v オプションを付けて進行状況が分かるようにしておきます。

ssh -N -D 0.0.0.0:16000 pi@192.168.10.201 -v

 
今回はパスワード認証のため、途中でパスワードを入力します。

pi@192.168.10.201's password: 
debug1: Authentication succeeded (password).

 

Mac上のPolipoを起動

SOCKSのポートにHTTP Proxyをつなぎ、ポート 23000 でHTTPアクセスを受け付けるようにします。

$ polipo -c ./polipo_config/config 
Established listening socket on port 23000.

なお、今回はPolipoを起動したときのみ、HTTP Proxyとして動作させるようにしました。停止は Ctrl + C です。

 

AndroidのProxy設定を変更

WiFi設定にて、Proxy設定を行います。

なお、手元のAndroidではHTTP Proxyしか存在しなかったので、実験に好都合です。

 
AndroidのProxy設定は、

  • プロキシ:手動
  • プロキシのホスト名:MacIPアドレス
    • 192.168.10.101
  • プロキシポート:polipoで設定したHTTP Proxyのポート
    • 23000

とします。

 
HTTP Proxyに変更後、AndroidのブラウザでWindows上のWebサーバへアクセスします。

コマンドプロンプトのログを見てみると、Raspberry Piのものになっていました。

192.168.10.201 - - [12/Jun/2018 21:49:44] "GET / HTTP/1.1" 200 -

 
期待通りの環境ができました。