2024年4月28日发(作者:)

【新提醒】PCC多运营商接入环境下的DNS Cache 均衡负载routerosmikrotikros

软路由论坛中国路由网软件路由软件路由器routeros技术论坛路由论坛

众所周知,ROS在多个运营商接入环境下配置策略路由的 DNS cache 一直是个难题

原因是 一个ros 只有一个 cache 。在多个isp接入下必须指定一个isp为主DNS。这样

就造成了主DNS将90%的dns请求解析为该isp的线路请求。(大多数网站都有双isp接

入)如果是一条大带宽 主isp + 若干 小带宽 备用isp 做策略路由,这样解析就是最合理

的结构。但是如果是 多条同等带宽的isp,比如 100M电信接入 + 100M网通接入,那

么采用 ROS 的 DNS cache 势必会造成一条线路分担了主isp的绝大部分流量。而另一

个isp线路则很闲的尴尬局面。在这种情况下,好像只有放弃ros 的 dns cache方案。采

用客户端部分配置电信dns,部分配置网通dns (比如奇数编号的机器配置电信dns,偶数

编号的机器配置网通dns)的无奈举措。这就有几个问题。一是客户端挨个配置dns的行

为毕竟太繁琐。就算用dhcp,也无法保证 同一时间 配置电信dns 的机器 ,和配置网通

dns 的机器开机数量相等。

二是万一某个dns挂掉,无法无缝平滑的使用其他dns进行替换。大多数win客户机

dns只能写两个,而且win下的dns解析可靠性和效率大家都懂的。有没有一个完美的方

法,在几乎不增加其他硬件成本的情况下,既可以使用ros的dns cache, 客户机填写路

由器的ip 就能 电信+网通 dns均衡负载,甚至客户机乱填一个dns地址也能被劫持并成

功均衡,更甚至可以自由的调整不同isp的dns分配比例呢?现设定ROS 内网卡 IP 为

192.168.0.1,DNS 设置为 电信dns1,电信dns2,电信dns3。。。同一个dns cache不

能设置不同的isp,以免出现解析混乱的情况。在内网其他任意一个服务器上用单网卡桥接

的方式虚拟一个ROS,ip 为 192.168.0.2 ,DNS cache设置为 网通dns1,网通dns2,

网通dns3。。。在主ROS上 用 PCC 按源地址均分 排除192.168.0.2以外,劫持客户机

的 dns 请求/ip firewall nat

add action=dst-nat chain=dstnat dst-port=53

per-connection-classifier=src-address:2/0 protocol=udp

src-address=!192.168.0.2 to-addresses=192.168.0.2

add action=dst-nat chain=dstnat dst-port=53

per-connection-classifier=src-address:2/1 protocol=udp

src-address=!192.168.0.2 to-addresses=192.168.0.1这样无论客户机的dns如何填写,

二分之一的客户机的DNS请求就被劫持到了虚拟ros的 网通dns 缓存上。

另二分之一的 客户机DNS 请求 劫持在主ROS的 电信 dns缓存上。当然,如果所

有客户机dns都默认 192.168.0.1 那也可以省略掉第二行代码。

另外,如果把PCC规则设置为 src-address-and-port,那么是按请求连接来均分。

这样带宽利用更平均。不过这样就会出现 同一个客户机同一个网站第一个窗口走电信线,

第二个窗口走网通线。也许会出现一些网站验证方面的未知问题。本帖隐藏的内容如果电

信和网通的带宽不对称。比如一条100M 一条 150M 则只需要在PCC上调整比例为相应

的 2 :3 就可。因为虚拟的ROS只做dns缓存用,不做包转发。这样虚拟32M内存就

足够。对cpu的要求也是极少极少。内网任意一台服务器的闲置资源即可完成。基本不用

做硬件上的投入。具体的操作可用 " target="_blank"

class="relatedlink">vmware来虚拟,批处理开机运行。这里就不赘述了。补充1:

楼下有人问能否单个ROS DNS cache 来完成。其实仔细想想就不可能了。ROS先天就只

有一个DNS Cache 池。这样一个Cache中如果塞满了不同了运营商的DNS解析,很容

易造成解析混乱的情况发生。别说是均衡负载了,正常的DNS都会受到影响。反映出来就

是很多网页打不开或者打开很慢。这个已经有很多人领教过了。唯一的可能就是期盼

mikrotik 官方在后续的ros 版本中增设多个 DNS Cache池补充2:多于2个isp出口 可

以虚拟 ros3 ros4。。。 如法炮制。 如果他们其中的一个挂了怎么办? 只需要在主ros 简

单的加上 netwatch 判断通断,如果挂掉则关闭相应的dns劫持。目前在ROS5.2X 生产

环境中运行良好