Novachain:一个纯 Rust 实现的代理链工具
一个纯 Rust 实现的代理链工具,支持通过 SOCKS4、SOCKS5、HTTP 代理转发 TCP 连接。
https://git.jetsung.com/jetsung/novachain
特性
- 纯 Rust 实现:零
unsafe 代码,无 C 依赖
- 多种代理协议:支持 SOCKS4、SOCKS5、HTTP CONNECT
- 灵活的链式模式:
strict_chain:按顺序使用所有代理
dynamic_chain:跳过失效代理
random_chain:随机选择代理
round_robin:轮询模式
- 远程 DNS 解析:防止 DNS 泄漏
- DNAT 规则:支持地址转换
- 本地网段绕过:自动识别并直连本地地址
安装
从 crates.io 安装
cargo install novachain
从源码编译
git clone https://github.com/jetsung/novachain.git
cd novachain
cargo build --release
# 二进制文件位于 target/release/novachain
快速开始
1. 创建配置文件
你可以使用 -i 或 --init 参数快速生成一个默认配置文件:
# 在当前目录下生成 novachain.conf
novachain --init
# 在指定位置生成配置文件
novachain --init -f ~/.novachain.conf
Novachain 也会在以下位置查找配置文件(按优先级顺序):
NOVACHAIN_CONF_FILE 环境变量
export NOVACHAIN_CONF_FILE=/path/to/custom.conf
./novachain.conf (当前工作目录)
~/.config/novachain/config.conf (XDG Base Directory - 推荐)
mkdir -p ~/.config/novachain
~/.novachain.conf (主目录简洁配置 - 推荐)
# 直接在家目录下创建配置文件
~/.novachain/config.conf (传统位置)
/etc/novachain.conf (系统全局配置)
创建配置文件 ~/.novachain.conf:
# 选择链式模式(三选一)
strict_chain
# dynamic_chain
# random_chain
# 启用远程 DNS 解析(防止 DNS 泄漏)
proxy_dns
# 超时设置(毫秒)
tcp_read_time_out 5000
tcp_connect_time_out 10000
# 远程 DNS 子网(用于内部 DNS 解析)
remote_dns_subnet 224
# 定义代理服务器
[ProxyList]
socks5 192.168.1.100 1080
socks5 192.168.1.101 1080 user password
http 192.168.1.102 8080
2. 运行命令
# 基本用法
novachain curl https://example.com
# 初始化配置文件
novachain --init
# 或指定路径初始化
novachain -i -f my-config.conf
# 指定配置文件运行
novachain -f /path/to/config.conf curl https://example.com
# 安静模式(禁用日志输出)
novachain -q wget https://example.com
# 运行任意程序
novachain ssh user@remote-host
novachain git clone https://github.com/user/repo.git
配置详解
链式模式
strict_chain(严格模式)
按配置顺序依次连接所有代理,任一失败则整体失败。
strict_chain
proxy_dns
remote_dns_subnet 224
tcp_read_time_out 5000
tcp_connect_time_out 10000
[ProxyList]
socks5 10.0.0.1 1080
socks5 10.0.0.2 1080
socks5 10.0.0.3 1080
连接路径:客户端 → 10.0.0.1 → 10.0.0.2 → 10.0.0.3 → 目标
dynamic_chain(动态模式)
自动跳过失效的代理,适合不稳定的网络环境。
dynamic_chain
proxy_dns
remote_dns_subnet 224
tcp_read_time_out 5000
tcp_connect_time_out 10000
[ProxyList]
socks5 10.0.0.1 1080
socks5 10.0.0.2 1080
socks5 10.0.0.3 1080
如果 10.0.0.2 不可用,会自动跳过:客户端 → 10.0.0.1 → 10.0.0.3 → 目标
random_chain(随机模式)
随机选择指定数量的代理组成链条。
random_chain
proxy_dns
chain_len 2
remote_dns_subnet 224
tcp_read_time_out 5000
tcp_connect_time_out 10000
[ProxyList]
socks5 10.0.0.1 1080
socks5 10.0.0.2 1080
socks5 10.0.0.3 1080
socks5 10.0.0.4 1080
每次连接随机选择 2 个代理。
round_robin(轮询模式)
轮流使用代理,适合负载均衡场景。
round_robin
proxy_dns
chain_len 1
remote_dns_subnet 224
tcp_read_time_out 5000
tcp_connect_time_out 10000
[ProxyList]
socks5 10.0.0.1 1080
socks5 10.0.0.2 1080
socks5 10.0.0.3 1080
第一次连接用 10.0.0.1,第二次用 10.0.0.2,依此类推。
代理类型语法
[ProxyList]
# 格式:<类型> <IP/域名> <端口> [用户名] [密码]
# SOCKS5(无需认证)
socks5 192.168.1.100 1080
# SOCKS5(带认证)
socks5 192.168.1.100 1080 myuser mypass
# HTTP CONNECT 代理
http 192.168.1.100 8080
# SOCKS4
socks4 192.168.1.100 1080
远程 DNS 解析
启用 proxy_dns 后,DNS 请求会通过代理链发送,防止本地 DNS 泄漏:
proxy_dns
remote_dns_subnet 224
工作原理:
- 拦截 DNS 查询(如
example.com)
- 分配一个内部 IP(如
224.x.x.x)
- 通过代理链连接到目标服务器时,在代理端解析域名
DNAT 规则(地址转换)
将发往特定地址的连接重定向到其他地址:
[dnat_rules]
# 格式:<原 IP>:<原端口> -> <新 IP>:<新端口>
1.2.3.4:80 -> 5.6.7.8:443
192.168.1.1 -> 10.0.0.1
本地网段绕过
自动识别本地地址并直连,不经过代理链:
[localnet_rules]
# 格式:<地址> <掩码> [端口]
192.168.1.0 255.255.255.0
10.0.0.0 255.0.0.0
127.0.0.0 255.0.0.0
环境变量
程序运行时会自动设置以下环境变量供子进程使用:
http_proxy / HTTP_PROXY
https_proxy / HTTPS_PROXY
ALL_PROXY
NOVACHAIN_CONF_FILE:配置文件路径
NOVACHAIN_QUIET_MODE:安静模式标志
支持代理的应用(如 curl、wget、git)会自动使用这些变量。
与其他工具的配合
Git
novachain git clone https://github.com/user/private-repo.git
novachain git fetch origin
novachain git push
SSH
novachain ssh user@remote-host
novachain ssh -i ~/.ssh/id_ed25519 user@remote-host
Docker
novachain docker pull ubuntu:latest
novachain docker run --rm alpine curl https://example.com
Cargo
novachain cargo build
novachain cargo publish
调试
查看详细日志
移除 -q 参数即可看到详细日志:
novachain curl https://example.com
输出示例:
[novachain] novachain 0.1.0
[novachain] config file: /home/user/.novachain/config.conf
[novachain] chain type: strict_chain
[novachain] proxies: 3
[novachain] executing: curl https://example.com
[novachain] |-<=10.0.0.1)-<=1080)
[novachain] |--chain-loop-<=10.0.0.2)-<=1080)
[novachain] |--chain-loop-<=10.0.0.3)-<=1080)
[novachain] |<--OK-<=example.com:443)
测试代理连通性
# 测试是否能通过代理访问
novachain curl -I https://www.google.com
# 检查 IP 地址
novachain curl https://api.ipify.org?format=json
作为库使用
本项目也可作为 Rust 库集成到其他项目中:
# Cargo.toml
[dependencies]
novachain = "0.1"
use novachain::config::ConfigParser;
use novachain::connection::ConnectionManager;
use novachain::dns::DnsResolver;
use std::net::{IpAddr, Ipv4Addr};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 加载配置
let config = ConfigParser::parse_file("~/.novachain/config.conf")?;
// 创建 DNS 解析器
let resolver = DnsResolver::new(config.dns_resolver.clone(), config.remote_dns_subnet);
// 创建连接管理器
let manager = ConnectionManager::new(config, resolver);
// 通过代理链连接
let stream = manager.connect(
IpAddr::V4(Ipv4Addr::new(8, 8, 8, 8)),
443,
)?;
// 使用建立的连接...
Ok(())
}
与 proxychains-ng 的区别
| 特性 | Novachain (Rust) | proxychains-ng (C) |
| 实现语言 | Rust | C |
| 内存安全 | 是(零 unsafe) | 否 |
| 拦截方式 | 环境变量 | LD_PRELOAD |
| 跨平台 | 是 | Linux/macOS |
| 依赖 | 极少 | glibc, dlfcn |
| 透明拦截 | 部分¹ | 是 |
| 许可证 | Apache-2.0 | GPL-2.0 |
¹ Novachain 通过设置 http_proxy 等环境变量工作,需要应用支持这些变量。对于不支持的应用,可考虑使用 tun2socks 或 redsocks 等透明代理方案。
项目来源与独立性声明
Novachain 是受 proxychains-ng 启发而独立开发的纯 Rust 实现。
重要说明:
- 未使用任何原项目源代码:所有代码均为原创重写
- 架构完全不同:Novachain 使用环境变量方式,而非 LD_PRELOAD hook
- 技术栈独立:100% Rust 实现,零 unsafe 代码,无 C 依赖
- 许可证不同:Novachain 采用 Apache-2.0(宽松许可),原项目为 GPL-2.0
Novachain 的目标是提供一个更安全、更易维护、跨平台的替代方案,同时保持配置格式的兼容性,方便用户迁移。
常见问题
Q: 为什么某些程序无法通过代理?
A: Novachain 通过设置标准代理环境变量工作。如果程序不支持 http_proxy/ALL_PROXY 等变量,可能无法正常工作。解决方案:
- 检查程序文档是否支持代理环境变量
- 使用
tun2socks 或 redsocks 等透明代理方案
- 在程序内部配置代理
Q: 如何验证 DNS 没有泄漏?
A: 使用以下命令测试:
novachain curl https://dnsleaktest.com
或在配置中启用 proxy_dns,观察日志中的 DNS 解析行为。
Q: 链式模式如何选择?
A:
- strict_chain:所有代理都可靠时使用
- dynamic_chain:网络不稳定,需要自动跳过失效节点
- random_chain:需要匿名性,不想固定路径
- round_robin:多个代理性能相近,需要负载均衡