プロキシが目的のプロトコルをサポートしていない:対処法
プロキシを設定し、スクリプトを実行したところ、「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 refused や Unsupported 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に限定されていることが多いです。
購入前のチェックリスト
- 使用するソフトウェアが必要とするプロトコルを特定する
- UDPが必要かどうか(ゲーム、Torrent、VoIP)を確認する
- プロバイダーに目的のプロトコルサポートを確認する
- 互換性をテストするためのテストアクセスを要求する
- 代替案としてローカルコンバーターの計画を用意しておく
結論
プロトコルの非互換性は解決可能な問題です。ほとんどの場合、PrivoxyやGostのようなローカルコンバーターを使用するだけで対応できます。長期的なプロジェクトの場合は、最初から必要なプロトコルをサポートするプロキシを選択する方が費用対効果が高くなります。
プロトコルの選択肢に柔軟性が求められるタスクには、マルチプロトコルアクセスが可能なレジデンシャルプロキシが適しています。詳細は proxycove.com をご覧ください。