PPP Loadbalance Debian

From MS Computech
Revision as of 15:45, 28 June 2009 by Snifer (talk | contribs)
Jump to: navigation, search

PPP Loadbalance Debian 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