開発者
クライアントをどのプロトコルに向けるか、そしてプロキシを切り替えたあとにクライアントに設定するスキームがsocks5かsocks5hか。
SOCKS5はトランスポート層のプロキシプロトコルです。お客様に代わって接続を開き、中身を読んだり書き換えたりせずにバイトを運びます。当社が販売するすべての静的ISPプロキシは、すでにお持ちの注文のままHTTPとSOCKS5を切り替えられます。
プロトコルの切り替えは別の製品ではありません。すでにお持ちのプロキシをダッシュボードまたはAPIから切り替えると、注文が接続に使う新しいポートと認証情報に更新されます。
要点: SOCKS5はプロキシのプロトコルであり、アドレスの種類ではありません。TCP接続を、中身を読んだり書き換えたりせずに中継します。ProxyJamが販売するすべての静的レジデンシャル(ISP)プロキシはHTTP(HTTPSも通します)またはSOCKS5で動作し、すでにお持ちの注文のまま両者を切り替えられます。切り替えたあとは、注文に表示されるポートと認証情報で接続してください。
SOCKS5は、HTTPプロキシでは転送できない通信も含め、クライアントがTCP接続を開けるものなら何でも運び、バイトに手を加えずに通します。そのため、データベースのクライアント、SSHのセッション、HTTPを話さないあらゆるツールにとって自然な選択肢になります。一方で、アドレスの性質は変わりません。プロキシのプロトコルはクライアントとプロキシのあいだで話されるもので、向こう側のサイトから見えるのは、プロキシのアドレスからの接続と、HTTPプロキシが加えることにしたヘッダーです。ですから、問うべきなのはどのプロトコルを買うかではありません。そのアドレスがどのネットワークに属しているかです。その答えは名前の分かるインターネット事業者で、米国では19社です。
SOCKSバージョン5は1996年にRFC 1928として公開されました。ファイアウォールを越えるためのプロトコルで、SOCKSバージョン4にUDP、認証方法の枠組み、ドメイン名またはIPv6アドレスで指定する接続先を加えたものです。クライアントは対応している認証方法を提示し、サーバーがそのうち一つを選びます。そのあとクライアントは、外向きの接続(CONNECT)、待ち受けポート(BIND)、UDPの中継(UDP ASSOCIATE)のいずれかを求めます。ユーザー名とパスワードによるログインはそれ自体が短い仕様RFC 1929になっており、パスワードを平文で送ります。そのため、重要な通信はトンネルの中で暗号化しておいてください。
socks5とsocks5hのスキームが選び分けているのは、このドメイン名のオプションです。curlのマニュアルは、--socks5をプロキシを使いつつ「but resolve the hostname locally」(ただしホスト名は手元で解決する)ものとし、--socks5-hostnameを「the proxy resolve the hostname」(プロキシにホスト名を解決させる)形の変種として説明しています。プロキシURLでは、Everything curlの表にあるとおり、socks5://が前者の動作に、socks5h://が後者の動作になります。HTTPSを運ぶHTTPプロキシは、通常は代わりに名前を受け取ります。CONNECTリクエストが接続先のホストとポートを名指しし、プロキシがそこへのトンネルを開くからです(RFC 9110、9.3.6節)。UDPの中継はSOCKS5の仕様の一部ですが、実装によって扱いが異なります。当社のプロキシでそれが何を意味するかは、下のFAQで説明しています。
すでにサーバーにSSHでログインできるなら、プロキシを買わなくてもSOCKS5プロキシが手に入ります。ssh -N -D 1080 user@serverは、OpenBSDのsshマニュアルがローカルの「dynamic」(動的)なアプリケーションレベルのポートフォワーディングと呼ぶものを設定します。sshはお客様のマシンのポート1080で待ち受け、「will act as a SOCKS server」(SOCKSサーバーとして動作する)ことで、各接続を暗号化されたSSHのチャネルで運び、リモートのマシンから開きます。-Nを付けるとリモートのシェルを起動せず、転送だけを行います。クライアントをsocks5h://127.0.0.1:1080に向ければ、その通信はサーバーから出ていきます。
購入したSOCKS5プロキシとの違いは、接続がどこから出ていくかです。SSHトンネルを通すと、向こう側のサイトから見えるのはSSHサーバーのアドレスと、そのサーバーが属するネットワークで、借りたサーバーならたいていホスティング会社のネットワークです。SSHが暗号化するのはお客様とサーバーのあいだの区間で、サーバーからサイトまでの通信はもともとの状態のままです。SOCKS5に切り替えたProxyJamのプロキシは、購入手続きで国と通信事業者を選んだ、名前の分かるインターネット事業者のネットワーク上のアドレスから出ていきます。注文に表示されるポートと認証情報で直接接続するので、あいだにSSHは入らず、ご自身でサーバーを運用する必要もありません。
つまり、この二つは別々の問いに答えるものです。SSHのトンネルは、すでに管理しているマシンから通信を送り出します。ISPアドレスのSOCKS5プロキシは、出口のアドレスそのもの、つまりそれを照会したときにどのネットワークが表示されるかが重要になる作業のためのものです。
短いやり取りが3回あるだけで、どれもプロキシがお客様の通信を理解する必要はありません。
クライアントがプロキシに挨拶し、認証方法を取り決める。 クライアントは対応している方法を提示し、プロキシは使いたい方法を一つ指定します。当社のアドレスでは、それはユーザー名とパスワードか、代わりにご自身のIPをホワイトリストに登録している場合は認証なしです。
クライアントが接続先を求める。 ホストとポートを、アドレスか名前のどちらかで送ります。注目すべきは名前を送る場合です。プロキシが名前を解決するので、名前の照会はお客様のネットワークではなくプロキシのネットワークから出ていきます。
そのあと、プロキシはバイトを運ぶだけ。 ペイロードを解析せず、ヘッダーも加えず、運んでいるのがウェブページなのか、データベースのセッションなのか、メールの転送なのかも知りません。この無関心こそが、HTTPプロキシではなくSOCKS5を選ぶ理由のすべてです。
| HTTPプロキシ | CONNECTによるHTTPS | SOCKS5 | |
|---|---|---|---|
| 運べるもの | HTTPリクエストのみ | 指定したホストとポートへのTCPトンネル | あらゆるTCPストリーム |
| プロキシがペイロードを読むか | はい。リクエストを解析します | トンネルが開いたあとは読みません | どの時点でも読みません |
| ヘッダーを変更できるか | はい。ヘッダーを転送し、Viaのような独自のヘッダーを加えることがあります | トンネルが開いたあとはできません | いいえ。ヘッダーという概念がありません |
| ホスト名が解決される場所 | プロキシ側 | プロキシ側。CONNECTがホストを名指しします | どちら側かを選べます |
| クライアントの一般的な対応状況 | HTTPのツールなら必ず対応 | HTTPのツールなら必ず対応 | コマンドラインツールでは一般的。追加のパッケージが必要なライブラリもあります |
| 向いている用途 | 単純なウェブリクエスト | 通常のHTTPSの閲覧とスクレイピング | ウェブ以外のプロトコルと混在する通信 |
クライアントをどのプロトコルに向けるか、そしてプロキシを切り替えたあとにクライアントに設定するスキームがsocks5かsocks5hか。
クライアントをどのプロトコルに向けるか、そしてすでにお持ちのプロキシをダッシュボードやAPIからどう切り替えるか。
ダッシュボードから、または注文に対する1回のAPI呼び出しで切り替えます。クライアントだけを変えても足りません。切り替えのあいだ、プロキシが短時間使えなくなることがあります。
HTTPで接続していたときの値を使い回さないでください。
プロキシにホスト名を解決させるならsocks5h://USERNAME:PASSWORD@HOST:PORT、お客様の側で解決するならsocks5://です。
curl -x socks5h://USERNAME:PASSWORD@HOST:PORT https://example.com/。
Pythonでは、socks5h://のプロキシURLを使えるようにする前に、requestsのSOCKSエクストラが必要です。pip install requests[socks]を実行してください。
import requests
# HOST, PORT, USERNAME, PASSWORD come with your order (dashboard or API)
proxy = "http://USERNAME:PASSWORD@HOST:PORT"
proxies = {
"http": proxy,
"https": proxy,
}
response = requests.get(
"https://example.com/",
proxies=proxies,
)
print(response.status_code)
# HOST, PORT, USERNAME, PASSWORD come with your order (dashboard or API)
curl -x http://USERNAME:PASSWORD@HOST:PORT \
https://example.com/
import axios from "axios";
import { HttpsProxyAgent } from "https-proxy-agent";
// HOST, PORT, USERNAME, PASSWORD come with your order (dashboard or API)
const proxy = "http://USERNAME:PASSWORD@HOST:PORT";
const agent = new HttpsProxyAgent(proxy);
const response = await axios.get(
"https://example.com/",
{
httpAgent: agent,
httpsAgent: agent,
},
);
console.log(response.status);
package main
import (
"fmt"
"net/http"
"net/url"
)
func main() {
// HOST, PORT, USERNAME, PASSWORD come with your order (dashboard or API)
proxy, _ := url.Parse(
"http://USERNAME:PASSWORD@HOST:PORT")
client := &http.Client{Transport: &http.Transport{
Proxy: http.ProxyURL(proxy),
}}
res, _ := client.Get("https://example.com/")
fmt.Println(res.Status)
}
以下のサンプルは、注文の開始時のプロトコルであるHTTPで接続します。SOCKS5を使うには、まずプロキシそのものをダッシュボードから、または1回のAPI呼び出しで切り替えてください。すると注文に、以後使うポートと認証情報が表示されます。クライアントでは、そのポートと認証情報を使い、スキームをsocks5に、プロキシにホスト名を解決させたい場合はsocks5hに変更します。そのためにPythonではrequests[socks]が、Node.jsではHTTPSエージェントの代わりにSOCKSエージェントが必要です。
以下の回答は当社の販売条件を述べており、条件を述べる回答にはそれぞれ、当社をその条件に拘束する文書へのリンクを付けています。
SOCKS5は、RFC 1928で定義された、トランスポート層で動作するプロキシのプロトコルです。クライアントがプロキシにホストとポートへの接続を開くよう求めると、プロキシがそれを開き、以後は双方向のバイトを解釈せずに転送します。運んでいるものを解析しないので、ウェブの通信に限られず、TCPの上で動くものなら何でも通せます。
HTTPプロキシはHTTPを理解します。リクエスト行とヘッダーを読み、それらを自由に追加、削除、書き換えできます。お客様が設定していないヘッダーでひそかに自分の存在を知らせるプロキシがあるのはそのためです。SOCKS5にはヘッダーという概念がまったくなく、見えるのは接続先とバイトのストリームだけです。通信がHTTPでない場合や、途中で何者にも通信を編集させたくない場合は、SOCKS5を選んでください。
いいえ。HTTPプロキシも暗号化しません。SOCKS5はプロキシに対してお客様を認証し、そのあとはバイトを転送するだけです。仕様では認証方法が独自の保護を加えることを認めていますが、ユーザー名とパスワードによる認証(RFC 1929)はパスワードを平文で送り、そのあとの通信を何も保護しません。中の通信がHTTPSやSSHなら、すでにエンドツーエンドで暗号化されており、プロキシはそれを読めません。中の通信が平文なら平文のままなので、SOCKS5を暗号化の層として扱わないでください。
DNSの照会を行う場所が変わります。socks5では、クライアントがホスト名を手元で解決し、得られたアドレスへの接続をプロキシに求めます。socks5hでは、クライアントは名前を送り、プロキシがそれを解決します。これには二つの意味があります。お客様自身のリゾルバーには、どのホストにアクセスしているかが見えません。そして、プロキシのネットワークが受け取る答えが返ってきます。地域によって答えが変わるホスト名では、それは自宅で得られる答えとは違うことがよくあります。
UDP ASSOCIATEはRFC 1928にありますが、クライアントやサーバーがそれを実装しているかどうかはさまざまなので、思い込まずに両側を確認してください。当社のプロキシについてはUDP対応を公表していないので、TCPを前提に計画し、UDPに依存するものを作る前にサポートにお問い合わせください。
いいえ。すでにお持ちのプロキシを、HTTP(HTTPSも通します)とSOCKS5のあいだで切り替えます。ダッシュボードから、または同じ注文に対する1回のAPI呼び出しで行えます。これはクライアントの設定だけの話ではありません。切り替えはプロキシに対して行われ、注文は新しいプロトコル、ポート、認証情報に更新され、そのあいだプロキシが短時間使えなくなることがあります。プロキシはお支払いいただいた期間全体を通じてお客様のものであり、応答しなくなったり指定した対象でブロックされたりした場合は、暦月ごとに注文の最大20%まで無料で交換されます。また初回注文には、最大10 IPを対象とする24時間の返金が付いており、テストしても対象から外れません。 利用規約
--socks5はホスト名を手元で解決し、--socks5-hostnameはプロキシに解決させるsocks5://とsocks5h://、そしてどちら側がホスト名を解決するか-Dはローカルの動的ポートフォワーディングを設定し、sshがSOCKS4とSOCKS5のサーバーとして動作する。-Nはリモートのコマンドを実行せずにポートを転送する