Blog Home
Updated: 2025 Dec 08

从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%的内网传输性能提升。

**核心技术要点回顾**:

  1. RAW表做第一层安全防护(SYN Flood、端口扫描)
  2. Mangle表实现策略路由分流(连接标记+路由标记)
  3. Filter表精确控制访问(CVE防护+FastTrack优化)
  4. 路由表实现高可用(健康检查+自动切换)
  5. IPv6完整支持(不再是简单的disable)

如果你也厌倦了传统NAT代理的"雨衣效应",不妨尝试一下纯路由模式。记住:折腾的路上,每一个坑都是成长的机会!

附录:完整配置获取方式

# 配置备份
/system backup save name=pure-routing-backup

# 导出配置
/export file=pure-routing-config

# 查看系统版本
/system resource print

参考资料

Comments:

Email questions, comments, and corrections to hi@smartisan.dev.

Submissions may appear publicly on this website, unless requested otherwise in your email.