前文
原理
如架构图·,咱都是在一个机器里面的虚拟化,里面的机器互相起了bfd,那么当家宽灵车的时候,就用脚本把连接到聚合Merge的接口给down掉,那边bfd检测到便会进行切换。
完美的避开了BFD快速检测的特性x。(还是因为不好检测是否断网了,然后还是忘记缴费欠费了)
能跑就行的YF
脚本
把脚本扔到一个文件夹,然后丢进crontab执行即可(第一次可能要touch个log文件)
当三次curl不到target和ping不通一个地址后,将会把一个接口down掉(内网接口)
#!/bin/bash
down="eth1"
time=`date +%Y-%m-%d" "%H:%M:%S`
ping="223.5.5.5"
target="www.baidu.com"
function network()
{
#超时时间
local timeout=3
#获取响应状态码
local ret_code=`curl -I -s --connect-timeout ${timeout} ${target} -w %{http_code} | tail -n1`
if [ "x$ret_code" = "x200" ]; then
#网络畅通
return 1
else
#网络不畅通
return 0
fi
return 0
}
network
if [ $? -eq 0 ];then
# 写一个失败次数 (读取原本的)
if [ -e ./fail ];then
num=`cat ./fail`
else
num=0
fi
new=`expr $num + 1`
echo $new > ./fail
if [ $num -gt 2 ]; then
# 如果甚至还ping不通(也有可能是测试站挂了x)
# Todo 这里也触发一次远程提醒
ping -c 3 $ping > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo 1 > ./down
echo "Interface down ${down} - ${time}"
ifdown $down
else
echo "Ping ok ${ping} - ${time}"
fi
fi
echo "Curl fail: ${num} - ${time}"
exit -1
else
if [ -e ./fail ];then
rm ./fail
fi
# 如果存在把接口禁用了就重新启用接口
if [ -e ./down ]; then
echo "Interface up ${down} - ${time}"
ifup $down
rm ./down
fi
fi
# 清理Log
line=`wc -l < ./log`
if [ $line -gt 5 ];then
tail -3 ./log > ./log.temp
mv ./log.temp ./log
echo "Clear log - ${time}" >> ./log
fi
echo "Script finished! - ${time}"
exit 0
如何指定出口
那当然是使用frr的pbr啦x
interface ens22
pbr-policy VM
exit
pbr-map VM seq 100
match src-ip 192.168.20.10/32
set nexthop 192.168.10.102
exit
你也可以用mac或者其他判断方式