[LARTC] Using tc with iptables marking.

Linux Advanced Routing and Traffic Control

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Excuse the long first post but I thought I had better annotate the script I
have so far. I have been looking for a solution for keeping
my "interactive" browsing whilst people hammer my web-server (hosted inside
the dsl, port forwarded from the router). I've looked at scripts like the
wondershapper but I decided to roll my own as I'm already reasonably au-
fait with the iptables toolchain. The problem is it doesn't work as
expected but I may be missing something. Onwards with the config:

First I set-up iptables to mark outgoing packets (I don't bother with
incomming as ADSL is asymetric and its the upstream interface that
saturates)

    # Setup POSTROUTING marking on dsl output
    # needed for QoS type hacks
    # 1 - outgoing interactive (ssh)
    # 2 - outgoing file stuff (www)
    # 3 - incomming interactive (ssh)
    # 4 - incomming personal use (https, http-tunnel)
    # 5 - incomming web
    # 6 - incomming mail
    # 7 - everything else

    # create the to-dsl table (we can only shape outgoing traffic)
    /sbin/iptables -t mangle -N to-dsl

    # For outgoing packets we need to mark stuff
/sbin/iptables -t mangle -A to-dsl -p tcp --dport 22   -j MARK --set-mark 1
/sbin/iptables -t mangle -A to-dsl -p tcp --dport 80   -j MARK --set-mark 2
/sbin/iptables -t mangle -A to-dsl -p tcp --sport 24   -j MARK --set-mark 3
/sbin/iptables -t mangle -A to-dsl -p tcp --sport 443  -j MARK --set-mark 4
/sbin/iptables -t mangle -A to-dsl -p tcp --sport 8890 -j MARK --set-mark 4
/sbin/iptables -t mangle -A to-dsl -p tcp --sport 80   -j MARK --set-mark 5
/sbin/iptables -t mangle -A to-dsl -p tcp --sport 25   -j MARK --set-mark 6
     # turn it on
/sbin/iptables -t mangle -A POSTROUTING -o ppp0 -j to-dsl

This bit works great. I can do "watch -n 1 -d iptables -t mangle -nvL" and
watch packets get marked to the different rules as I expect. Then I
configure the tc bits thusly:

# root qdisc, shape the upload bandwidth to 256kbits
tc qdisc add dev ppp0 root handle 1: cbq avpkt 1000 bandwidth 256kbit rate
240kbit

#create the prioitiser
tc qdisc add dev ppp0 parent 1:0 handle 2: prio bands 6 priomap 0 1 2 3 4 5

# create sfq's for each class
tc qdisc add dev ppp0 parent 2:1 handle 10: sfq
tc qdisc add dev ppp0 parent 2:2 handle 20: sfq
tc qdisc add dev ppp0 parent 2:3 handle 30: sfq
tc qdisc add dev ppp0 parent 2:4 handle 40: sfq
tc qdisc add dev ppp0 parent 2:5 handle 50: sfq
tc qdisc add dev ppp0 parent 2:6 handle 60: sfq

#and now the filters
tc filter add dev ppp0 parent 2:0 protocol ip prio 1 handle 1 fw flowid 10:0
tc filter add dev ppp0 parent 2:0 protocol ip prio 2 handle 2 fw flowid 20:0
tc filter add dev ppp0 parent 2:0 protocol ip prio 3 handle 3 fw flowid 30:0
tc filter add dev ppp0 parent 2:0 protocol ip prio 4 handle 4 fw flowid 40:0
tc filter add dev ppp0 parent 2:0 protocol ip prio 5 handle 5 fw flowid 50:0
tc filter add dev ppp0 parent 2:0 protocol ip prio 6 handle 6 fw flowid 60:0

But when I do a "tc -s -d qdisc ls"

qdisc sfq 60: dev ppp0 quantum 1478b limit 128p flows 128/1024
 Sent 0 bytes 0 pkts (dropped 0, overlimits 0)

 qdisc sfq 50: dev ppp0 quantum 1478b limit 128p flows 128/1024
 Sent 0 bytes 0 pkts (dropped 0, overlimits 0)

 qdisc sfq 40: dev ppp0 quantum 1478b limit 128p flows 128/1024
 Sent 0 bytes 0 pkts (dropped 0, overlimits 0)

 qdisc sfq 30: dev ppp0 quantum 1478b limit 128p flows 128/1024
 Sent 0 bytes 0 pkts (dropped 0, overlimits 0)

 qdisc sfq 20: dev ppp0 quantum 1478b limit 128p flows 128/1024
 Sent 0 bytes 0 pkts (dropped 0, overlimits 0)

 qdisc sfq 10: dev ppp0 quantum 1478b limit 128p flows 128/1024
 Sent 90818614 bytes 64922 pkts (dropped 0, overlimits 0)

 qdisc prio 2: dev ppp0 bands 6 priomap  0 1 2 3 4 5 0 0 1 1 1 1 1 1 1 1
 Sent 92824232 bytes 66370 pkts (dropped 0, overlimits 0)

 qdisc cbq 1: dev ppp0 rate 240Kbit cell 8b (bounded,isolated) prio no-
transmit/8 weight 240Kbit allot 1478b
level 0 ewma 5 avpkt 1000b maxidle 1016us
 Sent 94712662 bytes 67725 pkts (dropped 0, overlimits 0)
  borrowed 0 overactions 0 avgidle 25026 undertime 0

I suspect the problem is due to me misunderstanding the way prio and
priomap work in relation to the filters. I've been looking for any good
examples that show iptables -j MARK, prio and filter being used together
but have yet to come up with any good ones. If I get this to work your
welcome to use it in the FAQ :-)


Alex
www.bennee.com/~alex/




[Index of Archives]     [LARTC Home Page]     [Netfilter]     [Netfilter Development]     [Network Development]     [Bugtraq]     [GCC Help]     [Yosemite News]     [Linux Kernel]     [Fedora Users]
  Powered by Linux