Debian 轻量级策略路由管理器:按端口配置回程路由,自动检测,开机自启,一键回滚。
在旁路由(如 OpenWrt)和主路由共存的局域网中,如果主路由做了端口转发(DNAT)指向内网某台 Debian 主机,由于主机默认网关指向旁路由,回程流量会因路径不对称被主路由丢弃。
netroute.sh 通过 fwmark + CONNMARK + 独立路由表(table 100)的组合,把指定端口的回程流量强制引导到主路由,同时完全不影响其他流量的正常出站。
- 🔒 零侵入:不修改 DNS、不碰网络配置文件、不接管默认网关
- 🚀 零断网风险:只标记指定端口,SSH、DNS、普通上网完全不受影响
- 🔧 交互式菜单:无需记忆命令,跟着菜单一步步配置
- 🎯 端口管理:支持添加、删除、重置端口列表,自动排序去重
- 🛡️ 输入校验:IP 格式和端口范围严格校验,避免误配
- 🔄 开机自启:自动写入 systemd 服务,重启后规则自动恢复
- 🧹 一键回滚:清理所有规则,网络瞬间恢复默认状态
- 🌐 自动检测:自动识别网卡、本机 IP、默认网关,回程网关可从
table 100中检测
┌─────────┐
│ 外网 │
└────┬────┘
│ 端口映射
▼
┌─────────────────────────────────────┐
│ 主路由 (如 192.168.1.1) │
└──────┬───────────────────────▲──────┘
│ │
│ DNAT │ 回程
│ 特定端口 │ (table 100)
▼ │
┌──────────────┐ │
│ Debian │───────────────┘
│(如192.168.1.8)│
└──────┬───────┘
│
│ 默认出站
▼
┌──────────────┐
│ 旁路由 │
│(如192.168.1.2)│
└──────────────┘
- 主路由将外网端口 DNAT 到 Debian 的特定端口
- 希望这些特定端口的回包走主路由(如
192.168.1.1) - 其他所有流量(包括 Debian 主动出站)依然走旁路由(如
192.168.1.2)
# 1. 下载脚本
sudo curl -fsSL -o /root/netroute.sh https://raw.githubusercontent.com/nmrt0316/netroute/main/netroute.sh
# 2. 修复 Windows 换行符(可选)
sudo sed -i 's/\r$//' /root/netroute.sh
# 3. 赋执行权限
sudo chmod +x /root/netroute.sh
# 4. 运行
sudo /root/netroute.sh前置依赖:
iptables(Debian 通常自带,若缺失请执行apt install iptables)
sudo /root/netroute.sh首次运行会自动检测网络环境,输出类似下面的菜单:
==================================================
回程路由配置菜单
==================================================
系统信息:
网卡 : eth0
本机 IP : 192.168.1.8
默认网关 : 192.168.1.2
--------------------------------------------------
配置项:
回程网关 : 未配置
回程端口 : ——— [需先配置回程网关]
--------------------------------------------------
1. 设置回程网关
2. 设置回程端口
3. 查看详细配置与状态
4. 清理并恢复默认
0. 退出
==================================================
请选择 [0-4]:
- 首次运行 → 选
1→ 输入主路由 IP(如192.168.1.1) - 选
2→ 输入端口列表(如80,443) - 配置自动保存并生效
- 选
3验证规则是否生效 - 重启后,规则由 systemd 自动恢复
脚本通过三条协同工作的规则实现精细化的回程路由:
iptables标记入站连接:为从主路由进来的特定端口连接打上fwmark 100。ip rule策略路由:让带有fwmark 100标记的数据包查table 100路由表。table 100指定回程网关:在独立路由表中指定默认网关为主路由。
为什么不会断网?
- 只标记特定端口,SSH、DNS 不受影响
- 不修改默认网关,系统默认路由保持指向旁路由
- 不碰系统配置,DNS、网卡配置完全不变
| 路径 | 用途 |
|---|---|
/root/netroute.sh |
主脚本(菜单 + 应用 + 清理) |
/etc/public-return-route.conf |
保存用户配置(网卡、IP、网关、端口) |
/etc/systemd/system/public-return-route.service |
systemd 开机自启服务 |
不会。 脚本只操作 fwmark、table 100 和 iptables mangle 表,完全不碰 DNS、网卡配置和默认路由。就算配置填错,最多是特定端口访问不通,SSH 和内网依然正常。
这是 iptables 显示格式差异导致的。脚本已兼容 --set-mark 100 和 --set-xmark 0x64 两种写法。
目前只在 Debian 12/13 上测试通过。理论上兼容使用 iptables 和 systemd 的其他 Linux 发行版,但未做完整验证。
不支持,脚本只处理 IPv4。
因为它只操作 fwmark 和路由表,完全不修改系统默认路由和DNS。最坏的情况只是特定端口不通,你的 SSH 和基础网络永远安全。
sudo /root/netroute.sh
# 选择 4,确认清理如果不小心删除了 netroute.sh,可以手动执行以下命令清理所有残留:
# 清理路由规则
sudo ip rule del fwmark 100 table 100 2>/dev/null || true
sudo ip route flush table 100 2>/dev/null || true
# 清理 iptables 规则(兼容两种 mark 写法)
sudo iptables -t mangle -S PREROUTING | grep "CONNMARK" | \
sed 's/^-A //' | while read rule; do
sudo iptables -t mangle -D $rule 2>/dev/null
done
sudo iptables -t mangle -D OUTPUT -j CONNMARK --restore-mark 2>/dev/null || true
# 停止并删除 systemd 服务
sudo systemctl disable --now public-return-route.service 2>/dev/null || true
sudo rm -f /etc/systemd/system/public-return-route.service
sudo systemctl daemon-reload
# 删除配置文件
sudo rm -f /etc/public-return-route.conf本脚本操作系统的网络层规则。虽然经过谨慎设计,但使用者仍需自行承担风险。建议在生产环境使用前先做好快照或备份。
欢迎提交 Issue 和 Pull Request!