PPP Loadbalance Debian
PPP Loadbalance Debian Script
<source lang=bash line start="0">
- !/bin/bash
- bal_local Load-balance internet connection over two local links
- Version: 1.0.0 - Fri, Sep 26, 2008
- Author: Niels Horn <[email protected]>
- Set devices:
DEV1=${1-eth0} # default eth0 DEV2=${2-ppp0} # default ppp0
- Get IP addresses of our devices:
ip1=`ifconfig $DEV1 | grep inet | awk '{ print $2 }' | awk -F: '{ print $2 }'` ip2=`ifconfig $DEV2 | grep inet | awk '{ print $2 }' | awk -F: '{ print $2 }'`
- Get default gateway for our devices:
gw1=`route -n | grep $DEV1 | grep '^0.0.0.0' | awk '{ print $2 }'` gw2=`route -n | grep $DEV2 | grep '^0.0.0.0' | awk '{ print $2 }'`
echo "$DEV1: IP=$ip1 GW=$gw1" echo "$DEV2: IP=$ip2 GW=$gw2"
- Definition of routes ###
- Check if tables exists, if not -> create them:
if [ -z "`cat /etc/iproute2/rt_tables | grep '^251'`" ] ; then echo "251 rt_dev1" >> /etc/iproute2/rt_tables fi if [ -z "`cat /etc/iproute2/rt_tables | grep '^252'`" ] ; then echo "252 rt_dev2" >> /etc/iproute2/rt_tables fi
- Define routing tables:
ip route add default via $gw1 table rt_dev1 ip route add default via $gw2 table rt_dev2
- Create rules:
ip rule add from $ip1 table rt_dev1 ip rule add from $ip2 table rt_dev2
- If we already have a 'nexthop' route, delete it:
if [ ! -z "`ip route show table main | grep 'nexthop'`" ] ; then ip route del default scope global fi
- Balance links based on routes:
ip route add default scope global nexthop via $gw1 dev $DEV1 weight 1 nexthop via $gw2 dev $DEV2 weight 1
- Flush cache table:
ip route flush cache
- All done...
</source>
Another loadbalance script
Source <source lang="bash" line start="0">
- !/bin/bash
- PPP Load Balancer Script #
- #
- Author: Neutron Soutmun #
- Created: 2008-04-28 #
- Copyright: © 2008 Neutron Soutmun <[email protected]> #
- License: GPL-2 #
VERSION=0.1.1
- LOG_DIR : Store the neccessary log files for ppp load balance processing.
LOG_DIR=/var/log/ppp-balance
- TABLE_PREFIX : The prefix for the table name that specified in
- /etc/iproute2/rt_tables for identification of route.
TABLE_PREFIX=isp
- GAMEONLINE_ROUTE_TO_IFNO : The interface number which desired to be the
- GameOnline routing path.
- You must set the netfilter rules for this function
- will work properly.
- To disable this, set it to -1
- Example netfilter rules:
- # iptables -t mangle -A PREROUTING -i eth0 -p tcp \
- -m multiport --dports 1025:65535 -j MARK --set-mark 0x4
- # iptables -t mangle -A PREROUTING -i eth0 -p udp \
- -m multiport --dports 1025:65535 -j MARK --set-mark 0x4
-
GAMEONLINE_ROUTE_TO_IFNO=3
- RELOAD_SQUID : Force to reload the squid config, workaround for the system
- that running squid process, disable set it to 0
RELOAD_SQUID=1
- VERBOSE : Verbose mode, display all logs and errors
- disable set it to 0.
VERBOSE=1
- Do not need to change below ###
IP=/sbin/ip IFCONFIG=/sbin/ifconfig SQUID=/etc/init.d/squid
RT_TABLES=/etc/iproute2/rt_tables
OLD_IF_FILE=${LOG_DIR}/old-if.log OLD_IF_COUNT_FILE=${LOG_DIR}/old-if-cnt.log OLD_RULE_FILE=${LOG_DIR}/old-rule.log NEXTHOP_FILE=${LOG_DIR}/nexthop.log REDIAL_LOG_FILE=${LOG_DIR}/redial.log TEMP_FILE=${LOG_DIR}/temp.log LOG_FILE=${LOG_DIR}/ppp-balance.log
log() {
timestamp=`date` if [ ${VERBOSE} -gt 0 ]; then echo "${timestamp}: $1" fi echo "${timestamp}: $1" >> ${LOG_FILE}
}
error() {
timestamp=`date` if [ ${VERBOSE} -gt 0 ]; then echo "${timestamp}: ERROR! - $1" fi echo "${timestamp}: ERROR! - $1" >> ${LOG_FILE} exit $2
}
- Check if the system ready ###
- Check log dir
if [ ! -d ${LOG_DIR} ]; then
mkdir -p ${LOG_DIR} || exit 1
fi
- Check neccessary program
if [ ! -f ${IP} ]; then
error "The 'iproute2' package is not installed properly ?!!" 1
fi
- Check pre-defined tables name
rt_tables=`cat ${RT_TABLES} | grep "200 ${TABLE_PREFIX}0" | wc -l` if [ $rt_tables -eq 0 ]; then
## Create the route tables name from prefix echo "" >> ${RT_TABLES} echo "#" >> ${RT_TABLES} echo "# Added by PPP Load Balancer" >> ${RT_TABLES} echo "#" >> ${RT_TABLES}
for (( i = 0; i < 10; i++ )); do echo "20${i} ${TABLE_PREFIX}${i}" >> ${RT_TABLES} done
fi
- Clear the temporary files
echo "" > ${TEMP_FILE}
del_old_rule () {
log "Removing old rules ..." ${IP} rule show | grep ${TABLE_PREFIX} | grep -v "all to" > ${OLD_RULE_FILE}
while read line do #echo $line line_ip=`echo $line | cut -d' ' -f3` line_table=`echo $line | cut -d' ' -f5` check=`echo ${line_table} | grep ${TABLE_PREFIX}` if [ $? -eq 0 ]; then log "${IP} rule del from ${line_ip} table ${line_table}" ${IP} rule del from ${line_ip} table ${line_table}
log "${IP} route flush table ${line_table}" ${IP} route flush table ${line_table} fi
done < ${OLD_RULE_FILE}
}
update_route () {
log "Updating new route ..." echo "" > ${NEXTHOP_FILE}
for PPP in ${PPP_LIST} do new_ppp=`cat ${TEMP_FILE} | grep ${PPP}` new_ip=`echo ${new_ppp} | cut -d':' -f2` new_tab=`echo ${new_ppp} | cut -d':' -f3` log "${IP} route add ${new_ip}/32 dev ${PPP} src ${new_ip} table ${new_tab}" ${IP} route add ${new_ip}/32 dev ${PPP} src ${new_ip} table ${new_tab}
log "${IP} route add default via ${new_ip} table ${new_tab}" ${IP} route add default via ${new_ip} table ${new_tab}
log "${IP} rule add from ${new_ip} table ${new_tab}" ${IP} rule add from ${new_ip} table ${new_tab}
log "nexthop via ${new_ip} dev ${PPP} weight 1" echo "nexthop via ${new_ip} dev ${PPP} weight 1 " >> ${NEXTHOP_FILE} 2>&1 done
}
update_default_route () {
log "Updating default route ..." nexthop=`cat ${NEXTHOP_FILE}` check=`echo $nexthop | grep nexthop | wc -l` if [ $check -gt 0 ]; then default_gw="${IP} route add default scope global equalize " log "${default_gw} ${nexthop}" ${IP} route del default ${default_gw} ${nexthop}
# Game online and other ports 1025:65535 go through the specified game path if [ ${GAMEONLINE_ROUTE_TO_IFNO} -gt -1 ]; then log "Adding GameOnline interception ..." ${IP} rule del fwmark 4 table ${TABLE_PREFIX}${GAMEONLINE_ROUTE_TO_IFNO} ${IP} rule add fwmark 4 table ${TABLE_PREFIX}${GAMEONLINE_ROUTE_TO_IFNO} fi fi
}
- MAIN ###
changes=0
- Gathering current PPP list
PPP_LIST=`${IFCONFIG} | grep ppp | cut -d' ' -f1` IF_COUNT=`${IFCONFIG} | grep ppp | cut -d' ' -f1 | wc -l`
for PPP in ${PPP_LIST} do
if_ip=`${IFCONFIG} ${PPP} | grep inet | cut -d':' -f2 | cut -d' ' -f 1` table_id=`echo ${PPP} | cut -d'p' -f4` check_old=`cat ${OLD_IF_FILE} | grep ${PPP}` check_ip=`echo ${check_old} | grep ${if_ip}` if [ $? -eq 1 ]; then # Some change in this device do update routing log "${PPP} Routing change...." changes=1 fi echo ${PPP}:${if_ip}:${TABLE_PREFIX}${table_id} >> ${TEMP_FILE}
done
if [ -f ${OLD_IF_COUNT_FILE} ]; then
OLD_IF_COUNT=`cat ${OLD_IF_COUNT_FILE}`
else
OLD_IF_COUNT=0
fi
if [ ${OLD_IF_COUNT} != ${IF_COUNT} ]; then
log "Links size changed!" changes=1
fi
if [ ${changes} -eq 1 ]; then
del_old_rule update_route update_default_route ${IP} route flush cache
if [ ${RELOAD_SQUID} -gt 0 ]; then log "Reloading SQUID config ..." ${SQUID} reload fi date >> ${REDIAL_LOG_FILE}
success=`${IP} route | grep nexthop | wc -l` if [ ${success} -gt 0 ]; then cp ${TEMP_FILE} ${OLD_IF_FILE} echo ${IF_COUNT} > ${OLD_IF_COUNT_FILE} log "Updated!" else rm -f ${OLD_IF_FILE} rm -f ${OLD_IF_COUNT_FILE} log "Update Pending! - Retry in the next time." fi
fi
- END ###
</source> Cron Job
nano /etc/cron.d/ppp-balance
*/1 * * * * root /usr/local/bin/ppp-balance.sh >/dev/null 2>&1
/etc/init.d/cron restart