SOCKS5プロキシ認証リレー:構築するか、完全にスキップするか

Chromeや多くの自動化ツールは、依然としてSOCKS5プロキシの認証を行うことができません。小さなローカルリレーがそれを修正し、認証情報を保持します。ここでは、最小限の動作するリレー、既製のツール、そして全く必要ない場合を紹介します。

SOCKS5プロキシ認証リレーは、プロキシのユーザー名/パスワードのチャレンジにあなたの代わりに応答し、その後ツールに平文の認証なしのエンドポイントを127.0.0.1で提供する小さなローカルプロセスです。これは頑固なギャップを埋めるために存在します:Chromiumは認証されたSOCKS5をサポートしたことがなく(Chromiumバグ40829748として追跡されています)、多くの自動化ツールは単なるhost:portしか受け付けません。Redditのスレッドで話題になったのは、ツールが依然として認証されたSOCKS5を処理できないために小さなリレーを構築するほどフラストレーションを感じた人の話です。このガイドでは、最小限の動作するリレー、既製のツール、そして、同様に重要なこととして、必要ない場合を紹介します。

パターン:前面は認証なし、背面は認証あり

この分野のすべてのリレーは同じことを行います。ローカルで認証なしでリッスンし、各接続に対して実際の認証情報を使用して上流の接続を開きます。ツールは127.0.0.1に接続し、パスワードは必要ありません。リレーはSOCKS5ゲートウェイへのSOCKS5認証ハンドシェイクを行います。認証情報はループバック上の一箇所にあり、ツールの設定には触れません。これが重要な理由はもう一つあります:SOCKS5は暗号化されておらず、認証情報をクリアテキストで送信するため、認証された接続を自分のマシン上で127.0.0.1にバインドして保持することが安全な方法です。

ワンコマンドリレー:gost

リレーを手書きする必要はほとんどありません。gostは、ユーザー名/パスワード認証を含む完全なSOCKS5仕様を実装したオープンソースのトンネリングツールで、全体の作業を1つのコマンドに変えます。ローカルで認証なしのSOCKS5リスナーを公開し、認証された上流に転送します:

# local no-auth SOCKS5 on :1080  ->  authenticated SOCKS5 upstream
gost -L socks5://:1080 -F socks5://USER:PASS@gate.quantumproxies.io:PORT

# now point any tool at the loopback address, no credentials:
#   --proxy-server=socks5://127.0.0.1:1080   (Chrome, nodriver, zendriver)

ツールがHTTPを話すがSOCKS5を話さない場合、同じコマンドでプロトコルを変換します。認証されたSOCKS5ゲートウェイに転送するローカルHTTPプロキシを公開します。これは「SOCKS5をHTTPプロキシに変換する」という繰り返しの質問に対するクリーンな答えであり、gostは上流の認証を一箇所で処理するため、従来のPrivoxy設定よりも優れています。

# local HTTP proxy on :8080  ->  authenticated SOCKS5 upstream
gost -L http://:8080 -F socks5://USER:PASS@gate.quantumproxies.io:PORT

# Chrome/curl/anything with an HTTP proxy setting can now use 127.0.0.1:8080
ローカルSOCKS5認証リレーのフローダイアグラム:ツールが認証なしのループバックリスナーに接続し、認証情報を追加して認証されたプロキシゲートウェイに転送します
リレーはループバック上で認証情報を保持し、SOCKS5認証ハンドシェイクを行うため、ツールは認証なしのエンドポイントしか見ることがありません。

ゼロからの最小限のリレー

動作部分を理解したい場合、ここに純粋なPythonでの最小限の有用なバージョンがあります。PySocks(pip install PySocks)を使用して認証された上流の接続を開き、バイトを両方向にパイプします。この特定のスケッチは1つのターゲットホストをトンネルし、認証されたSOCKS5出口を通じて1つのAPIをスクレイピングするのに十分で、短く正確に保たれています。クライアントハンドシェイクを解析する一般的なSOCKS5サーバーは、gostのようなツールがすでに行っていることです:

import asyncio, socks   # PySocks

UP_HOST, UP_PORT = "gate.quantumproxies.io", 0000   # your SOCKS5 gateway
UP_USER, UP_PASS = "USER", "PASS"
TARGET = ("example.com", 443)                        # the one host to reach

async def pipe(reader, writer):
    try:
        while data := await reader.read(65536):
            writer.write(data)
            await writer.drain()
    finally:
        writer.close()

async def handle(local_r, local_w):
    # open the upstream leg with SOCKS5 auth (PySocks is blocking -> a thread)
    up = await asyncio.to_thread(
        socks.create_connection, TARGET,
        proxy_type=socks.SOCKS5, proxy_addr=UP_HOST, proxy_port=UP_PORT,
        username=UP_USER, password=UP_PASS,
    )
    up_r, up_w = await asyncio.open_connection(sock=up)
    await asyncio.gather(pipe(local_r, up_w), pipe(up_r, local_w))

async def main():
    server = await asyncio.start_server(handle, "127.0.0.1", 1080)
    async with server:
        await server.serve_forever()

asyncio.run(main())

任意のクライアントが指すことができる完全なローカルSOCKS5サーバーについては、GitHubのコミュニティプロジェクトsocks-relayが良い参考になります。これは認証なしまたはユーザー/パスのリスナーを実行し、PySocksに基づいて数百行で別のSOCKS5サーバーにリレーします。HTTP変換の仕事をするsocks-to-http-proxyプロジェクト(Rust)は、コンパイルされたバイナリを好む場合に役立ちます。いずれにせよ、gostが1行で提供するのと同じパターンを実行しています。

リレーが不要な場合

リレーはあなたが所有するホップであり、多くの場合、問題全体を削除することができます。次のいずれかが当てはまる場合、スキップします:

# no relay needed — curl authenticates SOCKS5 directly (socks5h resolves DNS
# through the proxy, avoiding leaks):
curl -x socks5h://USER:PASS@gate.quantumproxies.io:PORT https://httpbin.org/ip

# and HTTP Basic proxy auth is even more widely supported:
curl -x http://USER:PASS@gate.quantumproxies.io:PORT https://httpbin.org/ip
SOCKS5認証リレーが不要な場合と、その価値がある場合を比較するチェックリスト。HTTPエンドポイント、IPホワイトリスト、ネイティブライブラリサポート、ChromiumのSOCKS5ギャップをカバーしています。
ほとんどのセットアップではリレーをスキップできます:HTTPエンドポイント、IPホワイトリスト、またはネイティブにSOCKS5認証を話すクライアントがあれば、リレーの必要性がなくなります。

正直なデメリット

自分のリレーを実行することは、障害点を追加します。監視する必要がある別のプロセスです:クラッシュすると、その背後のすべてのリクエストが失敗し、スクリプトには再起動、ヘルスチェック、ログ記録がありません。独自の回転はなく、設定した単一の上流に転送するため、出口の回転はゲートウェイから来る必要があります。レイテンシのホップを追加し、プレーンテキストの認証情報をメモリに保持します。これがまさに127.0.0.1にバインドし、公開インターフェースには決してバインドしない理由です。1つのサイトをスクレイピングするラップトップには問題ありませんが、ページングするものには、新しい動作部分のない修正(ホワイトリストまたはHTTPエンドポイント)をリレーよりも優先してください。

このリレーパターンは、ChromiumのSOCKS5ギャップがそれに基づくすべてのブラウザと共有されているため、ステルスエコシステム全体で見られます。特定のフレームワークにこれを組み込む場合、Playwright SOCKS5認証と、途中で遭遇するエラーについての407トラブルシューティングガイドを参照してください。

よくある質問

SOCKS5プロキシ認証リレーとは何ですか?

認証なしでリッスンし、各接続をユーザー名とパスワードを使用して上流のSOCKS5プロキシに転送する小さなローカルプロセスです。主にChromiumベースのブラウザがSOCKS5認証情報を送信できないツールが、127.0.0.1:1080のようなループバックアドレスを指すことで認証されたプロキシに到達できるようにします。gostはこれを1つのコマンドで作成します。

SOCKS5プロキシをHTTPプロキシに変換するにはどうすればよいですか?

プロキシ自体を変換することはできません。ローカルでHTTPを話し、上流でSOCKS5を話す中間者を実行します。gost -L http://:8080 -F socks5://USER:PASS@host:portは、認証されたSOCKS5ゲートウェイに転送するローカルHTTPプロキシを公開します。socks-to-http-proxyやPrivoxyのような専用ツールも同じ仕事をします。

Chromeはなぜ認証されたSOCKS5プロキシを使用できないのですか?

ChromiumはSOCKS5のユーザー名/パスワード認証を実装したことがなく、これはChromiumバグ40829748として長年の制限として記録されています。認証なしのSOCKS5は--proxy-server=socks5://host:portを通じて動作しますが、認証情報を提供する方法はありません。ローカルリレーまたはIPホワイトリストが標準的な修正であり、プロキシ認証拡張機能はHTTPプロキシをカバーします。

SOCKS5の認証情報をリレーに送信するのは安全ですか?

ループバック経由のみです。SOCKS5は暗号化されておらず、認証情報をクリアテキストで送信するため、リレーは127.0.0.1にバインドし、公開インターフェースには決してバインドしない必要があります。これにより、認証された接続が自分のマシン上に保持されます。ターゲットへの暗号化されたトンネルはHTTPSに関してエンドツーエンドで確立されるため、リレーはTLSバイトしか見ることができません。

ツールが他に選択肢を残さないときにのみリレーを使用してください。gostは1行の答えであり、PySocksはゼロからの答えですが、ほとんどの人にとって最速の修正はIPをホワイトリストに登録するかHTTPエンドポイントを使用し、何も追加で実行しないことです。動作部分が少ないほど、午前3時のページングも少なくなります。

IPホワイトリスト付きのSOCKS5プロキシを取得