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