Sign inSign up

charmingcheung000/router-socks5

By charmingcheung000

•Updated 6 months ago

Image
1

548

charmingcheung000/router-socks5 repository overview

⁠router-socks5

带账号密码鉴权的 SOCKS5 代理 Docker 镜像,支持像 Clash 一样配置分流规则——可以把命中规则的域名/IP 流量强制走宿主机的 IPv6 出口、绑定到宿主机指定的网卡(如 wg0、第二张物理网卡等),或者转发到上游 SOCKS5 代理(proxy chain);其余流量走默认(IPv4)出口。

底层用 Xray-core⁠ 做 SOCKS5 入站和路由分流。

⁠快速开始

⁠docker cli
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
⁠docker compose
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_PORT1080监听端口(host 网络下直接占用宿主机端口)
SOCKS_LISTEN0.0.0.0监听地址
RULES_FILE/etc/xray-router/rules.yaml规则文件路径(容器内)
XRAY_LOG_LEVELwarningdebug/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)

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。
  • 路由表:绑定网卡只是限定出向网卡,目标网段需通过该网卡可达。如果该网卡上没有目标 IP 的路由,连接会失败。
⁠转发到上游 SOCKS5(chain)

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

要点:

  • 上游 SOCKS5 必须自己能处理目标——如果它不通某个网站,规则匹配后还是连不上
  • 域名解析:默认透传(xray 把域名直接发给上游,由上游解析)。如果你想本端先解析再发 IP,给这个 outbound 加一条规则到 routing.domainStrategy 或在路由层设置——目前 entrypoint 默认是 IPIfNonMatch,对 DOMAIN-* 规则不会预解析
  • 链式:上游同样可以是另一个 router-socks5 实例,配合 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 直出,复用宿主机路由表      │
└─────────────────────────────────────────────────────┘

Tag summary

Content type

Image

Digest

sha256:59b0012fd…

Size

40.3 MB

Last updated

6 months ago

docker pull charmingcheung000/router-socks5