从Untitled-3.ini看MikroTik纯路由代理方案:一个技术宅的网络优化实录
开篇:为什么我要折腾纯路由模式?
作为一个常年混迹于各种网络论坛的技术宅,我最近发现了一个有趣的现象:传统的NAT代理模式虽然简单,但总感觉像是穿着雨衣洗澡——能用,但不痛快。特别是在使用ZeroTier远程访问家庭NAS时,总是看不到真实的源IP,这让我这个强迫症晚期患者异常难受。
于是,我开始了这场"纯路由模式"的探索之旅。本文就基于我优化后的《Untitled-3-optimized-zh.ini》配置,手把手分析这个方案的精髓所在。
网络拓扑:我的家庭网络长这样
+-------------+ +-------------+ +-------------+
| 光猫 +---->+ RB5009 +---->+ 代理服务器 |
| (桥接模式) | | (RouterOS) | | (10.10.10.252)
+-------------+ +------+------+ +-------------+
|
| bridge
|
+------+------+
| 交换机 |
+------+------+
|
+----------------+----------------+
| | |
+---------v------+ +-------v------+ +------v---------+
| PC(代理) | | NAS(直连) | | ZeroTier设备 |
| 10.10.10.100 | | 10.10.10.200 | | 10.24.152.x |
+----------------+ +---------------+ +---------------+
说明:PC走代理,NAS直连,ZeroTier保持真实IP
核心思路:让数据包走它该走的路
纯路由模式的精髓可以用一句话概括:"用路由表说话,而不是用NAT表骗人"。传统方案中,数据包会被NAT改来改去,而纯路由模式下,数据包保持原汁原味,只是走路径不同。
逐层解剖:从RAW表到Forward链的完整旅程
**第一道防线:RAW表的"安检" (/ip firewall raw)
# 这就是传说中的SYN Flood防护,简单粗暴但有效
add action=add-src-to-address-list chain=prerouting \
comment="[SEC] Enhanced SYN Flood detection" \
address-list=syn_flooder address-list-timeout=30m \
connection-limit=30,32 protocol=tcp tcp-flags=syn \
connection-state=new in-interface-list=WAN \
log=no
add action=drop chain=prerouting \
comment="[SEC] Drop SYN flooders" \
src-address-list=syn_flooder in-interface-list=WAN \
log=yes log-prefix="[RAW:SYNFLOOD]"
*技术解析*:这里用了一个很巧妙的技巧——先检测到SYN洪水特征(30秒内超过30个SYN包),再把IP加入黑名单,最后统一丢弃。这比传统的直接限速要智能得多。
再看这个端口扫描检测:
add action=add-src-to-address-list chain=prerouting \
comment="[SEC] Port scan detection" \
protocol=tcp address-list=port_scanners \
address-list-timeout=1h in-interface-list=WAN \
psd=21,3s,3,1
这里的psd参数是个黑科技:21表示端口阈值,3s是时间窗口,3是权重,1是因子。简单说就是3秒内扫描了21个以上端口就认为是扫描行为。
**第二道关卡:Mangle表的"分流" (ip firewall mangle)
这是整个方案的核心,相当于交通指挥员:
# 第一步:给需要代理的流量做个记号
add action=mark-connection chain=prerouting \
src-address-list=use_proxy \
dst-address-list=!local_network \
new-connection-mark=proxy-conn \
passthrough=yes \
comment="Mark proxy connections for FastTrack exclusion"
# 第二步:给这些流量指条明路
add action=mark-routing chain=prerouting \
src-address-list=use_proxy \
connection-state=new \
new-routing-mark=proxy-route \
passthrough=no \
comment="Route proxy traffic via proxy gateway"
*实战技巧*:这里的passthrough参数很有讲究。第一步设为yes是为了让数据流继续走下去,第二步设为no是因为已经找到路了,不需要再走其他策略。
**第三道管控:Filter表的"安检" (ip firewall filter)
这里有个很有意思的设计——CVE-2024-54772防护:
# WinBox访问 - CVE-2024-54772防护
add action=accept chain=input \
comment="[SEC] WinBox rate limited - CVE protected" \
dst-port=8299 in-interface-list=TRUSTED protocol=tcp \
connection-state=new limit=5/second,5:packet
add action=drop chain=input \
comment="[SEC] WinBox brute force protection" \
dst-port=8299 in-interface-list=TRUSTED protocol=tcp \
connection-state=new log=yes log-prefix="[SEC:WINBOX-BF]"
*安全解读*:这个CVE最近很火,基本思路就是限制WinBox的访问频率,超过5次/秒就认为是暴力破解,直接drop掉。
再看FastTrack的优化:
add action=fasttrack-connection chain=forward \
comment="FastTrack established (exclude proxy-conn)" \
connection-state=established,related hw-offload=yes \
connection-mark=!proxy-conn
*性能优化*:这里的connection-mark=!proxy-conn是关键,它让FastTrack跳过代理流量,这样代理流量就不会被硬件加速错误处理。
**第四道程序:路由表的"导航" (/ip route)
# 主路由 - 带健康检查
add dst-address=0.0.0.0/0 gateway=10.10.10.252 \
routing-table=proxy-route check-gateway=ping \
comment="Proxy gateway (primary - health checked)"
# 备用路由
add dst-address=0.0.0.0/0 gateway=10.10.10.1 \
routing-table=proxy-route distance=10 \
comment="Proxy fallback to main gateway"
*高可用设计*:check-gateway=ping是个神器,它会定期ping代理服务器,如果ping不通就会自动把这条路由标记为不可用,流量就会自动走备用路由。
实战测试:验证你的配置是否工作
测试代理分流
# 1. 检查连接标记是否生效 /ip firewall connection print where connection-mark=proxy-conn and dst-address~"google" # 2. 验证路由表是否被使用 /ip route print detail where routing-mark=proxy-route # 3. 查看代理健康状态 /tool netwatch print status # 4. 检查FastTrack统计 /ip firewall filter print stats where action=fasttrack-connection
性能基准测试
# 测试直连速度(NAS应该直连) ping -c 10 10.10.10.200 # 测试代理速度(PC应该走代理) ping -c 10 10.10.10.100 # 检查CPU占用 /system resource print # 查看连接数 /ip firewall connection print count-only
踩坑记录:我遇到的那些坑
坑1:IPv6完全禁用导致的问题 最初我完全禁用了IPv6,结果发现在某些环境下会出现莫名其妙的连接问题。优化后的方案改成了完整的IPv6防火墙:
# 不要这样做! /ipv6 settings set disable-ipv6=yes # 应该这样做 /ipv6 settings set disable-ipv6=no forward=yes /ipv6 firewall raw add action=drop chain=prerouting connection-state=invalid
坑2:DNS over HTTPS的证书问题 DoH配置中的verify-doh-cert=yes在实验室环境没问题,但在实际部署中经常因为系统时间不准确导致证书验证失败。解决方案是同时配置NTP:
/system ntp client set enabled=yes server=223.5.5.5,119.29.29.29,time.google.com mode=unicast
坑3:连接跟踪参数调优 默认的连接跟踪参数对于代理环境来说太保守了,需要针对性调整:
/ip firewall connection tracking set udp-timeout=15s udp-stream-timeout=45s tcp-established-timeout=1d
性能对比:数据说话
经过一周的测试,我记录了以下数据:
| 指标 | 传统NAT方案 | 纯路由方案 | 提升 |
|---|---|---|---|
| 内网传输速度 | 950 Mbps | 980 Mbps | +3.2% |
| CPU占用(高峰) | 45% | 28% | -37.8% |
| 内存使用 | 512MB | 480MB | -6.3% |
| ZeroTier延迟 | 35ms | 28ms | -20% |
| 故障恢复时间 | 30s | 10s | -66.7% |
应用场景:适合谁?不适合谁?
适合的场景
- ✓ 有专业网络知识的技术爱好者
- ✓ 对网络性能有极致追求的用户
- ✓ 需要透明网络架构的环境
- ✓ ZeroTier等VPN重度使用者
不适合的场景
- ✗ 网络小白或者懒得折腾的人
- ✗ 代理服务器不稳定的网络
- ✗ 主要是国内访问,国外流量很少
- ✗ 不能承受短暂网络中断的环境
总结:折腾的价值
纯路由模式就像手动挡汽车——需要更多的技巧和维护,但能给你更精准的操控感和更好的性能表现。通过这次优化,我不仅解决了ZeroTier真实IP可见性的问题,还意外获得了3%的内网传输性能提升。
**核心技术要点回顾**:
- RAW表做第一层安全防护(SYN Flood、端口扫描)
- Mangle表实现策略路由分流(连接标记+路由标记)
- Filter表精确控制访问(CVE防护+FastTrack优化)
- 路由表实现高可用(健康检查+自动切换)
- IPv6完整支持(不再是简单的disable)
如果你也厌倦了传统NAT代理的"雨衣效应",不妨尝试一下纯路由模式。记住:折腾的路上,每一个坑都是成长的机会!
附录:完整配置获取方式
# 配置备份 /system backup save name=pure-routing-backup # 导出配置 /export file=pure-routing-config # 查看系统版本 /system resource print
参考资料
- MikroTik官方文档:https://help.mikrotik.com/docs/display/ROS/Policy+Routing
- CVE-2024-54772详情:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-54772
- 中国IP列表项目:https://github.com/seymer/china_ip_list
- RouterOS最佳实践:https://wiki.mikrotik.com/wiki/Manual:IP/Firewall
Comments:
Email questions, comments, and corrections to hi@smartisan.dev.
Submissions may appear publicly on this website, unless requested otherwise in your email.