V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lnc1995
V2EX  ›  路由器

RouterOS 如何切换 DNS 服务器

  •  
  •   lnc1995 · 49 天前 · 1501 次点击
    这是一个创建于 49 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    36 条回复    2024-05-07 16:18:12 +08:00
    Yien
        1
    Yien  
       49 天前
    dhcp dns 设置配置一个备用的 dns 不可以吗?
    lnc1995
        2
    lnc1995  
    OP
       49 天前
    @Yien 这样的话会导致 DNS 泄漏 所以没办法
    supemaomao
        3
    supemaomao  
       49 天前 via Android
    DHcp 里面不是可以设置多个 DNS 服务器吗?如果必须只设置一个且满足切换,就做两个 DNS 服务器,使用 vrrp 虚拟一个 IP 地址,做主备切换。
    Kite6
        4
    Kite6  
       49 天前 via Android
    ros 可以写个脚本,判断一下 adg 是否存活,不存活的话改掉 dns 就行
    Yien
        5
    Yien  
       49 天前 via Android
    @Kite6 这样看起来也可以,不知道客户机会不会即时生效。
    herozzm
        6
    herozzm  
       48 天前
    在 `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
        7
    hefish  
       48 天前
    用带 chatgpt 的 routeros 即可。。。
    lnc1995
        8
    lnc1995  
    OP
       48 天前
    @Kite6 这是不行的 ROS 下的客户端这时候获取的还是 ADG 的地址
    lnc1995
        9
    lnc1995  
    OP
       48 天前
    @herozzm 这是不行的 ROS 下的客户端这时候获取的还是 ADG 的地址
    lnc1995
        10
    lnc1995  
    OP
       48 天前
    @supemaomao 感觉这个好像有点可行性 关键是这个 VRRP 可以把 223.5.5.5 这种虚拟吗?我也没接触过 VRRP ,我想要的还是用公共 DNS 做后备切换,自建的一个就够用了。不知道你说的 VRRP 可不可以做到这点
    supemaomao
        11
    supemaomao  
       48 天前 via Android
    @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
        12
    herozzm  
       48 天前
    @lnc1995 将 DHCP 下发的 dns 设置成 ros 的 ip 即可
    lnc1995
        13
    lnc1995  
    OP
       48 天前
    @supemaomao 感觉符合我的需求,我来研究研究。不下发两个主要是 DNS 泄漏问题
    lnc1995
        14
    lnc1995  
    OP
       48 天前
    @herozzm 就是不想设置成 ROS 地址来着 这样 ADG 没法统计客户端
    herozzm
        15
    herozzm  
       48 天前
    同理啊,你在 up 和 down 里面设置脚本修改 dhcp 设置即可
    Yien
        16
    Yien  
       48 天前
    脚本配合
    ```
    /ip dhcp-server lease remove [find]
    ```
    试试
    jinqzzz
        17
    jinqzzz  
       48 天前
    nat 转发 ros:53 到 adg 可以正常统计
    jinqzzz
        18
    jinqzzz  
       48 天前
    VRRP 什么的都可以试试,你这么简单的网络,方法简直太多了
    neroxps
        19
    neroxps  
       47 天前 via iPhone
    emmm netwatch 用 ping 确认并不能百分百确认 dns 是否存活,因为 ag 挂了也会导致故障。
    建议用脚本向目的 dns 查询,如果查询成功就存活,查询失败三次就切换。
    1 做 dnat ,将所有目的地址是 53 的 udp 目的地址改写为 ros 地址,挟持所有 dns 流量。
    2 ros 做 dns server

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

    https://github.com/neroxps/RouterOS-Script/blob/master/Clash_dns_check.rsc
    lnc1995
        21
    lnc1995  
    OP
       47 天前
    @neroxps 我的难点并不在检测 而是怎么切换 DHCP 中不设置为 ROS 的话 切换不了
    lnc1995
        22
    lnc1995  
    OP
       47 天前
    @jinqzzz 并不行 统计的都是 ROS 的地址
    jinqzzz
        23
    jinqzzz  
       47 天前
    @lnc1995 既然说出来了,我肯定是自己试过可以的。翻了一下你的回复几乎都是复读,我也懒得贴我的配置了
    neroxps
        24
    neroxps  
       47 天前
    @lnc1995 [1] 步骤就解决了啊,挟持局域网所有的 DNS 到 ros 啊,然后 ros 上游给 ag
    keyfunc
        25
    keyfunc  
       47 天前
    我的 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
        26
    keyfunc  
       47 天前
    另外可以通过这个访问拦截一些常用的 dns 地址 8.8.8.8 之类的,可以防止 dns 泄漏和一些软件不使用系统 dns 之类的。
    keyfunc
        27
    keyfunc  
       47 天前
    @jinqzzz 咋实现的,是在 dns 那台机器上写路由规则吗?
    everfly
        28
    everfly  
       47 天前 via iPhone
    @keyfunc 你这后面两条规则有点奇怪,自己发起 dns 请求自己?那样肯定会导致统计规则失效的。为啥不把 dns 服务器 ip 放在另一个网段呢?这样就不需要那两条规则了。另外 ros 支持容器的,也可以建个 agh 的容器作为 dns 服务器用。
    keyfunc
        29
    keyfunc  
       47 天前
    @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
        30
    lnc1995  
    OP
       46 天前
    @jinqzzz 我说的统计是不同客户端,你都把 ROS Nat 了,ADG 还能区分不同客户端?
    jinqzzz
        31
    jinqzzz  
       46 天前 via iPhone
    @lnc1995 当然可以
    jinqzzz
        32
    jinqzzz  
       46 天前
    @keyfunc 我也遇到过同样的问题必须 masquerade ,后来在 mikrotik 论坛上找到过解决方案但是没有保存,现在改成了 VRRP ,就不再用 netwatch 和 nat 了(你拦截 8888 可能还需要保留)
    lnc1995
        33
    lnc1995  
    OP
       46 天前
    @jinqzzz 确实可以 搞定了这种方案
    lwq84510
        34
    lwq84510  
       46 天前
    dhcp 下发 dns1 adg, dns2 ros, dns1 adg 挂了会 fallback 到 dns2 ros, ros netwatch adg, 挂了和恢复了用脚本切 ros 的上游 dns
    lnc1995
        35
    lnc1995  
    OP
       46 天前 via Android
    @lwq84510 诶,卧槽,好像是啊,平时 ROS 上游也用 ADG ,挂了切一下上游…以前好像想复杂了啊…
    lwq84510
        36
    lwq84510  
       46 天前
    @lnc1995 #35 而且 adg 这个统计也只能是参考意义,设备不一定是按 dns1 不通 fallback dns2 ,可能是并发查询,这样 adg 还是会记录到很多来源是 ros 的查询
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2645 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 09:23 · PVG 17:23 · LAX 02:23 · JFK 05:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.