Skip to main content

RouterOS v7 DNS 和网关热备

环境:

  • Mikrotik RB5009 作为PPPOE和DHCP主路由,IP: 10.0.1.1
  • Linux 同时作为网关和 dns 服务器,IP: 10.0.1.21 (后边可能会拆开)

DNS 热备(劫持)

DNS 热备方案是通过劫持发往 ROS 主路由 53 端口的流量到 dns 服务器实现的。

劫持发往 10.0.1.1:53 的流量到 10.0.1.21:53

/ip firewall nat
add action=dst-nat chain=dstnat comment=hijack-dns dst-address=10.0.1.1 dst-port=53 in-interface-list=LAN protocol=udp \
    src-address=!10.0.1.21 to-addresses=10.0.1.21 to-ports=53
add action=masquerade chain=srcnat comment=masquerade-dns dst-address=10.0.1.21 dst-port=53 protocol=udp src-address=\
    10.0.1.0/24
add action=dst-nat chain=dstnat comment=hijack-dns dst-address=10.0.1.1 dst-port=53 in-interface-list=LAN protocol=tcp \
    src-address=!10.0.1.21 to-addresses=10.0.1.21 to-ports=53
add action=masquerade chain=srcnat comment=masquerade-dns dst-address=10.0.1.21 dst-port=53 protocol=tcp src-address=\
    10.0.1.0/24

此时可以测试 10.0.1.1 和 10.0.1.21 和其他 dns 的结果: 我的测试方案是在 dns 服务器丢弃了 ipv6 结果,然后查询 cloudflare/github 域名的 A 记录

所谓热备,就是在 dns 服务器挂掉的时候,让 ros 自己的 dns 上线

配置 ros dns 为阿里公共dns, 并且做 dns 服务器时需要开启 allow-remote-requests

/ip dns
set allow-remote-requests=yes servers=223.5.5.5

使用 script 和 netwatch 来监控 dns 服务器是否在线

/system script
add dont-require-permissions=yes name=dns-hijack-up owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/ip/firewall/nat/enable [find comment=hijack-dns]\r\
    \n/ip/firewall/nat/enable [find comment=masquerade-dns]"
add dont-require-permissions=yes name=dns-hijack-down owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=\
    "/ip/firewall/nat/disable [find comment=hijack-dns]\r\
    \n/ip/firewall/nat/disable [find comment=masquerade-dns]"
/tool netwatch
add disabled=no down-script=dns-hijack-down host=10.0.1.21 http-codes="" test-script="" type=simple up-script=dns-hijack-up

此时可以测试 10.0.1.21 拔掉网线时,10.0.1.1 是否切换到了 ros 内置 dns 来解析域名,可以用 router.lan 来测试

设置 dhcp server 的默认 dns 为 10.0.1.1

/ip dhcp-server network
add address=10.0.1.0/24 dns-server=10.0.1.1 gateway=10.0.1.1

网关热备(VRRP)

我的主网关是 linux 主机,安装 keepalived; 备网关是 ros,使用 vrrp

在 linux 网关下线时,需要下级设备无感自动切换到备用 ros 网关

ROS 新建 vrrp 接口

/interface vrrp
add interface=bridge interval=500ms name=vrrp1 priority=100 vrid=51

绑定一个 ip (10.0.1.22) 到 vrrp 接口,

/ip address
add address=10.0.1.22 interface=vrrp1 network=10.0.1.22

linux 主机安装 keepalived, 编辑 /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
   vrrp_version 3
}

vrrp_instance VI_1 {
    state MASTER
    interface eno1
    virtual_router_id 51
    priority 130
    advert_int 0.5
    virtual_ipaddress {
        10.0.1.22
    }
}

state 为 MASTER, interface 为 lan 接口, virtual_router_id 需要和 vrrp 一致, priority 大于 vrrp, virtual_ipaddress 填写 vrrp ip 地址

此时路由已经默认走 10.0.1.22 出了,可以拔掉 linux 主机的网线来测试路由是否自动切换到 ros

dhcp server 里设置此 ip 为网关

/ip dhcp-server network
add address=10.0.1.0/24 dns-server=10.0.1.1 gateway=10.0.1.22