[packages] multiwan:
authorCraig M. Coffee <cmcoffee@gmail.com>
Fri, 18 Jun 2010 03:22:19 +0000 (03:22 +0000)
committerCraig M. Coffee <cmcoffee@gmail.com>
Fri, 18 Jun 2010 03:22:19 +0000 (03:22 +0000)
Routing tables now begin at 300+, to stay away from default routing tables.
Changed message for fastbalancer failure.
Changed QoS portion to allow more WANs, added check to make sure same interface doesnt receive qos configuration twice.
Restructured order of iptables so DNS comes last, and utilizing differnt fwmark for load balancing.

SVN-Revision: 21831

net/multiwan/Makefile
net/multiwan/files/usr/bin/multiwan

index 05ed6af1671d97901faf7249a76e1819485d8f28..4693a8fc3ef7775145bb9373841e04164c195488 100644 (file)
@@ -8,8 +8,8 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=multiwan
-PKG_VERSION:=1.0.12
-PKG_RELEASE:=2
+PKG_VERSION:=1.0.13
+PKG_RELEASE:=1
 
 include $(INCLUDE_DIR)/package.mk
 
@@ -25,7 +25,7 @@ endef
 define Package/multiwan/description
 An agent script that makes Multi-WAN configuration simple,
 easy and manageable. Complete with load balancing, failover and an easy
-to manage traffic ruleset. Allows for configuration of up to 9 wan links.
+to manage traffic ruleset.
 endef
 
 define Package/multiwan/conffiles
index 13d7e215abc5ec3b6401437c035316cac47a3a5c..8e40a974ed838e4a83a21b1f445844366df2565b 100755 (executable)
@@ -152,8 +152,6 @@ fi
 }
 
 acquire_wan_data() {
-if [ $wancount -lt 9 ]; then
-
 local ipaddr
 local gateway
 local ifname
@@ -198,8 +196,8 @@ check_old_map=`echo $wan_id_map 2>&1 | grep -o "$1\["`
                 if [ "$old_ifname" != "$ifname" ]; then
                iptables -D MultiWanPreHandler -t mangle -i $old_$ifname -m state --state NEW -j FW${get_wanid}MARK
                iptables -A MultiWanPreHandler -t mangle -i $ifname -m state --state NEW -j FW${get_wanid}MARK 
-               iptables -D MultiWanPostHandler -t mangle -o $old_$ifname -m mark --mark 0x123 -j FW${get_wanid}MARK
-               iptables -A MultiWanPostHandler -t mangle -o $ifname -m mark --mark 0x123 -j FW${get_wanid}MARK 
+               iptables -D MultiWanPostHandler -t mangle -o $old_$ifname -m mark --mark 0x1 -j FW${get_wanid}MARK
+               iptables -A MultiWanPostHandler -t mangle -o $ifname -m mark --mark 0x1 -j FW${get_wanid}MARK 
                 fi 
 
                 if [ "$ifname" != "x" -a "$ipaddr" != "x" -a "$gateway" != "x" ]; then
@@ -214,9 +212,6 @@ check_old_map=`echo $wan_id_map 2>&1 | grep -o "$1\["`
                 refresh_dns
                update_cache
        fi
-else
-wancount=9
-fi
 }
 
 update_cache() {
@@ -278,10 +273,6 @@ echo "## Refreshing Interfaces ##"
                ifup $group > /dev/null 2>&1 &
        done
 
-if [ ! -z "$CHKFORQOS" ]; then
-/etc/init.d/qos restart & > /dev/null 2>&1
-fi
-
 echo "## Unloaded, updating syslog and exiting. ##"
 mwnote "Succesfully Unloaded on $(exec date -R)."
 ip route flush cache
@@ -343,10 +334,10 @@ i=0
 while [ $i -lt $wancount ]; do 
 i=`expr $i + 1` 
 group=$(query_config group $i)
-iptables -t mangle -F MultiWanQoS_${group}
-iptables -t mangle -F MultiWanQoS_${group}_ct
-iptables -t mangle -X MultiWanQoS_${group}
-iptables -t mangle -X MultiWanQoS_${group}_ct
+iptables -t mangle -F ${group}
+iptables -t mangle -F ${group}_ct
+iptables -t mangle -X ${group}
+iptables -t mangle -X ${group}_ct
 done
 
 fi
@@ -360,15 +351,26 @@ local get_wan_iptables
 local add_qos_iptables
 local add_qos_tc
 local execute
+local iprule
+local qos_if_test
 local i 
 local p
 
 ifname=$(query_config ifname $1)
+iprule=$(expr $2 \* 10)
 
 if [ "$ifname" == "x" ]; then
 return
 fi
 
+qos_if_test=$(echo $qos_if_done | grep $ifname.)
+
+if [ ! -z "$qos_if_test" ]; then
+return
+fi
+
+qos_if_done=$(echo ${qos_if_done}.${ifname})
+
 queue_count=$(tc filter list dev $ifname | tail -n 1 | awk -F " " '{print $10}' | sed "s/0x//g")
 
 if [ -z "$queue_count" ]; then
@@ -377,15 +379,16 @@ fi
 
 queue_count=`expr $queue_count + 1`
 
-iptables -t mangle -N MultiWanQoS_${1}
-iptables -t mangle -N MultiWanQoS_${1}_ct
+iptables -t mangle -N ${1}
+iptables -t mangle -N ${1}_ct
 
 get_wan_tc=$(tc filter list dev $ifname | grep "0x" | sed -e "s/filter /tc filter add dev $ifname /g" -e "s/pref/prio/g" -e "s/fw//g") 
-get_wan_iptables=$(iptables-save | egrep  '(-A Default )|(-A Default_ct )' | grep -v "MultiWanQoS" | sed -e "s/Default /MultiWanQoS_${1} /g" -e "s/Default_ct /MultiWanQoS_${1}_ct /g" -e "s/-A/iptables -t mangle -A/g")
+get_wan_iptables=$(iptables-save | egrep  '(-A Default )|(-A Default_ct )' | grep -v "MultiWanQoS" | sed -e "s/Default /${1} /g" -e "s/Default_ct /${1}_ct /g" -e "s/-A/iptables -t mangle -A/g")
+
 
 i=0
 while [ $i -lt $queue_count ]; do 
-echo "s/\(0x$i \|0x$i\/0xffffffff\)/0x${2}${i} /g" >> /tmp/.mwan/qos.$1.sedfilter
+echo "s/\(0x$i \|0x$i\/0xffffffff\)/0x$(expr $iprule + $i) /g" >> /tmp/.mwan/qos.$1.sedfilter
 i=`expr $i + 1` 
 done
 
@@ -405,11 +408,11 @@ rm /tmp/.mwan/qos.$1.sedfilter
 
 i=0
 while [ $i -lt $queue_count ]; do
-  p=`expr $i + $2 \* 10`
+  p=`expr $i + $(expr $2 \* 10) + 300`
 if [ $i -lt $(expr $queue_count - 1) ]; then
-  ip rule add fwmark 0x$(expr $p + 1) table $(expr $2 \* 10) prio $(expr $p + 2)
+  ip rule add fwmark 0x$(expr $p + 1 - 300) table $(expr $iprule + 300) prio $(expr $p + 2)
 fi
-  iptables -t mangle -A MultiWanQoS -m mark --mark 0x$p -j MultiWanQoS_${1}
+  iptables -t mangle -A MultiWanQoS -m mark --mark 0x$(expr $p - 300) -j ${1}
   i=`expr $i + 1`
 done
 }
@@ -515,7 +518,8 @@ dns=$(echo $dns | sed -e "s/ /\n/g")
 if [ ! -z "$dns" -a "$failchk" != "x" -a "$ipaddr" != "x" -a "$gateway" != "x" -a "$ifname" != "x" ]; then
 echo "$dns" | while read dns_server 
 do
-       iptables -t mangle -A MultiWanDNS -d $dns_server -j FW${i}MARK
+       iptables -t mangle -A MultiWanDNS -d $dns_server -p tcp --dport 53 -j FW${i}MARK
+       iptables -t mangle -A MultiWanDNS -d $dns_server -p udp --dport 53 -j FW${i}MARK
 
                compile_dns="nameserver $dns_server"
                echo "$compile_dns" >> /tmp/resolv.conf.auto
@@ -570,7 +574,7 @@ iptables -t mangle -N MultiWanRules
 iptables -t mangle -N MultiWanDNS
 iptables -t mangle -N MultiWanPreHandler
 iptables -t mangle -N MultiWanPostHandler
-iptables -t mangle -N MultiWanFastBalancer
+iptables -t mangle -N MultiWanLoadBalancer
 
 echo "## Creating FW Rules ##"
 i=0
@@ -582,32 +586,32 @@ iptables -t mangle -A FW${i}MARK -j MARK --set-mark 0x${iprule}
 iptables -t mangle -A FW${i}MARK -j CONNMARK --save-mark
 done
 
-iptables -t mangle -A LoadBalancer -j MARK --set-mark 0x123
+iptables -t mangle -A LoadBalancer -j MARK --set-mark 0x1
 iptables -t mangle -A LoadBalancer -j CONNMARK --save-mark
 
 if [ -z "$CHKFORMODULE" ]; then
-iptables -t mangle -A FastBalancer -j MARK --set-mark 0x124
+iptables -t mangle -A FastBalancer -j MARK --set-mark 0x2
 iptables -t mangle -A FastBalancer -j CONNMARK --save-mark
 else
-mwnote "Fast Balancer is unavailable due to current kernel limitations.."
-mwnote "All Fast Balancer traffic will be diverted to the Load Balancer."
-iptables -t mangle -A FastBalancer -j MARK --set-mark 0x123
+mwnote "Performance load balancer(fastbalanacer) is unavailable due to current kernel limitations.."
+iptables -t mangle -A FastBalancer -j MARK --set-mark 0x1
 iptables -t mangle -A FastBalancer -j CONNMARK --save-mark
 fi
 
 iptables -t mangle -I PREROUTING -j MultiWan
 iptables -t mangle -I PREROUTING 2 -j MultiWanPreHandler
-iptables -t mangle -I PREROUTING 3 -j MultiWanDNS
-iptables -t mangle -I PREROUTING 4 -j MultiWanRules
-iptables -t mangle -I PREROUTING 5 -j MultiWanFastBalancer
+iptables -t mangle -I PREROUTING 3 -j MultiWanRules
+iptables -t mangle -I PREROUTING 4 -j MultiWanLoadBalancer
+iptables -t mangle -I PREROUTING 5 -j MultiWanDNS
+
 
 iptables -t mangle -I FORWARD -j MultiWan
 
 iptables -t mangle -I OUTPUT -j MultiWan
-iptables -t mangle -I OUTPUT 2 -j MultiWanDNS
-iptables -t mangle -I OUTPUT 3 -j MultiWanRules
-iptables -t mangle -I OUTPUT 4 -j MultiWanFastBalancer
-iptables -t mangle -I OUTPUT 5 -j MultiWanPostHandler
+iptables -t mangle -I OUTPUT 2 -j MultiWanRules
+iptables -t mangle -I OUTPUT 3 -j MultiWanLoadBalancer
+iptables -t mangle -I OUTPUT 4 -j MultiWanPostHandler
+iptables -t mangle -I OUTPUT 5 -j MultiWanDNS
 
 
 iptables -t mangle -I POSTROUTING -j MultiWan
@@ -635,7 +639,7 @@ i=`expr $i + 1`
 group=$(query_config group $i)
 ifname=$(query_config ifname $group)
 iptables -t mangle -A MultiWanPreHandler -i $ifname -m state --state NEW -j FW${i}MARK
-iptables -t mangle -A MultiWanPostHandler -o $ifname -m mark --mark 0x123 -j FW${i}MARK
+iptables -t mangle -A MultiWanPostHandler -o $ifname -m mark --mark 0x1 -j FW${i}MARK
 done
 
 if [ ! -z "$CHKFORQOS" ]; then
@@ -662,12 +666,12 @@ echo "## Refreshing Load Balancer ##"
 
 CHKIPROUTE=`cat /etc/iproute2/rt_tables | grep LoadBalancer`
  if [ -z "$CHKIPROUTE" ]; then
-echo "123     LoadBalancer" >> /etc/iproute2/rt_tables
+echo "300     LoadBalancer" >> /etc/iproute2/rt_tables
  fi
-ip rule del prio 123 > /dev/null 2>&1 
-ip route flush table 123 > /dev/null 2>&1
+ip rule del prio 300 > /dev/null 2>&1 
+ip route flush table 300 > /dev/null 2>&1
 
-        for TABLE in 123
+        for TABLE in 300
         do
                 ip route | grep link | grep -Ev ^default | while read ROUTE
                 do
@@ -675,7 +679,7 @@ ip route flush table 123 > /dev/null 2>&1
                 done
          done
 
-iptables -F MultiWanFastBalancer -t mangle
+iptables -F MultiWanLoadBalancer -t mangle
 
 total_weight=0
 
@@ -717,7 +721,7 @@ total_weight=$(expr $total_weight - $weight)
         fi
 
        if [ -z "$CHKFORMODULE" ]; then
-               iptables -A MultiWanFastBalancer -t mangle -m mark --mark 0x124 -m statistic --mode random --probability $rand_probability -j FW${i}MARK
+               iptables -A MultiWanLoadBalancer -t mangle -m mark --mark 0x2 -m statistic --mode random --probability $rand_probability -j FW${i}MARK
        fi
 fi
 
@@ -725,12 +729,12 @@ done
 
 pre_nexthop_chk=`echo $nexthop | awk -F "nexthop" '{print NF-1}'`
 if [ "$pre_nexthop_chk" == "1" ]; then
-ip route add default via $(echo $nexthop | awk -F " " '{print $3}') dev $(echo $nexthop | awk -F " " '{print $5}') proto static table 123
+ip route add default via $(echo $nexthop | awk -F " " '{print $3}') dev $(echo $nexthop | awk -F " " '{print $5}') proto static table 300
 elif [ "$pre_nexthop_chk" -gt "1" ]; then
-ip route add proto static table 123 default scope global $nexthop
+ip route add proto static table 300 default scope global $nexthop
 fi
 
-ip rule add fwmark 0x123 table 123 prio 123
+ip rule add fwmark 0x1 table 300 prio 300
 ip route flush cache
 }
 
@@ -753,7 +757,7 @@ gateway=$(query_config gateway $group)
 ifname=$(query_config ifname $group)
 ipaddr=$(query_config ipaddr $group)
 
-iprule=$(expr $i \* 10)
+iprule=$(expr $(expr $i \* 10) + 300)
 ip route flush table $iprule > /dev/null 2>&1
 
         for TABLE in $iprule
@@ -780,14 +784,14 @@ local group
 local gateway
 local ipaddr
 
-iprule=$(expr $1 \* 10)
+iprule=$(expr $(expr $1 \* 10) + 300)
 group=$(query_config group $1)
 gateway=$(query_config gateway $group)
 ipaddr=$(query_config ipaddr $group)
 
 CHKIPROUTE=`cat /etc/iproute2/rt_tables | grep MWAN${1}`
  if [ -z "$CHKIPROUTE" ]; then
-echo "$iprule      MWAN${1}" >> /etc/iproute2/rt_tables
+echo "$iprule     MWAN${1}" >> /etc/iproute2/rt_tables
  fi
 
 ip rule del prio $iprule > /dev/null 2>&1 
@@ -795,7 +799,7 @@ ip rule del prio $(expr $iprule + 1) > /dev/null 2>&1
 
 if [ "$gateway" != "x" -a "$ipaddr" != "x" ]; then
 ip rule add from $ipaddr table $iprule prio $iprule
-ip rule add fwmark 0x${iprule} table $iprule prio $(expr $iprule + 1)
+ip rule add fwmark 0x$(expr $iprule - 300) table $iprule prio $(expr $iprule + 1)
 fi
 }
 
@@ -809,7 +813,7 @@ ip rule flush > /dev/null 2>&1
 ip rule add lookup main prio 32766 > /dev/null 2>&1
 ip rule add lookup default prio 32767 > /dev/null 2>&1
 
-ip route flush table 123 > /dev/null
+ip route flush table 300 > /dev/null
 
        i=0
        while [ $i -lt $wancount ]; do 
@@ -971,6 +975,8 @@ elif [ "$icmp_hosts" == "disable" ]; then
 echo "$1.pass" >> $jobfile
 fi
 
+sh /usr/sbin/natloopback.sh $1 lan
+
 sleep $health_interval
 done
 }