带账号密码鉴权的 SOCKS5 代理 Docker 镜像,支持像 Clash 一样配置分流规则——可以把命中规则的域名/IP 流量强制走宿主机的 IPv6 出口、绑定到宿主机指定的网卡(如 wg0、第二张物理网卡等),或者转发到上游 SOCKS5 代理(proxy chain);其余流量走默认(IPv4)出口。
底层用 Xray-core 做 SOCKS5 入站和路由分流。
docker run -d --name router-socks5 \
--network host --restart unless-stopped \
-e SOCKS_USER=alice -e SOCKS_PASS=changeme -e SOCKS_PORT=1080 \
-v $PWD/rules.yaml:/etc/xray-router/rules.yaml:ro \
charmingcheung000/router-socks5:latest
services:
router-socks5:
image: charmingcheung000/router-socks5:latest
container_name: router-socks5
network_mode: host
restart: unless-stopped
environment:
SOCKS_USER: alice
SOCKS_PASS: changeme
SOCKS_PORT: 1080
XRAY_LOG_LEVEL: warning
volumes:
- ./rules.yaml:/etc/xray-router/rules.yaml:ro
| 变量 | 默认值 | 说明 |
|---|---|---|
SOCKS_USER | (空) | SOCKS5 用户名。和 SOCKS_PASS 同时为空 = 不鉴权(不推荐) |
SOCKS_PASS | (空) | SOCKS5 密码 |
SOCKS_PORT | 1080 | 监听端口(host 网络下直接占用宿主机端口) |
SOCKS_LISTEN | 0.0.0.0 | 监听地址 |
RULES_FILE | /etc/xray-router/rules.yaml | 规则文件路径(容器内) |
XRAY_LOG_LEVEL | warning | debug/info/warning/error/none |
配置由两部分组成:outbounds(命名出口)和 rules(按出口分组的 Clash 风格规则)。不命中任何规则的流量走默认出口(freedom,UseIPv4)。
outbounds:
v6:
type: direct # 默认即 direct,可省略
# interface: eth0 # 可选:绑定宿主机网卡 (SO_BINDTODEVICE)
domain_strategy: UseIPv6 # AsIs/UseIP/UseIPv4/UseIPv6,默认 UseIP
wg:
type: direct
interface: wg0
domain_strategy: UseIP
upstream: # 转发到上游 SOCKS5
type: socks
server: 1.2.3.4
port: 1080
user: alice # 可选
pass: secret # 可选
# interface: eth0 # 可选:xray→上游 的连接走指定网卡
# 想让默认出口也绑定网卡?覆盖名为 default 的 outbound:
# default:
# interface: eth0
# domain_strategy: UseIPv4
rules:
v6:
- DOMAIN-SUFFIX,google.com # google.com 及全部子域名
- DOMAIN,api.example.com # 精确匹配
- DOMAIN-KEYWORD,gstatic # 包含关键字
- DOMAIN-REGEX,^api-\d+\.foo$ # 正则
- IP-CIDR,2001:db8::/32 # IPv6 段
- GEOSITE,google # xray 内置 geosite 数据集
- GEOIP,us # xray 内置 geoip 数据集
wg:
- DOMAIN-SUFFIX,internal.corp
- IP-CIDR,10.8.0.0/24
upstream:
- DOMAIN-SUFFIX,blocked.example
- GEOSITE,netflix
修改规则后重启容器即可生效:docker restart router-socks5。
interface 用 Linux 的 SO_BINDTODEVICE 强制 socket 走指定网卡。要点:
--network host,可以直接看到宿主机的所有 interface。先用 ip link 确认名字(如 eth0、wlan0、wg0、enp3s0)。SO_BINDTODEVICE 需要 CAP_NET_ADMIN(或 CAP_NET_RAW)。Docker 容器默认以 root 启动并带这两个 cap,所以默认跑得通。如果你用 --user 切了非 root,或者跑 rootless,需要显式 --cap-add NET_ADMIN。type: socks 的 outbound 会把命中流量原样转发到指定的上游 SOCKS5 代理。
outbounds:
upstream:
type: socks
server: 1.2.3.4 # 域名或 IP
port: 1080
user: alice # 可选,省略则不带鉴权
pass: secret
# interface: eth0 # 可选;绑定本端 → 上游 的连接走指定网卡
# 不影响上游再往外发出的连接
rules:
upstream:
- DOMAIN-SUFFIX,blocked.example
- GEOSITE,netflix
要点:
routing.domainStrategy 或在路由层设置——目前 entrypoint 默认是 IPIfNonMatch,对 DOMAIN-* 规则不会预解析interface 可以做多跳的源地址绑定┌─────────────────────────────────────────────────────┐
│ Host network (--network host) │
│ │
│ xray inbound: SOCKS5 (auth, port 1080) │
│ │ │
│ ▼ │
│ routing engine │
│ ├─ 命中 ipv6_rules → outbound "direct-v6" │
│ │ (freedom, domainStrategy=UseIPv6) │
│ │ │
│ └─ 默认 → outbound "direct" │
│ (freedom, domainStrategy=UseIPv4) │
│ │
│ 两个 outbound 都是 freedom 直出,复用宿主机路由表 │
└─────────────────────────────────────────────────────┘
Content type
Image
Digest
sha256:59b0012fd…
Size
40.3 MB
Last updated
6 months ago
docker pull charmingcheung000/router-socks5