From 95ffbbad9b316e8039d39cb1653de7985645cea9 Mon Sep 17 00:00:00 2001 From: teastep Date: Thu, 13 Oct 2005 20:19:31 +0000 Subject: [PATCH] Minor traffic shaping additions git-svn-id: https://shorewall.svn.sourceforge.net/svnroot/shorewall/trunk@2875 fbd18981-670d-0410-9b5c-8dc0c1a9a2bb --- Shorewall-docs2/MAC_Validation.xml | 19 ++- Shorewall-docs2/images/QoS.png | Bin 22195 -> 36494 bytes Shorewall-docs2/traffic_shaping.xml | 213 ++++++++++++++++------------ 3 files changed, 142 insertions(+), 90 deletions(-) diff --git a/Shorewall-docs2/MAC_Validation.xml b/Shorewall-docs2/MAC_Validation.xml index 4fc79dbca..b2f75cc71 100644 --- a/Shorewall-docs2/MAC_Validation.xml +++ b/Shorewall-docs2/MAC_Validation.xml @@ -15,7 +15,7 @@ - 2005-08-31 + 2005-10-13 2001-2005 @@ -73,7 +73,7 @@
Components - There are four components to this facility. + There are six components to this facility. @@ -136,6 +136,21 @@ MACLIST_TTL="" or is specified as zero then 'maclist' lookups will not be cached). + + + Beginning with Shorewall 2.4.6, the MACLIST_TABLE variable in /etc/shorewall/shorewall.conf. Normally, MAC + verification occurs in the filter table (INPUT and FORWARD) chains. + When forwarding a packet from an interface with MAC verification to a + bridge interface, that doesn't work. + + This problem can be worked around by setting + MACLIST_TABLE=mangle which will cause MAC verification to occur out of + the PREROUTING chain. Because REJECT isn't available in that + environment, you may not specify MACLIST_DISPOSITION=REJECT with + MACLIST_TABLE=mangle. +
diff --git a/Shorewall-docs2/images/QoS.png b/Shorewall-docs2/images/QoS.png index 029a4ebd114f91b3bb839572e6bc19f66c1bc035..a9288b6ab2915bd19e4df2c35bcd058e68f59fa3 100644 GIT binary patch literal 36494 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 z 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 literal 22195 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

f-^Z?(I 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 - 2005-10-08 + 2005-10-13 2001-2004 @@ -58,10 +58,11 @@ The support for traffic shaping and control still does not cover all options available (and especially all algorithms that can be used to queue traffic) in the Linux kernel but it should fit most needs. If you are - using your own script for traffic control and you still want to use it - in the future, you will find information on how to do this, - later in this document. But for this to work, you will also need to - enable traffic shaping in the kernel and Shorewall as covered by the next sections. + using your own script for traffic control and you still want to use it in + the future, you will find information on how to do this, later in this document. But for this to work, + you will also need to enable traffic shaping in the kernel and Shorewall + as covered by the next sections.

@@ -85,38 +86,38 @@ For Shorewall traffic shaping we use two algorithms, one is called HTB (Hierarchical Token Bucket) and SFQ (Stochastic Fairness Queuing). SFQ is easy to explain: it just tries to track your connections (tcp or udp - streams) and balances the traffic between them. This normally works well. HTB - allows you to define a set of classes, and you can put the traffic you + streams) and balances the traffic between them. This normally works well. + HTB allows you to define a set of classes, and you can put the traffic you want into these classes. You can define minimum and maximum bandwitdh - settings for those classes and order them hierachically (the less priorized - classes only get bandwitdth if the more important have what they need). - Shorewall builtin traffic shaping allows you to define these classes (and - their bandwidth limits), and it uses SFQ inside these classes to make - sure, that different data streams are handled equally. + settings for those classes and order them hierachically (the less + priorized classes only get bandwitdth if the more important have what they + need). Shorewall builtin traffic shaping allows you to define these + classes (and their bandwidth limits), and it uses SFQ inside these classes + to make sure, that different data streams are handled equally. You can only shape outgoing traffic. The reason for this is simple, the packets were already received by your network card before you can decide what to do with them. So the only choice would be to drop them - which does normally makes no sense (since you received the packet already, - it went through the possible bottleneck (the incoming connection). The - next possible bottleneck might come if the packet leaves on another - interface, so this will be the place where queuing might occur. So, - defining queues for incoming packages is not very useful, you just want to - have it forwarded to the outgoing interface as fast as possible. + which normally makes no sense (since you received the packet already, it + went through the possible bottleneck (the incoming connection). The next + possible bottleneck might come if the packet leaves on another interface, + so this will be the place where queuing might occur. So, defining queues + for incoming packages is not very useful, you just want to have it + forwarded to the outgoing interface as fast as possible. There is one exception, though. Limiting incoming traffic to a value a bit slower than your actual line speed will avoid queueing on the other end of that connection. This is mostly useful if you don't have access to traffic control on the other side and if this other side has a faster network connection than you do (the line speed between the systems is the - bottleneck, e.g. a DSL connection to you providers router, the router itself - is normally connected to a much faster backbone). So, if you - drop packages that are coming in too fast, the underlaying protocol might + bottleneck, e.g. a DSL connection to you providers router, the router + itself is normally connected to a much faster backbone). So, if you drop + packages that are coming in too fast, the underlaying protocol might recognize this and slow down the connection. TCP has a builtin mechanism for this, UDP has not (but the protocol over UDP might recognize it , if there is any). - The reason why qeueing is bad in these cases is, that you might have + The reason why queing is bad in these cases is, that you might have packets which need to be priorized over others, e.g. VoIP or ssh. For this type of connections it is important that packets arrive in a certain amount of time. For others like http downloads, it does not really matter @@ -126,6 +127,44 @@ does not care about QoS or the QoS bits are not set properly, your important packets will go into the same queue as your less timecritical download packets which will result in a large delay. + + You shape and control outgoing traffic by assigning the traffic to + classes. Each class is associated with exactly one + network interface and has a number of attributes: + + + + PRIORITY - Used to give preference to one class over another + when selecting a packet to send. The priority is a numeric value with + 1 being the highest priority, 2 being the next highest, and so + on. + + + + RATE - The minimum bandwidth this class should get, when the + traffic load rises. Classes with a higher priority (lower PRIORITY + value) are served even if there are others that have a guaranteed + bandwith but have a lower priority (higher PRIORITY value). + + + + CEIL - The maximum bandwidth the class is allowed to use when + the link is idle. + + + + MARK - Netfilter has a facility for + marking packets. Packet marks have a numberic + value which is limited in Shorewall to the values 1-255. You assign + packet marks to different types of traffic using entries in the + /etc/shorewall/tcrules file. + + + + One class for each interface must be designated as the + default class. This is the class to which unmarked + traffic (packets to which you have not assigned a mark value in + /etc/shorewall/tcrules) is assigned.
@@ -178,28 +217,28 @@ For defining bandwidths (for either devices or classes) please use kbit or kbps(for Kilobytes per second) and make sure there is NO space - between the number and the unit (it is 100kbit not - 100 kbit). Using mbit, mbps or a raw number (which means bytes) could be used, - but note that only integer numbers are supported (0.5 is not + role="bold">NO space between the number and the unit (it is + 100kbit not 100 kbit). Using mbit, mbps + or a raw number (which means bytes) could be used, but note that only + integer numbers are supported (0.5 is not valid). To properly configure the settings for your devices you might need to find out, the real up- and downstream rates you have. This is especially the case, if you are using a DSL connection or one of another - type that do not have a guaranteed bandwidth.Don't trust the - values your provider tells you for this, especially measuring the real - download speed is important! There are several online - tools that help you find out, search for "dsl speed test" on google (For Germany you - can use arcor speed - check). Be sure to choose a test located near you. + type that do not have a guaranteed bandwidth.Don't trust the values your + provider tells you for this, especially measuring the real download speed + is important! There are several online tools that help you find out, + search for "dsl speed test" on google (For Germany you can use arcor speed + check). Be sure to choose a test located near you.
/etc/shorewall/tcrules The fwmark classifier provides a convenient way to classify - packets for traffic shaping. The /etc/shorewall/tcrules file - is used for specifying these marks in a tabular fashion. + packets for traffic shaping. The /etc/shorewall/tcrules + file is used for specifying these marks in a tabular fashion. Normally, packet marking occurs in the PREROUTING chain before any address rewriting takes place. This makes it impossible to mark inbound @@ -478,26 +517,25 @@ ppp0 6000kbit 500kbit should do. You are free to change it...
- tcdevices file + tcdevices file - #INTERFACE IN-BANDWITH OUT-BANDWIDTH + #INTERFACE IN-BANDWITH OUT-BANDWIDTH ppp0 5000kbit 500kbit +
-
- tcclasses file + tcclasses file - #INTERFACE MARK RATE CEIL PRIORITY OPTIONS + #INTERFACE MARK RATE CEIL PRIORITY OPTIONS ppp0 1 full full 1 tcp-ack,tos-minimize-delay ppp0 2 9*full/10 9*full/10 2 default ppp0 3 8*full/10 8*full/10 2 +
-
+
+ tcrules file -
- tcrules file - - #MARK SOURCE DEST PROTO PORT(S) CLIENT USER + #MARK SOURCE DEST PROTO PORT(S) CLIENT USER # PORT(S) 1:P 0.0.0.0/0 0.0.0.0/0 icmp echo-request 1:P 0.0.0.0/0 0.0.0.0/0 icmp echo-reply @@ -505,20 +543,20 @@ ppp0 3 8*full/10 8*full/10 2 # mldonkey 3 0.0.0.0/0 0.0.0.0/0 udp - 4666 - Wondershaper allows you to define a set of hosts and/or ports - you want to classify as low priority. To achieve this , you have to - add these hosts to tcrules and set the mark to 3 (true if you use the - example configuration files). + Wondershaper allows you to define a set of hosts and/or ports + you want to classify as low priority. To achieve this , you have to + add these hosts to tcrules and set the mark to 3 (true if you use + the example configuration files). +
-
-
- Setting hosts to low priority +
+ Setting hosts to low priority - lets assume the following settings from your old wondershaper - script (don't assume these example values are really useful, they are - only used for demonstrating ;-): + lets assume the following settings from your old wondershaper + script (don't assume these example values are really useful, they + are only used for demonstrating ;-): - + # low priority OUTGOING traffic - you can leave this blank if you want # low priority source netmasks NOPRIOHOSTSRC="192.168.1.128/25 192.168.3.28" @@ -532,66 +570,65 @@ NOPRIOPORTSRC="6662 6663" # low priority destination ports NOPRIOPORTDST="6662 6663" - This would result in the following additional settings to the - tcrules file: + This would result in the following additional settings to the + tcrules file: - 3 192.168.1.128/25 0.0.0.0/0 all + 3 192.168.1.128/25 0.0.0.0/0 all 3 192.168.3.28 0.0.0.0/0 all 3 0.0.0.0/0 60.0.0.0/24 all 3 0.0.0.0/0 0.0.0.0/0 udp 6662,6663 3 0.0.0.0/0 0.0.0.0/0 udp - 6662,6663 3 0.0.0.0/0 0.0.0.0/0 tcp 6662,6663 3 0.0.0.0/0 0.0.0.0/0 tcp - 6662,6663 -
+
+
A simple setup - - This is a simple setup for people sharing an internet connection - and using different computers for this. It just basically shapes - between 2 hosts which have the ip addresses 192.168.2.23 and - 192.168.2.42 - -
- tcdevices file - #INTERFACE IN-BANDWITH OUT-BANDWIDTH + This is a simple setup for people sharing an internet connection + and using different computers for this. It just basically shapes + between 2 hosts which have the ip addresses 192.168.2.23 and + 192.168.2.42 + +
+ tcdevices file + + #INTERFACE IN-BANDWITH OUT-BANDWIDTH ppp0 6000kbit 700kbit - We have 6mbit down and 700kbit upstream. - -
-
- tcclasses file + We have 6mbit down and 700kbit upstream. +
- #INTERFACE MARK RATE CEIL PRIORITY OPTIONS +
+ tcclasses file + + #INTERFACE MARK RATE CEIL PRIORITY OPTIONS ppp0 1 10kbit 50kbit 1 tcp-ack ppp0 2 300kbit full 2 ppp0 3 300kbit full 2 ppp0 4 90kbit 200kbit 3 default - We add a class for tcp ack packets with highest priority, so - that downloads are fast. The following 2 classes share most - of the bandwidth between the 2 hosts, if the connection is idle, - they may use full speed. As the hosts should be treated equally - they have the same priority. The last class is for the remaining traffic. + We add a class for tcp ack packets with highest priority, so + that downloads are fast. The following 2 classes share most of the + bandwidth between the 2 hosts, if the connection is idle, they may + use full speed. As the hosts should be treated equally they have the + same priority. The last class is for the remaining traffic. +
-
+
+ tcrules file -
- tcrules file - - #MARK SOURCE DEST PROTO PORT(S) CLIENT USER + #MARK SOURCE DEST PROTO PORT(S) CLIENT USER # PORT(S) 1:P 0.0.0.0/0 0.0.0.0/0 icmp echo-request 1:P 0.0.0.0/0 0.0.0.0/0 icmp echo-reply 2:P 192.168.2.23 0.0.0.0/0 all 3:P 192.168.2.42 0.0.0.0/0 all - We mark icmp ping and replies so they will go into the fast - interactive class and set a mark for each host. - -
+ We mark icmp ping and replies so they will go into the fast + interactive class and set a mark for each host. +