main
🚀 4to6 - 高性能自适应双栈网络中转网桥 (Any-to-Any Network Bridge)
4to6 是一个使用 Go 语言(Go 1.20+) 开发的、高性能、零外部依赖、自适应双栈 的网络端口转发代理工具。
虽然命名为 4to6,但由于项目底层采用自适应网络协议栈解析,它已经进化为了一个通用的 Any-to-Any 双栈网桥。它能够完美运行在单栈/双栈服务器或树莓派(Raspberry Pi)上,支持将 TCP 和 UDP 流量在 IPv4 与 IPv6 之间进行随心所欲的高并发、高性能双向中转。
✨ 核心技术亮点
- ⚡ 高性能零拷贝 (Zero-Copy Splice):
TCP 转发采用并发双向 Copy 机制,底层完美接轨 Go 标准库与 Linux 内核的
splice系统调用。数据直接在内核态 socket 缓冲区间流转,避免了用户态内存拷贝,极大地降低了大流量中转时的 CPU 与内存消耗。 - 🌀 有状态全双工 UDP 异步引擎:
UDP 采用工作协程(Worker Pool)与“专属后台接收协程”相结合的全双工异步设计。每个客户端拥有一个独立接收协程,工作协程只进行非阻塞的单向
Write,彻底消灭了高并发下数据/协议响应乱序、相互抢占以及超时导致的雪崩式延迟 Bug。 - 🔒 操作系统自愈与安全熔断保护:
- FD 物理极限提升:程序在启动第一秒自动调升进程的文件描述符上限(RLIMIT_NOFILE)至系统的 硬限制上限 (如 1,048,576),彻底打破传统转发软件的连接瓶颈。
- 应用层安全熔断:内置
MaxUdpClients = 10000并发连接熔断器。当遭遇外网恶意高频扫描或 DDoS 攻击时,自动熔断、静默丢包,绝对不会耗尽系统套接字句柄,确保整机运行安全。
- 📊 轻量级(会话级)高吞吐可观测性:
- 前台运行:实时、精准打印会话轨迹(如
UDP 建立会话、释放 UDP 会话等)。每会话生命周期仅产生两行日志,比起逐个数据包打印,降低了 95% 以上的 IO 阻塞开销,网络性能不打折。 - 后台守护:使用守护进程(
-d)运行时,所有前台输出将无感重定向、追加保存到当前工作目录下的4to6.log。
- 前台运行:实时、精准打印会话轨迹(如
- 🤖 会话隔离守护模式 (Setsid):
-d守护进程模式深度集成了syscall.Setsid独立会话控制,子进程完全脱离原控制终端 TTY 的生命周期。即使终端断开、SSH 客户端关闭,后台代理也绝对不会因为SIGHUP信号而离线挂掉。 - 🧱 静态链接,零依赖: 未引入任何外部第三方包,纯标准库打造。编译脚本集成了 CGO 禁用、全静态编译以及 upx 高强度体积压缩,生成的可执行文件仅几百 KB,开箱即用,极致兼容 Alpine 等微型容器及树莓派等嵌入式设备。
🌐 支持的 4 大网络拓扑场景
由于底层的原生级自适应设计,本工具支持在双栈服务器上进行任意跨协议栈中转:
┌──────────────────────────────┐
│ 4to6 (A):IPv4 监听 ──> IPv6 │
├──────────────────────────────┤
IPv4/IPv6 Client ──>│ 4to4 (B):IPv4 监听 ──> IPv4 │ ──> Target Host
├──────────────────────────────┤
│ 6to6 (C):IPv6 监听 ──> IPv6 │
├──────────────────────────────┤
│ 6to4 (D):IPv6 监听 ──> IPv4 │
└──────────────────────────────┘
- IPv4 监听
\rightarrowIPv6 目标 (4to6):适用于仅 IPv4 的设备通过代理访问远端 IPv6 资源。 - IPv4 监听
\rightarrowIPv4 目标 (4to4):传统的 IPv4 端口中转。 - IPv6 监听
\rightarrowIPv6 目标 (6to6):IPv6 节点之间的流量转发。 - IPv6 监听
\rightarrowIPv4 目标 (6to4):纯 IPv6 局域网/移动网设备,通过代理访问公网 IPv4 后端服务。
🛠️ 编译与安装
本工具需要 Go 1.20+ 环境,执行以下命令进行一键静态编译并压缩:
git clone https://git.aixiao.me/aixiao/4to6.git
cd 4to6
bash build.sh
编译完成后,会在项目根目录生成两个跨平台的静态压缩包:
4to6-linux-amd64:适用于常规 Linux AMD64 服务器。4to6-linux-arm64:适用于树莓派 4B 等 ARM64 设备。
📝 配置文件规范 (4to6.conf)
手写自适应配置解析器支持非常简单、直观的 DSL 映射关系。支持使用 // 或 # 进行行首或行尾注释:
global {
// TCP 转发规则 (本地监听地址 -> 目标服务器地址)
LT = 0.0.0.0:2222 -> v6.aixiao.me:22 // 将本地所有 IPv4 网卡的 2222 端口,转发到目标主机的 SSH
LT = [::]:8080 -> 192.168.1.50:80 // 同时接受客户端 IPv4/IPv6 连接,转发至后端内网 IPv4 网页
// UDP 转发规则 (本地监听地址 -> 目标服务器地址)
LU = 0.0.0.0:853 -> [2408:8221:9915::ebc5]:53 // 将本地 853 端口中转至远端公网 IPv6 DNS 服务器
}
🚀 生产环境部署:白金级实践 (Best Practices)
在实际生产环境中,强烈建议不要使用 -d 命令行参数。相反,推荐将程序保持前台运行(可完美打印会话轨迹),并全权委托给操作系统的 Systemd 进行进程管理和磁盘防爆隔离。
1. 编写 Systemd 服务配置文件
在您的服务器 /etc/systemd/system/4to6.service 写入以下规范配置:
[Unit]
Description=High Performance Any-to-Any Network Bridge
After=network.target
[Service]
Type=simple
# 指向您解压后的可执行程序和配置文件路径
ExecStart=/usr/local/bin/4to6-linux-amd64 -c /etc/4to6/4to6.conf
# 💥 崩溃自愈:进程若由于遭遇系统 OOM 或断电挂掉,3秒后自动复活,实现 7x24 小时高可用常驻
Restart=always
RestartSec=3s
# 操作系统级别 FD 限制调优 (在极高并发时双重保险)
LimitNOFILE=65535
# 操作系统级安全沙箱隔离限制 (推荐)
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target
2. 启用系统级的日志自循环 (彻底解决磁盘占满风险)
Systemd 托管程序后,程序的前台标准输出日志会被系统组件 journald 统一捕获。我们可以对日志的最大存储体积进行系统层面的物理约束,永远不撑爆磁盘:
在 /etc/systemd/journald.conf 中追加/修改:
SystemMaxUse=500M # 💥 整个系统的 journal 日志总占用绝不超过 500MB,溢出后自动覆盖旧日志!
执行 sudo systemctl restart systemd-journald 即可。
3. 日志查阅与维护
# 启动 4to6 代理服务
sudo systemctl start 4to6
# 设置开机自动启动
sudo systemctl enable 4to6
# 实时追踪并查看最新的 100 行会话转发日志
journalctl -u 4to6.service -f -n 100
⚖️ 开源协议
本项目采用 MIT License 授权。 如有更多特定性能调优或协议桥接需要,欢迎发起 PR 共同完善该项目!
Languages
Go
98.5%
Shell
1.5%