# mini-socks ![Platform](https://img.shields.io/badge/platform-Linux-blue) ![Language](https://img.shields.io/badge/language-Rust-orange) ![License](https://img.shields.io/badge/license-MIT-green) ![Version](https://img.shields.io/badge/version-0.1.0-brightgreen) **Linux 下免运行库运行的轻量级 SOCKS5 服务器。** 完全静态编译的单文件二进制,无任何运行时依赖,拷贝到任何 x86_64 Linux 上即可运行。 ## 特性 - **SOCKS5 全特性**(RFC 1928): - `CONNECT` —— TCP 代理 - `BIND` —— 反向连入(FTP 等场景) - `UDP ASSOCIATE` —— UDP 中继 - **用户名/密码认证**(RFC 1929),未配置时免认证 - **多出口 IP**:客户端从哪个本机 IP 连入,出站流量就以该 IP 为源地址 - **systemd 服务**:一条命令安装/卸载,开机自启、掉线自动重启 - **零依赖**:musl 静态链接,无 glibc 版本问题,无 OpenSSL,无 Python ## 编译 需要 Rust 工具链(1.70+)与 musl 目标: ```bash 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 目标仅在编译时需要,运行环境无任何要求。 ## 快速开始 ```bash # 免认证,监听 0.0.0.0:1080 ./mini-socks -p 1080 # 启用用户名/密码认证 ./mini-socks -p 1080 -a alice:s3cret ``` 客户端连接示例: ```bash 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`,地址 `<服务器 IP>`,端口 `1080`,账号密码可选。 ## 命令行参数 ``` mini-socks [-p <端口>] [-a ] 前台运行 mini-socks [-p <端口>] [-a ] -i 安装为 systemd 服务并启动(需 root) mini-socks -u 停止并删除 systemd 服务(需 root) mini-socks -h 显示版本、监听地址与帮助 ``` | 参数 | 说明 | | ---- | ---- | | `-p <端口>` | 监听端口(1-65535),默认 `1080`,监听 `0.0.0.0:<端口>` | | `-a ` | 启用 SOCKS5 用户名/密码认证;缺省为免认证 | | `-i` | 安装为 systemd 服务(`mini-socks.service`),立即启动并开机自启 | | `-u` | 停止服务并删除 systemd 服务 | | `-h` | 显示版本、监听地址与帮助 | ## systemd 服务 在服务器上以 root 执行,`-p` / `-a` 参数会被固化进服务: ```bash sudo ./mini-socks -p 1080 -a alice:s3cret -i # 安装并立即启动 ``` ```bash systemctl status mini-socks # 查看状态 journalctl -u mini-socks -f # 实时日志 systemctl restart mini-socks # 重启 sudo ./mini-socks -u # 停止并卸载服务 ``` 说明: - `-i` 直接以当前二进制的绝对路径作为 `ExecStart`,**不复制文件**;移动或删除二进制前请先 `-u` 卸载 - 重复执行 `-i` 为覆盖安装,以最后一次的参数为准并自动重启服务(例如改端口后重新 `-i` 即可生效) - `-u` 只停止并删除服务,不删除二进制文件 - 服务崩溃后 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 流量: ```bash # firewalld firewall-cmd --permanent --add-port=1080/tcp && firewall-cmd --reload # ufw ufw allow 1080/tcp ``` > 公网部署强烈建议配合 `-a` 开启认证,或用防火墙限制来源 IP。 ## 常见问题
BIND 命令有什么用? SOCKS5 的 `BIND` 用于让远端主动反向连入(典型如 FTP 主动模式数据连接)。日常 HTTP/网页代理不会用到,但 mini-socks 已完整实现,可配合需要的客户端使用。
多出口 IP 需要特殊配置吗? 不需要修改本程序参数。只要服务器网卡上已配置多个 IP,监听在 `0.0.0.0` 的 mini-socks 就会自动按连入 IP 选择出口。若某入口 IP 未配置在本机(如 NAT 映射场景),该连接会回退默认路由。
忘记服务参数想修改怎么办? 带新参数重新执行 `sudo ./mini-socks -p <端口> -a -i` 覆盖安装即可,服务会自动重启到新配置。
## 项目结构 ``` mini-socks/ ├── src/ │ ├── main.rs # 命令行解析、帮助信息、日志 │ ├── socks.rs # SOCKS5 协议(CONNECT/BIND/UDP)、认证、多出口 IP │ └── install.rs # systemd 服务安装/卸载 ├── Cargo.toml └── .cargo/config.toml ``` ## License [MIT](LICENSE)