你可能在软件设置里见过 SOCKS5、SOCKS Host、SOCKS Server。中文聊天里有人会把 SOCKS5 简称成 “S5”,甚至写成 “SK5”,但正式名称就是 SOCKS5。
先别急着想“协议层”。看一个最容易理解的例子。
PC B 上的软件本来够不到公司内部网络,但 Windows A 已经通过 VPN 进入了这个网络。如果 PC B 上的软件支持 SOCKS5,它可以先连 Windows A 的 SOCKS5 代理,再让 Windows A 替它建立到目标服务器的连接。
这就是 SOCKS5 最核心的价值:它不要求你访问的东西必须是网页。
为什么大家会说 SOCKS5 比 HTTP 代理更“通用”
HTTP Proxy 天生围绕 HTTP/HTTPS 这类 Web 通信工作,而 SOCKS5 关注的是更底层一点的问题:“你要连接哪个地址、哪个端口?我替你连。”
例如程序想连接数据库:
10.20.30.15:3306
这里根本没有网页,也没有 HTTP 请求。只要这个程序支持 SOCKS5,它仍然可以要求 SOCKS5 代理帮它建立这条 TCP 连接。
因为 SOCKS5 不要求上层数据一定是 HTTP。很多基于 TCP 的应用,只要客户端本身支持 SOCKS5,都可以通过它建立连接。SOCKS5 还定义了 UDP 转发能力,所以适用面确实比普通 Web 代理更广。
但“所有协议”四个字严格来说又不准确。后面会解释它的边界。
专业一点:SOCKS5 在网络里到底做了什么
SOCKS5 的正式标准是 RFC 1928。标准里定义了客户端如何和代理协商、如何告诉代理目标地址和端口,以及代理需要支持的主要请求。最常见的三种是:
| 命令 | 它做什么 | 普通用户最容易在哪见到 |
|---|---|---|
| CONNECT | 让 SOCKS5 代理替客户端建立一个 TCP 连接 | 浏览器、开发工具、数据库客户端、聊天/自动化软件等 |
| BIND | 让代理端监听连接,服务于某些需要反向连接的协议 | 现代普通用户很少直接碰到 |
| UDP ASSOCIATE | 建立 UDP 转发关系 | 客户端和服务端都实现 SOCKS5 UDP 时 |
RFC 1928 还允许目标地址直接写成 IPv4、IPv6 或域名。这也是为什么 SOCKS5 能处理“目标是一个域名”这种情况。
TCP 是什么?
TCP 可以先理解为一种“先建立可靠连接,再持续传数据”的通信方式。网页的 HTTPS、SSH、很多数据库连接、远程管理、邮件等大量网络程序都建立在 TCP 上。
SOCKS5 的 CONNECT 最常见的用途,就是帮应用程序建立这样的 TCP 连接。
UDP 又是什么?
UDP 更像“直接发数据包”,不先建立同样的可靠连接。实时音视频、DNS 查询、部分游戏和实时协议会使用 UDP。
SOCKS5 协议本身定义了 UDP ASSOCIATE,所以不能简单说“SOCKS5 只有 TCP”。但实际能不能代理 UDP,要看客户端程序是否支持、SOCKS5 服务端是否实现、网络策略是否允许,三者缺一不可。RFC 1928 明确规定了 UDP relay 的工作方式。
DNS 为什么经常和 SOCKS5 一起被讨论
假设你要访问:
erp.company.local
电脑真正连接之前,需要知道这个域名对应哪个 IP。这一步就是 DNS 解析。
这里有两种完全不同的做法。
| 方式 | 发生了什么 | 可能出现的问题 |
|---|---|---|
| 客户端本地解析 | PC B 先用自己的 DNS 把域名查成 IP,再把 IP 交给 SOCKS5 | 如果这个域名只有公司 VPN 内部 DNS 才认识,PC B 本地可能根本解析不出来 |
| 把域名交给代理 | PC B 直接告诉 SOCKS5:“请连接 erp.company.local:443” | 代理所在的 Windows A 如果能使用 VPN 内部 DNS,就可能正确解析 |
SOCKS5 标准允许请求里直接携带域名,但具体软件到底是自己先解析,还是把域名交给代理解析,取决于客户端实现。
curl 就把两种行为明确区分开:socks5:// 默认本地解析,而 socks5h:// / --socks5-hostname 会让代理端解析主机名。curl 官方文档对此写得很清楚。
如果某个公司内网 IP 通过 SOCKS5 能访问,但内部域名打不开,不要立刻断定 SOCKS5 失败。先查“域名到底是在本机解析,还是在代理端解析”。
SOCKS5 和 HTTP Proxy 的本质区别
| HTTP Proxy | SOCKS5 | |
|---|---|---|
| 最自然的用途 | 网页、HTTPS、Web API | 更广泛的软件网络连接 |
| 是否要求上层是 HTTP | 普通 HTTP 转发是;HTTPS 常通过 CONNECT 建 TCP 隧道 | 不要求是 HTTP |
| TCP | 支持,尤其 HTTPS CONNECT 本质是 TCP 隧道 | 核心能力,CONNECT |
| UDP | 传统 HTTP Proxy 不是为通用 UDP 转发设计 | 协议定义了 UDP ASSOCIATE |
| DNS | 看浏览器/客户端与代理实现 | 请求可携带域名,但本地还是远端解析仍看客户端实现 |
| 软件要求 | 软件要支持 HTTP Proxy 或遵守相应系统代理 | 软件要支持 SOCKS5,或有额外程序把流量转换进去 |
如果这里最让你疑惑的是“HTTP Proxy 为什么也能转发 HTTPS”,可以看 《HTTP Proxy 是什么?为什么填一个 IP 和端口,浏览器就能通过另一台电脑上网》,里面把 HTTP、HTTPS 和 CONNECT 隧道的关系单独讲清楚。
SOCKS5 不是什么:这几个误区一定要分开
误区 1:SOCKS5 = VPN
不是。SOCKS5 是代理协议;VPN 通常会建立隧道、虚拟网络接口或系统路由,让操作系统把一部分甚至全部 IP 流量送入 VPN。
一个程序用了 SOCKS5,并不代表整台电脑所有软件都会跟着它走。
误区 2:SOCKS5 = 所有流量都能代理
也不准确。最常见的是 TCP,协议还定义 UDP 转发。但 ICMP(例如普通 ping)、原始 IP 数据包、二层广播等,并不会因为你开启了 SOCKS5 就自动被完整接管。
误区 3:SOCKS5 本身会加密
SOCKS5 本身不是“加密 VPN”。它可以协商认证方式,但数据内容是否加密主要取决于里面跑的协议。例如 HTTPS/TLS 自己是加密的;一个没有加密的明文 TCP 协议不会因为外面套了普通 SOCKS5 就自动变成安全隧道。
误区 4:Windows 设置一个 SOCKS5,全系统就都走了
不一定。应用程序必须支持 SOCKS5,或者由系统级/第三方转发工具接管它。不同程序是否读取系统代理设置也不一样。
这也是为什么代理和网关不能混为一谈。一个软件配置了 SOCKS5,并不代表整台电脑的默认网络都改变了。这个区别在 《代理、VPN、网关到底有什么区别?为什么浏览器走了 VPN,其他软件却没有》 里会更直观。
NetConfiger 当前产品会把 Windows 上已存在的网络出口提供成 HTTP / SOCKS5。这里的 SOCKS5 仍然是应用代理,不是整机透明网关。放回到 NetConfiger 的真实场景,你就更容易理解
假设 Windows A 上已经连接 SoftEther,公司内部数据库是:
10.20.30.15:3306
PC B 上运行数据库管理工具。这个工具支持 SOCKS5。
这时候 SOCKS5 的意义就非常明确:它不是“另一个网页代理”,而是让 PC B 上那个支持 SOCKS5 的程序,把自己的连接交给 Windows A 去建立。
专业资料 / 进一步阅读
RFC 1928 — SOCKS Protocol Version 5(标准原文) 维基百科:SOCKS(通用概览) curl 官方文档:SOCKS5 / SOCKS5 hostname resolution在 NetConfiger 的实际使用里,这种区别很直接:Windows 上先有一条已经能用的网络,例如公司 VPN 或指定虚拟网卡,然后 NetConfiger 把这条网络提供成 HTTP 或 SOCKS5,局域网里的 PC、VM 或支持代理的软件再按自己的能力选择其中一种。