Skip to content

HTTP & SOCKS — sing-box

sing-box 把 HTTP、SOCKS 以及合并的 "mixed" 入站(同一端口上的 HTTP + SOCKS)打包在一个源文件里。出站 HTTP 可选用 TLS 包裹 CONNECT 流;出站 SOCKS 支持 v4、v4a、v5,并可选启用 udp_over_tcp 帧。

SOCKS

入站

type: "socks"

字段类型默认值允许值描述
users[]auth.User[][{username, password}]用户列表。为空则禁用鉴权。
domain_resolver*DomainResolveOptions(default)DomainResolveOptions覆盖该入站的目的主机名解析方式。

源码: option/simple.go:8-12 · 锚定版本 v1.13.11 (553cfa1)

该结构体还内嵌 ListenOptions(监听地址、端口、嗅探等)。

出站

type: "socks"

字段类型默认值允许值描述
versionstring54 | 4a | 5SOCKS 协议版本。v4 为原始 SOCKS4;v4a 增加远端主机名解析;v5 是现代默认。
usernamestring(unset)<string>上游鉴权用户名(仅 v5)。
passwordstring(unset)<string>上游鉴权密码。
networkNetworkList(tcp+udp)tcp | udp | 限定为仅 TCP 或仅 UDP。
udp_over_tcp*UDPOverTCPOptions(disabled)UDPOverTCPOptions把 UDP 包包装进 TCP 控制通道。上游代理不支持 UDP-associate 时有用。

源码: option/simple.go:22-30 · 锚定版本 v1.13.11 (553cfa1)

内嵌 DialerOptionsServerOptionsserverserver_port)。

HTTP / Mixed

httpmixed 入站类型共用同一个 Go 结构体 (HTTPMixedInboundOptions)。type 字段为 mixed 时,入站在同一 端口上同时接受 HTTP CONNECT 与 SOCKS5 握手 —— 协议种类由客户端首 字节判定。

入站(type: "http"type: "mixed"

字段类型默认值允许值描述
users[]auth.User[][{username, password}]用户列表。
domain_resolver*DomainResolveOptions(default)DomainResolveOptions按入站的域名解析器覆盖。
set_system_proxyboolfalsetrue | false为 true 时 sing-box 启动期把操作系统代理设置指向该监听器,退出时还原。

源码: option/simple.go:14-20 · 锚定版本 v1.13.11 (553cfa1)

内嵌 ListenOptionsInboundTLSOptionsContainer(入站可在 TLS 之上提供 HTTP —— 现代 Squid 风格的 HTTPS 代理)。

出站

type: "http"

字段类型默认值允许值描述
usernamestring(unset)<string>上游鉴权用户名。
passwordstring(unset)<string>上游鉴权密码。
pathstring(unset)/<path>添加到 CONNECT 请求行的路径前缀。空值使用上游期望的默认。
headersbadoption.HTTPHeader{}{<header>: <value or list>}每个 CONNECT 请求附加的 HTTP 头。

源码: option/simple.go:32-40 · 锚定版本 v1.13.11 (553cfa1)

内嵌 DialerOptionsServerOptionsOutboundTLSOptionsContainertls 让该出站指向 HTTPS 代理)。

示例

带单用户的 mixed 入站:

json
{
  "inbounds": [
    {
      "type": "mixed",
      "tag": "mixed-in",
      "listen": "127.0.0.1",
      "listen_port": 7890,
      "users": [
        { "username": "alice", "password": "<password>" }
      ]
    }
  ]
}

HTTPS 代理入站(HTTP over TLS):

json
{
  "inbounds": [
    {
      "type": "http",
      "tag": "https-proxy-in",
      "listen": "0.0.0.0",
      "listen_port": 8443,
      "users": [{ "username": "alice", "password": "<password>" }],
      "tls": {
        "enabled": true,
        "certificate_path": "/etc/ssl/cert.pem",
        "key_path": "/etc/ssl/key.pem"
      }
    }
  ]
}

启用 UoT 的 SOCKS5 出站:

json
{
  "outbounds": [
    {
      "type": "socks",
      "tag": "via-socks",
      "server": "upstream.example.com",
      "server_port": 1080,
      "version": "5",
      "username": "alice",
      "password": "<password>",
      "udp_over_tcp": { "enabled": true, "version": 2 }
    }
  ]
}

说明

  • mixed 入站按首字节判定协议,这意味着既不说 HTTP 也不说 SOCKS 的 错乱客户端会被立即关闭,不会阻塞监听器。
  • set_system_proxy 仅在 sing-box 支持系统代理 API 的平台 (Windows、macOS、GNOME)上生效。其他系统上被静默忽略。
  • version: "4a" 是把主机名发给 SOCKS4 服务器的唯一方式(纯 SOCKS4 只承载 IPv4 目标)。
  • HTTP 出站的 path 字段存在是因为部分上游 CONNECT 代理要求显式的 路径前缀(PUT /forward HTTP/1.1)以做路由 —— 大多数不需要,留空 即可。

跨内核说明

  • Xray-core 把 HTTP 与 SOCKS 放在分开的文件,使用 accounts[] (而非 users[])和 user / pass(而非 username / password), 且没有 "mixed" 入站 —— 需要两个不同端口上的独立入站。参见 HTTP & SOCKS — Xray-core
  • mihomo 把入站拆成三种监听器类型(httpsocksmixed), 并使用 kebab-case 字段名(skip-cert-verify 等)。参见 HTTP & SOCKS — mihomo

源码: option/simple.go:8-40 · v1.13.11 (553cfa1)

由 Argsment 出品的 Core Tutorial