你可能在软件设置里见过 SOCKS5SOCKS HostSOCKS Server。中文聊天里有人会把 SOCKS5 简称成 “S5”,甚至写成 “SK5”,但正式名称就是 SOCKS5

一句话先说清楚:SOCKS5 是一种“通用的软件网络代理”。程序把自己原本要直接建立的网络连接交给 SOCKS5 代理,由代理服务器替它去连接真正的目标。

先别急着想“协议层”。看一个最容易理解的例子。

PC B 上的某个软件
Windows A 上的 SOCKS5:192.168.1.100:1080
Windows A 已连接好的公司 VPN
公司数据库 / 内部服务器 / 网站

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 可以代理所有协议”这个说法为什么听起来有道理?
因为 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 的工作方式。

重要:支持 SOCKS5 ≠ 一定支持 SOCKS5 UDP。很多软件只实现最常见的 TCP CONNECT,所以不能只看到“SOCKS5”三个字就默认 UDP 也一定能走。

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 ProxySOCKS5
最自然的用途网页、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 HTTP 和 SOCKS5 服务界面NetConfiger 当前产品会把 Windows 上已存在的网络出口提供成 HTTP / SOCKS5。这里的 SOCKS5 仍然是应用代理,不是整机透明网关。

放回到 NetConfiger 的真实场景,你就更容易理解

假设 Windows A 上已经连接 SoftEther,公司内部数据库是:

10.20.30.15:3306

PC B 上运行数据库管理工具。这个工具支持 SOCKS5。

数据库工具(PC B)
SOCKS5 → 192.168.1.100:1080
NetConfiger(Windows A)
SoftEther / 公司 VPN
10.20.30.15:3306

这时候 SOCKS5 的意义就非常明确:它不是“另一个网页代理”,而是让 PC B 上那个支持 SOCKS5 的程序,把自己的连接交给 Windows A 去建立。

最终记住这一句就够:HTTP Proxy 更偏 Web;SOCKS5 更像“通用的软件连接代理”。但 SOCKS5 仍然不是完整 VPN、不是网关,也不是所有数据包的万能隧道。

在 NetConfiger 的实际使用里,这种区别很直接:Windows 上先有一条已经能用的网络,例如公司 VPN 或指定虚拟网卡,然后 NetConfiger 把这条网络提供成 HTTP 或 SOCKS5,局域网里的 PC、VM 或支持代理的软件再按自己的能力选择其中一种。