lnc1995
V2EX  ›  路由器

RouterOS 如何切换 DNS 服务器

  •  
  •   lnc1995 · May 4, 2024 · 4094 views
    This topic created in 913 days ago, the information mentioned may be changed or developed.

    DHCP 中设置的是 AdguardHome 的地址,现在通过 Netwatch 想在 Adg 挂了的时候,切换 DNS 。 查到的办法都是 DHCP 中 DNS 设置为 ROS 的地址才可以,有没有什么办法在我这种 DHCP 配置下,切换 DNS 呢?

    36 replies  •  2024-05-07 16:18:12 +08:00
    Yien
    Yien
    May 4, 2024
    1
    dhcp dns 设置配置一个备用的 dns 不可以吗?
    lnc1995
    lnc1995
    OP
    May 4, 2024
    2
    @Yien 这样的话会导致 DNS 泄漏 所以没办法
    supemaomao
    supemaomao
    May 4, 2024 via Android
    3
    DHcp 里面不是可以设置多个 DNS 服务器吗?如果必须只设置一个且满足切换,就做两个 DNS 服务器,使用 vrrp 虚拟一个 IP 地址,做主备切换。
    Kite6
    Kite6
    May 4, 2024 via Android
    4
    ros 可以写个脚本,判断一下 adg 是否存活,不存活的话改掉 dns 就行
    Yien
    Yien
    May 4, 2024 via Android
    5
    @Kite6 这样看起来也可以,不知道客户机会不会即时生效。
    herozzm
    herozzm
    May 4, 2024
    6
    在 `tools` - `Netwatch`


    Up
    ```
    /ip dns cache flush
    /ip dns set servers=192.168.1.2
    ```

    Down
    ```
    /ip dns set servers=""
    /ip dns set servers=192.168.1.100
    ```
    hefish
    hefish
    May 4, 2024
    7
    用带 chatgpt 的 routeros 即可。。。
    lnc1995
    lnc1995
    OP
    May 4, 2024
    8
    @Kite6 这是不行的 ROS 下的客户端这时候获取的还是 ADG 的地址
    lnc1995
    lnc1995
    OP
    May 4, 2024
    9
    @herozzm 这是不行的 ROS 下的客户端这时候获取的还是 ADG 的地址
    lnc1995
    lnc1995
    OP
    May 4, 2024
    10
    @supemaomao 感觉这个好像有点可行性 关键是这个 VRRP 可以把 223.5.5.5 这种虚拟吗?我也没接触过 VRRP ,我想要的还是用公共 DNS 做后备切换,自建的一个就够用了。不知道你说的 VRRP 可不可以做到这点
    supemaomao
    supemaomao
    May 4, 2024 via Android
    11
    @lnc1995 既然你要用公共做后备,在 DHCP 下发的时候为什么不能下发两个 DNS 服务器,首选你的 adg ,第二个 223 。vrrp 的方案大致适用场景是这样,假如 你现在,DHCP 下发 DNS 服务器是 192.168.1.3 这个默认是 adg ,如果 adg 挂了,网络就挂了。用 vrrp 以后用 1.5 ( vppr 网卡 ip )在 1.3 与 1.1 (假设这是 ros 的 ip )中做一个负载。DHCP 下发设置 1.5 ,正常情况下 adg 不挂,用 1.3 的 adg 解析,如果 adg 挂了 会通过 1.1 的 ROS 做 DNS 服务器。
    herozzm
    herozzm
    May 4, 2024
    12
    @lnc1995 将 DHCP 下发的 dns 设置成 ros 的 ip 即可
    lnc1995
    lnc1995
    OP
    May 4, 2024
    13
    @supemaomao 感觉符合我的需求,我来研究研究。不下发两个主要是 DNS 泄漏问题
    lnc1995
    lnc1995
    OP
    May 4, 2024
    14
    @herozzm 就是不想设置成 ROS 地址来着 这样 ADG 没法统计客户端
    herozzm
    herozzm
    May 4, 2024
    15
    同理啊,你在 up 和 down 里面设置脚本修改 dhcp 设置即可
    Yien
    Yien
    May 4, 2024
    16
    脚本配合
    ```
    /ip dhcp-server lease remove [find]
    ```
    试试
    filtrate
    filtrate
    May 4, 2024
    17
    nat 转发 ros:53 到 adg 可以正常统计
    filtrate
    filtrate
    May 4, 2024
    18
    VRRP 什么的都可以试试,你这么简单的网络,方法简直太多了
    neroxps
    neroxps
    May 5, 2024 via iPhone
    19
    emmm netwatch 用 ping 确认并不能百分百确认 dns 是否存活,因为 ag 挂了也会导致故障。
    建议用脚本向目的 dns 查询,如果查询成功就存活,查询失败三次就切换。
    1 做 dnat ,将所有目的地址是 53 的 udp 目的地址改写为 ros 地址,挟持所有 dns 流量。
    2 ros 做 dns server

    不需要做什么 vrrp 。
    neroxps
    neroxps
    May 5, 2024 via iPhone
    20
    具体实现的脚本如下,可以参考我的脚本。

    https://github.com/neroxps/RouterOS-Script/blob/master/Clash_dns_check.rsc
    lnc1995
    lnc1995
    OP
    May 5, 2024
    21
    @neroxps 我的难点并不在检测 而是怎么切换 DHCP 中不设置为 ROS 的话 切换不了
    lnc1995
    lnc1995
    OP
    May 5, 2024
    22
    @jinqzzz 并不行 统计的都是 ROS 的地址
    filtrate
    filtrate
    May 5, 2024
    23
    @lnc1995 既然说出来了,我肯定是自己试过可以的。翻了一下你的回复几乎都是复读,我也懒得贴我的配置了
    neroxps
    neroxps
    May 6, 2024
    24
    @lnc1995 [1] 步骤就解决了啊,挟持局域网所有的 DNS 到 ros 啊,然后 ros 上游给 ag
    keyfunc
    keyfunc
    May 6, 2024
    25
    我的 DNS 是 86.33 ,然后 nat 到了 86.1 ( ros )上,86.33 上的 19000 是健康检查端口,如果有问题,就会关闭防火墙规则,可以做到无感的自动切换。问题就是加个 masquerade ,导致统计功能没办法用了。虽然可以在 dns 主机上写路由规则来处理,但会造成防火墙的状态追踪出现问题,出现大量的 invalid 包,目前没找到办法处理。

    /ip firewall nat
    add action=dst-nat chain=dstnat comment="DNS Dummy" dst-address=192.168.86.1 dst-port=53 protocol=udp src-address=!192.168.86.33 src-address-type=!local to-addresses=192.168.86.33 \
    to-ports=53
    add action=dst-nat chain=dstnat comment="DNS Dummy" dst-address=192.168.86.1 dst-port=53 protocol=tcp src-address=!192.168.86.33 src-address-type=!local to-addresses=192.168.86.33 \
    to-ports=53
    add action=masquerade chain=srcnat comment="DNS Dummy" dst-address=192.168.86.33 dst-port=53 protocol=udp src-address-type=!local to-addresses=192.168.86.33
    add action=masquerade chain=srcnat comment="DNS Dummy" dst-address=192.168.86.33 dst-port=53 protocol=tcp src-address-type=!local to-addresses=192.168.86.33

    /tool netwatch
    add disabled=no down-script="/ip firewall nat disable numbers=[/ip firewall nat find comment=\"DNS Dummy\"]" host=192.168.86.33 http-codes="" interval=5s port=19000 test-script="" \
    timeout=2s type=tcp-conn up-script="/ip firewall nat enable numbers=[/ip firewall nat find comment=\"DNS Dummy\"]"
    keyfunc
    keyfunc
    May 6, 2024
    26
    另外可以通过这个访问拦截一些常用的 dns 地址 8.8.8.8 之类的,可以防止 dns 泄漏和一些软件不使用系统 dns 之类的。
    keyfunc
    keyfunc
    May 6, 2024
    27
    @jinqzzz 咋实现的,是在 dns 那台机器上写路由规则吗?
    everfly
    everfly
    May 6, 2024 via iPhone
    28
    @keyfunc 你这后面两条规则有点奇怪,自己发起 dns 请求自己?那样肯定会导致统计规则失效的。为啥不把 dns 服务器 ip 放在另一个网段呢?这样就不需要那两条规则了。另外 ros 支持容器的,也可以建个 agh 的容器作为 dns 服务器用。
    keyfunc
    keyfunc
    May 6, 2024
    29
    @everfly 可能是 ros 导出有点 bug 导致的,应该是
    add action=masquerade chain=srcnat comment="DNS Dummy" dst-address=192.168.86.33 dst-port=53 protocol=udp src-address-type=!local
    add action=masquerade chain=srcnat comment="DNS Dummy" dst-address=192.168.86.33 dst-port=53 protocol=tcp src-address-type=!local

    masquerade 设置不了 to-addresses 。

    我也不是非常清楚,但如果不设置这个规则的话,包虽然能发到 dns 服务上,但回包无法回到发起的设备,只能再 srcnat 一次。
    lnc1995
    lnc1995
    OP
    May 6, 2024
    30
    @jinqzzz 我说的统计是不同客户端,你都把 ROS Nat 了,ADG 还能区分不同客户端?
    filtrate
    filtrate
    May 6, 2024 via iPhone
    31
    @lnc1995 当然可以
    filtrate
    filtrate
    May 6, 2024
    32
    @keyfunc 我也遇到过同样的问题必须 masquerade ,后来在 mikrotik 论坛上找到过解决方案但是没有保存,现在改成了 VRRP ,就不再用 netwatch 和 nat 了(你拦截 8888 可能还需要保留)
    lnc1995
    lnc1995
    OP
    May 7, 2024
    33
    @jinqzzz 确实可以 搞定了这种方案
    chiikawa
    chiikawa
    May 7, 2024
    34
    dhcp 下发 dns1 adg, dns2 ros, dns1 adg 挂了会 fallback 到 dns2 ros, ros netwatch adg, 挂了和恢复了用脚本切 ros 的上游 dns
    lnc1995
    lnc1995
    OP
    May 7, 2024 via Android
    35
    @lwq84510 诶,卧槽,好像是啊,平时 ROS 上游也用 ADG ,挂了切一下上游…以前好像想复杂了啊…
    chiikawa
    chiikawa
    May 7, 2024
    36
    @lnc1995 #35 而且 adg 这个统计也只能是参考意义,设备不一定是按 dns1 不通 fallback dns2 ,可能是并发查询,这样 adg 还是会记录到很多来源是 ros 的查询
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1320 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 20:39 · PVG 04:39 · LAX 12:39 · JFK 15:39
    ♥ Do have faith in what you're doing.