SOCKS5とHTTPプロキシ: プロトコル、DNS、対応

9分

SOCKS5とHTTPプロキシ: HTTP CONNECTとSOCKS5トンネルの違い、DNSの解決場所、クライアントごとの認証対応、買ったプロトコルの確認方法。

この案内は、プロキシプランのHTTP端点とSOCKS5端点のあいだで選ぶ人、またはクライアントが片方を拒む理由を調べる人向けです。無料プロキシは渡しません。IPも売りません。以下はプロトコルそのもの、DNS照会の行き先、実際に渡されたものの確認方法です。

01HTTP CONNECTとSOCKS5: それぞれのトンネル

細部の前に、ほかより大切な一点があります。プロトコルは出自ではありません。 レジデンシャルプールはHTTPとしても、SOCKS5としても、両方としても売れます。データセンターIPも両方の形があります。SOCKS5は品質の等級ではありません。バイトの運び方です。相手サイトがトラフィックを信じるかどうかは、IPの網と履歴に依存し、ゲートウェイへ届く握手には依存しません。

HTTPプロキシは、クライアントとHTTPを話します。二種類のトラフィックを別々に扱います。

素の http:// URLでは、クライアントはリクエスト全体をプロキシへ送ります。プロキシはそれを読み、転送し、途中でヘッダーを足したり、削ったり、キャッシュしたりできます。公開サイトで素のHTTPを出すところはもう少ないので、実務ではこの経路は稀です。

https:// URLと、素のHTTPでないものでは、クライアントはCONNECTメソッドを使います。RFC 9110、9.3.6節では、CONNECTは指名した宛先へのトンネルをプロキシに開き、成功したら解釈を止めて、どちらかが閉じるまで両方向にバイトを中継するよう求めます。リクエスト対象はホストとポートだけです。例は CONNECT example.com:443 です。プロキシが2xxで答えたら、TLSはクライアントとサイトのあいだで端から端まで走ります。プロキシは尋ねたホストとポートは見えます。復号したページは読めません。

SOCKS5プロキシは、一段下で動きます。RFC 1928は短いバイナリの握手を定義します。クライアントが認証方式を出し、サーバーが一つ選び、クライアントがコマンドと宛先付きのリクエストを送ります。コマンドは三つです。普通のTCPストリーム向けの CONNECT、着信向けの BIND、UDP中継向けの UDP ASSOCIATE です。SOCKS5はペイロードがHTTPか、TLSか、SMTPか、ゲームプロトコルかを気にしません。バイトを動かすだけです。

なので「SOCKS5対HTTP CONNECT」は、賢いプロキシと愚かなプロキシの選択ではありません。HTTPSトラフィックでは、どちらも不透明なTCPトンネルになります。本当の差は、HTTPS以外に何を運べるか、宛先名の渡し方、どのクライアントが話せるかです。

HTTPプロキシ(CONNECT)SOCKS5プロキシ
定義RFC 9110(CONNECTメソッド)RFC 1928、認証はRFC 1929
トンネルするものHTTPSと、プロキシが許す任意のTCPポート任意のTCP。サーバーが対応していれば UDP ASSOCIATE 経由のUDP
素のHTTPプロキシが読み、リクエストを書き換えられる生のバイトとして通す
宛先の形式CONNECT行の host:port テキストIPv4、IPv6、またはドメイン名の欄
認証Proxy-Authorization ヘッダー。失敗時は407交渉した方式。たいていはユーザー名とパスワード
クライアントの例ブラウザ、OSのプロキシ設定、curl、よくあるHTTPライブラリFirefox、curl、Telegram、アンチディテクトブラウザ、一部のデスクトップアプリ
よくある既定ポート8080、3128(本当の規則はない)1080(本当の規則はない)

RFC 9110は、プロキシがCONNECTを既知のポートまたは設定した対象一覧へ「制限すべき(SHOULD)」とも書いています。ポート25への開いたCONNECTは、スパム中継に悪用され得るからです。なのでHTTP端点は、資格情報が正しくても、データベース、メールサーバー、独自TCPポートへのトンネルを拒むことがあります。それらのポートが要るなら、許されているCONNECTポートを供給元の文書で確認するか、それを許すSOCKS5端点を使ってください。

02DNS: 端末で解決するか、プロキシ経由か

DNSは、サイトやISPがあなたについて知り得るものを実際に変える部分であり、SOCKS5設定がいちばん壊れやすい場所でもあります。

HTTPプロキシでは、クライアントはリクエスト対象(CONNECT example.com:443)にホスト名を渡し、その接続の照会はプロキシがします。実際にプロキシを通るリクエストについては、ローカルの照会が消えます。端末がDNS照会を一切しない保証ではありません。ブラウザはDNSを先読みでき、迂回一覧と「直接」規則は一部のホストをプロキシの周りへ送り、WebRTCは独自の接続を開け、端末のほかのアプリはシステムのリゾルバを使い続けます。

SOCKS5では、クライアントが決めます。RFC 1928は、宛先欄に生のIPv4、生のIPv6、または完全修飾ドメイン名を置けます。クライアントが名前をローカルで解決し、IPだけを送ると、トラフィック自体はプロキシを通っても、ISPのリゾルバ(またはOSが使うリゾルバ)は訪れるすべてのドメインを見ます。クライアントがドメイン名を送ると、プロキシがその先で解決します。

curlはこの選択を見える形にします。マニュアルは --socks5 を「指定したSOCKS5プロキシを使うが、ホスト名はローカルで解決する」と書き、--socks5-hostname または socks5h:// スキームを「プロキシにホスト名を解決させる」と書いています。プロキシしたリクエストについて、その一文字の h が、ローカルのリゾルバが宛先名を見るかを決めます。ほかのクライアントは、同じスイッチを「SOCKS v5使用時にプロキシDNS」や「リモートDNS」といった名前で隠します。HTTPと同じ但し書きがあります。リモートDNSが覆うのはSOCKSトンネルを通るトラフィックであり、先読み、迂回ホスト、WebRTC、ほかのアプリではありません。仮定せずリーク試験で確認してください。

リモート解決は、プライバシーだけでなく結果にも効きます。リゾルバの場所で答えるCDNは、ローカル解決した名前をプロキシ出口の近くではなく、あなたの近くのエッジへ送れます。IPは正しく見えても、ページは間違った地域から読み込まれます。

HTTP CONNECTトンネル、プロキシ側DNS(socks5h)のSOCKS5、ローカルDNSのSOCKS5を比べ、各場合でホスト名がどこで解決されるかを示す模式図

模式例であり、ネットワーク測定ではありません。プロキシしたリクエストについて、宛先名がどこで解決されるかを示します。ブラウザの先読み、迂回規則、WebRTC、ほかのアプリは対象外で、それらはまだローカル照会できます。

03クライアントの対応と認証

クライアントがすでにうまく話せるプロトコルを選んでください。追加パッケージやラッパーで無理に足すのは、「プロキシが壊れている」報告のよくある源です。

ブラウザ。 Firefoxは、独自のプロキシ設定にHTTPとSOCKSの欄があります。Chromium系はシステム設定か --proxy-server フラグに従います。どちらもCONNECTは問題なく扱います。弱いのは、ユーザー名とパスワード付きのSOCKS5です。内蔵のブラウザSOCKS設定には資格情報を入れる場所が無いことがあり、それが拡張やアンチディテクトブラウザを使う理由の一つです。プロファイルごとに一つのプロトコルにしてください。同じプロファイルでHTTPのシステムプロキシとSOCKS5拡張を混ぜると、一部のリクエストが一方、一部が他方へ行く簡単な道です。

スクレイパーとHTTPライブラリ。 curlのようなよくあるHTTPクライアントは、http://user:pass@host:port のプロキシをそのまま受け、HTTPSには自分でCONNECTを使います。一部のライブラリでは、SOCKS5に追加パッケージやビルドオプションが要ります。スタックがWebページを取るだけなら、HTTP端点の方が驚きは少ないです。出自側の選択はスクレイピング案内にあります。

HTTPでないアプリ。 メッセージアプリ、ゲームランチャー、メールクライアント、SSH、データベースツールはHTTPクライアントではありません。プロキシに対応しているとき、欄はHTTPではなくSOCKSであることが多いです。そこではSOCKS5の方が合い、ゲートウェイが実際に UDP ASSOCIATE を実装しているときの音声などのUDPにも合います。プランにSOCKS5があることだけでは、UDP対応を意味しません。UDP向けに買う前に確認してください。

認証。 HTTPプロキシは Proxy-Authorization ヘッダーで資格情報を送り、無いまたは間違っていると 407 Proxy Authentication Required を返します。SOCKS5は先に方式を交渉します。RFC 1928は方式としてGSSAPIとUSERNAME/PASSWORDを挙げます。ログインとパスワードを渡すプランは後者で、RFC 1929に規定があります。

SOCKS4とSOCKS4aは別のプロトコルで、パスワード対応がありません。SOCKS4だけのクライアントは、SOCKS5だけを話す端点と握手を終えられません。IP許可リストはパスワードの必要を消しますが、プロトコルは変えません。供給元がSOCKS4/SOCKS4aとして明示した端点(たいていIP許可リストと組)か、SOCKS5またはHTTPに対応したクライアントが必要です。

クライアントとプロキシのあいだの素の、暗号化されていない接続では、ログインは守られません。HTTP Basicの資格情報はBase64で符号化されているだけで、SOCKS5のユーザー名とパスワードは平文で流れます。その網路上の誰でも読めます。HTTPSプロキシ端点、つまりクライアントからプロキシへの接続自体がTLSで包まれているものは、そのホップ(資格情報を含む)を守ります。どちらでも、大事な場所でプロキシ資格情報を再利用しないでください。

速度。 よく聞かれるのは「SOCKS5対HTTPプロキシの速度」です。差は小さいです。どちらも接続開始時に握手を一つ足し、そのあとはバイトを転送します。実務で速度を決めるのは、ゲートウェイまでの距離、供給元の負荷、出口IPであり、プロトコルではありません。素のHTTPプロキシはキャッシュすると速く感じることがありますが、HTTPSにはほとんど当てはまりません。

SOCKS5対HTTPS。 「HTTPSプロキシ」は二つの意味です。たいてい、CONNECTでHTTPSサイトをトンネルするHTTPプロキシ、つまり上で述べたものです。ときに、自分とプロキシのあいだのリンク自体がTLSで包まれている意味で、ローカル網からプロキシ資格情報と対象ホスト名を隠します。素のHTTPプロキシ接続とSOCKS5接続は、その最初のホップを暗号化しないので、それを隠すことが大切なら、供給元とクライアントが対応していればTLSで包んだプロキシ端点を使うか、その区間にVPNを使ってください。

04どちらを選ぶか

状況選ぶもの理由
ウェブサイトだけを読むブラウザHTTP、またはリモートDNS付きSOCKS5どちらも動く。プロファイルがネイティブに扱う方を使う
ページを取るPython/Node/GoのスクレイパーHTTP内蔵対応、HTTPSのCONNECT、依存が少ない
Telegram、ゲーム、メール、SSH、データベースSOCKS5HTTPクライアントではない。生のTCPトンネルが要る
音声やほかのUDPUDP対応が確認されたSOCKS5CONNECTはTCPだけを運ぶ
クライアントがSOCKS4だけ文書化されたSOCKS4/SOCKS4a端点(たいていはIP許可リスト付き)、または別のクライアントSOCKS4はSOCKS5専用端点と話せない。パスワードも送れない
ホスティングASNでサイトに止められるプロトコルではなく出自を変える同じIP、同じ評判、どちらでも

最後の行が、買い手がいちばんよくやる誤りです。データセンターIPをHTTPからSOCKS5に替えても、家庭の回線には見えません。サイトが網を採点するなら、出口の種類を変えてください。レジデンシャルプロキシ、モバイルプロキシ、データセンタープロキシを比べるか、先にレジデンシャルとデータセンターを読んでください。

05買ったプロトコルを確認する方法

ポート番号を信じないでください。8080、3128、1080、60000のような高いポートは両方に使われ、同じポートで両方に答えるゲートウェイもあります。

  1. 先に自分のIPを知る。 プロキシなしで自分のIPを開き、比較の基準を取ってください。

  2. 端点が応答するかを確認する。 供給元の端点をプロキシチェッカーへ HOST:PORT または HOST:PORT:USER:PASS として貼ります。チェッカーはこちらのサーバーで走り、対応プロトコルを試し、最初に成功したものを報告します。プロトコル接頭辞は最初に試すプロトコルを変えますが、フォールバックは消しません。したがって、一つの成功は、その端点がHTTPとSOCKS5の両方を受ける証明ではありません。別々に比べるなら、下の二つのcurlコマンドか、各プロトコルを強制できるクライアントを使ってください。確認が失敗したら、誤りを見て、資格情報、IP許可リスト、プラン制限を確かめてから、プロトコル非対応と結論してください。

  3. 同じことをコマンドラインから確認する。 両方の実行で同じ中立の試験URLを使い、結果を比べられるようにします。

    # HTTP proxy: curl sends CONNECT for an https:// URL
    curl -v -x http://USER:PASS@HOST:PORT https://example.com/ -o /dev/null
    
    # SOCKS5 with proxy-side DNS (no local lookup)
    curl -v -x socks5h://USER:PASS@HOST:PORT https://example.com/ -o /dev/null
    

    最初のコマンドの詳細出力で、CONNECT example.com:443 の行のあとに200応答があれば、HTTPトンネルの確認です。407はプロキシがHTTPを話しているが資格情報を拒んだ意味で、認証の問題であり、プロトコルの問題ではありません。HTTPの試行が不正な応答ですぐ失敗し、socks5h:// がつながるなら、そのポートはその端点がSOCKSを話している可能性が高いです。供給元の文書で確認してください。

  4. 通過だけでなく、出口IPを比べる。 各プロトコルが、払った国と網の種類から出るかを確認してください。ローテーションプールでは、プロトコルに関係なく、二つの試験が別のIP、ときに別の網を示すことがあるので、不一致だけでは別プールの証明になりません。スティッキーセッションは同条件の比較を起こしやすくしますが、試験のあいだ、または再接続のあとに同じIPが保たれる保証ではありません。

  5. 同じセッションでDNSを見る。 リモートDNS(socks5h://、またはクライアントの「プロキシDNS」)を使い、リーク試験を実行してください。プロキシが動くかの確認が、DNSとWebRTCの確認を案内します。

  6. IPv6は別に試す。 SOCKS5はIPv6宛先を運べますが、ゲートウェイにIPv6出口があるときだけです。デュアルスタックの掲載には、デュアルスタックの試験が必要です。

結果の読み方の、仮定の計算例です。プランが一つのゲートウェイホストに二つのポートを掲げ、上の両方のcurlを同じ試験URLへ走らせたとします。これらの型は図示であり、実在の供給元の結果ではありません。

見えるもの(仮定)意味し得ること次にすること
HTTPポート: CONNECT のあと200。SOCKSポート: 握手成功各ポートがプランのプロトコルを話しているクライアントがネイティブに対応する方を選ぶ
HTTPポート: 407 Proxy Authentication RequiredポートはHTTPを話している。ログインが拒まれたユーザー名、パスワード、供給元が文書化するセッション接尾辞を見直す
HTTPポート: 不正な応答。socks5h:// はつながるそのポートはHTTPではなくSOCKSを話している可能性が高いクライアントを替える前に供給元の文書で確認する
正しく見える資格情報で両方失敗許可リスト、プラン範囲、またはクライアントの問題であり、必ずしもプロトコルではないIP許可リストとプラン設定を確認し、再試験する
両方通過、出口IPまたは網が違うローテーションプールでは普通正確なIPではなく、国と網の種類を比べる

プロトコルを決める前の短い確認です。

  • クライアントにこのプロトコルのネイティブ設定があり、プランが使うならユーザー名とパスワードの欄もある。
  • プロキシしたリクエストのDNSはプロキシで解決され(SOCKS5なら socks5h:// または「プロキシDNS」)、実際のブラウザまたはアプリでリーク試験を実行した。
  • 必要なポートが許されている。HTTP端点ならCONNECT対象、SOCKS5端点でUDPが要るならUDP。
  • 出口の国と網の種類がプランと一致する。プロトコルとは別に判断する。
  • その網を資格情報が横切ることが心配なら、端末からプロキシへのリンクが守られている(TLSプロキシ端点またはVPN)。

プロトコルは対応の選択、出自は到達の選択、セッションモード(スティッキーかローテーション)は流れの選択です。この順で決めると、きれいなIPだと思ってSOCKS5に余分を払わずに済みます。

06HTTPとSOCKS5の両方を出す供給元

買う前に、プランにどのプロトコルが含まれるか、それぞれのポートまたはホスト名、UDP対応、クライアントが要るならIP許可リストがあるかを、各供給元の文書で確認してください。

SOAX — レジデンシャルとモバイルプロキシ
SOAX — レジデンシャルとモバイルプロキシ3.8218

SOAXは共有クレジットプール上のローテーションするレジデンシャルとモバイルを売り、データセンターとISPも同じプランに入ります。Builderは月$200 + VAT(200クレジット)から。Builderのティア1トラフィックは1GBあたり$3です。

85か国
$3.00
1GBあたり
Bright Data — レジデンシャルとデータセンタープロキシ
Bright Data — レジデンシャルとデータセンタープロキシ4.41442

Bright Dataはデータ収集向けの大規模プロキシ網です。レジデンシャル、モバイル、ISP、データセンターのIPが約195か国にあります。レジデンシャルトラフィックは定期契約なしの従量払いができ、データセンターとISPアドレスは10 IPからのパックです。レジデンシャルとモバイルの利用には本人確認が必要です。

10か国
$5.00
1GBあたり
Oxylabs — レジデンシャルとデータセンタープロキシ
Oxylabs — レジデンシャルとデータセンタープロキシ4.0771

Oxylabsはレジデンシャル、モバイル、ISP、データセンタープロキシを、月$30からのひとつの月次契約で売っています。支払いはカード、電信送金、AliPay、PayPalです。

10か国
$0.45
1GBあたり
Decodo(Smartproxy) — レジデンシャルとデータセンタープロキシ
Decodo(Smartproxy) — レジデンシャルとデータセンタープロキシ4.22118

Decodo(旧Smartproxy)はレジデンシャルとデータセンタープロキシを売っています。レジデンシャルは月次プランなしで1GBあたり$4、または3 GBから1GBあたり$3.75の月次パックです。支払いはカード、PayPal、Alipay、Google/Apple Pay、暗号資産(制限あり)です。

83か国
$0.38
1GBあたり

SOCKS5とHTTPプロキシの主な違いは何ですか?

HTTPプロキシはHTTPを話し、CONNECTメソッドでHTTPSをトンネルし、たいていはWebポートだけです。SOCKS5はプロトコルに依存しないトンネルで、任意のTCPと、サーバーが対応していればUDPを運びます。普通のHTTPS閲覧では、どちらもプロキシが読めない暗号化トンネルになります。

SOCKS5はHTTPプロキシより速いですか?

気づく差はありません。どちらも接続ごとに握手を一つ足し、そのあとバイトを転送します。ゲートウェイまでの距離、供給元の負荷、出口IPの方が、プロトコルよりずっと効きます。

SOCKS5はDNSリークを防ぎますか?

減らせますが、リモートDNSがオンのときだけです。curlでは socks5h://、クライアントでは「プロキシDNS」を使い、プロキシしたトラフィックのホスト名をプロキシに解決させてください。素の socks5:// では、名前は端末で調べられます。ブラウザの先読み、迂回規則、WebRTC、ほかのアプリはまだローカル照会できるので、リーク試験を実行してください。

SOCKS5はHTTPより匿名ですか?

違います。素のHTTPプロキシ接続もSOCKS5接続も、クライアントからプロキシへのホップは暗号化されず、サイトに見せる出口IPも同じです。匿名性はIPの出自、DNSの扱い、クライアントの指紋に依存し、プロキシプロトコルには依存しません。

SOCKS5とHTTPSプロキシはどう違いますか?

HTTPSプロキシはたいてい、CONNECTでHTTPSサイトをトンネルするHTTPプロキシです。ときに、プロキシ自身への接続がTLSを使い、ローカル網上の資格情報を隠す意味です。SOCKS5には、その最初のホップ向けの内蔵暗号化はありません。

同じプロキシをHTTPとSOCKS5の両方で使えますか?

プランに両方が含まれるなら使えます。一部の供給元は、同じプランでHTTPとSOCKS5を別ポートまたは別ホスト名で出します。文書を確認してください。HTTPとSOCKS5は、この案内のcurlのようにプロトコル固有のクライアント試験で別々に比べてください。プロキシチェッカーはプロトコルを自動検出し、最初に成功したものを報告します。スティッキーセッションは出口IPの比較を役立てやすくしますが、再接続でアドレスはまだ変わります。