pproxy というプロキシサーバが簡単で良かった、のは昔の話になってしまった

IP 制限されたサーバにアクセスしようとする時、例えば、サーバ A からは http(s) アクセスができるが、端末 B からは http(s) アクセスが拒否される場合があります。 検証用環境では一般的な設定でしょう。

申請してアクセスを許可してもらうのが本筋だとは思いますが、時間もかかりますし、管理もめんどくさいです。

そういった場合、B からのアクセスを A 経由にしてブラウジングすれば、アクセスが拒否されません。

一般には、ssh の -D オプション(dynamic port forward) を使います。このオプションは、ローカルへの socks5 proxy 接続をあたかも、リモートサーバから http(s) 接続したかのように見せるものです。

しかし残念なことに、Windows 11 のプロキシ設定は http proxy しか設定できないようです。socks には対応していません。

そんなわけで、以前、「過去の投稿」のような記事を書きました。

しかし、python 3.10 以降で段階的に変更が加えられ、3.14 でついに以下のエラーが発生するようになりました。

RuntimeError: There is no current event loop in thread 'MainThread'.

原因は、asyncio の get_event_loop の動きが変わった(参考)ためのようです。

このページをご覧になられたのは、上記のエラーを直す方法をお探しだったのかもしれません。

asyncio.set_event_loop(asyncio.new_event_loop())asyncio.run() を使うよう修正すれば直りそうですが、pproxy 自体、2年以上更新されていないようです。色々な接続方法がサポートされていますが、http プロキシを socks プロキシに変換する用途が多いだろうと思い、他の方法を模索しました。

前置きが長くなってしまいました。

以下の二つの方法を提案します。

rust 版のものもあるようですが、ここでは割愛します。

前者は go で書かれたもので、後者は node.js で書かれたものです。

私自身は、hpts のほうを先に知ったのですが、前者のほうがおすすめです。gohpts の exe ファイル1個だけあれば、他に何もインストールしなくて良いため。

GoHPTS

インストール

releases にあるものをダウンロードします。Windows の場合は、例えば、gohpts-v1.14.2-windows-amd64.tar.gz などをダウンロードします。

ダウンロードした tar.gz を展開すると gohpts-v1.14.2-windows-amd64.exe のようなファイルができるので、適当な場所に置いておきます。

使い方

コマンドプロンプト等から、

ssh -D 1080 your_account@your_host

別のコマンドプロンプトを開いて、

gohpts-v1.14.2-windows-amd64.exe -s 127.0.0.1:1080

を実行します(バージョン番号は適宜読み替えてください)。デフォルトでは、localhost の 8080 番ポートが http プロキシサーバになります。

windows のプロキシ設定で、

  • プロキシサーバを使う: オンにする
  • プロキシIPアドレス: localhost
  • ポート: 8080

を設定します。

https://ifconfig.io などにアクセスして、どこからのアクセスになっているか確認できます。

http-proxy-to-socks(hpts)

node.js で作られた http proxy to socks proxy ツールです。

gohpts は、他にインストールが不要なのでおすすめですが、バイナリのインストールが制限されているが node.js は使える、といった環境では hpts が有用だと思います。

http-proxy-to-socksを参照。

インストール

以下のようにしてインストールします。

npm install -g http-proxy-to-socks

使い方

前述の ssh コマンドを実行した後、別のコマンドプロンプトを開いて、

hpts -s 127.0.0.1:1080 -p 8080

windows のプロキシ設定で、

  • プロキシサーバを使う: オンにする
  • プロキシIPアドレス: localhost
  • ポート: 8080

を設定します。

過去の投稿(今は簡単でなくなった)

ファイルをダウンロードするための(WEB)サーバが、指定したホストからしかアクセスできず、どうしようかと思った。

そんな時は、VPN、SSH のポートフォワード、プロキシサーバなどが考えられます。今回の場合は、プロキシサーバぐらいしか解決方法が無さそうでした。

プロキシサーバの有名なものとしては squid でしょうが、設定がめんどうで時間がかかります。

python で誰か作っているのではないかと思い、検索したところ、pproxy というソフトがありました。

pypi では、

HTTP/HTTP2/HTTP3/Socks4/Socks5/Shadowsocks/SSH/Redirect/Pf/QUIC TCP/UDP asynchronous tunnel proxy implemented in Python3 asyncio.

とあります。

Quickstart に書いてありますが、

pip3 install pproxy
pproxy

とするだけで、プロキシサーバが起動します。

実運用で使える程のパフォーマンスが得られるかどうかはわかりませんが、テスト用には簡単で使いやすいと思います。

不特定多数の人に使われないよう、firewall 設定するのをお忘れなく。


[PR]

Python は[チュートリアル][3]や[ライブラリのリファレンス][4]が充実しているので、公式サイトだけでも学習はできます。(実際、私はそうしました。)

理解しづらい場合は、Amazon などで書籍をあたってみてはどうかと思います。どの本を選ぶか迷った場合、私は、オライリーの本を買うようにしています。少し難し目かもしれませんが。

  • [Python 関連書籍][2]

ご相談・お問い合わせ

ネットワーク・サーバ等のインフラ構築や、Python・Go を使ったシステム開発のご依頼を承っております。見積もり・ご相談だけでもお問い合わせください。ご予算に応じて柔軟に対応いたします。エージェント経由よりも直接ご依頼いただくほうが費用を抑えられます。助けてください!

1969年生まれ。大学卒業後から15年以上にわたり、通信、カードリーダ、セキュリティ業界においてソフトウェア開発に従事。その後、2012年5月に当社を設立。電力、交通、車載向けの組み込み系システム、旅行業界向けの WEB システム開発、音声合成システム、消防向けのシステム開発等に参画。
低コストかつシンプルで安定稼働するシステムの実現を目指し、アーキテクチャ設計に取り組んでいます。
会社情報と代表者守屋のプロフィール詳細