在嵌入式开发和网络运维中,我们经常需要将流量从一台公网服务器(如新加坡 NAT VPS)转发到不同的落地节点(如家宽或高性能落地机)。虽然可视化面板(如 3x-ui)很方便,但命令行配置更轻量、更适合自动化部署,且能实现更复杂的路由逻辑。
本文将介绍两种主流的命令行中转方案。
方案一:使用 Gost 实现快速端口转发(轻量级)
Gost (Go Simple Tunnel) 是目前 Linux 上最简单、功能最全的转发工具。它不需要复杂的配置文件,一行命令即可搞定。
1. 安装 Gost
你可以直接下载编译好的二进制文件:
Bash
wget https://github.com/go-gost/gost/releases/download/v2.11.5/gost-linux-amd64.gz
gunzip gost-linux-amd64.gz
mv gost-linux-amd64 /usr/local/bin/gost
chmod +x /usr/local/bin/gost
2. 场景:将 NAT 端口 A 转发到 落地 A,端口 B 转发到 落地 B
假设你的 NAT 服务器公网端口为 10001 和 10002,落地节点为 Home_A:1234 和 Home_B:5678。
启动转发:
Bash
# 转发到落地 A
gost -L tcp://:10001/Home_A_IP:1234 -L udp://:10001/Home_A_IP:1234 &
# 转发到落地 B
gost -L tcp://:10002/Home_B_IP:5678 -L udp://:10002/Home_B_IP:5678 &
注:-L 参数支持同时转发 TCP 和 UDP,满足游戏和实时通讯需求。
方案二:基于 Xray 核心实现精细化分流(进阶型)
如果你需要更强大的功能,比如在手机端通过不同的节点名选择不同的落地,但希望在中转服务器上统一管理,那么手动配置 Xray 的 config.json 是最佳选择。
1. 核心逻辑
通过为每个入站端口(Inbound)打上标签(Tag),并利用路由规则(Routing)将其定向到特定的出站(Outbound)。
2. 配置文件示例 (/usr/local/etc/xray/config.json)
JSON
{
"inbounds": [
{
"port": 10001,
"protocol": "vless",
"tag": "in-A",
"settings": {
"clients": [{ "id": "你的UUID" }],
"decryption": "none"
}
},
{
"port": 10002,
"protocol": "vless",
"tag": "in-B",
"settings": {
"clients": [{ "id": "你的UUID" }],
"decryption": "none"
}
}
],
"outbounds": [
{
"tag": "out-A",
"protocol": "socks",
"settings": {
"servers": [{ "address": "家宽A_IP", "port": 12345 }]
}
},
{
"tag": "out-B",
"protocol": "socks",
"settings": {
"servers": [{ "address": "家宽B_IP", "port": 12346 }]
}
}
],
"routing": {
"rules": [
{
"type": "field",
"inboundTag": ["in-A"],
"outboundTag": "out-A"
},
{
"type": "field",
"inboundTag": ["in-B"],
"outboundTag": "out-B"
}
]
}
}
3. 运行与维护
手动配置建议配合 systemd 进行管理:
Bash
# 启动 Xray
systemctl start xray
# 查看日志
journalctl -u xray -f
性能优化建议
对于中转 10 人左右的规模,以下命令行操作能显著提升体验:
开启 BBR 加速:
Bash
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf sysctl -p调整文件句柄限制:
在
/etc/security/limits.conf中添加:Plaintext
* soft nofile 65535 * hard nofile 65535DDNS 自动化:
如果落地家宽 IP 变动,可以编写简单的 Shell 脚本,利用 Cloudflare API 动态更新
config.json中的address字段并重启服务。
总结
命令行配置虽然有一定的门槛,但它提供了确定性。在 NAT 服务器端口有限的情况下,通过 Tag 和 Routing 的配合,你可以精准控制每一份流量的去向。
对于嵌入式开发者来说,这种“干净”的配置方式比臃肿的面板更易于版本管理和故障排查。