Difference between revisions of "PPP Loadbalance Debian"
Line 2: | Line 2: | ||
[http://neutron.debianclub.com/neutron/projects/ppp-balance/ppp-balance.sh Source] | [http://neutron.debianclub.com/neutron/projects/ppp-balance/ppp-balance.sh Source] | ||
− | + | ||
<source lang:"bash"> | <source lang:"bash"> | ||
#!/bin/bash | #!/bin/bash | ||
Line 246: | Line 246: | ||
### END ### | ### END ### | ||
</source> | </source> | ||
− | + | ||
Cron Job | Cron Job | ||
<pre>nano /etc/cron.d/ppp-balance | <pre>nano /etc/cron.d/ppp-balance |
Revision as of 15:30, 28 June 2009
PPP Loadbalance Debian Script
<source lang:"bash">
- !/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