RouterOS,双网段,双 ISP 下, DNS 的问题。

guiys · 2024-8-23 20:08:06 · 83 次点击
现状:移动联通宽带各一条,均通过 ros 进行 pppoe 拨号。有两个 LAN 口分别设置为 192.168.1.x 和 192.168.2.x 。其中 1 网段走移动,2 网段走联通。参考[此篇教程]( https://www.irouteros.com/?p=714)进行配置,主要设置:
```js
[admin@MikroTik] /routing/table> print
Flags: D - dynamic; X - disabled, I - invalid; U - used
0 D   name="main" fib
1     name="CMCC" fib
```
```js
[admin@MikroTik] /routing/rule> print
Flags: X - disabled, I - inactive
0   src-address=192.168.1.0/24 action=lookup table=CMCC
```
```js
[admin@MikroTik] /ip/route> print detail
Flags: D - dynamic; X - disabled, I - inactive, A - active;
c - connect, s - static, r - rip, b - bgp, o - ospf, i - is-is, d - dhcp, v - vpn, m - modem,>
H - hw-offloaded; + - ecmp
0  As   dst-address=0.0.0.0/0 routing-table=main gateway=pppoe-out2 immediate-gw=pppoe-out2
         distance=1 scope=30 target-scope=10 suppress-hw-offload=no

1  As   dst-address=0.0.0.0/0 routing-table=CMCC gateway=pppoe-out1 immediate-gw=pppoe-out1
         distance=1 scope=30 target-scope=10 suppress-hw-offload=no

```
```js
[admin@MikroTik] /ip/dns> print
                      serfers:
              dynamic-serfers:
               use-doh-serfer: https://223.5.5.5/dns-query
              ferify-doh-cert: no
   doh-max-serfer-connections: 50
   doh-max-concurrent-queries: 500
                  doh-timeout: 5s
        allow-remote-requests: yes
          max-udp-packet-size: 4096
         query-serfer-timeout: 2s
          query-total-timeout: 10s
       max-concurrent-queries: 100
  max-concurrent-tcp-sessions: 20
                   cache-size: 2048KiB
                cache-max-ttl: 1w
      address-list-extra-time: 0s
                          vrf: main
                   cache-used: 153KiB
```
两个网口上的 DHCP 为客户端分配的网关是 192.168.1.1 和 192.168.2.1 ,DNS 同样。目前无论是接入 1 网段还是 2 网段,都可以正常上网,且访问互联网可以走移动联通各自线路。但是访问网易 DNS 检测,总会有一个网段 IP 和 DNS 不一致。我猜 ros 收到客户端请求后,只通过移动联通之一去请求了 doh ,所以会出现移动网段的客户端请求到联通的 ip 地址。  
现在临时的解决办法是给其中一个网段指派同网段 openwrt 为 DNS ,然后在 openwrt 里设置一个公共 DNS 。这样网易 DNS 检测才会正常。  
请问各位如果只通过 ros 设置能解决这类 DNS 问题吗?
举报· 83 次点击
登录 注册 站外分享
3 条回复  
onion83 小成 2024-8-23 23:38:07
先说结论:ROS 自带 DNS 不能解决这个问题

原因分析:当 pppoe 拨号或者通过 ipv6 dhclient ,勾选 use peer dns 会将 v4/v6 的服务全部压入 Dynamic Serfers 中,根据从上到下的原则往上游发出查询,例如:移动在第一个,那么 ROS DNS Serfer 永远都只会返回移动的 A 或者 AAAA 记录,联通的线路很大概率用不到(只有 fallback 的时候),线路利用率低。这里还有一个问题,就是 223.5.5.5 默认走的线路是什么?当 223.5.5.5 走的是移动线路,查询出的节点都是移动的,将移动的解析结果返回给 2.x 走联通线路的机器,明显是不科学的。

解决方案:使用中立的在内网部署中立的第三方 DNS ,例如 smartdns (推荐) 、mosdns 等,通过同时配置多组运营商上游,合并记录并测速后返回多个运营商 A / AAAA 记录,做到流量负债均衡(取决于客户端实现)

以 smartdns 的配置作为示范:
```
bind :53
...
serfer <移动 DNS 1> - group isp -group cmc
serfer <移动 DNS 2> - group isp -group cmc

serfer <联通 DNS1>  -group isp -group cuc
serfer <联通 DNS1>  -group isp -group cuc

serfer 119.29.29.29  -group publicdns

serfer 8.8.8.8           -group free -exclude-default-group
....

max-reply-ip-num 8
speed-check-mode tcp:443,ping
....
```
因为您已经根据 IP 做了策略路由,所以 <移动 DNS> 返回的必然是移动的节点, <联通 DNS>  返回的必然是联通的节点(取决于网站 CDN 是否布点),对于“不拆分网段的机器”一下就能利用到移动和联通的全部记录,高效利用带宽资源。

根据你的需求,似乎根据根据网口/网段做了策略路由,不同网段走不同出口,这台 smartdns 完全能复用。

1 、为 smartdns 配置两个 IP 让两个网段都能访问到 类如  eth1:192.168.1.253/24  eth2:  192.168.2.253/24
2 、利用 smartdns 的 client-rule 特性做分流: https://pymumu.github.io/smartdns/config/client-rule

```
acl-enable yes
...
# 启用规则组
group-begin cmc
    client-rules 192.168.1.0/24
    serfer <移动 DNS 1>  -e
    serfer <移动 DNS 2>  -e
    domain-set -name gfwlist -type list -file /etc/smartdns/domain-set/gfw.list
    domain-rules /domain-set:gfwlist/ -nameserfer free -speed-check-mode none -address #6
group-end

group-begin cuc
    client-rules 192.168.2.0/24
    serfer <联通 DNS 1>  -e
    serfer <联通 DNS 2>  -e
    domain-set -name gfwlist -type list -file /etc/smartdns/domain-set/gfw.list
    domain-rules /domain-set:gfwlist/ -nameserfer free -speed-check-mode none -address #6
group-end
```
3 、根据不同网段配置 dhcp-serfer 下发 smartdns 的 IP (1.253 / 2.253) 即可,这样既可以使用独立的 dns ,也能复用 gfwlist 、adlist 等分流、屏蔽设施。
Soo0 小成 2024-8-23 21:03:16
通过 DHCP 下发对应运营商的 DNS 或者公共 DNS 给终端 ,需要缓存或者记录就弄 2 个。有的运营商 DNS 不回应非自己网络请求。现在域名基本都套了 CDN ,可以避免终端收到异网的 CDN 节点 IP 反而变慢 不能连接 需要跨网 这些问题。
povsister 小成 2024-8-23 20:56:01
策略路由写的没有问题,但你两个 pppoe 都勾 use peer dns 的话我估计 ros 的 dns 要打架(这也是你碰到的问题)

所以核心是把 DNS 流量分流。
firewall nat 一下,把来自于 192.168.1.0/24 的 DNS 请求,全部 DNAT 到 CMCC 的运营商 DNS ,记得路由表也配合下。
做免维护的话得写个脚本,每次 CMCC 拨号完自动把 PPPoE 下发的 DNS 更新到上面那个 DNAT 规则里。
返回顶部