RouterOS V7域名分流保姆级教程:比V6更简单的配置方法
RouterOS V7 域名分流实战:告别脚本,拥抱自动化配置新范式
如果你和我一样,长期在RouterOS V6时代里,为了一个“域名分流”功能,不得不和一堆定时脚本、地址列表更新斗智斗勇,那么RouterOS V7的到来,无疑是一份迟到的礼物。过去,我们为了实现某个域名走特定线路,往往需要借助外部脚本定时解析域名并更新IP列表,流程繁琐且存在延迟。而现在,V7版本在路由表和防火墙规则层面引入了更精细、更原生的支持,让基于域名的流量导向变得前所未有的直观和稳定。这篇文章,就是为你——无论是负责企业多线负载的网络工程师,还是追求家庭网络极致体验的技术爱好者——准备的一份从原理到实操的深度指南。我们将彻底抛开V6时代的复杂脚本,探索RouterOS V7如何用更简洁的配置逻辑,实现更高效的智能分流。
1. 核心理念革新:从“脚本维护IP”到“DNS驱动路由”
在深入命令行之前,理解RouterOS V7在此功能上的设计哲学转变至关重要。这能帮助你在未来面对更复杂场景时,依然能灵活应对。
V6时代的经典做法,通常被称为“曲线救国”。核心思路是:通过一个外部脚本(比如跑在计划任务里),定期去解析你想要分流的域名(例如*.google.com),获取其当前的所有A记录或AAAA记录(IP地址),然后将这些IP地址添加到一个名为overip或类似的地址列表中。最后,配置防火墙Mangle规则,对目标地址在这个列表中的数据包,打上特定的路由标记,使其走指定的网关出口。
注意:这种方法有几个固有缺陷。一是延迟性,脚本执行间隔内域名IP若发生变化,分流会失效或错误。二是管理负担,每增加一个域名都需要调整脚本。三是可能产生大量冗余的IP条目,影响设备性能。
V7的优雅解决方案,则巧妙利用了DNS解析过程本身。它引入了一个关键特性:DNS静态条目现在可以直接将解析结果动态添加到一个指定的地址列表中,并且这个动作是在DNS查询发生时实时完成的。这意味着:
- 实时性:用户首次访问某个域名,RouterOS为其解析DNS的同时,就会把解析到的IP塞进你预设的列表。没有延迟。
- 自动化:无需任何外部脚本或定时任务。配置是一次性的,后续该域名解析出任何新IP,都会自动入列。
- 精准性:列表里只包含实际被解析并使用过的IP,列表大小得到有效控制。
本质上,V7将分流策略的触发点,从“IP地址”提前到了“域名解析”这个更上游的环节。我们不再需要维护一个可能很庞大的IP库,而是告诉RouterOS:“凡是以特定模式匹配的域名,其解析出的IP,都请放到这个篮子里。” 后续的路由策略只需要盯着这个“篮子”即可。
这种“DNS驱动路由”的模式,其工作流程可以概括为以下几步:
sequenceDiagram participant C as 客户端 participant R as RouterOS participant D as DNS服务器 participant F as 防火墙/路由 C->>R: 请求访问 example.com R->>D: 查询 example.com 的IP D-->>R: 返回IP地址 (如 142.250.185.78) Note over R: 关键步骤:<br/>匹配DNS静态规则,<br/>将IP加入“海外列表” R->>F: IP 142.250.185.78 已被标记 F->>F: 查询路由表,<br/>确定该IP走“海外”网关 R-->>C: 返回IP地址 C->>R: 向 142.250.185.78 发送数据 R->>F: 数据包目标IP在“海外列表”中 F->>R: 应用“海外”路由标记,从指定网关发出2. 基础环境搭建:路由表与默认网关
在配置任何分流规则前,我们必须先打好网络基础。假设你拥有两条出口线路:
- 线路A (默认线路):本地运营商线路,网关为
192.168.1.1,用于访问国内资源,速度快、延迟低。 - 线路B (海外线路):具有国际访问能力的线路,网关为
10.0.0.1,用于访问特定海外资源。
我们的目标是让大部分流量走线路A,而匹配特定域名的流量自动走线路B。
2.1 创建独立的路由表
这是V7与V6在配置语法上的一个重要区别。在V6中,我们通常直接在ip route中使用routing-mark。而在V7中,routing-table的概念被正式引入并分离,routing-mark则是在防火墙中打上的标签,用于选择使用哪张路由表。
首先,我们需要创建一张独立的路由表,专门用于管理“海外”流量。
/routing table add name=oversea fib这条命令创建了一张名为oversea的FIB(Forwarding Information Base)类型路由表。你可以将oversea替换为任何你喜欢的名字,例如global,proxy等。
2.2 为海外线路添加默认路由
接下来,在这张新建的oversea路由表中,添加一条默认路由,指向你的海外线路网关。
/ip route add dst-address=0.0.0.0/0 gateway=10.0.0.1 routing-table=oversea参数解读:
dst-address=0.0.0.0/0: 匹配所有目标地址,即默认路由。gateway=10.0.0.1: 下一跳网关,请替换为你的海外线路实际网关。routing-table=oversea: 关键!指定此路由条目仅添加到名为oversea的路由表中,不会影响主路由表。
至此,你的设备里现在至少有两张路由表在同时工作:
- 主路由表 (main):包含你所有接口的直连路由以及默认网关(如
192.168.1.1)。 - 海外路由表 (oversea):只包含一条指向
10.0.0.1的默认路由。
目前,所有流量依然默认使用主路由表。我们需要一个“开关”,将特定流量切换到oversea路由表。
3. 核心配置:DNS静态条目与地址列表的联动
这是实现自动化域名分流最精妙的一环。我们将配置RouterOS的DNS服务器,使其在解析特定域名时,自动执行额外操作。
3.1 配置DNS静态转发规则
假设我们希望所有.google.com的子域名都走海外线路。我们需要创建一个DNS静态条目,类型为FWD(转发)。
/ip dns static add name=google.com forward-to=8.8.8.8 type=FWD regexp=".*\\.google\\.com\$"命令详解:
| 参数 | 值 | 说明 |
|---|---|---|
name | google.com | 这是一个基准名称,实际匹配由regexp控制。 |
type | FWD | 指定此为转发规则。所有匹配的查询将被转发至指定的DNS服务器。 |
forward-to | 8.8.8.8 | 将匹配的DNS查询转发到该服务器解析。这里使用海外的公共DNS,确保解析出的是海外IP。请根据你的海外线路特性选择最优DNS,例如你的海外网关可能也提供DNS服务。 |
regexp | .*\\.google\\.com\$ | 正则表达式。.*匹配任意字符,\\.转义点号,\$匹配字符串结束。此表达式匹配所有以.google.com结尾的域名。 |
但仅有转发还不够。我们需要让RouterOS记住这些被转发域名所解析出来的IP。这就需要用到V7的强大功能:address-list。
3.2 实现DNS解析结果自动入列
修改上面的命令,增加address-list参数:
/ip dns static add name=google.com forward-to=8.8.8.8 type=FWD regexp=".*\\.google\\.com\$" address-list=oversea_ipaddress-list=oversea_ip: 这是点睛之笔。它告诉RouterOS,凡是通过此规则解析出的IPv4地址,都自动添加到名为oversea_ip的地址列表中。如果解析出的是IPv6地址,则会自动添加到一个名为oversea_ip6的列表中(后缀自动加6)。
现在,你可以去访问一下www.google.com或drive.google.com,然后立即检查地址列表:
/ip firewall address-list print where list="oversea_ip"你应该会看到类似下面的输出,条目前面带有一个D标志,表示它是由DNS规则动态添加的。
Flags: D - dynamic # ADDRESS LIST CREATION-TIME TIMEOUT 0 D 142.250.185.78 oversea_ip apr/16/2024 10:23:12 1 D 142.250.185.99 oversea_ip apr/16/2024 10:23:15提示:
address-list参数在V6的同类命令中不被支持,这正是V6需要依赖外部脚本的主要原因。V7的这个原生支持,极大地简化了流程。
你可以为不同的域名组创建多条规则,指向相同的或不同的address-list。例如,为社交媒体再添加一条:
/ip dns static add name=twitter.com forward-to=8.8.8.8 type=FWD regexp=".*\\.twitter\\.com\$" address-list=oversea_ip /ip dns static add name=facebook.com forward-to=8.8.8.8 type=FWD regexp=".*\\.facebook\\.com\$" address-list=oversea_ip4. 流量识别与路由标记:防火墙Mangle规则
现在,oversea_ip列表里已经动态填充了我们希望走海外线路的IP地址。下一步,就是在流量经过路由器时,识别出目标地址在这个列表中的数据包,并为它们打上“海外路由”的标记。
这需要在防火墙的Mangle表中添加规则。Mangle表主要用于修改数据包的各种标记(mark),这里我们使用mark-routing动作。
4.1 创建路由标记规则
假设你的内网网段是192.168.88.0/24。我们为从该网段发出、且目标IP在oversea_ip列表中的流量打上路由标记。
/ip firewall mangle add chain=prerouting src-address=192.168.88.0/24 dst-address-list=oversea_ip action=mark-routing new-routing-mark=oversea passthrough=yes逐项解析:
chain=prerouting: 在数据包进入路由决策之前进行处理,这是标记路由的最佳位置。src-address=192.168.88.0/24:限制源地址。非常重要!这确保只有来自你指定内网的流量才会被分流。如果你有多个网段或想针对特定设备,可以修改或添加多条规则。不加以限制可能导致路由器自身的流量(如DNS查询)也被错误标记。dst-address-list=oversea_ip: 匹配条件。目标IP地址在oversea_ip这个动态地址列表中的数据包。action=mark-routing: 动作为“标记路由”。new-routing-mark=oversea: 将数据包的routing-mark设置为oversea。这个值必须与我们在第2.1步创建的路由表名称完全一致。系统会根据这个标记去选择对应的路由表。passthrough=yes: 设置为yes后,即使本条规则匹配并执行了动作,数据包仍会继续向下匹配Mangle表中的后续规则。通常建议设为yes以保持防火墙规则的灵活性。
4.2 规则顺序与性能考量
防火墙规则是按顺序匹配的。你应该将这条分流规则放在Mangle表preroutingchain中相对靠前的位置,但要在一些基础处理规则(比如连接标记)之后。一个常见的良好实践是,在规则注释中写明用途,并利用place-before参数来精确控制位置。
你可以通过以下命令查看当前规则顺序:
/ip firewall mangle print where chain=prerouting如果需要调整,可以使用:
/ip firewall mangle move [规则ID] destination=[目标规则ID之前]对于高性能环境,dst-address-list的匹配是高效的。由于列表是动态的且通常只包含活跃IP,对现代RouterOS硬件压力很小。
5. 进阶策略与优化技巧
基础配置完成后,你的域名分流已经可以工作。但要打造一个稳健、高效的分流系统,还需要考虑以下方面。
5.1 DNS策略的精细化设计
将所有分流域名的DNS都转发到8.8.8.8不一定是最优解。你需要一个清晰的DNS策略。
- 默认DNS:在
/ip dns中设置servers为你的国内快速DNS,如223.5.5.5和114.114.114.114。所有不匹配分流规则的域名将使用这些DNS解析。 - 分流DNS:在
forward-to参数中,最好使用你海外线路网关提供的DNS,或者该线路延迟最低的海外公共DNS(如1.1.1.1)。这能确保解析出的IP在对应线路上访问最优。 - 处理DNS泄露:即使流量通过海外线路转发,如果设备的DNS请求仍默认走国内线路,可能会暴露你的访问意图。上述配置通过
forward-to将特定域名的DNS查询也导向了海外DNS,是解决此问题的一部分。更彻底的做法是,在Mangle规则中,也将源端口为53(DNS)且目标地址为海外DNS的UDP数据包,同样标记为走海外路由。
5.2 双栈支持(IPv6)
如果你的网络环境支持IPv6,并且海外线路也支持IPv6,那么配置需要扩展。
IPv6路由表:同样需要为IPv6创建路由表并添加默认路由。
/routing table add name=oversea6 fib /ipv6 route add dst-address=::/0 gateway=2001:db8::1 routing-table=oversea6(请将网关替换为你的实际IPv6网关)
IPv6地址列表:DNS静态规则在解析出IPv6地址时,会自动添加到
address-list参数名后加6的列表中。例如我们设置了address-list=oversea_ip,那么IPv6地址会被添加到oversea_ip6列表。IPv6 Mangle规则:需要在
ipv6 firewall mangle中创建类似的规则。/ipv6 firewall mangle add chain=prerouting src-address=2001:db8:88::/64 dst-address-list=oversea_ip6 action=mark-routing new-routing-mark=oversea6 passthrough=yes
5.3 故障排查与监控
当分流不生效时,可以按照以下步骤排查:
- 检查DNS解析:在RouterOS终端内,使用
/tool dns lookup host=www.google.com server=8.8.8.8手动测试,看是否能解析出IP,并观察该IP是否被正确添加到了oversea_ip列表中。 - 检查地址列表:使用
/ip firewall address-list print where list="oversea_ip"确认目标IP是否在列表中。 - 检查路由标记:使用
/tool torch src-address=192.168.88.XX dst-address=目标IP来实时监控数据包,查看匹配的防火墙规则和最终使用的路由标记。 - 检查路由:使用
/ip route print detail查看主路由表和oversea路由表的具体条目,确认网关状态是否可达。 - 规则顺序:再次确认Mangle规则的位置和条件(特别是
src-address)是否正确。
5.4 性能与规模管理
如果你需要分流的域名非常多,管理大量的/ip dns static条目会变得繁琐。这时,可以考虑使用通配符域名或地址列表作为条件。
- 更宽泛的正则表达式:例如,
regexp=".*\\.(google|facebook|twitter|youtube)\\.com\$"可以一条规则匹配多个顶级域名。但需谨慎,避免匹配过度。 - 使用地址列表管理域名:RouterOS V7的DNS静态条目也支持
match-server和match-address等更复杂的条件,但将域名列表放在一个地址列表中,然后通过脚本批量生成DNS静态规则,是更可维护的方法。你可以创建一个地址列表domains_oversea,里面添加的是域名(如value=google.com),然后通过一个脚本读取这个列表,自动生成或更新对应的DNS静态转发规则。这超出了本文基础范围,但为大规模部署提供了思路。
经过以上配置,你的RouterOS V7已经建立起一套自动化的、基于域名的智能分流系统。这套系统的优势在于其声明式的配置:你只需要告诉路由器“哪些域名走海外”,剩下的IP收集、路由选择全部由系统自动、实时地完成。相比于V6时代,它减少了至少80%的维护脚本工作,并且大幅提升了分流准确性和及时性。在实际使用中,最关键的体会是,增加或修改一个需要分流的域名,现在只需要简单添加或修改一条DNS静态规则,所有客户端立即生效,这种体验上的提升是颠覆性的。剩下的,就是根据你的具体网络环境,微调DNS策略和防火墙规则顺序,使其达到最佳性能。
