最近在做freeradius的高可用配置,使用lvs的vip做輪詢: freeradius的配置見前面的文章; 下麵是lvs的keepalived的配置: global_defs { router_id LVS_DEVEL_TEST } vrrp_sync_group LVS_RA { group ...
最近在做freeradius的高可用配置,使用lvs的vip做輪詢:
freeradius的配置見前面的文章;
下麵是lvs的keepalived的配置:
global_defs {
router_id LVS_DEVEL_TEST
}
vrrp_sync_group LVS_RA {
group {
VI_1
}
}
vrrp_instance VI_1 {
state MASTER #主備
interface eth0
virtual_router_id 123 #區域網內的唯一標識
priority 80 #優先順序
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
x.x.x.x #虛擬ip地址
}
debug
}
virtual_server x.x.x.x 1812 { #虛擬ip地址 UDP埠
delay_loop 6
lb_algo sh #調度演算法
lb_kind TUN #lvs的轉發模式
protocol UDP #UDP協議
real_server x.x.x.x 1812 { #real IP地址和UDP埠
MISC_CHECK { #MISC的檢測方式
misc_path "/data/shell/UDP_CHECK.sh x.x.x.x 1812" #UDP的檢測腳本如下
misc_timeout 10 #腳本執行超時時間
misc_dynamic
}
}
real_server x.x.x.x 1812 {
MISC_CHECK {
misc_path "/data/shell/UDP_CHECK.sh x.x.x.x 1812"
misc_timeout 10
misc_dynamic
}
}
}
UDP檢測腳本/data/shell/UDP_CHECK.sh:
#!/bin/bash
/usr/bin/nc -uz -w1 $1 $2 | grep succeeded > /dev/null
exit $?
註意:freeradius和keepalived不能在一臺伺服器上,會對包的轉發產生影響
下麵需要在real上綁定一下vip並且腳本需放到/etc/rc.d/init.d/目錄底下,綁定腳本addVIP內容如下:
#!/bin/bash
IPADDR=(x.x.x.x) //填寫VIP地址
NUM=`expr ${#IPADDR[*]} - 1`
start_vip(){
for i in `seq 0 $NUM`;do
ifconfig lo:$i ${IPADDR[$i]} broadcast ${IPADDR[$i]} netmask 255.255.255.255 up
route add -host ${IPADDR[$i]} dev lo:$i
done
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "0">/proc/sys/net/ipv4/conf/all/rp_filter
echo "0">/proc/sys/net/ipv4/conf/eth0/rp_filter
echo "0">/proc/sys/net/ipv4/conf/lo/rp_filter
echo "0">/proc/sys/net/ipv4/conf/default/rp_filter
/sbin/sysctl -p >/dev/null 2>&1
}
stop_vip(){
for i in `seq 0 $NUM`;do
/sbin/route del -host ${IPADDR[$i]} dev lo:$i
/sbin/ifconfig lo:$i ${IPADDR[$i]} broadcast ${IPADDR[$i]} netmask 255.255.255.255 down
done
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "0" >/proc/sys/net/ipv4/ip_forward
echo "1">/proc/sys/net/ipv4/conf/all/rp_filter
echo "1">/proc/sys/net/ipv4/conf/eth0/rp_filter
echo "1">/proc/sys/net/ipv4/conf/lo/rp_filter
echo "1">/proc/sys/net/ipv4/conf/default/rp_filter
/sbin/sysctl -p >/dev/null 2>&1 //這裡的文件不一定全部存在,主要看系統
}
case $1 in
start|START)
start_vip
if [ $? == "0" ];then
echo "setting vip success"
else
echo "setting vip fault"
fi
;;
stop|STOP)
stop_vip
if [ $? == "0" ];then
echo "remove vip success"
else
echo "remove vip fault"
fi
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac
在real上執行此腳本(前提是給定執行許可權):#/etc/rc.d/init.d/addVIP start
綁定效果如下;
開啟lvs伺服器的keepalived服務,如果freeradius服務正常,則lvs看到效果如下:
最後找一臺伺服器用radius的測試命令radtest去測試吧!
說明一下為什麼需要在real伺服器上綁定VIP:在 DR 模式下,由於 UDP 是無連接狀態的,當 RS 回應結果時預設採用原先的地址,Client 在轉發數據包時,源地址不是原先請求的 IP(VS IP),所以會存 在問題 。