PPP Loadbalance Debian

From MS Computech
Jump to: navigation, search

PPP Loadbalance Debian Script

<source lang=bash line start="0">

  1. !/bin/bash
  2. bal_local Load-balance internet connection over two local links
  3. Version: 1.0.0 - Fri, Sep 26, 2008
  4. Author: Niels Horn <[email protected]>
  1. Set devices:

DEV1=${1-eth0} # default eth0 DEV2=${2-ppp0} # default ppp0

  1. 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 }'`

  1. 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"

      1. Definition of routes ###
  1. 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

  1. Define routing tables:

ip route add default via $gw1 table rt_dev1 ip route add default via $gw2 table rt_dev2

  1. Create rules:

ip rule add from $ip1 table rt_dev1 ip rule add from $ip2 table rt_dev2

  1. 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

  1. 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

  1. Flush cache table:

ip route flush cache

  1. All done...

</source>


Another loadbalance script

Source <source lang="bash" line start="0">

  1. !/bin/bash
  1. PPP Load Balancer Script #
  2. #
  3. Author: Neutron Soutmun #
  4. Created: 2008-04-28 #
  5. Copyright: © 2008 Neutron Soutmun <[email protected]> #
  6. License: GPL-2 #

VERSION=0.1.1

  1. LOG_DIR : Store the neccessary log files for ppp load balance processing.

LOG_DIR=/var/log/ppp-balance

  1. TABLE_PREFIX : The prefix for the table name that specified in
  2. /etc/iproute2/rt_tables for identification of route.

TABLE_PREFIX=isp

  1. GAMEONLINE_ROUTE_TO_IFNO : The interface number which desired to be the
  2. GameOnline routing path.
  3. You must set the netfilter rules for this function
  4. will work properly.
  5. To disable this, set it to -1
  6. Example netfilter rules:
  7. # iptables -t mangle -A PREROUTING -i eth0 -p tcp \
  8. -m multiport --dports 1025:65535 -j MARK --set-mark 0x4
  9. # iptables -t mangle -A PREROUTING -i eth0 -p udp \
  10. -m multiport --dports 1025:65535 -j MARK --set-mark 0x4

GAMEONLINE_ROUTE_TO_IFNO=3

  1. RELOAD_SQUID : Force to reload the squid config, workaround for the system
  2. that running squid process, disable set it to 0

RELOAD_SQUID=1

  1. VERBOSE : Verbose mode, display all logs and errors
  2. disable set it to 0.

VERBOSE=1

      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

}

      1. Check if the system ready ###
  1. Check log dir

if [ ! -d ${LOG_DIR} ]; then

 mkdir -p ${LOG_DIR} || exit 1

fi

  1. Check neccessary program

if [ ! -f ${IP} ]; then

 error "The 'iproute2' package is not installed properly ?!!" 1

fi

  1. 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


  1. 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

}

      1. MAIN ###

changes=0

  1. 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

      1. 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

Another Loadbalance Script