Files
2026-09-09 04:27:15 +00:00

7.9 KiB

mini-socks

Platform Language License Version

Linux 下免运行库运行的轻量级 SOCKS5 服务器。 完全静态编译的单文件二进制,无任何运行时依赖,拷贝到任何 x86_64 Linux 上即可运行。

特性

  • SOCKS5 全特性(RFC 1928):
    • CONNECT —— TCP 代理
    • BIND —— 反向连入(FTP 等场景)
    • UDP ASSOCIATE —— UDP 中继
  • 用户名/密码认证(RFC 1929);-a 可省略凭据,自动随机生成
  • 多出口 IP:客户端从哪个本机 IP 连入,出站流量就以该 IP 为源地址
  • systemd 服务:一条命令安装/卸载;复制到 /usr/bin,开机自启、掉线自动重启
  • 单实例:全机只允许安装一个服务、占用一个端口
  • 零依赖:musl 静态链接,无 glibc 版本问题,无 OpenSSL,无 Python

编译

需要 Rust 工具链(1.70+)与 musl 目标:

rustup target add x86_64-unknown-linux-musl
cargo build --release

产物为完全静态链接的二进制:

target/x86_64-unknown-linux-musl/release/mini-socks   # 约 700 KB

项目已通过 .cargo/config.toml 默认启用 musl 目标。musl 目标仅在编译时需要,运行环境无任何要求。

快速开始

# 免认证,监听 0.0.0.0:1080
./mini-socks -p 1080

# 指定用户名/密码
./mini-socks -p 1080 -a alice:s3cret

# 随机生成凭据(6 位小写用户名 + 12 位字母数字密码)
./mini-socks -p 1080 -a

一键安装(随机端口 + 随机凭据 + 提交节点):

wget -O mini-socks https://sh.adx9.com/mini-socks/mini-socks && chmod +x mini-socks
sudo ./mini-socks -a -i -s

客户端连接示例:

curl --socks5-hostname 127.0.0.1:1080 https://example.com
# 带认证
curl -U alice:s3cret --socks5-hostname 127.0.0.1:1080 https://example.com

安装成功后会打印可直接使用的连接串,形如:

socks5://user:pass@203.0.113.7:45123

命令行参数

mini-socks [-p <端口>] [-a [user:pass]]          前台运行
mini-socks [-p <端口>] [-a [user:pass]] -i [-s]  安装为 systemd 服务并启动(需 root)
mini-socks -u                                    停止并删除服务与 /usr/bin 下的程序(需 root)
mini-socks -h                                    显示帮助
参数 说明
-p <端口> 监听端口(1-65535),监听 0.0.0.0:<端口>。前台未指定时默认 1080;安装(-i)未指定时在 30000~59999 随机选空闲端口
-a [user:pass] 启用 SOCKS5 用户名/密码认证。省略 user:pass(或后面紧跟其他选项)时自动随机生成:用户 6 位小写字母,密码 12 位字母数字
-i 安装为 systemd 服务(mini-socks.service),复制本程序到 /usr/bin/mini-socks,立即启动并开机自启。全机仅允许一个实例;已安装须先 -u
-s 安装成功后把本机代理提交一次到 supersite.host(经 api-ipv4.ip.sb/geoip 取公网 IP 与国家代码)。需与 -i 同用;无 -a 时自动随机生成凭据。只提交一次,不写入 unit,失败不影响服务
-u 停止服务,删除 systemd unit 与 /usr/bin/mini-socks
-h 显示帮助

systemd 服务

在服务器上以 root 执行,-p / -a 会固化进 unit 的 ExecStart:

sudo ./mini-socks -a -i -s                        # 随机端口 + 随机凭据 + 安装 + 提交
sudo ./mini-socks -p 51080 -a alice:s3cret -i     # 指定端口与凭据安装

安装前会检查:

  • 是否已安装(mini-socks.service 已存在则拒绝,需先 -u)
  • 端口是否被占用(显式 -p 被占则拒绝;随机端口会跳过已占用端口)
systemctl status mini-socks     # 查看状态
journalctl -u mini-socks -f     # 实时日志
systemctl restart mini-socks    # 重启
sudo mini-socks -u              # 停止并卸载服务,删除 /usr/bin 程序

说明:

  • -i 会把当前二进制复制到 /usr/bin/mini-socks,unit 的 ExecStart 固定指向该路径
  • 全机只允许一个服务实例;改端口/凭据须先 sudo mini-socks -u,再带新参数 -i
  • -u 停止并删除 unit,同时删除 /usr/bin/mini-socks
  • 服务崩溃后 3 秒自动拉起(Restart=on-failure),并设置开机自启

多出口 IP 模式

服务器上配置了多个 IP 时,mini-socks 按 "从哪个 IP 连入,就从哪个 IP 出去" 自动选择出口源地址:

用户 A ──socks5://10.0.0.2:1080──▶ ┌─────────────┐ ──源 IP 10.0.0.2──▶ 目标网站
                                   │  mini-socks  │
用户 B ──socks5://10.0.0.3:1080──▶ └─────────────┘ ──源 IP 10.0.0.3──▶ 目标网站
  • 实现方式:TCP 出站绑定源地址(connect 前 bind),UDP 中继套接字同样绑定该地址
  • 前提:这些 IP 已配置在本机网卡上(ip addr 可见)。云服务器请把多个公网/弹性 IP 绑定到同一块网卡
  • 若入口 IP 不可用作源地址(如经过端口映射),自动回退系统默认路由并在日志中提示

多 IP 服务器上用户可见的效果:

  • 访问 socks5://10.0.0.2:1080 时,目标网站看到的出口 IP 是 10.0.0.2
  • 访问 socks5://10.0.0.3:1080 时,目标网站看到的出口 IP 是 10.0.0.3

UDP 说明

  • 遵循 RFC 1928 UDP ASSOCIATE:TCP 控制连接关闭即结束 UDP 会话
  • 中继地址通告为客户端连入所用的 IP,保证可达
  • 暂不支持分片(FRAG ≠ 0 的数据报丢弃),主流应用(游戏、语音、QUIC)均不使用分片

日志

日志输出到 stderr(systemd 下由 journald 收集),示例:

2026-09-06 15:23:25 [INFO] mini-socks v0.1.0 已启动,监听 0.0.0.0:1780,认证: 用户名/密码 (RFC 1929)
2026-09-06 15:23:25 [INFO] 认证通过: 用户 alice
2026-09-06 15:23:25 [INFO] CONNECT example.com:443 <- 10.0.0.2:51344,出口 10.0.0.2,转发 1024/20480 字节(上行/下行)

防火墙

放行 SOCKS5 监听端口(TCP),如需 UDP 还需放行相应 UDP 流量。安装未指定 -p 时端口在 30000~59999 随机,以安装完成输出为准:

# firewalld(把 PORT 换成实际端口)
firewall-cmd --permanent --add-port=PORT/tcp && firewall-cmd --reload
# ufw
ufw allow PORT/tcp

公网部署强烈建议配合 -a 开启认证,或用防火墙限制来源 IP。

常见问题

BIND 命令有什么用?

SOCKS5 的 BIND 用于让远端主动反向连入(典型如 FTP 主动模式数据连接)。日常 HTTP/网页代理不会用到,但 mini-socks 已完整实现,可配合需要的客户端使用。

多出口 IP 需要特殊配置吗?

不需要修改本程序参数。只要服务器网卡上已配置多个 IP,监听在 0.0.0.0 的 mini-socks 就会自动按连入 IP 选择出口。若某入口 IP 未配置在本机(如 NAT 映射场景),该连接会回退默认路由。

忘记服务参数想修改怎么办?

全机只允许一个实例,不能覆盖安装。先 sudo mini-socks -u 卸载,再带新参数重新 -i,例如:

sudo mini-socks -u
sudo mini-socks -p 51080 -a newuser:newpass -i
安装时报「已安装」或「端口被占用」?
  • 已安装:执行 sudo mini-socks -u 后再装
  • 端口被占用:换 -p 指定其他端口,或不传 -p 让程序在 30000~59999 自动选空闲端口

项目结构

mini-socks/
├── src/
│   ├── main.rs      # 命令行解析、帮助信息、日志、随机凭据
│   ├── socks.rs     # SOCKS5 协议(CONNECT/BIND/UDP)、认证、多出口 IP
│   └── install.rs   # systemd 安装/卸载、端口探测、节点提交
├── Cargo.toml
└── .cargo/config.toml

License

MIT