ブログに戻る

プロキシが目的のプロトコルをサポートしていない場合の対処法

プロトコルとプロキシの非互換性の原因と、ローカルコンバーターの設定から適切なプロキシタイプの選択まで、実用的な解決策を解説。

📅2025年12月9日
```html

プロキシが目的のプロトコルをサポートしていない:対処法

プロキシを設定し、スクリプトを実行したところ、「Protocol not supported」や「Connection refused」というエラーが表示されました。プロトコルの非互換性は、思っているよりも頻繁に発生します。なぜこれが起こるのか、プロバイダーを変更せずにこの問題を解決する方法を見ていきましょう。

プロキシが使用するプロトコル

問題を解決する前に、プロトコルの違いを理解することが重要です。それぞれに用途と制限があります。

プロトコル デフォルトポート 特徴
HTTP 80, 8080, 3128 HTTPトラフィックのみ、ヘッダーを変更可能
HTTPS (CONNECT) 443, 8443 HTTP CONNECTによるトンネリング、暗号化
SOCKS4 1080 TCP接続のみ、認証なし、UDPなし
SOCKS5 1080, 1081 TCPおよびUDP、認証対応、プロキシ経由のDNS

一般的な競合例:

  • SeleniumやPuppeteerはHTTP/HTTPSを要求するが、持っているのはSOCKS5
  • TelegramボットはSOCKS5経由で動作するが、プロキシはHTTPのみ対応
  • TorrentクライアントはUDP対応のSOCKS5を要求するが、プロキシはSOCKS4
  • ゲームアプリケーションはUDPを要求するが、HTTPプロキシはUDPをサポートしない

診断:プロキシのプロトコルを特定する

プロバイダーがプロトコルを明示していない場合や、疑問がある場合は、ご自身でプロキシをテストしてください。

curlを使用したテスト

HTTPプロトコルをテストします。

# HTTPプロキシ
curl -x http://proxy_ip:port http://httpbin.org/ip

# 認証付きの場合
curl -x http://user:pass@proxy_ip:port http://httpbin.org/ip

SOCKS5をテストします。

# SOCKS5プロキシ
curl -x socks5://proxy_ip:port http://httpbin.org/ip

# プロキシ経由でDNSを行う場合 (socks5h)
curl -x socks5h://proxy_ip:port http://httpbin.org/ip

コマンドがプロキシのIPアドレスを返せば、プロトコルは正しく特定されています。エラー(Connection refusedUnsupported proxy)が出た場合は、プロトコルが一致していません。

Pythonを使用したテスト

import requests

proxy_ip = "proxy_ip:port"

# HTTPテスト
try:
    r = requests.get("http://httpbin.org/ip", 
                     proxies={"http": f"http://{proxy_ip}"}, 
                     timeout=10)
    print(f"HTTP 動作中: {r.json()}")
except Exception as e:
    print(f"HTTP 動作せず: {e}")

# SOCKS5テスト (pip install requests[socks] が必要)
try:
    r = requests.get("http://httpbin.org/ip", 
                     proxies={"http": f"socks5://{proxy_ip}"}, 
                     timeout=10)
    print(f"SOCKS5 動作中: {r.json()}")
except Exception as e:
    print(f"SOCKS5 動作せず: {e}")

自動検出

プロトコルを総当たりで試すスクリプト:

import requests

def detect_protocol(proxy_address):
    protocols = ["http", "https", "socks4", "socks5", "socks5h"]
    
    for proto in protocols:
        try:
            proxies = {
                "http": f"{proto}://{proxy_address}",
                "https": f"{proto}://{proxy_address}"
            }
            r = requests.get("http://httpbin.org/ip", 
                           proxies=proxies, timeout=5)
            if r.status_code == 200:
                return proto
        except:
            continue
    return None

result = detect_protocol("proxy_ip:port")
print(f"検出されたプロトコル: {result}")

HTTPからSOCKSへの変換と逆の変換

プロキシがソフトウェアが必要とするプロトコルをサポートしていない場合、ローカルコンバーターを使用して変換します。

Privoxy: HTTP → SOCKS

PrivoxyはHTTPリクエストを受け取り、SOCKSプロキシ経由で転送します。

インストール:

# Ubuntu/Debian
sudo apt install privoxy

# macOS
brew install privoxy

# Windows — 公式サイトからダウンロード

設定/etc/privoxy/config ファイル):

# ローカルポート8118 (HTTP) でリッスン
listen-address 127.0.0.1:8118

# 外部SOCKS5経由で転送
forward-socks5 / socks_proxy_ip:1080 .

# 認証付きの場合
forward-socks5 / user:pass@socks_proxy_ip:1080 .

これで、ソフトウェアは 127.0.0.1:8118 にHTTPで接続し、トラフィックはSOCKS5経由で外部に流れます。

Gost: ユニバーサルコンバーター

Gostは、あらゆるプロトコル変換に対応する強力なツールです。

# 入力: HTTP → 出力: SOCKS5
gost -L http://:8080 -F socks5://socks_proxy_ip:1080

# 入力: SOCKS5 → 出力: HTTP
gost -L socks5://:1080 -F http://http_proxy_ip:8080

# 両端で認証付き
gost -L http://local_user:local_pass@:8080 \
     -F socks5://remote_user:remote_pass@proxy_ip:1080

Pythonコンバーター

簡単なタスク向けの最小限のコンバーター:

# pip install pproxy
# 入力: HTTP, 出力: SOCKS5
pproxy -l http://:8080 -r socks5://proxy_ip:1080

# 入力: SOCKS5, 出力: HTTP  
pproxy -l socks5://:1080 -r http://proxy_ip:8080

ローカルトンネルの設定

変換だけでは不十分な場合、本格的なトンネルを設定する必要があります。

SSHトンネル経由のHTTPプロキシ

SSHサーバーとHTTPプロキシがある場合、SOCKS5を作成できます。

# HTTPプロキシ経由でlocalhost:1080にSOCKS5を作成
ssh -D 1080 -o ProxyCommand="nc -X connect -x http_proxy:8080 %h %p" user@ssh_server

HTTPSのためのStunnel

HTTPSプロキシが必要だが、HTTPプロキシしかない場合:

# stunnel.conf
[https-proxy]
client = yes
accept = 127.0.0.1:8443
connect = http_proxy_ip:8080
protocol = connect
protocolHost = target_host:443

利用可能なプロトコルに合わせてソフトウェアを設定する

変換するよりも、既存のプロトコルに合わせてソフトウェアを設定する方が簡単な場合があります。

異なるプロトコルでのSelenium設定

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# HTTPプロキシ (標準的な方法)
options = Options()
options.add_argument('--proxy-server=http://proxy_ip:8080')

# SOCKS5プロキシ
options.add_argument('--proxy-server=socks5://proxy_ip:1080')

# FirefoxをSOCKS5で設定する場合
from selenium.webdriver.firefox.options import Options as FirefoxOptions
profile = webdriver.FirefoxProfile()
profile.set_preference("network.proxy.type", 1)
profile.set_preference("network.proxy.socks", "proxy_ip")
profile.set_preference("network.proxy.socks_port", 1080)
profile.set_preference("network.proxy.socks_version", 5)

aiohttpとSOCKS

# pip install aiohttp-socks
import aiohttp
from aiohttp_socks import ProxyConnector

async def fetch_with_socks():
    connector = ProxyConnector.from_url('socks5://proxy_ip:1080')
    async with aiohttp.ClientSession(connector=connector) as session:
        async with session.get('http://httpbin.org/ip') as response:
            return await response.json()

HTTP経由のTelegramボット

TelegramライブラリがSOCKS5を要求するが、手元にHTTPしかない場合:

# python-telegram-bot でのHTTPプロキシ設定
from telegram.ext import ApplicationBuilder

application = (
    ApplicationBuilder()
    .token("YOUR_TOKEN")
    .proxy_url("http://proxy_ip:8080")  # HTTPに対応
    .build()
)

ヒント: 多くの最新ライブラリはHTTPとSOCKSの両方をサポートしています。ドキュメントを確認し、URLスキームを socks5:// から http:// に変更するだけで済む場合があります。

適切なプロトコルを持つプロキシの選び方

プロトコルの問題を避けるためには、事前に要件を明確にすることが重要です。

互換性マトリックス

タスク 推奨プロトコル 理由
ウェブスクレイピング HTTP/HTTPS 幅広いサポート、簡単な設定
ブラウザ自動化 HTTPまたはSOCKS5 ブラウザやフレームワークに依存
Telegram, Discordボット SOCKS5 ライブラリの要件
Torrent UDP対応SOCKS5 DHTやP2P通信にUDPが必要
ゲーム、VoIP UDP対応SOCKS5 低遅延、UDPトラフィック
APIリクエスト HTTP/HTTPS REST APIはHTTP経由で動作

プロバイダー選択時に確認すべき点

  • サポートプロトコルリスト — 明示的に記載されていること
  • 切り替えの可能性 — 1つのIPで異なるポート/プロトコルへのアクセスを提供しているか
  • SOCKS5のUDPサポート — すべてのSOCKS5プロキシがUDPをサポートしているわけではない
  • 設定ドキュメント — さまざまな言語やツールでの設定例があるか

レジデンシャルプロキシは通常、HTTP/HTTPSとSOCKS5の両方を同時にサポートしているため、互換性の問題のほとんどを解消できます。データセンタープロキシはHTTP/HTTPSに限定されていることが多いです。

購入前のチェックリスト

  1. 使用するソフトウェアが必要とするプロトコルを特定する
  2. UDPが必要かどうか(ゲーム、Torrent、VoIP)を確認する
  3. プロバイダーに目的のプロトコルサポートを確認する
  4. 互換性をテストするためのテストアクセスを要求する
  5. 代替案としてローカルコンバーターの計画を用意しておく

結論

プロトコルの非互換性は解決可能な問題です。ほとんどの場合、PrivoxyやGostのようなローカルコンバーターを使用するだけで対応できます。長期的なプロジェクトの場合は、最初から必要なプロトコルをサポートするプロキシを選択する方が費用対効果が高くなります。

プロトコルの選択肢に柔軟性が求められるタスクには、マルチプロトコルアクセスが可能なレジデンシャルプロキシが適しています。詳細は proxycove.com をご覧ください。

```