@kyanny's blog

My thoughts, my life. Views/opinions are my own.

proxy.py で動作検証用の HTTP プロキシサーバを立てる

pypi.org

Python 製の HTTP プロキシ。インストールすると proxy コマンドが使えるようになる。

venv 環境内へのインストール手順。

python3 -m venv venv
source venv/bin/activate
pip install proxy.py

注意点として、デフォルトで IPv6 のポートを listen する。IPv4 のポートは listen しない。curl のように IPv4/IPv6 をよしなに処理してくれる HTTP クライアントでは問題にならず、気付きづらいが、ssh の ProxyCommand + nc でプロキシを通すテストの検証時にはまった。

proxy.py -h

  --hostname HOSTNAME   Default: ::1. Server IP address.
  --port PORT           Default: 8899. Server port.
❯ proxy --port 8080
2021-07-18 02:35:29,204 - pid:74959 [I] load_plugins:334 - Loaded plugin proxy.http.proxy.HttpProxyPlugin
2021-07-18 02:35:29,205 - pid:74959 [I] listen:113 - Listening on ::1:8080
2021-07-18 02:35:29,228 - pid:74959 [I] start_workers:136 - Started 4 workers

curl に IPv4 アドレスのみを解決させる -4, --ipv4 オプションを指定すると、ローカルのプロキシサーバに接続できずエラーになることがわかる。

❯ curl -x localhost:8080 ifconfig.me/ua
curl/7.64.1

❯ curl -4 -x localhost:8080 ifconfig.me/ua
curl: (7) Failed to connect to localhost port 8080: Connection refused

❯ curl -6 -x localhost:8080 ifconfig.me/ua
curl/7.64.1

ProxyCommand を指定するとエラーになる。おそらく nc がデフォルトで IPv4 アドレスのみを解決するから。

❯ ssh -o ProxyCommand='nc -X connect -x localhost:8080 %h %p' -p 443 -T git@ssh.github.com
nc: Proxy error: "HTTP/1.1 200 Connection established"
kex_exchange_identification: Connection closed by remote host
❯ proxy --port 8080
2021-07-18 02:38:21,728 - pid:75222 [I] load_plugins:334 - Loaded plugin proxy.http.proxy.HttpProxyPlugin
2021-07-18 02:38:21,729 - pid:75222 [I] listen:113 - Listening on ::1:8080
2021-07-18 02:38:21,750 - pid:75222 [I] start_workers:136 - Started 4 workers
ConnectionResetError(54, 'Connection reset by peer')

proxy.py に IPv4 アドレスを bind すると解決する・・・はずなのだが、いま手元で試したらうまくいかない。昨日はうまくいったのに・・・。

❯ proxy --hostname 0.0.0.0 --port 8080