开发者
把客户端指向哪种协议,以及代理切换后要在客户端中设置的 socks5 或 socks5h 方案。
SOCKS5 是一种传输层代理协议:它代您打开连接并传送字节,不读取也不改写其中的内容。我们销售的每个静态 ISP 代理,都可以在您已持有的订单上在 HTTP 和 SOCKS5 之间切换。
切换协议并不是换一种产品:您切换的是已经持有的代理,可以通过控制台或 API 操作,订单会更新为用于连接的新端口和新凭据。
简而言之: SOCKS5 是一种代理协议,而不是一种地址类型:它中继 TCP 连接,不读取也不改写其中的内容。ProxyJam 销售的每个静态住宅(ISP)代理都运行 HTTP(可承载 HTTPS)或 SOCKS5,您可以在已持有的订单上在两者之间切换;切换之后,请使用订单显示的端口和凭据进行连接。
SOCKS5 可以承载您的客户端能为之打开 TCP 连接的任何东西,包括 HTTP 代理无法转发的流量,并且原样传递字节。这使它成为数据库客户端、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 中,socks5:// 对应第一种行为,socks5h:// 对应第二种,Everything curl 中的表格对此有所列明。承载 HTTPS 的 HTTP 代理通常收到的则是名称:CONNECT 请求指明目标主机和端口,由代理打开通往它的隧道(RFC 9110,第 9.3.6 节)。UDP 中继是 SOCKS5 规范的一部分,但各实现对它的处理不同;下面的常见问题说明了这在我们的代理上意味着什么。
如果您已经有一台服务器的 SSH 登录权限,那么无需购买,您就有了一个 SOCKS5 代理。ssh -N -D 1080 user@server 会建立 OpenBSD ssh 手册所说的本地 “dynamic”(动态)应用层端口转发:ssh 在您机器的 1080 端口上监听,并且 “will act as a SOCKS server”(将充当 SOCKS 服务器),通过加密的 SSH 通道承载每一个连接,并从远程机器上打开它。-N 让它只做转发,不启动远程 shell。把客户端指向 socks5h://127.0.0.1:1080,它的流量就会从那台服务器发出。
与购买的 SOCKS5 代理相比,区别在于连接从哪里出去。通过 SSH 隧道,远端的网站看到的是 SSH 服务器的地址以及该服务器所属的网络,对于租用的服务器来说,那通常是一家托管公司的网络。SSH 加密的是您与服务器之间的那一段;从服务器到网站,流量原来是什么样就还是什么样。切换到 SOCKS5 的 ProxyJam 代理则从一个位于具名互联网服务商网络上的地址出去,这个地址在结账时按国家和运营商选定;您使用订单上的端口和凭据直接连接它,中间没有 SSH,也不需要自己运行服务器。
所以两者回答的是不同的问题。SSH 隧道把流量从一台您已经控制的机器上发出去。ISP 地址上的 SOCKS5 代理则用于出口地址本身很重要的工作,也就是查询它时会显示哪个网络。
三次简短的交换,其中没有一次需要代理理解您的流量。
您的客户端向代理问候,并商定认证方式。 它提出自己支持的方法;代理指定它想用的那一种。在我们的地址上,那就是用户名和密码;如果您改为把自己的 IP 加入了白名单,则无需任何认证。
您的客户端请求一个目标。 一个主机和一个端口,以地址或名称的形式发送。发送名称是值得关注的情形:由代理来解析它,因此查询从代理的网络发出,而不是从您的网络发出。
此后代理只是传送字节。 它不解析载荷,不添加标头,也不知道自己承载的是网页、数据库会话还是邮件传输。正是这种不加区分,构成了选择 SOCKS5 而不是 HTTP 代理的全部理由。
| HTTP 代理 | 通过 CONNECT 的 HTTPS | SOCKS5 | |
|---|---|---|---|
| 能承载什么 | 仅 HTTP 请求 | 到指定主机和端口的 TCP 隧道 | 任何 TCP 流 |
| 代理是否读取载荷 | 是,它会解析请求 | 隧道打开后不读取 | 任何时候都不读取 |
| 能否改动您的标头 | 能,它会转发标头,并且可能添加自己的标头,例如 Via | 隧道打开后不能 | 不能,它根本没有标头的概念 |
| 主机名在哪里解析 | 在代理端 | 在代理端,因为 CONNECT 会指明主机 | 由您选择,两端都可以 |
| 常见客户端支持情况 | HTTP 工具普遍支持 | HTTP 工具普遍支持 | 命令行工具中很常见;有些库需要额外的包 |
| 最适合 | 普通网页请求 | 日常 HTTPS 浏览和抓取 | 非网页协议和混合流量 |
把客户端指向哪种协议,以及代理切换后要在客户端中设置的 socks5 或 socks5h 方案。
把客户端指向哪种协议,以及如何通过控制台或 API 切换您已持有的代理。
在控制台中操作,或在订单上调用一次 API;只更改客户端是不够的。切换期间,代理可能会短暂不可用。
不要沿用您通过 HTTP 连接时使用的值。
socks5h://USERNAME:PASSWORD@HOST:PORT 让代理解析主机名,socks5:// 则在您这一端解析。
curl -x socks5h://USERNAME:PASSWORD@HOST:PORT https://example.com/。
在 Python 中,requests 需要先安装它的 SOCKS 扩展 pip install requests[socks],socks5h:// 代理 URL 才能工作。
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,请先切换代理本身,可以在控制台中操作,也可以调用一次 API;之后订单会显示从现在起要使用的端口和凭据。在客户端中,把方案改为 socks5,或者如果您希望由代理解析主机名,则改为 socks5h,并使用那个端口和那些凭据。为此,Python 需要 requests[socks],Node.js 则需要用 SOCKS agent 替换 HTTPS agent。
下面的回答说明了我们的销售条款,每个说明条款的回答都链接到约束我们的那份文件。
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 之间切换,可以在控制台中操作,也可以在同一个订单上调用一次 API。这不仅仅是客户端设置:切换是在代理上进行的,订单会更新为新的协议、端口和凭据,切换期间代理可能会短暂不可用。在您付费的整个期间内,代理始终属于您;如果它停止响应,或在您指定的目标上被封锁,我们会免费更换,每个自然月最多可更换订单的 20%;首次订单还享有 24 小时退款,最多涵盖 10 个 IP,测试不会使其失效。 服务条款
--socks5 在本地解析主机名,--socks5-hostname 让代理解析主机名socks5:// 和 socks5h://,以及由哪一端解析主机名-D 设置本地动态端口转发,由 ssh 充当 SOCKS4 和 SOCKS5 服务器;-N 只转发端口而不执行远程命令