Người xài CentOS hiếm có khó tìm, nên mình share ở đây cho riêng người dùng ... CentOS.
Mấy cái script sau đây có tác dụng tạo ra bảng định tuyến được load balance tại 1 Internet Gateway chạy CentOS 5.6, với giả định rằng các kênh Internet là pppoe phổ biến tại VN. Cái này đã chạy thực tế và nói chung khá ... ổn. 10.0.0.0/8 là subnet của bạn (thay bằng IP nào tuỳ bạn). Chú ý các dấu nháy xuôi ' và ngược ` nhé. Các file script đều phải có quyền execute.
Một lưu ý nữa là trong các file ifcfg-pppx, phải đặt tham số DEFROUTE=no. Nếu không nó phá hỏng bảng định tuyến cân bằng tải.
Các file /etc/ppp/ppp0-weight.conf, /etc/ppp/ppp1-weight.conf ... chứa nội dung:
Code:
Đây chính là "trọng lượng" của các kênh pppx (mặc định = 1 nếu ko có file định nghĩa), càng to thì càng được dồn lưu lượng nhiều. Việc NAT không nằm trong các script, bạn phải tự config.
cat /etc/ppp/ip-up.local
Code:
#!/bin/sh
#echo "Starting up pppd $1 $2 $3 $4 $5 $6"
table=`/usr/bin/perl -e '\$ARGV[0] =~ /ppp(\d)/ and print \$1+200' $1`
/sbin/ip route add 0.0.0.0/0 table $table dev $1
/sbin/ip rule add from $4 table $table
/sbin/ip rule add from $4 to 10.0.0.0/8 table main
exec /etc/ppp/ip-lb-up.local $1
cat /etc/ppp/ip-lb-up.local
Code:
#!/bin/sh
echo "Starting up load balancing for $1." >> /var/log/ppp.local.log
#get weight for this connection.
if [ -e "/etc/ppp/$1-weight.conf" ] ; then
. /etc/ppp/$1-weight.conf
else
WEIGHT=1
fi
#Get current list of default route.
DEFRT=`ip route list match 0/0`
echo "Current default routes:" >> /var/log/ppp.local.log
echo $DEFRT >> /var/log/ppp.local.log
#No default route, add it.
if [ "$DEFRT" == "" ] ; then
ip route add default dev $1
echo "weight $WEIGHT" > /etc/ppp/default-weight
exit;
fi
#Check if the dev is in route?
echo "$DEFRT" | grep $1
if [ $? == 0 ] ; then
echo "$1 is in route already" >> /var/log/ppp.local.log
exit;
fi
#Check if the default route is multiple already
echo "$DEFRT" | grep 'nexthop'
if [ $? == 1 ] ; then
OLDWEIGHT=`cat /etc/ppp/default-weight`
DEFRT=`echo "$DEFRT" | sed 's/default/default nexthop/'`
DEFRT="$DEFRT $OLDWEIGHT"
fi
#remove invalid options
DEFRT=`echo "$DEFRT" | sed 's/\n//g' | sed 's/proto static//g' | sed 's/scope link//g'`
ip route replace $DEFRT nexthop dev $1 weight $WEIGHT 2>> /var/log/ppp.local.log
#Save default route for restore later.
ip route list match 0/0 > /etc/ppp/default-lb-routes
echo "Done." >> /var/log/ppp.local.log
cat /etc/ppp/ip-down.local
Code:
#!/bin/sh
#echo "Shutting down pppd $1 $2 $3 $4 $5 $6"
table=`/usr/bin/perl -e '\$ARGV[0] =~ /ppp(\d)/ and print \$1+200' $1`
/sbin/ip route del 0.0.0.0/0 table $table dev $1
/sbin/ip rule del from $4 table $table
/sbin/ip rule del from $4 to 10.0.0.0/8 table main
exec /etc/ppp/ip-lb-down.local $1
cat /etc/ppp/ip-lb-down.local
Code:
#!/bin/sh
echo "Stopping load balancing for $1." >> /var/log/ppp.local.log
echo "LB-Routes:" >> /var/log/ppp.local.log
cat /etc/ppp/default-lb-routes >> /var/log/ppp.local.log
#Save default route for restore later.
grep -v "$1" /etc/ppp/default-lb-routes > /tmp/routes
DEFRT=`cat /tmp/routes`
cp -f /tmp/routes /etc/ppp/default-lb-routes
echo "Removed LB-Routes:" >> /var/log/ppp.local.log
echo $DEFRT >> /var/log/ppp.local.log
#No default route, remove the file.
if [ "$DEFRT" == "" ] ; then
echo "No entry in default-lb-routes"
rm -f /etc/ppp/default-lb-routes
exit;
fi
#remove invalid options
DEFRT=`echo "$DEFRT" | sed 's/\n//g' | sed 's/proto static//g' | sed 's/scope link//g'`
if [ "$DEFRT" != "" ] ; then
#Re-add the routes.
#ip route del default
ip route replace $DEFRT 2>> /var/log/ppp.local.log
fi
echo "Stop done." >> /var/log/ppp.local.log