拓扑描述:
主路由是Mikrotik RouteOS路由器,不做复杂操作,高稳定性实现上网需求,即使一两年也不需要重启,IP地址为192.168.88.1,同时做DHCP服务器。
OpenWRT是单臂旁挂路由(单网口),实现去广告等高级操作,IP地址为192.168.88.2。我实际用的是虚拟机X86方案,物理软路由原理一样。不让OpenWRT做主路由是考虑稳定性等各方面原因,如果OpenWRT已经是主路由了,那么就不涉及我描述的问题,可以忽略本文。 因为贴图提示发帖超过系统限制,所以把截图都删掉了,只好使用命令行来描述了
问题现象:
主路由DHCP服务器,在通过DHCP分配IP地址的时候,指定网关为软路由192.168.88.2。 /ip dhcp-server network add address=192.168.88.0/24 comment=defconf dns-server=192.168.88.8,192.168.88.1 gateway=192.168.88.8
当OpenWRT故障时,下面各种终端的网关仍然指向软路由192.168.88.2,而网关192.168.88.2实际不可达而无法上网。DHCP地址一旦分配完毕,DHCP服务器无法在租期内撤销已分配给终端的IP地址(DHCP协议不支持撤销动作),所以除非下面的各终端手动重新申请或因DHCP租期到期等原因,重新发起DHCP请求,申请了新的IP地址,并且把网关指向了192.168.88.1才能上网,否则持续无法联网。
方案:双路由之间运行VRRP协议
ROS与OpenWRT起VRRP协议,通过DHCP指定下一跳为虚拟网关192.168.88.8实现可靠性备份。 OpenWRT VRRP优先级高于ROS的优先级100,所以OpenWRT的虚拟网关192.168.88.8活跃,能正常转发流量,可以去广告等高级操作;当OpenWRT故障时,ROS自动升为主,虚拟网关192.168.88.8生效可以转发路由,能正常上网,但是没有高级特性了。
ROS VRRP协议配置: ROS上配置比较简单,新建一个VRRP接口,配置好参数,然后给这个VRRP接口配置虚拟网关IP地址192.168.88.8即可。Interface是指能发现OpenWRT的接口;VRID一定要和OpenWRT保持一致,我们设置为51;Priority是决定主备的优先级,这里采用默认的一百作为备份;Interval是VRRP报文检测间隔,默认1.00s即可。注意勾选抢占模式Preemption Mode,如果不勾选这个选项,即使OpenWRT挂了,ROS也不会升级为主。认证密码建议不用填写;版本号Version是2。 ROS上给这个VRRP配置IP地址,虚拟网关192.168.88.8。如果此时ROS是主VRRP,则地址正常;如果是备VRRP,则地址是红色的。
OpenWRT VRRP协议配置: OpenWRT上需要安装keepalived, opkg update & opkg install keepalived 因为没有界面,所以需要使用命令行修改配置文件 /etc/keepalived/keepalived.conf
root@OpenWrt:~# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived
global_defs { router_id LVS_DEVEL }
vrrp_instance VI_1 { interface br-lan #指定连接ROS的接口,默认为LAN接口的桥接 state BACKUP #默认状态是BACKUP,也可以指定为MASTER virtual_router_id 51 #和ROS保持一致即可 priority 110 # 本机优先级为110,主路由,ROS优先级为100 advert_int 1
virtual_ipaddress { 192.168.88.8 # 虚拟网关地址,和ROS保持一致 }
} root@OpenWrt:~#
修改完配置文件之后 /usr/sbin/keepalived -n -f /etc/keepalived/keepalived.conf & 即可,理论上修改了配置文件就可以默认自动启动此服务了,也可以使用 service keepalived enable来增加开机自动启。
root@OpenWrt:~# ps -ef | grep keepalived
26128 root 5052 S /usr/sbin/keepalived -n -f /etc/keepalived/keepalived.conf 26130 root 5060 S /usr/sbin/keepalived -n -f /etc/keepalived/keepalived.conf 31895 root 1076 R grep keepalived root@OpenWrt:~# service keepalived status running root@OpenWrt:~# service keepalived enable
root@OpenWrt:~#
之后如果ROS上VRRP的状态标记是B(表示Backup),且其他主机ping虚拟网关192.168.88.8可以通,则设置完成。
中间可能遇到的问题:
1. keepalived在OpenWRT有两个版本,我使用的是scolate编译的2020/7/18懒人版,5.4.50内核,最新的Keepalived v2.0.20 (04/21,2020), 也有一个老的Keepalived v1.4.5版本,二者对于库的依赖关系不同。安装的时候会折腾出一些libip4tc.so.0和libip6tc.so.0等依赖性之类的问题,这个挺折腾的,如果对linux不熟悉,建议使用默认的版本。我之前一个版本折腾了好长时间,因为需要的库是libip4tc.so.0,已经安装了更新版本的libip4tc.so.2,所以尝试通过软链接解决这个问题。
root@OpenWrt:~# cd /usr/lib
root@OpenWrt:/usr/lib# ln -s libip4tc.so.2 libip4tc.so.0
//增加一个软连接,指向当前已经安装的库即可
root@OpenWrt:/usr/lib# ll /usr/lib/libip4tc*
lrwxrwxrwx 1 root root 13 Jul 18 15:48 /usr/lib/libip4tc.so.0 -> libip4tc.so.2*
我使用的清华大学最新版本镜像,默认下载的就是最新版Keepalived v2.0.20。
src/gz openwrt_core https://mirrors.tuna.tsinghua.ed ... ets/x86/64/packages
src/gz openwrt_base https://mirrors.tuna.tsinghua.ed ... ackages/x86_64/base
src/gz openwrt_freifunk https://mirrors.tuna.tsinghua.ed ... ges/x86_64/freifunk
src/gz openwrt_luci https://mirrors.tuna.tsinghua.ed ... ackages/x86_64/luci
src/gz openwrt_packages https://mirrors.tuna.tsinghua.ed ... ges/x86_64/packages
src/gz openwrt_routing https://mirrors.tuna.tsinghua.ed ... ages/x86_64/routing
src/gz openwrt_telephony https://mirrors.tuna.tsinghua.ed ... es/x86_64/telephony
|