Redesign firewall and bandwidth scripts
authorNeutron Soutmun <neo.neutron@gmail.com>
Mon, 9 Feb 2009 12:30:04 +0000 (19:30 +0700)
committerNeutron Soutmun <neo.neutron@gmail.com>
Mon, 9 Feb 2009 12:30:04 +0000 (19:30 +0700)
2009-02-09  Neutron Soutmun <neo.neutron@gmail.com>

* example/{bandwidth,firewall}.sh.in:
- Redesign the firewall rules and the bandwidth management to support the
  bandwidth of the network interface.
- Reduce the bandwidth slots from 9998 to 9900, 100 slots approximately,
  reserved for the other purposes than the users bandwidth shapping.
* src/rh-task-bandwidth.c: Reduce the maximum slots respectively to
  new changes.

ChangeLog
example/bandwidth.sh.in
example/firewall.sh.in
src/rh-task-bandwidth.c

index 94ef9d9..0e28dea 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2009-02-09  Neutron Soutmun <neo.neutron@gmail.com>
+
+       * example/{bandwidth,firewall}.sh.in: 
+               - Redesign the firewall rules and the bandwidth management to support the 
+                 bandwidth of the network interface.
+               - Reduce the bandwidth slots from 9998 to 9900, 100 slots approximately, 
+                 reserved for the other purposes than the users bandwidth shapping.
+       * src/rh-task-bandwidth.c: Reduce the maximum slots respectively to 
+                 new changes.
+
 2009-01-29  Neutron Soutmun <neo.neutron@gmail.com>
 
        * lcfg/lcfg_static.{h,c}: New upstream release 0.2.0 of liblcfg.  
index 43e9125..c76d64d 100755 (executable)
@@ -12,45 +12,104 @@ IP=/sbin/ip
 INIT=@sysconfdir@/default/rahunas
 RUN=@localstatedir@/run/rahunas-bandwidth
 
-# Unclassified clients' bandwidth (Kbit)
-DOWN_UNCLASS=256
-UP_UNCLASS=256
+# Interface Speed (Kbit), Default: 100 Mbps
+INTERFACE_SPEED=102400
+
+DOWN_P2P=512
+UP_P2P=512 
 
 SHAPING_DOWN_INF=imq0
 SHAPING_UP_INF=imq1
 
+INTERFACE_ID=9999
+P2P_ID=9998
+
 test -f $INIT || exit 0
 . $INIT
 
 test "$RUN_DAEMON" = "yes" || exit 0
+test -f $RAHUNAS_CONFIG || exit 1
 
-start () {
-  # Downlink
-  $TC qdisc add dev $SHAPING_DOWN_INF root handle 1: htb default 9999
-  $TC class add dev $SHAPING_DOWN_INF parent 1: classid 1:9999 htb \
-    rate ${DOWN_UNCLASS}Kbit
+set -e
 
-  # Uplink
-  $TC qdisc add dev $SHAPING_UP_INF root handle 2: htb default 9999 
-  $TC class add dev $SHAPING_UP_INF parent 2: classid 2:9999 htb \
-    rate ${UP_UNCLASS}Kbit
+get_config_value () {
+  key=$1
+  cat $RAHUNAS_CONFIG | grep -v ^/ | grep -w "$key" | cut -d= -f2 | sed 's/^ *\(.*[^ ]\) *$/\1/' | sed 's/"//g'
+}
+
+BANDWIDTH_SHAPE_IMQ=`get_config_value bandwidth_shape_imq`
+BITTORRENT_BLOCK=`get_config_value bittorrent_block`
+
+test "$BANDWIDTH_SHAPE_IMQ" = "yes" || exit 0 
+
+interface_setting () {
+  case "$1" in
+    start)
+      # Interface Downlink
+      $TC qdisc add dev $SHAPING_DOWN_INF root handle 1: htb \
+        default ${INTERFACE_ID} 
+      $TC class add dev $SHAPING_DOWN_INF parent 1: classid 1:${INTERFACE_ID} \
+        htb rate ${INTERFACE_SPEED}Kbit
+
+      # Interface Uplink
+      $TC qdisc add dev $SHAPING_UP_INF root handle 2: htb \
+        default ${INTERFACE_ID} 
+      $TC class add dev $SHAPING_UP_INF parent 2: classid 2:${INTERFACE_ID} \
+        htb rate ${INTERFACE_SPEED}Kbit
+      ;;
+  stop)
+      # Interface Downlink
+      $TC qdisc del dev $SHAPING_DOWN_INF root
+
+      # Interface Uplink
+      $TC qdisc del dev $SHAPING_UP_INF root
+      ;;
+  esac
+}
+
+p2p_setting () {
+  case "$1" in
+    start)
+      # P2P Download throttling
+      $TC class add dev $SHAPING_DOWN_INF parent 1:${INTERFACE_ID} \
+        classid 1:${P2P_ID} htb rate ${DOWN_P2P}Kbit
+      $TC qdisc add dev $SHAPING_DOWN_INF parent 1:${P2P_ID} \
+        handle ${P2P_ID}: sfq perturb 10
+      $TC filter add dev $SHAPING_DOWN_INF parent 1: protocol ip prio 5 \
+        handle 0x3 fw classid 1:${P2P_ID}
+
+      # P2P Upload throttling
+      $TC class add dev $SHAPING_UP_INF parent 2:${INTERFACE_ID} \
+        classid 2:${P2P_ID} htb rate ${DOWN_P2P}Kbit
+      $TC qdisc add dev $SHAPING_UP_INF parent 2:${P2P_ID} \
+        handle ${P2P_ID}: sfq perturb 10
+      $TC filter add dev $SHAPING_UP_INF parent 2: protocol ip prio 5 \
+        handle 0x3 fw classid 2:${P2P_ID}
+      ;;
+    stop)
+      ;;
+  esac
+}
+
+start () {
+  interface_setting start
+  
+  test "$BITTORRENT_BLOCK" = "throttle" && p2p_setting start
 
   echo "Start OK"
 }
 
 stop () {
-  # Downlink
-  $TC qdisc del dev $SHAPING_DOWN_INF root
+  interface_setting stop
 
-  # Uplink
-  $TC qdisc del dev $SHAPING_UP_INF root
+  test "$BITTORRENT_BLOCK" = "throttle" && p2p_setting stop
 
   echo "Stop OK"
 }
 
 usage_add() {
   echo "Usage: $1 add ID IP DOWNSPEED UPSPEED"
-  echo "         ID - ID number from 1 to 9998"
+  echo "         ID - ID number from 1 to 9900"
   echo "         IP - IPv4 Address"
   echo "  DOWNSPEED - Download speed (bits/s)"
   echo "    UPSPEED - Upload speed (bits/s)"
@@ -58,7 +117,7 @@ usage_add() {
 
 usage_del() {
   echo "Usage: $1 del ID"
-  echo "         ID - ID number from 1 to 9998"
+  echo "         ID - ID number from 1 to 9900"
 }
 
 usage() {
@@ -75,16 +134,16 @@ bw_add() {
   echo "Add shaping slot id: $ID for $IP with D/U=$DOWNSPEED/$UPSPEED bits/s"
 
   # Downlink
-  $TC class add dev $SHAPING_DOWN_INF parent 1: classid 1:${ID} htb \
-    rate ${DOWNSPEED}bit ceil ${DOWNSPEED}bit
-  $TC filter add dev $SHAPING_DOWN_INF parent 1: protocol ip prio 1 \
-    u32 match ip dst ${IP}/32 flowid 1:${ID}
+  $TC class add dev $SHAPING_DOWN_INF parent 1:${INTERFACE_ID} \
+    classid 1:${ID} htb rate ${DOWNSPEED}bit ceil ${DOWNSPEED}bit
+  $TC filter add dev $SHAPING_DOWN_INF parent 1: \
+    protocol ip prio 1 u32 match ip dst ${IP}/32 flowid 1:${ID}
 
   # Uplink
-  $TC class add dev $SHAPING_UP_INF parent 2: classid 2:${ID} htb \
-    rate ${UPSPEED}bit ceil ${UPSPEED}bit
-  $TC filter add dev $SHAPING_UP_INF parent 2: protocol ip prio 1 \
-    u32 match ip src ${IP}/32 flowid 2:${ID}
+  $TC class add dev $SHAPING_UP_INF parent 2:${INTERFACE_ID} \
+    classid 2:${ID} htb rate ${UPSPEED}bit ceil ${UPSPEED}bit
+  $TC filter add dev $SHAPING_UP_INF parent 2: \
+    protocol ip prio 1 u32 match ip src ${IP}/32 flowid 2:${ID}
 }
 
 bw_del() {
@@ -102,8 +161,8 @@ bw_del() {
 
   # Class Removal
   # Downlink/Uplink
-  $TC class del dev $SHAPING_DOWN_INF parent 1: classid 1:${ID}
-  $TC class del dev $SHAPING_UP_INF parent 2: classid 2:${ID}
+  $TC class del dev $SHAPING_DOWN_INF parent 1:${INTERFACE_ID} classid 1:${ID}
+  $TC class del dev $SHAPING_UP_INF parent 2:${INTERFACE_ID} classid 2:${ID}
 }
 
 N=@sysconfdir@/rahunas/bandwidth.sh
index a11e1d6..d2c5ffa 100755 (executable)
@@ -67,11 +67,24 @@ CHAIN_INPUT_AUTH="${NAME}_input_authorized"
 CHAIN_FORWARD="${NAME}_forward"
 CHAIN_FORWARD_AUTH="${NAME}_forward_authorized"
 CHAIN_MANGLE_PREROUTING="${NAME}_mangle_prerouting"
+CHAIN_MANGLE_FORWARD="${NAME}_mangle_forward"
 CHAIN_MANGLE_POSTROUTING="${NAME}_mangle_postrouting"
 CHAIN_NAT_PREROUTING="${NAME}_nat_prerouting"
 CHAIN_NAT_POSTROUTING="${NAME}_nat_postrouting"
 CHAIN_NAT_AUTHEN="${NAME}_nat_authen"
 
+# P2P checking chains declaration
+CHAIN_P2P_DETECT="${NAME}_p2p_detect"
+CHAIN_P2P_RECHECK="${NAME}_p2p_recheck"
+CHAIN_P2P_CHECK="${NAME}_p2p_check"
+P2P_SET="rahunas_p2p"
+
+# Allow incoming to server
+SERVER_PORTS_ALLOW="80,443,8443,8888"
+
+# Intercept requesting ports
+SERVER_PORTS_INTERCEPT="80,8080,8088,3128"
+
 ##
 # Add set
 ##
@@ -90,6 +103,10 @@ add_set () {
   fi
   
   $IPSET -N $SETNAME rahunas $ipset_opt $ipset_ignoremac 
+
+  if [ "$BITTORRENT_BLOCK" = "throttle" ]; then
+    $IPSET -N $P2P_SET iphash
+  fi
 }
 
 ##
@@ -98,17 +115,23 @@ add_set () {
 cleanup_set () {
   $IPSET -F $SETNAME
   $IPSET -X $SETNAME
+
+  if [ "$BITTORRENT_BLOCK" = "throttle" ]; then
+    $IPSET -F $P2P_SET
+    $IPSET -X $P2P_SET 
+  fi
 }
 
 ##
 # Cleanup old rules
 ##
 cleanup () {
-  $IPTABLES -D INPUT -m connmark --mark 0x02 -j $CHAIN_INPUT_AUTH
+  $IPTABLES -D INPUT -m connmark --mark 2/2 -j $CHAIN_INPUT_AUTH
   $IPTABLES -D INPUT -j $CHAIN_INPUT
-  $IPTABLES -D FORWARD -m connmark --mark 0x02 -j $CHAIN_FORWARD_AUTH
+  $IPTABLES -D FORWARD -m connmark --mark 2/2 -j $CHAIN_FORWARD_AUTH
   $IPTABLES -D FORWARD -j $CHAIN_FORWARD
   $IPTABLES -t mangle -D PREROUTING -j $CHAIN_MANGLE_PREROUTING
+  $IPTABLES -t mangle -D FORWARD -j $CHAIN_MANGLE_FORWARD
   $IPTABLES -t mangle -D POSTROUTING -j $CHAIN_MANGLE_POSTROUTING
   $IPTABLES -t nat -D PREROUTING -j $CHAIN_NAT_PREROUTING
   $IPTABLES -t nat -D POSTROUTING -j $CHAIN_NAT_POSTROUTING
@@ -134,11 +157,25 @@ cleanup () {
   $IPTABLES -t nat -F $CHAIN_NAT_PREROUTING
   $IPTABLES -t nat -X $CHAIN_NAT_PREROUTING
   
+  $IPTABLES -t mangle -F $CHAIN_MANGLE_FORWARD
+  $IPTABLES -t mangle -X $CHAIN_MANGLE_FORWARD
+
   $IPTABLES -t nat -F $CHAIN_NAT_POSTROUTING
   $IPTABLES -t nat -X $CHAIN_NAT_POSTROUTING
   
   $IPTABLES -t nat -F $CHAIN_NAT_AUTHEN
   $IPTABLES -t nat -X $CHAIN_NAT_AUTHEN
+
+  if [ "$BITTORRENT_BLOCK" = "throttle" ]; then
+    $IPTABLES -t mangle -F $CHAIN_P2P_CHECK
+    $IPTABLES -t mangle -X $CHAIN_P2P_CHECK
+
+    $IPTABLES -t mangle -F $CHAIN_P2P_RECHECK
+    $IPTABLES -t mangle -X $CHAIN_P2P_RECHECK
+
+    $IPTABLES -t mangle -F $CHAIN_P2P_DETECT
+    $IPTABLES -t mangle -X $CHAIN_P2P_DETECT
+  fi
 }
 
 ##
@@ -150,10 +187,17 @@ new_chains () {
   $IPTABLES -N $CHAIN_FORWARD_AUTH
   $IPTABLES -N $CHAIN_FORWARD
   $IPTABLES -t mangle -N $CHAIN_MANGLE_PREROUTING
+  $IPTABLES -t mangle -N $CHAIN_MANGLE_FORWARD
   $IPTABLES -t mangle -N $CHAIN_MANGLE_POSTROUTING
   $IPTABLES -t nat -N $CHAIN_NAT_PREROUTING
   $IPTABLES -t nat -N $CHAIN_NAT_POSTROUTING
   $IPTABLES -t nat -N $CHAIN_NAT_AUTHEN
+
+  if [ "$BITTORRENT_BLOCK" = "throttle" ]; then
+    $IPTABLES -t mangle -N $CHAIN_P2P_CHECK
+    $IPTABLES -t mangle -N $CHAIN_P2P_RECHECK
+    $IPTABLES -t mangle -N $CHAIN_P2P_DETECT
+  fi
 }
 
 ##
@@ -177,11 +221,12 @@ rules () {
   # Init rules
   ##
   $IPTABLES -I INPUT -j $CHAIN_INPUT
-  $IPTABLES -I INPUT -m connmark --mark 0x02 -j $CHAIN_INPUT_AUTH
+  $IPTABLES -I INPUT -m connmark --mark 2/2 -j $CHAIN_INPUT_AUTH
   $IPTABLES -I FORWARD -j $CHAIN_FORWARD
-  $IPTABLES -I FORWARD -m connmark --mark 0x02 -j $CHAIN_FORWARD_AUTH
+  $IPTABLES -I FORWARD -m connmark --mark 2/2 -j $CHAIN_FORWARD_AUTH
 
   $IPTABLES -t mangle -I PREROUTING -j $CHAIN_MANGLE_PREROUTING
+  $IPTABLES -t mangle -I FORWARD -j $CHAIN_MANGLE_FORWARD
   $IPTABLES -t mangle -I POSTROUTING -j $CHAIN_MANGLE_POSTROUTING
 
   $IPTABLES -t nat -I PREROUTING -j $CHAIN_NAT_PREROUTING
@@ -210,7 +255,7 @@ rules () {
   ##
   # Allow incoming to our HTTP server for login page
   ##
-  $IPTABLES -A $CHAIN_INPUT -p tcp -m multiport --dports 80,8443,8888 -j ACCEPT
+  $IPTABLES -A $CHAIN_INPUT -p tcp -m multiport --dports $SERVER_PORTS_ALLOW -j ACCEPT
   
   ##
   # Allow incoming to our SSH server for remote maintenance access
@@ -252,12 +297,36 @@ rules () {
   fi
   
   ##
-  # Mark the connections that have been authorized to save rule check time
+  # Mark the connections that have been authorized
   ##
-  $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -m set --set rahunas_set dst -j CONNMARK --set-mark 0x2 
-  $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -m set --set rahunas_set src -j CONNMARK --set-mark 0x2 
+  $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -m set --set rahunas_set dst -j CONNMARK --set-mark 2 
+  $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -m set --set rahunas_set src -j CONNMARK --set-mark 2 
 
-  
+  ##
+  # P2P Throttle
+  ##
+  if [ "$BITTORRENT_BLOCK" = "throttle" ]; then
+    $IPTABLES -t mangle -A $CHAIN_MANGLE_FORWARD -m connmark --mark 2/2 -j $CHAIN_P2P_CHECK
+    $IPTABLES -t mangle -A $CHAIN_MANGLE_FORWARD -m set --set $P2P_SET src -j MARK --set-mark 3
+    $IPTABLES -t mangle -A $CHAIN_MANGLE_FORWARD -m set --set $P2P_SET dst -j MARK --set-mark 3
+
+
+    $IPTABLES -t mangle -A $CHAIN_P2P_CHECK -m layer7 --l7proto bittorrent -j $CHAIN_P2P_DETECT
+    $IPTABLES -t mangle -A $CHAIN_P2P_CHECK -m layer7 --l7proto bittorrent-announce -j $CHAIN_P2P_DETECT
+    $IPTABLES -t mangle -A $CHAIN_P2P_CHECK -m set --set $P2P_SET src -j $CHAIN_P2P_RECHECK
+    $IPTABLES -t mangle -A $CHAIN_P2P_CHECK -j RETURN
+
+
+    $IPTABLES -t mangle -A $CHAIN_P2P_DETECT -m recent --name $P2P_SET --update --seconds 600 -j RETURN
+    $IPTABLES -t mangle -A $CHAIN_P2P_DETECT -j SET --add-set $P2P_SET src
+    $IPTABLES -t mangle -A $CHAIN_P2P_DETECT -m recent --name $P2P_SET --set -j RETURN
+
+
+    $IPTABLES -t mangle -A $CHAIN_P2P_RECHECK -m recent --name $P2P_SET --rcheck --seconds 600 -j RETURN
+    $IPTABLES -t mangle -A $CHAIN_P2P_RECHECK -j SET --del-set $P2P_SET src
+    $IPTABLES -t mangle -A $CHAIN_P2P_RECHECK -m recent --name $P2P_SET --remove -j RETURN 
+  fi
+   
   ##
   # Accept Forwarding for the authorized clients
   ##
@@ -274,10 +343,10 @@ rules () {
     if [ "$TRANSPARENT_PROXY" = "yes" ]; then
       if [ "$PROXY_HOST" = "localhost" ]; then
         $IPTABLES -t nat -A $CHAIN_NAT_PREROUTING -p tcp --dport http \
-          -m connmark --mark 0x02 -j REDIRECT --to-ports $PROXY_PORT
+          -m connmark --mark 2/2 -j REDIRECT --to-ports $PROXY_PORT
       else
         $IPTABLES -t nat -A $CHAIN_NAT_PRETROUTING -p tcp --dport http \
-          -m connmark --mark 0x02 \
+          -m connmark --mark 2/2 \
           -j DNAT --to-destination ${PROXY_HOST}:${PROXY_PORT}
       fi
     fi
@@ -288,8 +357,8 @@ rules () {
   ##
   
   $IPTABLES -t nat -A $CHAIN_NAT_PREROUTING -p tcp -m multiport \
-    --dports 80,8080,8088,3128 -d ! $SERVER \
-    $DEV_IN_PARAM $DEV_LAN -m connmark ! --mark 0x2 \
+    --dports $SERVER_PORTS_INTERCEPT -d ! $SERVER \
+    $DEV_IN_PARAM $DEV_LAN -m connmark ! --mark 2/2 \
     -j $CHAIN_NAT_AUTHEN
   
   $IPTABLES -t nat -A $CHAIN_NAT_AUTHEN \
@@ -317,9 +386,9 @@ rules () {
   for excluded in $EXCLUDED;
   do
     $IPTABLES -t mangle -I $CHAIN_MANGLE_PREROUTING -s $excluded \
-      -j CONNMARK --set-mark 0x2
+      -j CONNMARK --set-mark 2
     $IPTABLES -t mangle -I $CHAIN_MANGLE_PREROUTING -d $excluded \
-      -j CONNMARK --set-mark 0x2
+      -j CONNMARK --set-mark 2
   done 
   
   ##
@@ -340,6 +409,7 @@ rules () {
   $IPTABLES -A $CHAIN_FORWARD_AUTH -j RETURN
   $IPTABLES -A $CHAIN_FORWARD -j RETURN
   $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -j RETURN
+  $IPTABLES -t mangle -A $CHAIN_MANGLE_FORWARD -j RETURN
   $IPTABLES -t mangle -A $CHAIN_MANGLE_POSTROUTING -j RETURN
   $IPTABLES -t nat -A $CHAIN_NAT_PREROUTING -j RETURN
   $IPTABLES -t nat -A $CHAIN_NAT_POSTROUTING -j RETURN
index 872ed95..b24d0ec 100644 (file)
@@ -23,9 +23,9 @@
      PAGE_SIZE = sizeof(short) * 8
 */
 
-#define MAX_SLOT_ID    9998
+#define MAX_SLOT_ID    9900
 #define PAGE_SIZE      16
-#define MAX_SLOT_PAGE  625
+#define MAX_SLOT_PAGE  619
 
 #define BANDWIDTH_WRAPPER "/etc/rahunas/bandwidth.sh"