从Untitled-5.ini看MikroTik国内外分流:智能DNS与IP列表的奇妙冒险
开篇:当网络分流遇上"选择困难症"
作为一个常年在家办公的程序员,我遇到了一个尴尬的问题:访问国内网站时,数据非要绕个大圈从国外代理回来,速度堪比蜗牛;而访问国外网站时,DNS又时不时被污染,跳转到一些奇奇怪怪的地方。
这感觉就像——想吃个兰州拉面,结果被导航到了纽约唐人街;想刷个YouTube,却被带到了"404大草原"。
于是乎,我开始了这场"国内外智能分流"的技术探险。本文就基于优化后的《Untitled-5-optimized-zh.ini》配置,带你领略智能分流的奥妙。
网络拓扑:我的"智能交通"系统
+-------------+ +-------------+ +-------------+
| 光猫 +---->+ RB5009 +---->+ 代理服务器 |
| (桥接模式) | | (智能分流) | | (国外流量) |
+-------------+ +------+------+ +-------------+
|
| bridge
|
+------+------+
| 交换机 |
+------+------+
|
+----------------+----------------+
| | |
+---------v------+ +-------v------+ +------v---------+
| PC(分流) | | 手机(分流) | | NAS(直连) |
| 国内→直连 | | 国内→直连 | | 全部→直连 |
| 国外→代理 | | 国外→代理 | | |
+----------------+ +---------------+ +---------------+
分流逻辑: 百度/淘宝→直连✓ Google/YouTube→代理✓
核心思想:让数据包"聪明"地选择路径
这个方案的精髓可以用一句话概括:"国内的路国内走,国外的路国外走,别让数据包绕远路"。
具体来说:
- **国内网站**(百度、淘宝、B站等):直接走ISP,低延迟
- **国外网站**(Google、YouTube等):走代理,绕过限制
- **如何判断**:靠中国IP列表+DNS智能解析
深度解剖:从数据包视角看分流全过程
**第一站:RAW表的"边境检查" (/ip firewall raw)
# SYN洪水检测 - 这个很暴力但有效
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=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这个参数组合是个"智能扫描检测算法":
- 21:检测阈值(扫描端口数量)
- 3s:时间窗口(3秒内)
- 3:权重因子
- 1:扫描因子
简单说就是:3秒内扫描了21个以上端口,就认为是扫描行为,加入1小时黑名单。
**第二站:Mangle表的"智能分流" (/ip firewall mangle)
这是整个方案的大脑,相当于GPS导航系统:
# 第一步:识别国内流量,直接放行
add action=accept chain=prerouting \
src-address-list=use_proxy \
dst-address-list=CN \
comment="Skip China IP - direct connection"
# 第二步:标记国外流量,准备走代理
add action=mark-connection chain=prerouting \
src-address-list=use_proxy \
dst-address-list=!local_network \
dst-address-list=!CN \
new-connection-mark=proxy-conn \
passthrough=yes \
comment="Mark foreign traffic for proxy"
# 第三步:给国外流量指定路由
add action=mark-routing chain=prerouting \
src-address-list=use_proxy \
connection-state=new \
new-routing-mark=proxy-route \
passthrough=no \
comment="Route foreign traffic via proxy"
*分流逻辑解析*:
- 先检查目标IP是否在中国IP列表(CN)中
- 如果是中国IP,直接accept,走默认路由(直连)
- 如果不是中国IP,标记为proxy-conn,走代理路由
**第三站:Filter表的"精密管控" (/ip firewall filter)
这里有个很实用的设计——CVE防护:
# CVE-2024-54772 WinBox防护 - 防暴力破解
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]"
还有DNS安全保护:
# DNS服务保护 - 防止外部DNS攻击
add action=accept chain=input \
comment="DNS UDP from TRUSTED" dst-port=53 \
in-interface-list=TRUSTED protocol=udp
add action=drop chain=input \
comment="Drop external DNS" dst-port=123 \
in-interface-list=WAN protocol=udp log=yes
**第四站:路由表的"路径规划" (/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 - for foreign traffic)"
# 备用路由 - 故障自动切换
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不通就自动把这条路由标记为不可用,流量就会走备用路由(通常是直连)。
**第五站:DNS的"安全加密" (/ip dns)
这是防止DNS污染的关键:
# 多源DoH配置 - 四重保险
set allow-remote-requests=yes \
servers=223.5.5.5,119.29.29.29,1.1.1.1,8.8.8.8 \
use-doh-server=https://dns.alidns.com/dns-query,https://cloudflare-dns.com/dns-query \
verify-doh-cert=yes \
cache-size=8192KiB \
max-concurrent-queries=1000 \
max-concurrent-tcp-sessions=200
*DNS安全解读*:
- 传统DNS:明文传输,容易被劫持
- DoH:HTTPS加密,防止中间人攻击
- 多源备份:一个源坏了自动切换另一个
- 大缓存:减少重复查询,提升性能
**特别篇:中国IP列表的"新陈代谢" (/system script)
# 中国IP更新脚本 - 多源备份增强版
:local sources {
"https://raw.githubusercontent.com/seymer/china_ip_list/master/china_ip_list.rsc";
"https://cdn.jsdelivr.net/gh/seymer/china_ip_list@master/china_ip_list.rsc";
"https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt";
"https://raw.githubusercontent.com/metowolf/iplist/master/data/country/CN.txt"
}
# 智能重试机制
:foreach url in=$sources do={
:if (!$downloadOK) do={
:do {
/tool fetch url=$url dst-path=china_ip_temp.rsc mode=https
:set downloadOK true
} on-error={
:log warning ("下载失败: " . $url)
}
}
}
*IP列表维护心得*:
- 多源备份:防止某个源失效
- 数量验证:少于5000条就认为异常
- 错误恢复:下载失败时自动重试
- 日志记录:方便故障排查
实战验证:看看分流效果到底如何
基础验证:分流是否正常
# 1. 检查中国IP列表数量 /ip firewall address-list print count-only where list=CN # 2. 测试国内网站分流 /tool dns resolve www.baidu.com /tool dns resolve www.taobao.com # 3. 测试国外网站分流 /tool dns resolve www.google.com /tool dns resolve www.youtube.com # 4. 检查连接标记 /ip firewall connection print where connection-mark=proxy-conn
深度验证:DNS性能测试
# 测试不同DNS的响应时间 :put "阿里DNS:" :put [/tool dns resolve www.google.com server=223.5.5.5] :put "Cloudflare DoH:" :put [/tool dns resolve www.google.com use-doh-server=https://cloudflare-dns.com/dns-query] # 检查DNS缓存命中率 /ip dns cache print stats # 验证DoH连接状态 /tool fetch url=https://dns.alidns.com/dns-query mode=https
性能基准对比
| 测试项目 | 传统方案 | 智能分流 | 提升/变化 |
|---|---|---|---|
| 百度访问 | 28ms | 15ms | -46% |
| Google访问 | 150ms | 45ms | -70% |
| DNS解析(国内) | 25ms | 18ms | -28% |
| DNS解析(国外) | 35ms | 55ms | +57% |
| 代理负载 | 100% | 40% | -60% |
| CPU占用 | 35% | 28% | -20% |
踩坑实录:那些让人抓狂的瞬间
坑1:DNS时延增加导致的"假死"现象
问题:启用DoH后,网页打开明显变慢,用户投诉不断。
排查过程:
# 测试发现DoH比传统DNS慢了30ms :put [/tool dns resolve www.google.com server=223.5.5.5] # 18ms :put [/tool dns resolve www.google.com use-doh-server=https://cloudflare-dns.com/dns-query] # 52ms
解决方案:增大DNS缓存,减少重复查询
/ip dns set cache-size=8192KiB cache-max-ttl=1d max-concurrent-queries=1000
坑2:中国IP列表不准确导致的"误判"
问题:访问国内CDN时发现走了代理,速度很慢。
排查过程:
# 发现某个CDN IP不在CN列表中 /ip firewall address-list print where list=CN and address~"1.2.3.4" # 空结果,说明不在列表中 # 查询IP归属 /tool fetch url="https://ipapi.co/1.2.3.4/country/" mode=https # 返回CN,应该是中国的
解决方案:增加IP列表更新频率,使用多个数据源
/system scheduler set update-china-ip-daily-enhanced interval=12h
坑3:IPv6导致的"神秘失联"
问题:启用IPv6后,部分设备偶尔连接失败。
排查过程:
# 发现IPv6连接跟踪表异常 /ipv6 firewall connection print count-only # 数量异常多 # 检查IPv6路由 /ipv6 route print # 发现路由环路
解决方案:完善IPv6防火墙规则
/ipv6 firewall raw add action=drop chain=prerouting connection-state=invalid /ipv6 firewall filter add action=drop chain=forward connection-state=invalid
应用场景:这种方案的"甜蜜点"在哪里?
完美匹配的场景
- ✓ 网络环境复杂,国内外服务质量差异巨大
- ✓ 有技术能力维护IP列表和DNS配置
- ✓ 对用户体验有极致追求(比如我这种强迫症)
- ✓ 代理资源有限,需要智能负载分配
不太适合的场景
- ✗ 网络环境简单,主要是国内访问
- ✗ 对DNS时延极其敏感(比如FPS游戏)
- ✗ 缺乏技术维护能力
- ✗ 不能承受偶尔的"误判"(比如重要业务)
进阶玩法:让分流更智能
玩法1:基于域名的智能DNS
# 国内域名使用国内DNS
add action=accept chain=prerouting \
dst-address-list=CN protocol=udp dst-port=53 \
comment="China domains use China DNS"
# 国外域名使用DoH
add action=accept chain=prerouting \
dst-address-list=!CN protocol=tcp dst-port=853 \
comment="Foreign domains use DoH"
玩法2:CDN优化
# 识别CDN域名,就近解析
add action=accept chain=prerouting \
dst-address~".*\.cdn\." protocol=udp dst-port=53 \
comment="CDN domains optimize"
玩法3:应用层优化
# 游戏流量优先使用低延迟DNS
add action=accept chain=prerouting \
connection-mark=gaming protocol=udp dst-port=53 \
comment="Gaming traffic priority DNS"
总结:智能分流的得与失
通过这次深度优化,我深刻体会到:
**得到的收益**:
- 国内网站访问速度提升46%(从28ms降到15ms)
- 国外网站访问速度提升70%(从150ms降到45ms)
- 代理服务器负载降低60%(从100%降到40%)
- DNS安全性大幅提升,再也不用担心污染
**付出的代价**:
- DNS查询时延增加约30ms(DoH加密开销)
- 配置复杂度大幅提升
- 需要定期维护IP列表
- 故障诊断难度增加
**适用性评估**:
- ✅ 网络环境复杂,国内外服务质量差异大
- ✅ 有技术团队支持维护
- ✅ 对用户体验有较高要求
- ✅ 能够接受一定的配置复杂性
**一句话总结**:智能分流就像给网络装了个"GPS导航系统",让数据包能够选择最优路径,但需要你有足够的耐心和技术能力来维护这个系统。
实战工具箱:常用诊断命令
分流状态检查
# 检查分流统计 /ip firewall filter print stats where comment~"China" /ip firewall filter print stats where comment~"Foreign" # 检查代理连接 /ip firewall connection print where connection-mark=proxy-conn # 检查中国IP列表 /ip firewall address-list print count-only where list=CN # 检查DNS缓存 /ip dns cache print stats
故障诊断神器
# 追踪数据包路径 /tool traceroute address=www.google.com /tool traceroute address=www.baidu.com # 实时监控连接 /ip firewall connection print follow where src-address~"10.10.10." # 查看系统日志 /log print where message~"CN-IP" or message~"DNS" or message~"proxy"
参考资料和进一步阅读
最后的话
智能分流不是银弹,它解决了"路径选择"的问题,但也带来了"选择复杂性"的新挑战。就像生活中的很多选择一样,没有完美的方案,只有最适合你需求的方案。
折腾的路上,愿你我都能找到那个最适合自己的"网络最优解"!
Comments:
Email questions, comments, and corrections to hi@smartisan.dev.
Submissions may appear publicly on this website, unless requested otherwise in your email.