start of whopping queueing rewrite
[lartc.git] / 2.4routing.sgml
blob1c7bf2e13394e6562c334f85a15a0973b2e76207
1 <!doctype linuxdoc system>
3 <!-- $Id$
4 -->
6 <article>
8 <!-- Title information -->
10 <title>Linux 2.4 Advanced Routing HOWTO
11 <author>Netherlabs BV (bert hubert &lt;bert.hubert@netherlabs.nl&gt;)&nl;
12 Gregory Maxwell &lt;greg@linuxpower.cx&gt; &nl;
13 Remco van Mook &lt;remco@virtu.nl&gt; &nl;
14 Martijn van Oosterhout &lt;kleptog@cupid.suninternet.com&gt; &nl;
15 Paul B Schroeder &lt;paulsch@us.ibm.com&gt; &nl;
16 Jasper Spaans &lt;jasper@spaans.ds9a.nl&gt; &nl;
17 howto@ds9a.nl
18 <date>v0.3.0 $Date$
19 <abstract>
20 A very hands-on approach to iproute2, traffic shaping and a bit of netfilter
21 </abstract>
23 <!-- Table of contents -->
24 <toc>
26 <!-- Begin the document -->
28 <sect>Dedication
29 <p>
30 This document is dedicated to lots of people, and is my attempt to do
31 something back. To list but a few:
32 <p>
33 <itemize>
34 <item>Rusty Russell
35 <item>Alexey N. Kuznetsov
36 <item>The good folks from Google
37 <item>The staff of Casema Internet
38 </itemize>
40 <sect>Introduction
41 <p>
42 Welcome, gentle reader.
43 <p>
44 This document hopes to enlighten you on how to do more with Linux 2.2/2.4
45 routing. Unbeknownst to most users, you already run tools which allow you to
46 do spectacular things. Commands like 'route' and 'ifconfig' are actually
47 very thin wrappers for the very powerful iproute2 infrastructure
48 <p>
49 I hope that this HOWTO will become as readable as the ones by Rusty Russell
50 of (amongst other things) netfilter fame.
52 You can always reach us by writing to the <url name="HOWTO team"
53 url="mailto:HOWTO@ds9a.nl">. However, please consider posting to the mailing
54 list (see the relevant section) if you have questions which are not directly
55 related to this HOWTO.
57 Before losing your way in this HOWTO, if all you want to do is simple
58 traffic shaping, skip everything and head to the 'Other possibilties'
59 chapter, and read about CBQ.init.
62 <sect1>Disclaimer &amp; License
63 <p>
64 This document is distributed in the hope that it will be useful,
65 but WITHOUT ANY WARRANTY; without even the implied warranty of
66 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
68 In short, if your STM-64 backbone breaks down and distributes pornography to
69 your most esteemed customers - it's never our fault. Sorry.
71 Copyright (c) 2001 by bert hubert, Gregory Maxwell, Martijn van
72 Oosterhout, Remco van Mook, Paul B. Schroeder and others.
74 Please freely copy and distribute (sell or give away) this document in any
75 format. It's requested that corrections and/or comments be fowarded to the
76 document maintainer. You may create a derivative work and distribute it
77 provided that you:
79 <enum>
80 <item>Send your derivative work (in the most suitable format such as sgml) to
81 the LDP (Linux Documentation Project) or the like for posting on the Internet.
82 If not the LDP, then let the LDP know where it is available.
84 <item>License the derivative work with this same license or use GPL. Include a
85 copyright notice and at least a pointer to the license used.
87 <item>Give due credit to previous authors and major contributors.
89 </enum>
90 If you're considering making a derived work other than a translation, it's
91 requested that you discuss your plans with the current maintainer.
93 It is also requested that if you publish this HOWTO in hardcopy that you
94 send the authors some samples for 'review purposes' :-)
97 <sect1>Prior knowledge
98 <p>
99 As the title implies, this is the 'Advanced' HOWTO. While by no means rocket
100 science, some prior knowledge is assumed.
102 Here are some other references which might help learn you more:
103 <descrip>
104 <tag><url
105 url="http://netfilter.samba.org/unreliable-guides/networking-concepts-HOWTO/index.html"
106 name="Rusty Russell's networking-concepts-HOWTO"></tag>
107 Very nice introduction, explaining what a network is, and how it is
108 connected to other networks
109 <tag>Linux Networking-HOWTO (Previously the Net-3 HOWTO)</tag>
110 Great stuff, although very verbose. It learns you a lot of stuff that's
111 already configured if you are able to connect to the internet.
112 Should be located in <file>/usr/doc/HOWTO/NET3-4-HOWTO.txt</file> but can be also be found
113 <url url="http://www.linuxports.com/howto/networking"
114 name="online">
115 </descrip>
117 <sect1>What Linux can do for you
119 A small list of things that are possible:
121 <itemize>
122 <item>Throttle bandwidth for certain computers
123 <item>Throttle bandwidth TO certain computers
124 <item>Help you to fairly share your bandwidth
125 <item>Protect your network from DoS attacks
126 <item>Protect the internet from your customers
127 <item>Multiplex several servers as one, for load balancing or
128 enhanced availability
129 <item>Restrict access to your computers
130 <item>Limit access of your users to other hosts
131 <item>Do routing based on user id (yes!), MAC address, source IP
132 address, port, type of service, time of day or content
133 </itemize>
135 Currently, not many people are using these advanced features. This is for
136 several reasons. While the provided documentation is verbose, it is not very
137 hands-on. Traffic control is almost undocumented.
138 <sect1>Housekeeping notes
140 There are several things which should be noted about this document. While I
141 wrote most of it, I really don't want it to stay that way. I am a strong
142 believer in Open Source, so I encourage you to send feedback, updates,
143 patches etcetera. Do not hesitate to inform me of typos or plain old errors.
144 If my English sounds somewhat wooden, please realise that I'm not a native
145 speaker. Feel free to send suggestions.
147 If you feel to you are better qualified to maintain a section, or think that
148 you can author and maintain new sections, you are welcome to do so. The SGML
149 of this HOWTO is available via CVS, I very much envision more people
150 working on it.
152 In aid of this, you will find lots of FIXME notices. Patches are always
153 welcome! Wherever you find a FIXME, you should know that you are treading in
154 unknown territory. This is not to say that there are no errors elsewhere,
155 but be extra careful. If you have validated something, please let us know so
156 we can remove the FIXME notice.
158 About this HOWTO, I will take some liberties along the road. For example, I
159 postulate a 10Mbit internet connection, while I know full well that those
160 are not very common.
161 <sect1>Access, CVS &amp; submitting updates
163 The canonical location for the HOWTO is <url
164 url="http://www.ds9a.nl/2.4Routing" name="here">.
166 We now have anonymous CVS access available to the world at large. This is
167 good in a number of ways. You can easily upgrade to newer versions of this
168 HOWTO and submitting patches is no work at all.
170 Furthermore, it allows the authors to work on the source independently,
171 which is good too.
173 <tscreen><verb>
174 $ export CVSROOT=:pserver:anon@outpost.ds9a.nl:/var/cvsroot
175 $ cvs login
176 CVS password: [enter 'cvs' (without 's)]
177 $ cvs co 2.4routing
178 cvs server: Updating 2.4routing
179 U 2.4routing/2.4routing.sgml
180 </verb></tscreen>
182 If you spot an error, or want to add something, just fix it locally, and run
183 cvs diff -u, and send the result off to us.
185 A Makefile is supplied which should help you create postscript, dvi, pdf,
186 html and plain text. You may need to install sgml-tools, ghostscript and
187 tetex to get all formats.
189 <sect1>Mailing list
191 <label id="MLIST">
192 The authors receive an increasing amount of mail about this HOWTO. Because
193 of the clear interest of the community, it has been decided to start a
194 mailinglist where people can talk to each other about Advanced Routing and
195 Traffic Control. You can subscribe to the list
196 <url url="http://mailman.ds9a.nl/mailman/listinfo/lartc" name="here">.
198 It should be pointed out that the authors are very hesitant of answering
199 questions not asked on the list. We would like the archive of the list to
200 become some kind of knowledge base. If you have a question, please search
201 the archive, and then post to the mailinglist.
203 <sect1>Layout of this document
205 We will be doing interesting stuff almost immediately, which also means that
206 there will initially be parts that are explained incompletely or are not
207 perfect. Please gloss over these parts and assume that all will become clear.
209 Routing and filtering are two distinct things. Filtering is documented very
210 well by Rusty's HOWTOs, available here:
212 <itemize>
213 <item><url url="http://netfilter.samba.org/unreliable-guides/"
214 name="Rusty's Remarkably Unreliable Guides">
215 </itemize>
217 We will be focusing mostly on what is possible by combining netfilter and
218 iproute2.
219 <sect>Introduction to iproute2
220 <sect1>Why iproute2?
222 Most Linux distributions, and most UNIX's, currently use the
223 venerable 'arp', 'ifconfig' and 'route' commands. While these tools work,
224 they show some unexpected behaviour under Linux 2.2 and up. For example, GRE
225 tunnels are an integral part of routing these days, but require completely
226 different tools.
228 With iproute2, tunnels are an integral part of the tool set.
230 The 2.2 and above Linux kernels include a completely redesigned network
231 subsystem. This new networking code brings Linux performance and a feature
232 set with little competition in the general OS arena. In fact, the new
233 routing, filtering, and classifying code is more featureful than the one
234 provided by many dedicated routers and firewalls and traffic shaping
235 products.
237 As new networking concepts have been invented, people have found ways to
238 plaster them on top of the existing framework in existing OSes. This
239 constant layering of cruft has lead to networking code that is filled with
240 strange behaviour, much like most human languages. In the past, Linux
241 emulated SunOS's handling of many of these things, which was not ideal.
243 This new framework makes it possible to clearly express features
244 previously beyond Linux's reach.
246 <sect1>iproute2 tour
248 Linux has a sophisticated system for bandwidth provisioning called Traffic
249 Control. This system supports various method for classifying, prioritizing,
250 sharing, and limiting both inbound and outbound traffic.
253 We'll start off with a tiny tour of iproute2 possibilities.
254 <sect1>Prerequisites
256 You should make sure that you have the userland tools installed. This
257 package is called 'iproute' on both RedHat and Debian, and may otherwise be
258 found at <tt>ftp://ftp.inr.ac.ru/ip-routing/iproute2-2.2.4-now-ss??????.tar.gz"</tt>.
260 You can also try <url name="here" url="ftp://ftp.inr.ac.ru/ip-routing/iproute2-current.tar.gz">
261 for the latest version.
263 Some parts of iproute require you to have certain kernel options enabled. It
264 should also be noted that all releases of RedHat up to and including 6.2
265 come without most of the traffic control features in the default kernel.
267 RedHat 7.2 has everything in by default.
269 Also make sure that you have netlink support, should you choose to roll your
270 own kernel. Iproute2 needs it.
272 <sect1>Exploring your current configuration
274 This may come as a surprise, but iproute2 is already configured! The current
275 commands <tt>ifconfig</tt> and <tt>route</tt> are already using the advanced
276 syscalls, but mostly with very default (ie. boring) settings.
278 The <tt>ip</tt> tool is central, and we'll ask it to display our interfaces
279 for us.
280 <sect2><tt>ip</tt> shows us our links
282 <tscreen><verb>
283 [ahu@home ahu]$ ip link list
284 1: lo: <LOOPBACK,UP> mtu 3924 qdisc noqueue
285 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
286 2: dummy: <BROADCAST,NOARP> mtu 1500 qdisc noop
287 link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
288 3: eth0: <BROADCAST,MULTICAST,PROMISC,UP> mtu 1400 qdisc pfifo_fast qlen 100
289 link/ether 48:54:e8:2a:47:16 brd ff:ff:ff:ff:ff:ff
290 4: eth1: <BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc pfifo_fast qlen 100
291 link/ether 00:e0:4c:39:24:78 brd ff:ff:ff:ff:ff:ff
292 3764: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP> mtu 1492 qdisc pfifo_fast qlen 10
293 link/ppp
295 </verb></tscreen>
296 <p>Your mileage may vary, but this is what it shows on my NAT router at
297 home. I'll only explain part of the output as not everything is directly
298 relevant.
300 We first see the loopback interface. While your computer may function
301 somewhat without one, I'd advise against it. The MTU size (Maximum Transfer
302 Unit) is 3924 octets, and it is not supposed to queue. Which makes sense
303 because the loopback interface is a figment of your kernel's imagination.
305 I'll skip the dummy interface for now, and it may not be present on your
306 computer. Then there are my two physical network interfaces, one at the side
307 of my cable modem, the other one serves my home ethernet segment.
308 Furthermore, we see a ppp0 interface.
310 Note the absence of IP addresses. iproute disconnects the concept of 'links'
311 and 'IP addresses'. With IP aliasing, the concept of 'the' IP address had
312 become quite irrelevant anyhow.
314 It does show us the MAC addresses though, the hardware identifier of our
315 ethernet interfaces.
316 <sect2><tt>ip</tt> shows us our IP addresses
318 <tscreen><verb>
319 [ahu@home ahu]$ ip address show
320 1: lo: <LOOPBACK,UP> mtu 3924 qdisc noqueue
321 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
322 inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
323 2: dummy: <BROADCAST,NOARP> mtu 1500 qdisc noop
324 link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
325 3: eth0: <BROADCAST,MULTICAST,PROMISC,UP> mtu 1400 qdisc pfifo_fast qlen 100
326 link/ether 48:54:e8:2a:47:16 brd ff:ff:ff:ff:ff:ff
327 inet 10.0.0.1/8 brd 10.255.255.255 scope global eth0
328 4: eth1: <BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc pfifo_fast qlen 100
329 link/ether 00:e0:4c:39:24:78 brd ff:ff:ff:ff:ff:ff
330 3764: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP> mtu 1492 qdisc pfifo_fast qlen 10
331 link/ppp
332 inet 212.64.94.251 peer 212.64.94.1/32 scope global ppp0
333 </verb></tscreen>
335 This contains more information. It shows all our addresses, and to which
336 cards they belong. 'inet' stands for Internet (IPv4). There are lots of other
337 address families, but these don't concern us right now.
339 Let's examine eth0 somewhat closer. It says that it is related to the inet
340 address '10.0.0.1/8'. What does this mean? The /8 stands for the number of
341 bits that are in the Network Address. There are 32 bits, so we have 24 bits
342 left that are part of our network. The first 8 bits of 10.0.0.1 correspond
343 to 10.0.0.0, our Network Address, and our netmask is 255.0.0.0.
345 The other bits are connected to this interface, so 10.250.3.13 is directly
346 available on eth0, as is 10.0.0.1 for example.
348 With ppp0, the same concept goes, though the numbers are different. Its
349 address is 212.64.94.251, without a subnet mask. This means that we have a
350 point-to-point connection and that every address, with the exception of
351 212.64.94.251, is remote. There is more information however, it tells us
352 that on the other side of the link there is yet again only one address,
353 212.64.94.1. The /32 tells us that there are no 'network bits'.
355 It is absolutely vital that you grasp these concepts. Refer to the
356 documentation mentioned at the beginning of this HOWTO if you have trouble.
358 You may also note 'qdisc', which stands for Queueing Discipline. This will
359 become vital later on.
361 <sect2><tt>ip</tt> shows us our routes
363 Well, we now know how to find 10.x.y.z addresses, and we are able to reach
364 212.64.94.1. This is not enough however, so we need instructions on how to
365 reach the world. The internet is available via our ppp connection, and it
366 appears that 212.64.94.1 is willing to spread our packets around the
367 world, and deliver results back to us.
369 <tscreen><verb>
370 [ahu@home ahu]$ ip route show
371 212.64.94.1 dev ppp0 proto kernel scope link src 212.64.94.251
372 10.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.1
373 127.0.0.0/8 dev lo scope link
374 default via 212.64.94.1 dev ppp0
375 </verb></tscreen>
377 This is pretty much self explanatory. The first 4 lines of output explicitly
378 state what was already implied by <tt>ip address show</tt>, the last line
379 tells us that the rest of the world can be found via 212.64.94.1, our
380 default gateway. We can see that it is a gateway because of the word
381 via, which tells us that we need to send packets to 212.64.94.1, and that it
382 will take care of things.
384 For reference, this is what the old 'route' utility shows us:
385 <tscreen><verb>
386 [ahu@home ahu]$ route -n
387 Kernel IP routing table
388 Destination Gateway Genmask Flags Metric Ref Use
389 Iface
390 212.64.94.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
391 10.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 eth0
392 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
393 0.0.0.0 212.64.94.1 0.0.0.0 UG 0 0 0 ppp0
394 </verb></tscreen>
396 <sect1>ARP
398 ARP is the Address Resolution Protocol as described in
399 <url url="http://www.faqs.org/rfcs/rfc826.html" name="RFC 826">.
400 ARP is used by a networked machine to resolve the hardware location/address of
401 another machine on the same
402 local network. Machines on the Internet are generally known by their names
403 which resolve to IP
404 addresses. This is how a machine on the foo.com network is able to communicate
405 with another machine which is on the bar.net network. An IP address, though,
406 cannot tell you the physical location of a machine. This is where ARP comes
407 into the picture.
409 Let's take a very simple example. Suppose I have a network composed of several
410 machines. Two of the machines which are currently on my network are foo
411 with an IP address of 10.0.0.1 and bar with an IP address of 10.0.0.2.
412 Now foo wants to ping bar to see that he is alive, but alas, foo has no idea
413 where bar is. So when foo decides to ping bar he will need to send
414 out an ARP request.
415 This ARP request is akin to foo shouting out on the network "Bar (10.0.0.2)!
416 Where are you?" As a result of this every machine on the network will hear
417 foo shouting, but only bar (10.0.0.2) will respond. Bar will then send an
418 ARP reply directly back to foo which is akin
419 bar saying,
420 "Foo (10.0.0.1) I am here at 00:60:94:E9:08:12." After this simple transaction
421 that's used to locate his friend on the network, foo is able to communicate
422 with bar until he (his arp cache) forgets where bar is (typically after
423 15 minutes on Unix).
425 Now let's see how this works.
426 You can view your machines current arp/neighbor cache/table like so:
427 <tscreen><verb>
428 [root@espa041 /home/src/iputils]# ip neigh show
429 9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable
430 9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud reachable
431 </verb></tscreen>
433 As you can see my machine espa041 (9.3.76.41) knows where to find espa042
434 (9.3.76.42) and
435 espagate (9.3.76.1). Now let's add another machine to the arp cache.
437 <tscreen><verb>
438 [root@espa041 /home/paulsch/.gnome-desktop]# ping -c 1 espa043
439 PING espa043.austin.ibm.com (9.3.76.43) from 9.3.76.41 : 56(84) bytes of data.
440 64 bytes from 9.3.76.43: icmp_seq=0 ttl=255 time=0.9 ms
442 --- espa043.austin.ibm.com ping statistics ---
443 1 packets transmitted, 1 packets received, 0% packet loss
444 round-trip min/avg/max = 0.9/0.9/0.9 ms
446 [root@espa041 /home/src/iputils]# ip neigh show
447 9.3.76.43 dev eth0 lladdr 00:06:29:21:80:20 nud reachable
448 9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable
449 9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud reachable
450 </verb></tscreen>
452 As a result of espa041 trying to contact espa043, espa043's hardware
453 address/location has now been added to the arp/neighbor cache.
454 So until the entry for
455 espa043 times out (as a result of no communication between the two) espa041
456 knows where to find espa043 and has no need to send an ARP request.
458 Now let's delete espa043 from our arp cache:
460 <tscreen><verb>
461 [root@espa041 /home/src/iputils]# ip neigh delete 9.3.76.43 dev eth0
462 [root@espa041 /home/src/iputils]# ip neigh show
463 9.3.76.43 dev eth0 nud failed
464 9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable
465 9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud stale
466 </verb></tscreen>
468 Now espa041 has again forgotten where to find espa043 and will need to send
469 another ARP request the next time he needs to communicate with espa043.
470 You can also see from the above output that espagate (9.3.76.1) has been
471 changed to the "stale" state. This means that the location shown is still
472 valid, but it will have to be confirmed at the first transaction to that
473 machine.
475 <sect>Rules - routing policy database
477 If you have a large router, you may well cater for the needs of different
478 people, who should be served differently. The routing policy database allows
479 you to do this by having multiple sets of routing tables.
481 If you want to use this feature, make sure that your kernel is compiled with
482 the "IP: advanced router" and "IP: policy routing" features.
484 When the kernel needs to make a routing decision, it finds out which table
485 needs to be consulted. By default, there are three tables. The old 'route'
486 tool modifies the main and local tables, as does the ip tool (by default).
488 The default rules:
489 <tscreen><verb>
490 [ahu@home ahu]$ ip rule list
491 0: from all lookup local
492 32766: from all lookup main
493 32767: from all lookup default
494 </verb></tscreen>
496 This lists the priority of all rules. We see that all rules apply to all
497 packets ('from all'). We've seen the 'main' table before, it is output by
498 <tt>ip route ls</tt>, but the 'local' and 'default' table are new.
500 If we want to do fancy things, we generate rules which point to different
501 tables which allow us to override system wide routing rules.
503 For the exact semantics on what the kernel does when there are more matching
504 rules, see Alexey's ip-cref documentation.
506 <sect1>Simple source routing
508 Let's take a real example once again, I have 2 (actually 3, about time I
509 returned them) cable modems, connected to a Linux NAT ('masquerading')
510 router. People living here pay me to use the internet. Suppose one of my
511 house mates only visits hotmail and wants to pay less. This is fine with me,
512 but you'll end up using the low-end cable modem.
514 The 'fast' cable modem is known as 212.64.94.251 and is a PPP link to
515 212.64.94.1. The 'slow' cable modem is known by various ip addresses,
516 212.64.78.148 in this example and is a link to 195.96.98.253.
518 The local table:
519 <tscreen><verb>
520 [ahu@home ahu]$ ip route list table local
521 broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
522 local 10.0.0.1 dev eth0 proto kernel scope host src 10.0.0.1
523 broadcast 10.0.0.0 dev eth0 proto kernel scope link src 10.0.0.1
524 local 212.64.94.251 dev ppp0 proto kernel scope host src 212.64.94.251
525 broadcast 10.255.255.255 dev eth0 proto kernel scope link src 10.0.0.1
526 broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
527 local 212.64.78.148 dev ppp2 proto kernel scope host src 212.64.78.148
528 local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
529 local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
530 </verb></tscreen>
532 Lots of obvious things, but things that need to be specified somewhere.
533 Well, here they are. The default table is empty.
535 Let's view the 'main' table:
536 <tscreen><verb>
537 [ahu@home ahu]$ ip route list table main
538 195.96.98.253 dev ppp2 proto kernel scope link src 212.64.78.148
539 212.64.94.1 dev ppp0 proto kernel scope link src 212.64.94.251
540 10.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.1
541 127.0.0.0/8 dev lo scope link
542 default via 212.64.94.1 dev ppp0
543 </verb></tscreen>
545 We now generate a new rule which we call 'John', for our hypothetical
546 house mate. Although we can work with pure numbers, it's far easier if we add
547 our tables to <file>/etc/iproute2/rt_tables</file>.
549 <tscreen><verb>
550 # echo 200 John >> /etc/iproute2/rt_tables
551 # ip rule add from 10.0.0.10 table John
552 # ip rule ls
553 0: from all lookup local
554 32765: from 10.0.0.10 lookup John
555 32766: from all lookup main
556 32767: from all lookup default
557 </verb></tscreen>
559 Now all that is left is to generate Johns table, and flush the route cache:
560 <tscreen><verb>
561 # ip route add default via 195.96.98.253 dev ppp2 table John
562 # ip route flush cache
563 </verb></tscreen>
565 And we are done. It is left as an exercise for the reader to implement this
566 in ip-up.
567 <sect>GRE and other tunnels
569 There are 3 kinds of tunnels in Linux. There's IP in IP tunneling, GRE tunneling and tunnels that live outside the kernel (like, for example PPTP).
570 <sect1>A few general remarks about tunnels:
572 Tunnels can be used to do some very unusual and very cool stuff. They can also make things go horribly wrong when you don't configure them right. Don't point your default route to a tunnel device unless you know <bf>exactly</bf> what you are doing :-). Furthermore, tunneling increases overhead, because it needs an extra set of IP headers. Typically this is 20 bytes per packet, so if the normal packet size (MTU) on a network is 1500 bytes, a packet that is sent through a tunnel can only be 1480 bytes big. This is not necessarily a problem, but be sure to read up on IP packet fragmentation/reassembly when you plan to connect large networks with tunnels. Oh, and of course, the fastest way to dig a tunnel is to dig at both sides.
574 <sect1>IP in IP tunneling
576 This kind of tunneling has been available in Linux for a long time. It requires 2 kernel modules,
577 ipip.o and new_tunnel.o.
579 Let's say you have 3 networks: Internal networks A and B, and intermediate network C (or let's say, Internet).
580 So we have network A:
582 <tscreen><verb>
583 network 10.0.1.0
584 netmask 255.255.255.0
585 router 10.0.1.1
586 </verb></tscreen>
587 The router has address 172.16.17.18 on network C.
589 and network B:
590 <tscreen><verb>
591 network 10.0.2.0
592 netmask 255.255.255.0
593 router 10.0.2.1
594 </verb></tscreen>
595 The router has address 172.19.20.21 on network C.
597 As far as network C is concerned, we assume that it will pass any packet sent
598 from A to B and vice versa. You might even use the Internet for this.
600 Here's what you do:
602 First, make sure the modules are installed:
604 <tscreen><verb>
605 insmod ipip.o
606 insmod new_tunnel.o
607 </verb></tscreen>
608 Then, on the router of network A, you do the following:
609 <tscreen><verb>
610 ifconfig tunl0 10.0.1.1 pointopoint 172.19.20.21
611 route add -net 10.0.2.0 netmask 255.255.255.0 dev tunl0
612 </verb></tscreen>
613 And on the router of network B:
614 <tscreen><verb>
615 ifconfig tunl0 10.0.2.1 pointopoint 172.16.17.18
616 route add -net 10.0.1.0 netmask 255.255.255.0 dev tunl0
617 </verb></tscreen>
618 And if you're finished with your tunnel:
619 <tscreen><verb>
620 ifconfig tunl0 down
621 </verb></tscreen>
622 Presto, you're done. You can't forward broadcast or IPv6 traffic through
623 an IP-in-IP tunnel, though. You just connect 2 IPv4 networks that normally wouldn't be able to talk to each other, that's all. As far as compatibility goes, this code has been around a long time, so it's compatible all the way back to 1.3 kernels. Linux IP-in-IP tunneling doesn't work with other Operating Systems or routers, as far as I know. It's simple, it works. Use it if you have to, otherwise use GRE.
625 <sect1>GRE tunneling
627 GRE is a tunneling protocol that was originally developed by Cisco, and it
628 can do a few more things than IP-in-IP tunneling. For example, you can also
629 transport multicast traffic and IPv6 through a GRE tunnel.
631 In Linux, you'll need the ip_gre.o module.
633 <sect2>IPv4 Tunneling
635 Let's do IPv4 tunneling first:
637 Let's say you have 3 networks: Internal networks A and B, and intermediate network C (or let's say, Internet).
639 So we have network A:
640 <tscreen><verb>
641 network 10.0.1.0
642 netmask 255.255.255.0
643 router 10.0.1.1
644 </verb></tscreen>
645 The router has address 172.16.17.18 on network C.
646 Let's call this network neta (ok, hardly original)
648 and network B:
649 <tscreen><verb>
650 network 10.0.2.0
651 netmask 255.255.255.0
652 router 10.0.2.1
653 </verb></tscreen>
654 The router has address 172.19.20.21 on network C.
655 Let's call this network netb (still not original)
657 As far as network C is concerned, we assume that it will pass any packet sent
658 from A to B and vice versa. How and why, we do not care.
660 On the router of network A, you do the following:
661 <tscreen><verb>
662 ip tunnel add netb mode gre remote 172.19.20.21 local 172.16.17.18 ttl 255
663 ip link set netb up
664 ip addr add 10.0.1.1 dev netb
665 ip route add 10.0.2.0/24 dev netb
666 </verb></tscreen>
668 Let's discuss this for a bit. In line 1, we added a tunnel device, and
669 called it netb (which is kind of obvious because that's where we want it to
670 go). Furthermore we told it to use the GRE protocol (mode gre), that the
671 remote address is 172.19.20.21 (the router at the other end), that our
672 tunneling packets should originate from 172.16.17.18 (which allows your
673 router to have several IP addresses on network C and let you decide which
674 one to use for tunneling) and that the TTL field of the packet should be set
675 to 255 (ttl 255).
677 The second line enables the device.
679 In the third line we gave the newly born interface netb the address
680 10.0.1.1. This is OK for smaller networks, but when you're starting up a
681 mining expedition (LOTS of tunnels), you might want to consider using
682 another IP range for tunneling interfaces (in this example, you could use
683 10.0.3.0).
685 <p>In the fourth line we set the route for network B. Note the different notation for the netmask. If you're not familiar with this notation, here's how it works: you write out the netmask in binary form, and you count all the ones. If you don't know how to do that, just remember that 255.0.0.0 is /8, 255.255.0.0 is /16 and 255.255.255.0 is /24. Oh, and 255.255.254.0 is /23, in case you were wondering.
687 But enough about this, let's go on with the router of network B.
688 <tscreen><verb>
689 ip tunnel add neta mode gre remote 172.16.17.18 local 172.19.20.21 ttl 255
690 ip link set neta up
691 ip addr add 10.0.2.1 dev neta
692 ip route add 10.0.1.0/24 dev neta
693 </verb></tscreen>
694 And when you want to remove the tunnel on router A:
695 <tscreen><verb>
696 ip link set netb down
697 ip tunnel del netb
698 </verb></tscreen>
699 Of course, you can replace netb with neta for router B.
701 <sect2>IPv6 Tunneling
704 A short bit about IPv6 addresses:<p>
705 IPv6 addresses are, compared to IPv4 addresses, monstrously big. An example:
706 <verb>3ffe:2502:200:40:281:48fe:dcfe:d9bc</verb>
707 So, to make writing them down easier, there are a few rules:
708 <itemize>
709 <item>Don't use leading zeroes. Same as in IPv4.
710 <item>Use colons to separate every 16 bits or two bytes.
711 <item>When you have lots of consecutive zeroes, you can write this down as ::. You can only do this once in an address and only for quantities of 16 bits, though.
712 </itemize>
713 Using these rules, the address 3ffe:0000:0000:0000:0000:0020:34A1:F32C can be written down as 3ffe::20:34A1:F32C, which is a lot shorter.
715 On with the tunnels.
717 Let's assume that you have the following IPv6 network, and you want to connect it to 6bone, or a friend.
719 <tscreen><verb>
720 Network 3ffe:406:5:1:5:a:2:1/96
721 </verb></tscreen>
722 Your IPv4 address is 172.16.17.18, and the 6bone router has IPv4 address 172.22.23.24.
724 <tscreen><verb>
725 ip tunnel add sixbone mode sit remote 172.22.23.24 local 172.16.17.18 ttl 255
726 ip link set sixbone up
727 ip addr add 3ffe:406:5:1:5:a:2:1/96 dev sixbone
728 ip route add 3ffe::/15 dev sixbone
729 </verb></tscreen>
731 Let's discuss this. In the first line, we created a tunnel device called sixbone. We gave it mode sit (which is IPv6 in IPv4 tunneling) and told it where to go to (remote) and where to come from (local). TTL is set to maximum, 255. Next, we made the device active (up). After that, we added our own network address, and set a route for 3ffe::/15 (which is currently all of 6bone) through the tunnel.
733 GRE tunnels are currently the preferred type of tunneling. It's a standard that's also widely adopted outside the Linux community and therefore a Good Thing.
735 <sect1>Userland tunnels
737 There are literally dozens of implementations of tunneling outside the kernel. Best known are of course PPP and PPTP, but there are lots more (some proprietary, some secure, some that don't even use IP) and that is really beyond the scope of this HOWTO.
739 <sect>IPv6 tunneling with Cisco and/or 6bone
741 By Marco Davids &lt;marco@sara.nl&gt;
743 NOTE to maintainer:
745 As far as I am concerned, this IPv6-IPv4 tunneling is not per definition
746 GRE tunneling. You could tunnel IPv6 over IPv4 by means of GRE tunnel devices
747 (GRE tunnels ANY to IPv4), but the device used here ("sit") only tunnels
748 IPv6 over IPv4 and is therefore something different.
750 <sect1>IPv6 Tunneling
752 This is another application of the tunneling capabilities of Linux. It is
753 popular among the IPv6 early adopters, or pioneers if you like.
754 The 'hands-on' example described below is certainly not the only way
755 to do IPv6 tunneling. However, it is the method that is often used to tunnel
756 between Linux and a Cisco IPv6 capable router and experience learned that
757 this is just the thing many people are after. Ten to one this applies to
758 you too ;-)
760 A short bit about IPv6 addresses:
762 IPv6 addresses are, compared to IPv4 addresses, really big: 128 bits
763 against 32 bits. And this provides us just with the thing we need: many, many
764 IP-addresses: 340,282,266,920,938,463,463,374,607,431,768,211,465 to be
765 precise. Apart from this, IPv6 (or IPng, for IP Next Generation) is supposed
766 to provide for smaller routing tables on the Internet's backbone routers,
767 simpler configuration of equipment, better security at the IP level and
768 better support for QoS.
770 An example: 2002:836b:9820:0000:0000:0000:836b:9886
772 Writing down IPv6 addresses can be quite a burden. Therefore, to make
773 life easier there are some rules:
775 <itemize>
776 <item>
777 Don't use leading zeroes. Same as in IPv4.
779 <item>Use colons to separate every 16 bits or two bytes.
781 <item>When you have lots of consecutive zeroes,
782 you can write this down as ::. You can only do this once in an
783 address and only for quantities of 16 bits, though.
784 </itemize>
786 The address 2002:836b:9820:0000:0000:0000:836b:9886 can be written down
787 as 2002:836b:9820::836b:9886, which is somewhat friendlier.
789 IPv6 is intended to be the successor of the current IPv4. Because it
790 is relatively new technology, there is no worldwide native IPv6 network
791 yet. To be able to move forward swiftly, the 6bone was introduced.
793 Native IPv6 networks are connected to each other by encapsulating the IPv6
794 protocol in IPv4 packets and sending them over the existing IPv4 infrastructure
795 from one IPv6 site to another.
797 That is precisely where the tunnel steps in.
799 To be able to use IPv6, we should have a kernel that supports it. There
800 are many good documents on how to achieve this. But it all comes down to
801 a few steps:
802 <itemize>
803 <item>Get yourself a recent Linux distribution, with suitable glibc.
804 <item>Then get yourself an up-to-date kernel source.
805 </itemize>
806 If you are all set, then you can go ahead and compile an IPv6 capable
807 kernel:
808 <itemize>
809 <item>Go to /usr/src/linux and type:
810 <item>make menuconfig
811 <item>Choose "Networking Options"
812 <item>Select "The IPv6 protocol", "IPv6: enable EUI-64 token format", "IPv6:
813 disable provider based addresses"
814 </itemize>
815 HINT: Don't go for the 'module' option. Often this won't work well.
817 In other words, compile IPv6 as 'built-in' in your kernel.
818 You can then save your config like usual and go ahead with compiling
819 the kernel.
821 HINT: Before doing so, consider editing the Makefile:
822 EXTRAVERSION = -x ; --> ; EXTRAVERSION = -x-IPv6
824 There is a lot of good documentation about compiling and installing
825 a kernel, however this document is about something else. If you run into
826 problems at this stage, go and look for documentation about compiling a
827 Linux kernel according to your own specifications.
829 The file /usr/src/linux/README might be a good start.
830 After you acomplished all this, and rebooted with your brand new kernel,
831 you might want to issue an '/sbin/ifconfig -a' and notice the brand
832 new 'sit0-device'. SIT stands for Simple Internet Transition. You may give
833 yourself a compliment; you are now one major step closer to IP, the Next
834 Generation ;-)
836 Now on to the next step. You want to connect your host, or maybe even
837 your entire LAN to another IPv6 capable network. This might be the "6bone"
838 that is setup especially for this particular purpose.
840 Let's assume that you have the following IPv6 network: 3ffe:604:6:8::/64 and
841 you want to connect it to 6bone, or a friend. Please note that the /64
842 subnet notation works just like with regular IP adresses.
844 Your IPv4 address is 145.100.24.181 and the 6bone router has IPv4 address
845 145.100.1.5
846 <tscreen><verb>
847 # ip tunnel add sixbone mode sit remote 145.100.1.5 [local 145.100.24.181 ttl 225]
848 # ip link set sixbone up
849 # ip addr add 3FFE:604:6:7::2/126 dev sixbone
850 # ip route add 3ffe::0/16 dev sixbone
851 </verb></tscreen>
853 Let's discuss this. In the first line, we created a tunnel device called
854 sixbone. We gave it mode sit (which is IPv6 in IPv4 tunneling) and told it
855 where to go to (remote) and where to come from (local). TTL is set to
856 maximum, 255.
858 Next, we made the device active (up). After that, we added our own network
859 address, and set a route for 3ffe::/15 (which is currently all of 6bone)
860 through the tunnel. If the particular machine you run this on is your IPv6
861 gateway, then consider adding the following lines:
863 <tscreen><verb>
864 # echo 1 >/proc/sys/net/ipv6/conf/all/forwarding
865 # /usr/local/sbin/radvd
866 </verb></tscreen>
867 The latter, radvd is -like zebra- a router advertisement daemon, to
868 support IPv6's autoconfiguration features. Search for it with your favourite
869 search-engine if you like.
870 You can check things like this:
872 <tscreen><verb>
873 # /sbin/ip -f inet6 addr
874 </verb></tscreen>
876 If you happen to have radvd running on your IPv6 gateway and boot your
877 IPv6 capable Linux on a machine on your local LAN, you would be able to
878 enjoy the benefits of IPv6 autoconfiguration:
879 <tscreen><verb>
880 # /sbin/ip -f inet6 addr
881 1: lo: &lt;LOOPBACK,UP&gt; mtu 3924 qdisc noqueue inet6 ::1/128 scope host
883 3: eth0: &lt;BROADCAST,MULTICAST,UP&gt; mtu 1500 qdisc pfifo_fast qlen 100
884 inet6 3ffe:604:6:8:5054:4cff:fe01:e3d6/64 scope global dynamic
885 valid_lft forever preferred_lft 604646sec inet6 fe80::5054:4cff:fe01:e3d6/10
886 scope link
887 </verb></tscreen>
889 You could go ahead and configure your bind for IPv6 addresses. The A
890 type has an equivalent for IPv6: AAAA. The in-addr.arpa's equivalent is:
891 ip6.int. There's a lot of information available on this topic.
893 There is an increasing number of IPv6-aware applications available,
894 including secure shell, telnet, inetd, Mozilla the browser, Apache the
895 websever and a lot of others. But this is all outside the scope of this
896 Routing document ;-)
898 On the Cisco side the configuration would be something like this:
899 <tscreen><verb>
901 interface Tunnel1
902 description IPv6 tunnel
903 no ip address
904 no ip directed-broadcast
905 ipv6 enable
906 ipv6 address 3FFE:604:6:7::1/126
907 tunnel source Serial0
908 tunnel destination 145.100.24.181
909 tunnel mode ipv6ip
911 ipv6 route 3FFE:604:6:8::/64 Tunnel1
912 </verb></tscreen>
913 But if you don't have a Cisco at your disposal, try one of the many
914 IPv6 tunnel brokers available on the Internet. They are willing to configure
915 their Cisco with an extra tunnel for you. Mostly by means of a friendly
916 web interface. Search for "ipv6 tunnel broker" on your favourite search engine.
918 <sect>IPsec: secure IP over the internet
920 FIXME: editor vacancy.
921 In the meantime, see: <url url="http://www.freeswan.org/" name="The
922 FreeS/WAN project">. Another IPSec implementation for Linux is Cerberus,
923 by NIST. However, their web pages have not been updated in over a year,
924 and their version tended to trail well behind the current Linux kernel.
925 USAGI, an alternative IPv6 implementation for Linux, also includes an
926 IPSec implementation, but that might only be for IPv6.
928 <sect>Multicast routing
930 FIXME: Editor Vacancy!
932 The Multicast-HOWTO is ancient (relatively-speaking) and may be inaccurate
933 or misleading in places, for that reason.
935 Before you can do any multicast routing, you need to configure the Linux
936 kernel to support the type of multicast routing you want to do. This, in
937 turn, requires you to decide what type of multicast routing you expect to
938 be using. There are essentially four "common" types - DVMRP (the Multicast
939 version of the RIP unicast protocol), MOSPF (the same, but for OSPF), PIM-SM
940 ("Protocol Independent Multicasting - Sparse Mode", which assumes that users
941 of any multicast group are spread out, rather than clumped) and PIM-DM (the
942 same, but "Dense Mode", which assumes that there will be significant clumps
943 of users of the same multicast group).
945 In the Linux kernel, you will notice that these options don't appear. This is
946 because the protocol itself is handled by a routing application, such as
947 Zebra, mrouted, or pimd. However, you still have to have a good idea of which
948 you're going to use, to select the right options in the kernel.
950 For all multicast routing, you will definitely need to enable "multicasting"
951 and "multicast routing". For DVMRP and MOSPF, this is sufficient. If you are
952 going to use PIM, you must also enable PIMv1 or PIMv2, depending on whether
953 the network you are connecting to uses version 1 or 2 of the PIM protocol.
955 Once you have all that sorted out, and your new Linux kernel compiled, you
956 will see that the IP protocols listed, at boot time, now include IGMP. This
957 is a protocol for managing multicast groups. At the time of writing, Linux
958 supports IGMP versions 1 and 2 only, although version 3 does exist and has
959 been documented. This doesn't really affect us that much, as IGMPv3 is still
960 new enough that the extra capabilities of IGMPv3 aren't going to be that
961 much use. Because IGMP deals with groups, only the features present in the
962 simplest version of IGMP over the entire group are going to be used. For the
963 most part, that will be IGMPv2, although IGMPv1 is sill going to be
964 encountered.
966 So far, so good. We've enabled multicasting. Now, we have to tell the Linux
967 kernel to actually do something with it, so we can start routing. This means
968 adding the Multicast virtual network to the router table:
970 ip route add 224.0.0.0/4 dev eth0
972 (Assuming, of course, that you're multicasting over eth0! Substitute the
973 device of your choice, for this.)
975 Now, tell Linux to forward packets...
977 echo 1 > /proc/sys/net/ipv4/ip_forward
979 At this point, you may be wondering if this is ever going to do anything. So,
980 to test our connection, we ping the default group, 224.0.0.1, to see if anyone
981 is alive. All machines on your LAN with multicasting enabled <em>should</em>
982 respond, but nothing else. You'll notice that none of the machines that
983 respond have an IP address of 224.0.0.1. What a surprise! :) This is a group
984 address (a "broadcast" to subscribers), and all members of the group will
985 respond with their own address, not the group address.
987 ping -c 2 224.0.0.1
989 At this point, you're ready to do actual multicast routing. Well, assuming
990 that you have two networks to route between.
992 (To Be Continued!)
994 <sect>Queueing Disciplines for Bandwidth Management
996 Now, when I discovered this, it <em>really</em> blew me away. Linux 2.2/2.4
997 comes with everything to manage bandwidth in ways comparable to high-end
998 dedicated bandwidth management systems.
1000 Linux even goes far beyond what Frame and ATM provide.
1002 <sect1>Queues and Queueing Disciplines explained
1004 With queueing we determine the way in which data is <em>sent</em>. It is
1005 important to realise that we can only shape data that we transmit.
1007 With the way the internet works, we have no direct control of what people
1008 send us. It's a bit like your (physical!) mailbox at home. There is no way
1009 you can influence the world to modify the amount of mail they send you,
1010 short of contacting everybody.
1012 However, the internet is mostly based on TCP/IP which has a few features
1013 that help us. TCP/IP has no way of knowing the capacity of the network
1014 between two hosts, so it just starts sending data faster and faster ('slow
1015 start') and when packets start getting lost, because there is no room to
1016 send them, it will slow down. In fact it is a bit smarter than this, but
1017 more about that later.
1019 This is the equivalent of not reading half of your mail, and hoping that
1020 people will stop sending it to you. With the difference that it works for
1021 the Internet :-)
1023 If you have a router and wish to prevent certain hosts of networks from
1024 downloading too fast, you need to do your shaping on the *inner* interface
1025 of your router, the one that sends data to your own computers.
1027 <sect1>Simple, classless Queueing Disciplines
1029 As said, with queueing disciplines, we change the way data is sent.
1030 Classless queueing disciplines are those that, by and large accept data and
1031 only reorder, delay or drop it.
1033 These can be used to shape traffic for an entire interface, without any
1034 subdivisions. It is vital that you understand this part of queueing before
1035 we go on the the classful qdisc-containing-qdiscs!
1037 By far the most widely used discipline is the pfifo_fast queue - this is the
1038 default. This also explains why these advanced features are so robust. They
1039 are nothing more than 'just another queue'.
1041 Each of these queues has specific strengths and weaknesses. Not all of them
1042 may be as well tested.
1044 <sect2>pfifo_fast
1046 This queue is, as the name says, First In, First Out, which means that no
1047 packet receives special treatment. At least, not quite. This queue has 3 so
1048 called 'bands'. Within each band, FIFO rules apply. However, as long as
1049 there are packets waiting in band 0, band 1 won't be processed. Same goes
1050 for band 1 and band 2.
1052 The kernel honors the so called Type of Service flag of packets, and takes
1053 care to insert 'minimum delay' packets in band 0.
1055 <sect2>Token Bucket Filter
1057 The Token Bucket Filter (TBF) is a simple queue that only passes packets
1058 arriving at a rate which is not exceeding some administratively set rate,
1059 with the possibility to allow short bursts in excess of this rate.
1061 TBF is very precise, network- and processor friendly. It should be your
1062 first choice if you simple want to slow an interface down!
1064 The TBF implementation consists of a buffer (bucket), constantly filled by
1065 some virtual pieces of information called tokens, at a specific rate (token
1066 rate). The most important parameter of the bucket is its size, that is the
1067 number of tokens it can store.
1069 Each arriving token collects one incoming data packet from the data queue
1070 and is then deleted from the bucket. Associating this algorithm
1071 with the two flows -- token and data, gives us three possible scenarios:
1073 <itemize>
1074 <item> The data arrives in TBF at a rate that's <em>equal</em> to the rate
1075 of incoming tokens. In this case each incoming packet has its matching token
1076 and passes the queue without delay.
1078 <item> The data arrives in TBF at a rate that's <em>smaller</em> than the
1079 token rate. Only a part of the tokens are deleted at output of each data packet
1080 that's sent out the queue, so the tokens accumulate, up to the bucket size.
1081 The unused tokens can then be used to send data a a speed that's exceeding the
1082 standard token rate, in case short data bursts occur.
1084 <item> The data arrives in TBF at a rate <em>bigger</em> than the token rate.
1085 This means that the bucket will soon be devoid of tokens, which causes the
1086 TBF to throttle itself for a while. This is called an 'overlimit situation'.
1087 If packets keep coming in, packets will start to get dropped.
1088 </itemize>
1090 The last scenario is very important, because it allows to
1091 administratively shape the bandwidth available to data that's passing
1092 the filter.
1094 The accumulation of tokens allows a short burst of overlimit data to be
1095 still passed without loss, but any lasting overload will cause packets to be
1096 constantly delayed, and then dropped.
1098 <sect2>Stochastic Fairness Queueing
1100 Stochastic Fairness Queueing (SFQ) is a simple implementation of fair
1101 queueing algorithms family. It's less accurate than others, but it also
1102 requires less calculations while being almost perfectly fair.
1104 The key word in SFQ is conversation (or flow), which mostly corresponds to a
1105 TCP session or a UDP stream. Traffic is divided into a pretty large number
1106 of FIFO queues, one for each conversation. Traffic is then sent in a round
1107 robin fashion, giving each session the chance to send data in turn.
1109 This leads to very fair behaviour and disallows any single conversation from
1110 drowning out the rest. SFQ is called 'Stochastic' because it doesn't really
1111 allocate a queue for each session, it has an algorithm which divides traffic
1112 over a limited number of queues using a hashing algorithm.
1114 Because of the hash, multiple sessions mind end up in the same bucket, which
1115 would halve each session's chance of sending a packet, thus halving the
1116 effective speed available. To prevent this situation from becoming
1117 noticeable, SFQ changes its hashing algorithm quite often so that any two
1118 colliding sessions will only do so for a small number of seconds.
1120 It is important to note that SFQ is only useful in case your actual outgoing
1121 interface is really full! If it isn't then there will be no queue on your
1122 linux machine and hence no effect. Later on we will describe how to combine
1123 SFQ with other qdiscs to get a best-of-both worlds situation.
1125 Specifically, setting SFQ on the ethernet interface heading to your
1126 cablemodem or DSL router is pointless without further shaping!
1127 <sect2>Random Early Drop
1129 RED has some extra smartness built in. When a TCP/IP session starts, neither
1130 end knows the amount of bandwidth available. So TCP/IP starts to transmit
1131 slowly and goes faster and faster, though limited by the latency at which
1132 ACKs return.
1134 Once a link is filling up, RED starts dropping packets, which indicate to
1135 TCP/IP that the link is congested, and that it should slow down. The smart
1136 bit is that RED simulates real congestion, and starts to drop some packets
1137 some time before the link is entirely filled up. Once the link is completely
1138 saturated, it behaves like a normal policer.
1140 For more information on this, see the Backbone chapter.
1142 <sect2>Ingress policer qdisc
1143 <p>
1144 The Ingress qdisc comes in handy if you need to ratelimit a host without
1145 help from routers or other Linux boxes. You can police incoming bandwidth
1146 and drop packets when this bandwidth exceeds your desired rate. This can
1147 save your host from a SYN flood, for example, and also works to slow down
1148 TCP/IP, which responds to dropped packets by reducing speed.
1150 FIXME: shaping by dropping packets seems less desirable than using, for
1151 example, a token bucket filter. Not sure though, Cisco CAR works this
1152 way, and people appear to be happy with it.
1154 See the reference to <ref id="CAR" name="IOS Committed Access Rate"> at the
1155 end of this document.
1157 In short: you can use this to limit how fast your computer downloads files,
1158 thus leaving more of the available bandwidth for others.
1160 See the section on 'Protecting your host from SYN floods' for an example on
1161 how this works.
1163 <sect2>Summary
1165 Summarizing, these are the simple queues that actually manage traffic by
1166 reordering, slowing or dropping packets.
1168 Advice:
1169 <itemize>
1170 <item>
1171 To purely slow down outgoing traffic, use the Token Bucket Filter.
1172 <item>
1173 If your link is truly full and you want to make sure that no single session
1174 can dominate your outgoing bandwidth, use Stochastical Fairness Queueing.
1175 <item>
1176 If you have a big backbone and know what you are doing, consider Random
1177 Early Drop - see the backbone chapter.
1178 <item>
1179 To 'shape' incoming traffic which you are not forwarding, use the Ingress
1180 Policer. If you *are* forwarding it, use a TBF on the interface you are
1181 forwarding the data to.
1182 </itemize>
1183 <sect1>Classful Queueing Disciplines
1185 Some queueing disciplines can contain other queueing disciplines, which are
1186 then suddenly called 'classes'. A class is nothing short of a qdisc, except
1187 that it lives within another qdisc.
1189 Classful qdiscs are very useful if you have different kinds of traffic which
1190 should have differing treatment. One of the classful qdiscs is called 'CBQ'
1191 , 'Class Based Queueing' - it is so widely mentioned that people identify
1192 queueing with classes solely with CBQ, but this is not the case.
1194 CBQ is merely the oldest kid on the block - yet it is by far the least
1195 useful qdisc and also the most complex one. I advice *against* using it.
1196 This may come as something of a shock to many who fell for the 'sendmail
1197 effect', which learns us that any complex technology which doesn't come with
1198 documentation must be far superior.
1200 <sect2>Flow within classful qdiscs &amp; classes
1202 When traffic enters a classful qdisc, it needs to be sent to any of the
1203 qdiscs within, the classes. To determine what to do with a packet, the so
1204 called 'filters' are consulted. It is important to know that the filters are
1205 called from within a qdisc, and not the other way around!
1207 The filters then return with a decision, and the qdisc uses this to enqueue
1208 the packet into one of the classes. These classes don't know that they are
1209 part of an outer-qdisc, they act as they normally do: accepting packets on
1210 one end and outputting them again when asked.
1212 Besides containing other qdiscs, most classful qdiscs also perform shaping.
1213 This is useful to perform both packet reordering (with SFQ, for example) and
1214 rate control. You need this in cases where you have a high speed
1215 interface (for example, ethernet) to a slower device (a cable modem).
1217 If you were only to run SFQ, nothing would happen, as packets enter &amp;
1218 leave your router without delay: the output interface is far faster than
1219 your actual link speed.
1221 <sect2>The PRIO qdisc
1223 The PRIO qdisc doesn't actually shape, it only subdivides traffic based on
1224 how you configured your filters. You can consider the PRIO qdisc as a kind
1225 of pfifo_fast on stereoids, whereby each band is a separate qdisc instead of
1226 a simple FIFO.
1228 When a packet is enqueued to the PRIO qdisc, a sub-qdisc is chosen based on
1229 the filter commands you gave. By default, three pfifo sub-qdiscs are
1230 created. These sub-qdiscs are pure FIFO queues with no internal structure,
1231 but you can replace them by any qdisc you have available.
1233 This queue is very useful in case you want to prioritize certain kinds of
1234 traffic without using TOS-flags but using all the power of the tc filters.
1235 Because it doesn't actually shape, the same warning as for SFQ holds: either
1236 use it only if your physical link is really full or wrap it inside a
1237 classful qdisc that does shape.
1239 The last holds for almost all cablemodems and DSL devices.
1240 <sect2>The famous CBQ qdisc
1242 As said before, CBQ is the most complex qdisc available, the most hyped, the
1243 least understood and possibly the worst queueing discipline in the entire
1244 Linux kernel. This is not because the authors are evil or incompetent, far
1245 from it, it's just that the CBQ algorithm isn't all that good and doesn't
1246 really match the way Linux works.
1248 Besides being classful, CBQ is also a shaper and it is in that aspect that
1249 it really doesn't work very well. It works like this. If you try to shape a
1250 10mbit/s connection to 1mbit/s, the link should be idle 90% of the time. If
1251 it isn't, we need to throttle so that it IS idle 90% of the time.
1253 This is pretty hard to measure, so CBQ also needs to know how big an average
1254 packet is going to be, and instead derives the idle time from the number of
1255 microseconds that elapse between requests from the hardware layer for more
1256 data. Combined, this can be used to approximate how full or empty the link
1259 This is rather circumspect and doesn't always arrive at proper results. For
1260 example, what is the actual link speed of an interface that is not really
1261 able of transmitting the full 100mbit/s of data, perhaps because of a badly
1262 implemented driver? A PCMCIA network card will also never achieve 100mbit/s
1263 because of the way the bus is designed - again, how do we calculate the idle
1264 time?
1266 It gets even worse if we consider not-quite-real network devices like PPP
1267 over Ethernet or PPTP over TCP/IP. The effective bandwidth in that case is
1268 probably determined by the efficiency of pipes to userspace - which is huge.
1270 People who have done measurements discover that CBQ is not very accurate and
1271 sometimes completely misses the mark.
1273 Besides not being all that good, it also comes with little or no
1274 documentation AND with about 20 knobs to tune. In fact, CBQ is so hard to
1275 configure that people use scripts to generate the needed commands.
1277 In short - I would advise AGAINST using CBQ if you want to have accurate
1278 results and want to understand what you are doing.
1279 <sect3>CBQ parameters that have to do with shaping &amp; priorities
1281 Because lots of people are using CBQ anyhow, possibly because they don't
1282 have anything else available, we will describe it anyhow.
1284 Besides shaping, using the aforementioned idletime approximations, CBQ also
1285 acts like the PRIO queue in the sense that classes can have differing
1286 priorities and that lower priority numbers will be polled before the higher
1287 priority ones.
1289 Each time a packet is requested by the hardware layer to be sent out to the
1290 network, a weighted round robin process starts, beginning with the lower
1291 priority classes.
1293 These are then grouped and queried if they have data available. If so, it is
1294 returned. After a class has been allowed to dequeue a number of bytes, the
1295 next class within that priority is tried.
1297 Several parameters influence this Weighted Round Robin process.
1299 First the parameters that have to do with shaping:
1301 <descrip>
1302 <tag>avpkt</tag>
1303 Average size of a packet, measured in bytes. Needed for idle time
1304 approximation.
1305 <tag>bandwidth</tag>
1306 The physical bandwidth of your device, also needed for idle time
1307 calculations.
1308 <tag>cell</tag>
1309 The time a packet takes to be transmitted over an ethernet device grows in
1310 steps, based on the packet size. An 800 and a 806 size packet may take just
1311 as long to send, for example - this sets the granularity. Most often set to
1312 '8'.
1313 <tag>maxburst</tag>
1314 unknown
1315 <tag>mpu</tag>
1316 Mininum packet size - needed because even a zero size packet is padded
1317 to 64 bytes on ethernet, and so takes a certain time to transmit. CBQ needs
1318 to know this to accurately try to measure the idle time.
1319 <tag>rate</tag>
1320 Desired rate of traffic leaving this qdisc - this is the 'speed knob'
1321 </descrip>
1323 The following parameters control the WRR process:
1324 <descrip>
1325 <tag>allot</tag>
1326 When the outer cbq is asked for a packet to send out on the interface, it
1327 will try all inner qdiscs (classes) in turn, in order of the 'priority'
1328 parameter. Each time a class gets its turn, it can only send out a limited
1329 amount of data. 'Allot' is the base unit of this amount. See the 'weight'
1330 parameter for more information.
1332 <tag>prio</tag>
1333 The CBQ can also act like the PRIO device. Inner classes with lower priority
1334 are tried first and as long as they have traffic, other classes are not
1335 polled for traffic.
1337 <tag>weight</tag>
1338 Weight helps in the Weighted Round Robin process. Each class gets a chance
1339 to send in turn. If you have classes with significantly more bandwidth than
1340 other classes, it makes sense to allow them to send more data in one round
1341 than the others.
1343 A CBQ adds up all weights within a class, and normalizes them, so you can
1344 use arbitrary numbers: only the ratios are important. People have been
1345 using 'rate/10' as a rule of thumb and it appears to work well. The
1346 renormalized weight is multiplied by the 'allot' parameter to determine how
1347 much data can be sent in one round.
1348 </descrip>
1350 Internally, CBQ has a lot of finetuning. For example, classes which are
1351 known not to have data enqueued to them aren't queried. Overlimit classes
1352 are penalized by lowering their effective priority. All very smart &amp;
1353 complicated.
1355 <sect3>CBQ parameters that determine link sharing &amp; borrowing
1357 Besides purely limiting certain kinds of traffic, it is also possible to
1358 specify which classes can borrow capacity from other classes or, conversely,
1359 lend out bandwidth.
1361 A class that is configured with 'isolated' will not lend out bandwidth to
1362 sibling classes. Use this if you have competing or mutually-unfriendly
1363 agencies on your link who do want to give eachother freebies.
1365 A class can also be 'bounded', which means that it will not try to borrow
1366 bandwidth from sibling classes.
1368 A typical situation might be where you have two agencies on your link which
1369 are both 'isolated' and 'bounded', which means that they are really limited
1370 to their assigened rate, and also won't allow each other to borrow.
1372 Within such an agency class, there might be other classes which are allowed
1373 to swap bandwidth.
1375 <sect1>First attempt at bandwidth division
1377 CBQ enables us to generate several classes, and even classes within classes.
1378 The larger divisions might be called 'agencies'. Within these classes may be
1379 things like 'bulk' or 'interactive'.
1381 For example, we may have a 10 megabit connection to 'the internet'
1382 which is to be shared by our customers, and our corporate needs. We should
1383 not allow a few people at the office to steal away large amounts of
1384 bandwidth which we should sell to our customers.
1386 On the other hand, our customers should not be able to drown out the traffic
1387 from our field offices to the customer database.
1389 Previously, one way to solve this was to use either Frame Relay or ATM and
1390 create virtual circuits. This works, but Frame is not very fine grained, ATM
1391 is terribly inefficient at carrying IP traffic, and neither have standardised
1392 ways to segregate different types of traffic into different VCs.
1394 However, if you do use ATM, Linux can also happily perform deft acts of fancy
1395 traffic classification for you too. Another way is to order separate
1396 connections, but this is not very practical and also not very elegant, and
1397 still does not solve all your problems.
1399 CBQ to the rescue!
1401 Clearly we have two main classes, 'ISP' and 'Office'. Initially, we really
1402 don't care what the divisions do with their bandwidth, so we don't further
1403 subdivide their classes.
1405 We decide that the customers should always be guaranteed 8 megabits of
1406 downstream traffic, and our office 2 megabits.
1408 Setting up traffic control is done with the iproute2 tool <tt>tc</tt>.
1409 <tscreen><verb>
1410 # tc qdisc add dev eth0 root handle 10: cbq bandwidth 10Mbit avpkt 1000
1411 </verb></tscreen>
1412 <p>Ok, lots of numbers here. What has happened? We have configured
1413 the 'queueing discipline' of eth0. With 'root' we denote that this is the root
1414 discipline. We have given it the handle '10:'. We want to do CBQ, so we
1415 mention that on the command line as well. We tell the kernel that it can
1416 allocate 10Mbit and that the average packet size is somewhere around 1000
1417 octets.
1419 Now we need to generate our root class, from which all others descend:
1420 <tscreen><verb>
1421 # tc class add dev eth0 parent 10:0 classid 10:1 cbq bandwidth 10Mbit rate \
1422 10Mbit allot 1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000
1423 </verb></tscreen>
1425 Even more numbers to worry about - the Linux CBQ implementation is very
1426 generic. With 'parent 10:0' we indicate that this class descends from the
1427 root of qdisc handle '10:' we generated earlier. With 'classid 10:1' we
1428 name this class.
1430 We really don't tell the kernel a lot more, we just generate a
1431 class that completely fills the available device. We also specify that the
1432 MTU (plus some overhead) is 1514 octets. We also 'weigh' this class with
1433 1Mbit - a tuning parameter.
1435 We now generate our ISP class:
1436 <tscreen><verb>
1437 # tc class add dev eth0 parent 10:1 classid 10:100 cbq bandwidth 10Mbit rate \
1438 8Mbit allot 1514 weight 800Kbit prio 5 maxburst 20 avpkt 1000 \
1439 bounded
1440 </verb></tscreen>
1442 We allocate 8Mbit, and indicate that this class must not exceed this by
1443 adding the 'bounded' parameter. Otherwise this class would have started
1444 borrowing bandwidth from other classes, something we will discuss later on.
1446 To top it off, we generate the root Office class:
1447 <tscreen><verb>
1448 # tc class add dev eth0 parent 10:1 classid 10:200 cbq bandwidth 10Mbit rate \
1449 2Mbit allot 1514 weight 200Kbit prio 5 maxburst 20 avpkt 1000 \
1450 bounded
1451 </verb></tscreen>
1453 To make this a bit clearer, a diagram which shows our classes:
1455 <tscreen><verb>
1456 +-------------[10: 10Mbit]-------------------------+
1457 |+-------------[10:1 root 10Mbit]-----------------+|
1458 || ||
1459 || +-----[10:100 8Mbit]---------+ [10:200 2Mbit] ||
1460 || | | | | ||
1461 || | ISP | | Office | ||
1462 || | | | | ||
1463 || +----------------------------+ +------------+ ||
1464 || ||
1465 |+------------------------------------------------+|
1466 +--------------------------------------------------+
1467 </verb></tscreen>
1469 Ok, now we have told the kernel what our classes are, but not yet how to
1470 manage the queues. We do this presently, in one fell swoop for both classes.
1472 <tscreen><verb>
1473 # tc qdisc add dev eth0 parent 10:100 sfq quantum 1514b perturb 15
1474 # tc qdisc add dev eth0 parent 10:200 sfq quantum 1514b perturb 15
1475 </verb></tscreen>
1477 In this case we install the Stochastic Fairness Queueing discipline (sfq),
1478 which is not quite fair, but works well up to high bandwidths without
1479 burning up CPU cycles. There are other queueing disciplines available which
1480 are better, but need more CPU. The Token Bucket Filter is often used.
1482 Now there is only one thing left to do and that is to explain to the kernel
1483 which packets belong to which class. Initially we will do this natively with
1484 iproute2, but more interesting applications are possible in combination with
1485 netfilter.
1487 <tscreen><verb>
1488 # tc filter add dev eth0 parent 10:0 protocol ip prio 25 u32 match ip dst \
1489 150.151.23.24 flowid 10:200
1491 # tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip dst \
1492 150.151.0.0/16 flowid 10:100
1493 </verb></tscreen>
1495 Here it is assumed that our office hides behind a firewall with IP address
1496 150.151.23.24 and that all of our other IP addresses should be considered
1497 to be part of the ISP.
1499 The u32 match is a very simple one - more sophisticated matching rules are
1500 possible when using netfilter to mark our packets, which we can then match on
1501 in tc.
1503 Now that we have divided the downstream bandwidth fairly, we need to do
1504 the same for the upstream. For brevity's sake, all in one go:
1506 <tscreen><verb>
1507 # tc qdisc add dev eth1 root handle 20: cbq bandwidth 10Mbit avpkt 1000
1509 # tc class add dev eth1 parent 20:0 classid 20:1 cbq bandwidth 10Mbit rate \
1510 10Mbit allot 1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000
1512 # tc class add dev eth1 parent 20:1 classid 20:100 cbq bandwidth 10Mbit rate \
1513 8Mbit allot 1514 weight 800Kbit prio 5 maxburst 20 avpkt 1000 \
1514 bounded
1516 # tc class add dev eth1 parent 20:1 classid 20:200 cbq bandwidth 10Mbit rate \
1517 2Mbit allot 1514 weight 200Kbit prio 5 maxburst 20 avpkt 1000 \
1518 bounded
1520 # tc qdisc add dev eth1 parent 20:100 sfq quantum 1514b perturb 15
1521 # tc qdisc add dev eth1 parent 20:200 sfq quantum 1514b perturb 15
1523 # tc filter add dev eth1 parent 20:0 protocol ip prio 25 u32 match ip src \
1524 150.151.23.24 flowid 20:200
1526 # tc filter add dev eth1 parent 20:0 protocol ip prio 100 u32 match ip src \
1527 150.151.0.0/16 flowid 20:100
1528 </verb></tscreen>
1529 <sect1>What to do with excess bandwidth
1531 In our hypothetical case, we will find that even when the ISP customers
1532 are mostly offline (say, at 8AM), our office still gets only 2Mbit, which is
1533 rather wasteful.
1535 By removing the 'bounded' statements, classes will be able to borrow
1536 bandwidth from each other.
1538 Some classes may not wish to borrow their bandwidth to other classes. Two
1539 rival ISPs on a single link may not want to offer each other freebees. In
1540 such a case, you can add the keyword 'isolated' at the end of your 'tc class
1541 add' lines.
1543 <sect1>Class subdivisions
1545 FIXME: completely untested suppositions! Try this!
1547 We can go further than this. Should the employees at the office decide to all
1548 fire up their 'napster' clients, it is still possible that our database runs
1549 out of bandwidth. Therefore, we create two subclasses, 'Human' and 'Database'.
1551 Our database always needs 500Kbit, so we have 1.5Mbit left for Human
1552 consumption.
1554 We now need to create two new classes, within our Office class:
1555 <tscreen><verb>
1556 # tc class add dev eth0 parent 10:200 classid 10:250 cbq bandwidth 10Mbit rate \
1557 500Kbit allot 1514 weight 50Kbit prio 5 maxburst 20 avpkt 1000 \
1558 bounded
1560 # tc class add dev eth0 parent 10:200 classid 10:251 cbq bandwidth 10Mbit rate \
1561 1500Kbit allot 1514 weight 150Kbit prio 5 maxburst 20 avpkt 1000 \
1562 bounded
1563 </verb></tscreen>
1565 FIXME: Finish this example!
1567 <sect1>Loadsharing over multiple interfaces
1569 There are several ways of doing this. One of the easiest and straightforward
1570 ways is 'TEQL' - "True" (or "trivial") link equalizer. Like most things
1571 having to do with queueing, loadsharing goes both ways. Both ends of a link
1572 may need to participate for full effect.
1574 Imagine this situation:
1576 <tscreen><verb>
1577 +-------+ eth1 +-------+
1578 | |==========| |
1579 'network 1' ----| A | | B |---- 'network 2'
1580 | |==========| |
1581 +-------+ eth2 +-------+
1582 </verb></tscreen>
1584 A and B are routers, and for the moment we'll assume both run Linux. If
1585 traffic is going from network 1 to network 2, router A needs to distribute
1586 the packets over both links to B. Router B needs to be configured to accept
1587 this. Same goes the other way around, when packets go from network 2 to
1588 network 1, router B needs to send the packets over both eth1 and eth2.
1590 The distributing part is done by a 'TEQL' device, like this (it couldn't be
1591 easier):
1593 <tscreen><verb>
1594 # tc qdisc add dev eth1 root teql0
1595 # tc qdisc add dev eth2 root teql0
1596 </verb></tscreen>
1598 This needs to be done on both hosts. The device teql0 is basically a
1599 roundrobbin distributor over eth1 and eth2, for sending packets. No data
1600 ever comes in over an teql device, that just appears on the 'raw' eth1 and
1601 eth2.
1603 But now we just have devices, we also need proper routing. One way to do
1604 this is to assign a /31 network to both links, and a /31 to the teql0 device
1605 as well:
1607 FIXME: does this need something like 'nobroadcast'? A /31 is too small to
1608 house a network address and a broadcast address - if this doesn't work as
1609 planned, try a /30, and adjust the ip adresses accordingly. You might even
1610 try to make eth1 and eth2 do without an IP address!
1612 On router A:
1613 <tscreen><verb>
1614 # ip addr add dev eth1 10.0.0.0/31
1615 # ip addr add dev eth2 10.0.0.2/31
1616 # ip addr add dev teql0 10.0.0.4/31
1617 </verb></tscreen>
1619 On router B:
1620 <tscreen><verb>
1621 # ip addr add dev eth1 10.0.0.1/31
1622 # ip addr add dev eth2 10.0.0.3/31
1623 # ip addr add dev teql0 10.0.0.5/31
1624 </verb></tscreen>
1626 Router A should now be able to ping 10.0.0.1, 10.0.0.3 and 10.0.0.5 over the
1627 2 real links and the 1 equalized device. Router B should be able to ping
1628 10.0.0.0, 10.0.0.2 and 10.0.0.4 over the links.
1630 If this works, Router A should make 10.0.0.5 its route for reaching network
1631 2, and Router B should make 10.0.0.4 its route for reaching network 1. For
1632 the special case where network 1 is your network at home, and network 2 is
1633 the internet, Router A should make 10.0.0.5 its default gateway.
1635 <sect2>Caveats
1637 Nothing is as easy as it seems. eth1 and eth2 on both router A and B need to
1638 have return path filtering turned off, because they will otherwise drop
1639 packets destined for ip addresses other than their own:
1641 <tscreen><verb>
1642 # echo 0 > /proc/net/ipv4/conf/eth1/rp_filter
1643 # echo 0 > /proc/net/ipv4/conf/eth2/rp_filter
1644 </verb></tscreen>
1646 Then there is the nasty problem of packet reordering. Let's say 6 packets
1647 need to be sent from A to B - eth1 might get 1, 3 and 5. eth2 would then do
1648 2, 4 and 6. In an ideal world, router B would receive this in order, 1, 2,
1649 3, 4, 5, 6. But the possibility is very real that the kernel gets it like
1650 this: 2, 1, 4, 3, 6, 5. The problem is that this confuses TCP/IP. While not
1651 a problem for links carrying many different TCP/IP sessions, you won't be
1652 able to to a bundle multiple links and get to ftp a single file lots faster,
1653 except when your receiving or sending OS is Linux, which is not easily
1654 shaken by some simple reordering.
1656 However, for lots of applications, link loadbalancing is a great idea.
1660 <sect1>Hierarchical Token Bucket (HTB) queueing CBQ alternative
1662 As explained on the <url url="http://luxik.cdi.cz/~devik/qos/htb/"
1663 name="(site)">
1665 Martin Devera (&lt;devik&gt;) rightly realised that CBQ is complex and does
1666 not seem optimized for many typical situations. His Hierarchical approach is
1667 well suited for setups where you have a fixed amount of bandwidth, which you
1668 want to divide for different purposes, giving each purpose a guaranteed
1669 bandwidth, and possibly a bandwidth ceiling.
1671 A simple setup with three classes, one of which is the default class that
1672 gets all unfiltered traffic looks like this:
1673 <tscreen><verb>
1674 # tc qdisc add dev eth0 root handle 1: htb default 12
1676 # tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps burst 2k
1677 # tc class add dev eth0 parent 1:1 classid 1:10 htb rate 30kbps ceil 100kbps burst 2k
1678 # tc class add dev eth0 parent 1:1 classid 1:11 htb rate 10kbps ceil 100kbps burst 2k
1679 # tc class add dev eth0 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps burst 2k
1680 </verb></tscreen>
1682 The author then recommends SFQ for beneath these classes:
1683 <tscreen><verb>
1684 # tc qdisc add dev eth0 parent 1:10 handle 20: sfq perturb 10
1685 # tc qdisc add dev eth0 parent 1:11 handle 30: sfq perturb 10
1686 # tc qdisc add dev eth0 parent 1:12 handle 40: sfq perturb 10
1687 </verb></tscreen>
1689 Add the filters which direct traffic to the right classes:
1690 <tscreen><verb>
1691 # U32="tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32"
1692 # $U32 match ip dport 80 0xffff flowid 1:10
1693 # $U32 match ip sport 25 0xffff flowid 1:11
1694 </verb></tscreen>
1695 Note that there is no filter for 1:12 - it is already the default.
1697 And that's it - no unsightly unexplained numbers, no undocumented
1698 parameters.
1700 HTB certainly looks wonderful - if 1:10 and 1:11 both have their guaranteed
1701 bandwidth, and more is left to divide, they borrow in a 30:10 ratio, just as
1702 you would expect.
1704 As your HTB configuration gets more complex, your configuration scales
1705 well. With CBQ it is already complex even in simple cases! HTB is not yet a
1706 part of the standard kernel, but it should soon be!
1708 Esteve Camps Chust &lt;marvin@grn.es&gt;&nl;
1709 This text is an extract from my thesis on "QoS Support in Linux", September 2000.&nl;
1711 Source documents:&nl;
1712 <itemize>
1713 <item><url url="http://ica1www.epfl.ch/~almesber" name="Draft-almesberger-wajhak-diffserv-linux-01.txt">.
1714 <item>Examples in iproute2 distribution.
1715 <item><url url="http://www.qosforum.com/white-papers/qosprot_v3.pdf" name="White Paper-QoS protocols and architectures"> and
1716 <url url="http://www.qosforum.com/docs/faq" name="IP QoS Frequently Asked Questions"> both by <em>Quality of Service Forum</em>.
1717 </itemize>
1718 <sect>Special Queues
1719 <sect1>DSMARK
1721 This chapter was written by Esteve Camps &lt;esteve@hades.udg.es&gt;.
1722 <sect2>Introduction
1725 First of all, first of all, it would be a great idea for you to read RFCs
1726 written about this (RFC2474, RFC2475, RFC2597 and RFC2598) at <url
1727 url="http://www.ietf.org/html.carters/diffserv-charter.html" name="IETF
1728 DiffServ working Group web site"> and <url
1729 url="http://ica1www.epfl.ch/~almesber" name="Werner Almesberger web site">
1730 (he wrote the code to support Differentiated Services on Linux).
1732 <sect2>What is Dsmark related to?
1734 Dsmark is a queueing discipline that offers the capabilities needed in
1735 Differentiated Services (also called DiffServ or, simply, DS). DiffServ is
1736 one of two actual QoS architectures (the other one is called Integrated
1737 Services) that is based on a value carried by packets in the DS field of the
1738 IP header.
1741 One of the first solutions in IP designed to offer some QoS level was
1742 the Type of Service field (TOS byte) in IP header. By changing that value,
1743 we could choose a high/low level of throughput, delay or reliability.
1744 But this didn't provide sufficient flexibility to the needs of new
1745 services (such as real-time applications, interactive applications and
1746 others). After this, new architectures appeared. One of these was DiffServ
1747 which kept TOS bits and renamed DS field.
1748 <sect2>Differentiated Services guidelines
1750 Differentiated Services is group-oriented. I mean, we don't know nothing
1751 about flows (this will be the Integrated Services purpose); we know about
1752 flow aggregations and we will apply different behaviours depending on which
1753 aggregation a packet belongs to.
1756 When a packet arrives to an edge node (entry node to a DiffServ domain)
1757 entering to a DiffServ Domain we'll have to policy, shape and/or mark those
1758 packets (marking refers to assigning a value to the DS field. It's just like the
1759 cows :-) ). This will be the mark/value that the internal/core nodes on our
1760 DiffServ Domain will look at to determine which behaviour or QoS level
1761 apply.
1764 As you can deduce, Differentiated Services involves a domain on which
1765 all DS rules will have to be applied. In fact you can think &dquot;I
1766 will classify all the packets entering my domain. Once they enter my
1767 domain they will be subjected to the rules that my classification dictates
1768 and every traversed node will apply that QoS level&dquot;.
1770 In fact, you can apply your own policies into your local domains, but some
1771 <em>Service Level Agreements</em> should be considered when connecting to
1772 other DS domains.
1775 At this point, you maybe have a lot of questions. DiffServ is more than I've
1776 explained. In fact, you can understand that I can not resume more than 3
1777 RFC's in just 50 lines :-).
1779 <sect2>Working with Dsmark
1782 As the DiffServ bibliography specifies, we differentiate boundary nodes and
1783 interior nodes. These are two important points in the traffic path. Both
1784 types perform a classification when the packets arrive. Its result may be
1785 used in different places along the DS process before the packet is released
1786 to the network. It's just because of this that the diffserv code supplies an
1787 structure called sk_buff, including a new field called skb-&gt;tc_index
1788 where we'll store the result of initial classification that may be used in
1789 several points in DS treatment.
1792 The skb-&gt;tc_index value will be initially set by the DSMARK qdisc,
1793 retrieving it from the DS field in IP header of every received packet.
1794 Besides, cls_tcindex classifier will read all or part of skb-&gt;tcindex
1795 value and use it to select classes.
1798 But, first of all, take a look at DSMARK qdisc command and its parameters:
1799 <tscreen><verb>
1800 ... dsmark indices INDICES [ default_index DEFAULT_INDEX ] [ set_tc_index ]
1801 </verb></tscreen>
1802 What do these parameters mean?
1803 <itemize>
1804 <item><bf>indices</bf>: size of table of (mask,value) pairs. Maximum value is 2^n, where n&gt=0.
1805 <item><bf>Default_index</bf>: the default table entry index if classifier finds no match.
1806 <item><bf>Set_tc_index</bf>: instructs dsmark discipline to retrieve the DS field and store it onto skb-&gt;tc_index.
1807 </itemize>
1808 Let's see the DSMARK process.
1810 <sect2>How SCH_DSMARK works.
1812 This qdisc will apply the next steps:
1813 <itemize>
1814 <item>If we have declared set_tc_index option in qdisc command, DS field is retrieved and stored onto
1815 skb-&gt;tc_index variable.
1816 <item>Classifier is invoked. The classifier will be executed and it will return a class ID that will be stored in
1817 skb-&gt;tc_index variable.If no filter matches are found, we consider the default_index option to be the
1818 classId to store. If neither set_tc_index nor default_index has been declared results may be
1819 impredictibles.
1820 <item>After been sent to internal qdisc's where you can reuse the result of the filter, the classid returned by
1821 the internal qdisc is stored into skb-&gt;tc_index. We will use this value in the future to index a mask-
1822 value table. The final result to assign to the packet will be that resulting from next operation:
1823 <tscreen><verb>
1824 New_Ds_field = ( Old_DS_field & mask ) | value
1825 </verb></tscreen>
1827 <item>Thus, new value will result from "anding" ds_field and mask values and next, this result "ORed" with
1828 value parameter. See next diagram to understand all this process:
1829 </itemize>
1830 <tscreen>
1831 <verb>
1832 skb-&gt;ihp-&gt;tos
1833 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - &gt;
1834 | | ^
1835 | -- If you declare set_tc_index, we set DS | | &lt;-----May change
1836 | value into skb-&gt;tc_index variable | |O DS field
1837 | A| |R
1838 +-|-+ +------+ +---+-+ Internal +-+ +---N|-----|----+
1839 | | | | tc |---&gt;| | |--&gt; . . . --&gt;| | | D| | |
1840 | | |-----&gt;|index |---&gt;| | | Qdisc | |----&gt;| v | |
1841 | | | |filter|---&gt;| | | +---------------+ | ----&gt;(mask,value) |
1842 --&gt;| O | +------+ +-|-+--------------^----+ / | (. , .) |
1843 | | | ^ | | | | (. , .) |
1844 | | +----------|---------|----------------|-------|--+ (. , .) |
1845 | | sch_dsmark | | | | |
1846 +-|------------|---------|----------------|-------|------------------+
1847 | | | &lt;- tc_index -&gt; | |
1848 | |(read) | may change | | &lt;--------------Index to the
1849 | | | | | (mask,value)
1850 v | v v | pairs table
1851 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&gt;
1852 skb-&gt;tc_index
1853 </verb>
1854 </tscreen>
1856 How to do marking? Just change the mask and value of the class you want to remark. See next line of code:
1857 <tscreen>
1858 tc class change dev eth0 classid 1:1 dsmark mask 0x3 value 0xb8
1859 </tscreen>
1860 This changes the (mask,value) pair in hash table, to remark packets belonging to class 1:1.You have to "change" this values
1861 because of default values that (mask,value) gets initially (see table below).
1863 Now, we'll explain how TC_INDEX filter works and how fits into this. Besides, TCINDEX filter can be
1864 used in other configurations rather than those including DS services.
1867 <sect2>TC_INDEX Filter
1869 This is the basic command to declare a TC_INDEX filter:
1870 <tscreen>
1871 <verb>
1872 ... tcindex [ hash SIZE ] [ mask MASK ] [ shift SHIFT ]
1873 [ pass_on | fall_through ]
1874 [ classid CLASSID ] [ police POLICE_SPEC ]
1875 </verb>
1876 </tscreen>
1877 Next, we show the example used to explain TC_INDEX operation mode. Pay attention to bolded words:
1878 &nl;&nl;
1879 tc qdisc add dev eth0 handle 1:0 root dsmark indices 64 <bf>set_tc_index</bf>&nl;
1880 tc filter add dev eth0 parent 1:0 protocol ip prio 1 tcindex <bf>mask 0xfc shift 2</bf>&nl;
1881 tc qdisc add dev eth0 parent 1:0 handle 2:0 cbq bandwidth 10Mbit cell 8 avpkt 1000 mpu 64&nl;
1882 # EF traffic class&nl;
1883 tc class add dev eth0 parent 2:0 classid 2:1 cbq bandwidth 10Mbit rate 1500Kbit avpkt 1000 prio 1 bounded isolated allot 1514 weight 1 maxburst 10&nl;
1884 # Packet fifo qdisc for EF traffic&nl;
1885 tc qdisc add dev eth0 parent 2:1 pfifo limit 5&nl;
1886 tc filter add dev eth0 parent 2:0 protocol ip prio 1 <bf>handle 0x2e</bf> tcindex <bf>classid 2:1 pass_on</bf>&nl;
1887 &nl;&nl;
1888 (This code is not complete. It's just an extract from EFCBQ example included in iproute2 distribution).
1890 First of all, suppose we receive a packet marked as EF . If you read RFC2598, you'll see that DSCP
1891 recommended value for EF traffic is 101110. This means that DS field will be 10111000 (remember that
1892 less signifiant bits in TOS byte are not used in DS) or 0xb8 in hexadecimal codification.
1894 <tscreen>
1895 <verb>
1896 TC INDEX
1897 FILTER
1898 +---+ +-------+ +---+-+ +------+ +-+ +-------+
1899 | | | | | | | |FILTER| +-+ +-+ | | | |
1900 | |-----&gt;| MASK | -&gt; | | | -&gt; |HANDLE|-&gt;| | | | -&gt; | | -&gt; | |
1901 | | . | =0xfc | | | | |0x2E | | +----+ | | | | |
1902 | | . | | | | | +------+ +--------+ | | | |
1903 | | . | | | | | | | | |
1904 --&gt;| | . | SHIFT | | | | | | | |--&gt;
1905 | | . | =2 | | | +----------------------------+ | | |
1906 | | | | | | CBQ 2:0 | | |
1907 | | +-------+ +---+--------------------------------+ | |
1908 | | | |
1909 | +-------------------------------------------------------------+ |
1910 | DSMARK 1:0 |
1911 +-------------------------------------------------------------------------+
1913 </verb>
1914 </tscreen>
1916 The packet arrives, then, set with 0xb8 value at DS field. As we explained before, dsmark qdisc identified
1917 by 1:0 id in the example, retrieves DS field and store it in skb-&gt;tc_index variable.
1918 Next step in the example will correspond to the filter associated to this qdisc (second line in the example).
1919 This will perform next operations:
1920 <tscreen>
1921 <verb>
1922 Value1 = skb->tc_index & MASK
1923 Key = Value1 >> SHIFT
1924 </verb>
1925 </tscreen>
1928 In the example, MASK=0xFC i SHIFT=2.
1929 <tscreen>
1930 <verb>
1931 Value1 = 10111000 & 11111100 = 10111000
1932 Key = 10111000 >> 2 = 00101110 -> 0x2E in hexadecimal
1933 </verb>
1934 </tscreen>
1937 The returned value will correspond to a qdisc interal filter handle (in the example, identifier 2:0). If a
1938 filter with this id exists, policing and metering conditions will be verified (in case that filter includes this)
1939 and the classid will be returned (in our example, classid 2:1) and stored in skb-&gt;tc_index variable.
1942 But if any filter with that identifier is found, the result will depend on fall_through flag declaration. If so,
1943 value key is returned as classid. If not, an error is returned and process continues with the rest filters. Be
1944 careful if you use fall_through flag; this can be done if a simple relation exists between values
1945 &nl;of skb-&gt;tc_index variable and class id's.
1948 The latest parameters to comment on are hash and pass_on. The first one
1949 relates to hash table size. Pass_on will be used to indicate that if no classid
1950 equal to the result of this filter is found, try next filter.
1951 The default action is fall_through (look at next table).
1954 Finally, let's see which possible values can be set to all this TCINDEX parameters:
1955 <tscreen>
1956 <verb>
1957 TC Name Value Default
1958 -----------------------------------------------------------------
1959 Hash 1...0x10000 Implementation dependent
1960 Mask 0...0xffff 0xffff
1961 Shift 0...15 0
1962 Fall through / Pass_on Flag Fall_through
1963 Classid Major:minor None
1964 Police ..... None
1965 </verb>
1966 </tscreen>
1968 This kind of filter is very powerful. It's necessary to explore all possibilities. Besides, this filter is not only used in DiffServ configurations.
1969 You can use it as any other kind of filter.
1971 I recommend you to look at all DiffServ examples included in iproute2 distribution. I promise I will try to
1972 complement this text as soon as I can. Besides, all I have explained is the result of a lot of tests.
1973 I would thank you tell me if I'm wrong in any point.
1974 <sect1>WRR
1976 This qdisc is not included in the standard kernels but can be downloaded from
1977 <url url="http://wipl-wrr.dkik.dk/wrr/">.
1978 Currently the qdisc is only tested with Linux 2.2 kernels but it will
1979 probably work with 2.4 kernels too.
1981 The WRR qdisc distributes bandwidth between its classes using the weighted
1982 round robin scheme. That is, like the CBQ qdisc it contains classes
1983 into which arbitrary qdiscs can be plugged. All classes which have sufficient
1984 demand will get bandwidth proportional to the weights associated with the classes.
1985 The weights can be set manually using the <tt>tc</tt> program. But they
1986 can also be made automatically decreasing for classes transferring much data.
1988 The qdisc has a built-in classifier which assigns packets coming from or
1989 sent to different machines to different classes. Either the MAC or IP and
1990 either source or destination addresses can be used. The MAC address can only
1991 be used when the Linux box is acting as an ethernet bridge, however. The
1992 classes are automatically assigned to machines based on the packets seen.
1994 The qdisc can be very useful at sites such as dorms where a lot of unrelated
1995 individuals share an Internet connection. A set of scripts setting up a
1996 relevant behavior for such a site is a central part of the WRR distribution.
1998 <sect>Netfilter &amp; iproute - marking packets
2000 So far we've seen how iproute works, and netfilter was mentioned a few
2001 times. This would be a good time to browse through <url name="Rusty's Remarkably
2002 Unreliable Guides"
2003 url="http://netfilter.samba.org/unreliable-guides/">. Netfilter itself
2004 can be found <url name="here"
2005 url="http://netfilter.filewatcher.org/">.
2007 Netfilter allows us to filter packets, or mangle their headers. One special
2008 feature is that we can mark a packet with a number. This is done with the
2009 --set-mark facility.
2011 As an example, this command marks all packets destined for port 25, outgoing
2012 mail:
2014 <tscreen><verb>
2015 # iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 25 \
2016 -j MARK --set-mark 1
2017 </verb></tscreen>
2019 Let's say that we have multiple connections, one that is fast (and
2020 expensive, per megabyte) and one that is slower, but flat fee. We would most
2021 certainly like outgoing mail to go via the cheap route.
2023 We've already marked the packets with a '1', we now instruct the routing
2024 policy database to act on this:
2026 <tscreen><verb>
2027 # echo 201 mail.out >> /etc/iproute2/rt_tables
2028 # ip rule add fwmark 1 table mail.out
2029 # ip rule ls
2030 0: from all lookup local
2031 32764: from all fwmark 1 lookup mail.out
2032 32766: from all lookup main
2033 32767: from all lookup default
2034 </verb></tscreen>
2036 Now we generate the mail.out table with a route to the slow but cheap link:
2037 <tscreen><verb>
2038 # /sbin/ip route add default via 195.96.98.253 dev ppp0 table mail.out
2039 </verb></tscreen>
2041 And we are done. Should we want to make exceptions, there are lots of ways
2042 to achieve this. We can modify the netfilter statement to exclude certain
2043 hosts, or we can insert a rule with a lower priority that points to the main
2044 table for our excepted hosts.
2046 We can also use this feature to honour TOS bits by marking packets with a
2047 different type of service with different numbers, and creating rules to act
2048 on that. This way you can even dedicate, say, an ISDN line to interactive
2049 sessions.
2051 Needless to say, this also works fine on a host that's doing NAT
2052 ('masquerading').
2054 IMPORTANT: We received a report that MASQ and SNAT at least collide
2055 with marking packets. Rusty Russell explains it in
2056 <url
2057 url="http://lists.samba.org/pipermail/netfilter/2000-November/006089.html"
2058 name="this posting">. Turn off the reverse path filter to make it work
2059 properly.
2061 Note: to mark packets, you need to have some options enabled in your
2062 kernel:
2064 <tscreen><verb>
2065 IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) [Y/n/?]
2066 IP: policy routing (CONFIG_IP_MULTIPLE_TABLES) [Y/n/?]
2067 IP: use netfilter MARK value as routing key (CONFIG_IP_ROUTE_FWMARK) [Y/n/?]
2068 </verb></tscreen>
2070 See also <ref id="SQUID" name="Transparent web-caching using netfilter, iproute2, ipchains and squid">
2071 in the Cookbook.
2072 <sect>More classifiers
2075 Classifiers are the way by which the kernel decides which queue a packet
2076 should be placed into. There are various different classifiers, each of
2077 which can be used for different purposes.
2079 <descrip>
2080 <tag>fw</tag>
2081 Bases the decision on how the firewall has marked the packet.
2083 <tag>u32</tag>
2084 Bases the decision on fields within the packet (i.e. source IP address, etc)
2086 <tag>route</tag>
2087 Bases the decision on which route the packet will be routed by.
2089 <tag>rsvp, rsvp6</tag>
2090 Bases the decision on the target (destination,protocol) and optionally the source as well. (I think)
2092 <tag>tcindex</tag>
2093 FIXME: Fill me in
2094 </descrip>
2096 Note that in general there are many ways in which you can classify packet
2097 and that it generally comes down to preference as to which system you wish
2098 to use.
2100 Classifiers in general accept a few arguments in common. They are listed here for convenience:
2102 <descrip>
2103 <tag>protocol</tag>
2104 The protocol this classifier will accept. Generally you will only be
2105 accepting only IP traffic. Required.
2107 <tag>parent</tag>
2108 The handle this classifier is to be attached to. This handle must be
2109 an already existing class. Required.
2111 <tag>prio</tag>
2112 The priority of this classifier. Lower numbers get tested first.
2114 <tag>handle</tag>
2115 This handle means different things to different filters.
2117 FIXME: Add more
2118 </descrip>
2120 All the following sections will assume you are trying to shape the traffic
2121 going to <tt>HostA</tt>. They will assume that the root class has been
2122 configured on 1: and that the class you want to send the selected traffic to
2123 is 1:1.
2125 <sect1>The "fw" classifier
2126 <p> The "fw" classifier relies on the firewall tagging the packets to be shaped. So,
2127 first we will setup the firewall to tag them:
2129 <tscreen><verb>
2130 # iptables -I PREROUTING -t mangle -p tcp -d HostA \
2131 -j MARK --set-mark 1
2132 </verb></tscreen>
2134 Now all packets to that machine are tagged with the mark 1. Now we build
2135 the packet shaping rules to actually shape the packets. Now we just need
2136 to indicate that we want the packets that are tagged with the mark 1 to go
2137 to class 1:1. This is accomplished with the command:
2139 <tscreen><verb>
2140 # tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 1 fw classid 1:1
2141 </verb></tscreen>
2143 This should be fairly self-explanatory. Attach to the 1:0 class a filter
2144 with priority 1 to filter all packet marked with 1 in the firewall to
2145 class 1:1. Note how the handle here is used to indicate what the mark
2146 should be.
2148 That's all there is to it! This is the (IMHO) easy way, the other ways are
2149 harder to understand, I think. Note that you can apply the full power of
2150 the firewalling code with this classifier, including matching MAC
2151 addresses, user IDs and anything else the firewall can match.
2153 <sect1>The "u32" classifier
2155 The U32 filter is the most advanced filter available in the current
2156 implementation. It entirely based on hashing tables, which make it
2157 robust when there are many filter rules.
2159 In its simplest form the U32 filter is a list of records, each
2160 consisting of two fields: a selector and an action. The selectors,
2161 described below, are compared with the currently processed IP packet
2162 until the first match occurs, and then the associated action is performed.
2163 The simplest type of action would be directing the packet into defined
2164 CBQ class.
2166 The commandline of <tt>tc filter</tt> program, used to configure the filter,
2167 consists of three parts: filter specification, a selector and an action.
2168 The filter specification can be defined as:
2170 <tscreen><verb>
2171 tc filter add dev IF [ protocol PROTO ]
2172 [ (preference|priority) PRIO ]
2173 [ parent CBQ ]
2174 </verb></tscreen>
2176 The <tt>protocol</tt> field describes protocol that the filter will be
2177 applied to. We will only discuss case of <tt>ip</tt> protocol. The
2178 <tt>preference</tt> field (<tt>priority</tt> can be used alternatively)
2179 sets the priority of currently defined filter. This is important, since
2180 you can have several filters (lists of rules) with different priorities.
2181 Each list will be passed in the order the rules were added, then list with
2182 lower priority (higher preference number) will be processed. The <tt>parent</tt>
2183 field defines the CBQ tree top (e.g. 1:0), the filter should be attached
2186 The options decribed apply to all filters, not only U32.
2188 <sect2>U32 selector
2191 The U32 selector contains definition of the pattern, that will be matched
2192 to the currently processed packet. Precisely, it defines which bits are
2193 to be matched in the packet header and nothing more, but this simple
2194 method is very powerful. Let's take a look at the following examples,
2195 taken directly from a pretty complex, real-world filter:
2197 <tscreen><verb>
2198 # filter parent 1: protocol ip pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:3 \
2199 match 00100000/00ff0000 at 0
2200 </verb></tscreen>
2203 For now, leave the first line alone - all these parameters describe
2204 the filter's hash tables. Focus on the selector line, containing
2205 <tt>match</tt> keyword. This selector will match to IP headers, whose
2206 second byte will be 0x10 (0010). As you can guess, the 00ff number is
2207 the match mask, telling the filter exactly which bits to match. Here
2208 it's 0xff, so the byte will match if it's exactly 0x10. The <tt>at</tt>
2209 keyword means that the match is to be started at specified offset (in
2210 bytes) -- in this case it's beginning of the packet. Translating all
2211 that to human language, the packet will match if its Type of Service
2212 field will have `low delay' bits set. Let's analyze another rule:
2214 <tscreen><verb>
2215 # filter parent 1: protocol ip pref 10 u32 fh 800::803 order 2051 key ht 800 bkt 0 flowid 1:3 \
2216 match 00000016/0000ffff at nexthdr+0
2217 </verb></tscreen>
2220 The <tt>nexthdr</tt> option means next header encapsulated in the IP packet,
2221 i.e. header of upper-layer protocol. The match will also start here
2222 at the beginning of the next header. The match should occur in the
2223 second, 32-bit word of the header. In TCP and UDP protocols this field
2224 contains packet's destination port. The number is given in big-endian
2225 format, i.e. older bits first, so we simply read 0x0016 as 22 decimal,
2226 which stands for SSH service if this was TCP. As you guess, this match
2227 is ambigous without a context, and we will discuss this later.
2230 Having understood all the above, we will find the following selector
2231 quite easy to read: <tt>match c0a80100/ffffff00 at 16</tt>. What we
2232 got here is a three byte match at 17-th byte, counting from the IP
2233 header start. This will match for packets with destination address
2234 anywhere in 192.168.1/24 network. After analyzing the examples, we
2235 can summarize what we have learnt.
2237 <sect2>General selectors
2240 General selectors define the pattern, mask and offset the pattern
2241 will be matched to the packet contents. Using the general selectors
2242 you can match virtually any single bit in the IP (or upper layer)
2243 header. They are more difficult to write and read, though, than
2244 specific selectors that described below. The general selector syntax
2247 <tscreen><verb>
2248 match [ u32 | u16 | u8 ] PATTERN MASK [ at OFFSET | nexthdr+OFFSET]
2249 </verb></tscreen>
2252 One of the keywords <tt>u32</tt>, <tt>u16</tt> or <tt>u8</tt> specifies
2253 length of the pattern in bits. PATTERN and MASK should follow, of length
2254 defined by the previous keyword. The OFFSET parameter is the offset,
2255 in bytes, to start matching. If <tt>nexthdr+</tt> keyword is given,
2256 the offset is relative to start of the upper layer header.
2259 Some examples:
2261 <tscreen><verb>
2262 # tc filter add dev ppp14 parent 1:0 prio 10 u32 \
2263 match u8 64 0xff at 8 \
2264 flowid 1:4
2265 </verb></tscreen>
2268 Packet will match to this rule, if its time to live (TTL) is 64.
2269 TTL is the field starting just after 8-th byte of the IP header.
2271 <tscreen><verb>
2272 # tc filter add dev ppp14 parent 1:0 prio 10 u32 \
2273 match u8 0x10 0xff at nexthdr+13 \
2274 protocol tcp \
2275 flowid 1:3 \
2276 </verb></tscreen>
2279 This rule will only match TCP packets with ACK bit set. Here we can see
2280 an example of using two selectors, the final result will be logical AND
2281 of their results. If we take a look at TCP header diagram, we can see
2282 that the ACK bit is second older bit (0x10) in the 14-th byte of the TCP
2283 header (<tt>at nexthdr+13</tt>). As for the second selector, if we'd like
2284 to make our life harder, we could write <tt>match u8 0x06 0xff at 9</tt>
2285 instead of using the specific selector <tt>protocol tcp</tt>, because
2286 6 is the number of TCP protocol, present in 10-th byte of the IP header.
2287 On the other hand, in this example we couldn't use any specific selector
2288 for the first match - simply because there's no specific selector to match
2289 TCP ACK bits.
2291 <sect2>Specific selectors
2293 The following table contains a list of all specific selectors
2294 the author of this section has found in the <tt>tc</tt> program
2295 source code. They simply make your life easier and increase readability
2296 of your filter's configuration.
2298 FIXME: table placeholder - the table is in separate file ,,selector.html''
2300 FIXME: it's also still in Polish :-(
2302 FIXME: must be sgml'ized
2304 Some examples:
2306 <tscreen><verb>
2307 # tc filter add dev ppp0 parent 1:0 prio 10 u32 \
2308 match ip tos 0x10 0xff \
2309 flowid 1:4
2310 </verb></tscreen>
2312 The above rule will match packets which have the TOS field set to 0x10.
2313 The TOS field starts at second byte of the packet and is one byte big,
2314 so we could write an equivalent general selector: <tt>match u8 0x10 0xff
2315 at 1</tt>. This gives us hint to the internals of U32 filter -- the
2316 specific rules are always translated to general ones, and in this
2317 form they are stored in the kernel memory. This leads to another conclusion
2318 -- the <tt>tcp</tt> and <tt>udp</tt> selectors are exactly the same
2319 and this is why you can't use single <tt>match tcp dst 53 0xffff</tt>
2320 selector to match TCP packets sent to given port -- they will also
2321 match UDP packets sent to this port. You must remember to also specify
2322 the protocol and end up with the following rule:
2324 <tscreen><verb>
2325 # tc filter add dev ppp0 parent 1:0 prio 10 u32 \
2326 match tcp dst 53 0xffff \
2327 match ip protocol 0x6 0xff \
2328 flowid 1:2
2329 </verb></tscreen>
2331 <!--
2332 TODO:
2334 describe more options
2336 match
2337 offset
2338 hashkey
2339 classid | flowid
2340 divisor
2341 order
2342 link
2344 sample
2345 police
2349 <sect1>The "route" classifier
2352 This classifier filters based on the results of the routing tables. When a
2353 packet that is traversing through the classes reaches one that is marked
2354 with the "route" filter, it splits the packets up based on information in
2355 the routing table.
2357 <tscreen><verb>
2358 # tc filter add dev eth1 parent 1:0 protocol ip prio 100 route
2359 </verb></tscreen>
2361 Here we add a route classifier onto the parent node 1:0 with priority 100.
2362 When a packet reaches this node (which, since it is the root, will happen
2363 immediately) it will consult the routing table and if one matches will
2364 send it to the given class and give it a priority of 100. Then, to finally
2365 kick it into action, you add the appropriate routing entry:
2367 The trick here is to define 'realm' based on either destination or source.
2368 The way to do it is like this:
2370 <tscreen><verb>
2371 # ip route add Host/Network via Gateway dev Device realm RealmNumber
2372 </verb></tscreen>
2374 For instance, we can define our destination network 192.168.10.0 with a realm
2375 number 10:
2377 <tscreen><verb>
2378 # ip route add 192.168.10.0/24 via 192.168.10.1 dev eth1 realm 10
2379 </verb></tscreen>
2381 When adding route filters, we can use realm numbers to represent the
2382 networks or hosts and specify how the routes match the filters.
2384 <tscreen><verb>
2385 # tc filter add dev eth1 parent 1:0 protocol ip prio 100 \
2386 route to 10 classid 1:10
2387 </verb></tscreen>
2389 The above rule says packets going to the network 192.168.10.0 match class id
2390 1:10.
2392 Route filter can also be used to match source routes. For example, there is
2393 a subnetwork attached to the Linux router on eth2.
2395 <tscreen><verb>
2396 # ip route add 192.168.2.0/24 dev eth2 realm 2
2397 # tc filter add dev eth1 parent 1:0 protocol ip prio 100 \
2398 route from 2 classid 1:2
2399 </verb></tscreen>
2401 Here the filter specifies that packets from the subnetwork 192.168.2.0
2402 (realm 2) will match class id 1:2.
2404 <sect1>The "rsvp" classifier
2405 <p>FIXME: Fill me in
2408 <sect1>The "tcindex" classifier
2409 <p>FIXME: Fill me in
2411 <sect>Kernel network parameters
2413 The kernel has lots of parameters which can be tuned for different
2414 circumstances. While, as usual, the default parameters serve 99% of
2415 installations very well, we don't call this the Advanced HOWTO for the fun
2416 of it!
2418 The interesting bits are in /proc/sys/net, take a look there. Not everything
2419 will be documented here initially, but we're working on it.
2421 (FIXME)
2423 <sect1>Reverse Path Filtering
2425 By default, routers route everything, even packets which 'obviously' don't
2426 belong on your network. A common example is private IP space escaping onto
2427 the internet. If you have an interface with a route of 195.96.96.0/24 to it,
2428 you do not expect packets from 212.64.94.1 to arrive there.
2430 Lots of people will want to turn this feature off, so the kernel hackers
2431 have made it easy. There are files in <file>/proc</file> where you can tell
2432 the kernel to do this for you. The method is called "Reverse Path
2433 Filtering". Basically, if the reply to this packet wouldn't go out the
2434 interface this packet came in, then this is a bogus packet and should be
2435 ignored.
2437 The following fragment will turn this on for all current and future
2438 interfaces.
2440 <tscreen><verb>
2441 # for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do
2442 &gt; echo 2 > $i
2443 &gt; done
2444 </verb></tscreen>
2446 Going by the example above, if a packet arrived on the Linux router on eth1
2447 claiming to come from the Office+ISP subnet, it would be dropped. Similarly,
2448 if a packet came from the Office subnet, claiming to be from somewhere
2449 outside your firewall, it would be dropped also.
2451 The above is full reverse path filtering. The default is to only filter
2452 based on IPs that are on directly connected networks. This is because the
2453 full filtering breaks in the case of asymmetric routing (where packets come
2454 in one way and go out another, like satellite traffic, or if you have
2455 dynamic (bgp, ospf, rip) routes in your network. The data comes down
2456 through the satellite dish and replies go back through normal land-lines).
2458 If this exception applies to you (and you'll probably know if it does) you
2459 can simply turn off the <file>rp_filter</file> on the interface where the
2460 satellite data comes in. If you want to see if any packets are being
2461 dropped, the <file>log_martians</file> file in the same directory will tell
2462 the kernel to log them to your syslog.
2464 <tscreen><verb>
2465 # echo 1 >/proc/sys/net/ipv4/conf/<interfacename>/log_martians
2466 </verb></tscreen>
2468 FIXME: is setting the conf/{default,all}/* files enough? - martijn
2470 <sect1>Obscure settings
2472 Ok, there are a lot of parameters which can be modified. We try to list them
2473 all. Also documented (partly) in <file>Documentation/ip-sysctl.txt</file>.
2475 Some of these settings have different defaults based on whether you
2476 answered 'Yes' to 'Configure as router and not host' while compiling your
2477 kernel.
2479 <sect2>Generic ipv4
2481 As a generic note, most rate limiting features don't work on loopback, so
2482 don't test them locally. The limits are supplied in 'jiffies', and are
2483 enforced using the earlier mentioned token bucket filter.
2485 The kernel has an internal clock which runs at 'HZ' ticks (or 'jiffies') per
2486 second. On intel, 'HZ' is mostly 100. So setting a *_rate file to, say 50,
2487 would allow for 2 packets per second. The token bucket filter is also
2488 configured to allow for a burst of at most 6 packets, if enough tokens have
2489 been earned.
2491 Several entries in the following list have been copied from
2492 /usr/src/linux/Documentation/networking/ip-sysctl.txt, written by Alexey
2493 Kuznetsov &lt;kuznet@ms2.inr.ac.ru&gt; and Andi Kleen &lt;ak@muc.de&gt;
2494 <descrip>
2495 <tag>/proc/sys/net/ipv4/icmp_destunreach_rate</tag>
2496 If the kernel decides that it can't deliver a packet, it will drop it, and
2497 send the source of the packet an ICMP notice to this effect.
2498 <tag>/proc/sys/net/ipv4/icmp_echo_ignore_all</tag>
2499 Don't act on echo packets at all. Please don't set this by default, but if
2500 you are used as a relay in a DoS attack, it may be useful.
2501 <tag>/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts [Useful]</tag>
2502 If you ping the broadcast address of a network, all hosts are supposed to
2503 respond. This makes for a dandy denial-of-service tool. Set this to 1 to
2504 ignore these broadcast messages.
2505 <tag>/proc/sys/net/ipv4/icmp_echoreply_rate</tag>
2506 The rate at which echo replies are sent to any one destination.
2507 <tag>/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses</tag>
2508 Set this to ignore ICMP errors caused by hosts in the network reacting badly
2509 to frames sent to what they perceive to be the broadcast address.
2510 <tag>/proc/sys/net/ipv4/icmp_paramprob_rate</tag>
2511 A relatively unknown ICMP message, which is sent in response to incorrect
2512 packets with broken IP or TCP headers. With this file you can control the
2513 rate at which it is sent.
2514 <tag>/proc/sys/net/ipv4/icmp_timeexceed_rate</tag>
2515 This the famous cause of the 'Solaris middle star' in traceroutes. Limits
2516 number of ICMP Time Exceeded messages sent.
2517 <tag>/proc/sys/net/ipv4/igmp_max_memberships</tag>
2518 Maximum number of listening igmp (multicast) sockets on the host.
2519 FIXME: Is this true?
2520 <tag>/proc/sys/net/ipv4/inet_peer_gc_maxtime</tag>
2521 FIXME: Add a little explanation about the inet peer storage?&nl;
2522 Minimum interval between garbage collection passes. This interval is in
2523 effect under low (or absent) memory pressure on the pool. Measured in
2524 jiffies.
2525 <tag>/proc/sys/net/ipv4/inet_peer_gc_mintime</tag>
2526 Minimum interval between garbage collection passes. This interval is in
2527 effect under high memory pressure on the pool. Measured in jiffies.
2528 <tag>/proc/sys/net/ipv4/inet_peer_maxttl</tag>
2529 Maximum time-to-live of entries. Unused entries will expire after this
2530 period of time if there is no memory pressure on the pool (i.e. when the
2531 number of entries in the pool is very small). Measured in jiffies.
2532 <tag>/proc/sys/net/ipv4/inet_peer_minttl</tag>
2533 Minimum time-to-live of entries. Should be enough to cover fragment
2534 time-to-live on the reassembling side. This minimum time-to-live
2535 is guaranteed if the pool size is less than inet_peer_threshold.
2536 Measured in jiffies.
2537 <tag>/proc/sys/net/ipv4/inet_peer_threshold</tag>
2538 The approximate size of the INET peer storage. Starting from this threshold
2539 entries will be thrown aggressively. This threshold also determines
2540 entries' time-to-live and time intervals between garbage collection passes.
2541 More entries, less time-to-live, less GC interval.
2542 <tag>/proc/sys/net/ipv4/ip_autoconfig</tag>
2543 This file contains the number one if the host received its IP configuration by
2544 RARP, BOOTP, DHCP or a similar mechanism. Otherwise it is zero.
2545 <tag>/proc/sys/net/ipv4/ip_default_ttl</tag>
2546 Time To Live of packets. Set to a safe 64. Raise it if you have a huge
2547 network. Don't do so for fun - routing loops cause much more damage that
2548 way. You might even consider lowering it in some circumstances.
2549 <tag>/proc/sys/net/ipv4/ip_dynaddr</tag>
2550 You need to set this if you use dial-on-demand with a dynamic interface
2551 address. Once your demand interface comes up, any local TCP sockets which haven't seen replies will be rebound to have the right address. This solves the problem that the
2552 connection that brings up your interface itself does not work, but the
2553 second try does.
2554 <tag>/proc/sys/net/ipv4/ip_forward</tag>
2555 If the kernel should attempt to forward packets. Off by default.
2556 <tag>/proc/sys/net/ipv4/ip_local_port_range</tag>
2557 Range of local ports for outgoing connections. Actually quite small by
2558 default, 1024 to 4999.
2559 <tag>/proc/sys/net/ipv4/ip_no_pmtu_disc</tag>
2560 Set this if you want to disable Path MTU discovery - a technique to
2561 determine the largest Maximum Transfer Unit possible on your path. See also
2562 the section on Path MTU discovery in the cookbook chapter.
2563 <tag>/proc/sys/net/ipv4/ipfrag_high_thresh</tag>
2564 Maximum memory used to reassemble IP fragments. When
2565 ipfrag_high_thresh bytes of memory is allocated for this purpose,
2566 the fragment handler will toss packets until ipfrag_low_thresh
2567 is reached.
2568 <tag>/proc/sys/net/ipv4/ip_nonlocal_bind</tag>
2569 Set this if you want your applications to be able to bind to an address
2570 which doesn't belong to a device on your system. This can be useful when
2571 your machine is on a non-permanent (or even dynamic) link, so your services
2572 are able to start up and bind to a specific address when your link is down.
2573 <tag>/proc/sys/net/ipv4/ipfrag_low_thresh</tag>
2574 Minimum memory used to reassemble IP fragments.
2575 <tag>/proc/sys/net/ipv4/ipfrag_time</tag>
2576 Time in seconds to keep an IP fragment in memory.
2577 <tag>/proc/sys/net/ipv4/tcp_abort_on_overflow</tag>
2578 A boolean flag controlling the behaviour under lots of incoming connections.
2579 When enabled, this causes the kernel to actively send RST packets when a
2580 service is overloaded.
2581 <tag>/proc/sys/net/ipv4/tcp_fin_timeout</tag>
2582 Time to hold socket in state FIN-WAIT-2, if it was closed by our side. Peer
2583 can be broken and never close its side, or even died unexpectedly. Default
2584 value is 60sec. Usual value used in 2.2 was 180 seconds, you may restore it,
2585 but remember that if your machine is even underloaded WEB server, you risk
2586 to overflow memory with kilotons of dead sockets, FIN-WAIT-2 sockets are
2587 less dangerous than FIN-WAIT-1, because they eat maximum 1.5K of memory, but
2588 they tend to live longer. Cf. tcp_max_orphans.
2589 <tag>/proc/sys/net/ipv4/tcp_keepalive_time</tag>
2590 How often TCP sends out keepalive messages when keepalive is enabled. &nl;
2591 Default: 2hours.
2592 <tag>/proc/sys/net/ipv4/tcp_keepalive_intvl</tag>
2593 How frequent probes are retransmitted, when a probe isn't acknowledged. &nl;
2594 Default: 75 seconds.
2595 <tag>/proc/sys/net/ipv4/tcp_keepalive_probes</tag>
2596 How many keepalive probes TCP will send, until it decides that the
2597 connection is broken. &nl;
2598 Default value: 9. &nl;
2599 Multiplied with tcp_keepalive_intvl, this gives the time a link can be
2600 nonresponsive after a keepalive has been sent.
2601 <tag>/proc/sys/net/ipv4/tcp_max_orphans</tag>
2602 Maximal number of TCP sockets not attached to any user file handle, held by
2603 system. If this number is exceeded orphaned connections are reset
2604 immediately and warning is printed. This limit exists only to prevent simple
2605 DoS attacks, you _must_ not rely on this or lower the limit artificially,
2606 but rather increase it (probably, after increasing installed memory), if
2607 network conditions require more than default value, and tune network
2608 services to linger and kill such states more aggressively. Let me remind you
2609 again: each orphan eats up to ~64K of unswappable memory.
2610 <tag>/proc/sys/net/ipv4/tcp_orphan_retries</tag>
2611 How may times to retry before killing TCP connection, closed by our side.
2612 Default value 7 corresponds to ~50sec-16min depending on RTO. If your machine
2613 is a loaded WEB server, you should think about lowering this value, such
2614 sockets may consume significant resources. Cf. tcp_max_orphans.
2615 <tag>/proc/sys/net/ipv4/tcp_max_syn_backlog</tag>
2616 Maximal number of remembered connection requests, which still did not
2617 receive an acknowledgement from connecting client. Default value is 1024 for
2618 systems with more than 128Mb of memory, and 128 for low memory machines. If
2619 server suffers of overload, try to increase this number. Warning! If you
2620 make it greater than 1024, it would be better to change TCP_SYNQ_HSIZE in
2621 include/net/tcp.h to keep TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog and to
2622 recompile kernel.
2623 <tag>/proc/sys/net/ipv4/tcp_max_tw_buckets</tag>
2624 Maximal number of timewait sockets held by system simultaneously. If this
2625 number is exceeded time-wait socket is immediately destroyed and warning is
2626 printed. This limit exists only to prevent simple DoS attacks, you _must_
2627 not lower the limit artificially, but rather increase it (probably, after
2628 increasing installed memory), if network conditions require more than
2629 default value.
2630 <tag>/proc/sys/net/ipv4/tcp_retrans_collapse</tag>
2631 Bug-to-bug compatibility with some broken printers.
2632 On retransmit try to send bigger packets to work around bugs in
2633 certain TCP stacks.
2634 <tag>/proc/sys/net/ipv4/tcp_retries1</tag>
2635 How many times to retry before deciding that something is wrong
2636 and it is necessary to report this suspection to network layer.
2637 Minimal RFC value is 3, it is default, which corresponds
2638 to ~3sec-8min depending on RTO.
2639 <tag>/proc/sys/net/ipv4/tcp_retries2</tag>
2640 How may times to retry before killing alive TCP connection.
2641 RFC1122 says that the limit should be longer than 100 sec.
2642 It is too small number. Default value 15 corresponds to ~13-30min
2643 depending on RTO.
2644 <tag>/proc/sys/net/ipv4/tcp_rfc1337</tag>
2645 This boolean enables a fix for 'time-wait assassination hazards in tcp', described
2646 in RFC 1337. If enabled, this causes the kernel to drop RST packets for
2647 sockets in the time-wait state.&nl;
2648 Default: 0
2649 <tag>/proc/sys/net/ipv4/tcp_sack</tag>
2650 Use Selective ACK which can be used to signify that specific packets are
2651 missing - therefore helping fast recovery.
2652 <tag>/proc/sys/net/ipv4/tcp_stdurg</tag>
2653 Use the Host requirements interpretation of the TCP urg pointer
2654 field. &nl;
2655 Most hosts use the older BSD interpretation, so if you turn this on
2656 Linux might not communicate correctly with them. &nl;
2657 Default: FALSE
2658 <tag>/proc/sys/net/ipv4/tcp_syn_retries</tag>
2659 Number of SYN packets the kernel will send before giving up on the new
2660 connection.
2661 <tag>/proc/sys/net/ipv4/tcp_synack_retries</tag>
2662 To open the other side of the connection, the kernel sends a SYN with a
2663 piggybacked ACK on it, to acknowledge the earlier received SYN. This is part
2664 2 of the threeway handshake. This setting determines the number of SYN+ACK
2665 packets sent before the kernel gives up on the connection.
2666 <tag>/proc/sys/net/ipv4/tcp_timestamps</tag>
2667 Timestamps are used, amongst other things, to protect against wrapping
2668 sequence numbers. A 1 gigabit link might conceivably re-encounter a previous
2669 sequence number with an out-of-line value, because it was of a previous
2670 generation. The timestamp will let it recognise this 'ancient packet'.
2671 <tag>/proc/sys/net/ipv4/tcp_tw_recycle</tag>
2672 Enable fast recycling TIME-WAIT sockets. Default value is 1.
2673 It should not be changed without advice/request of technical experts.
2675 <tag>/proc/sys/net/ipv4/tcp_window_scaling</tag>
2676 TCP/IP normally allows windows up to 65535 bytes big. For really fast
2677 networks, this may not be enough. The window scaling options allows for
2678 almost gigabyte windows, which is good for high bandwidth*delay products.
2680 </descrip>
2681 <sect2>Per device settings
2683 DEV can either stand for a real interface, or for 'all' or 'default'.
2684 Default also changes settings for interfaces yet to be created.
2685 <descrip>
2686 <tag>/proc/sys/net/ipv4/conf/DEV/accept_redirects</tag>
2687 If a router decides that you are using it for a wrong purpose (ie, it needs
2688 to resend your packet on the same interface), it will send us a ICMP
2689 Redirect. This is a slight security risk however, so you may want to turn it
2690 off, or use secure redirects.
2691 <tag>/proc/sys/net/ipv4/conf/DEV/accept_source_route</tag>
2692 Not used very much anymore. You used to be able to give a packet a list of
2693 IP addresses it should visit on its way. Linux can be made to honor this IP
2694 option.
2695 <tag>/proc/sys/net/ipv4/conf/DEV/bootp_relay</tag>
2696 FIXME: fill this in
2697 <tag>/proc/sys/net/ipv4/conf/DEV/forwarding</tag>
2698 FIXME:
2699 <tag>/proc/sys/net/ipv4/conf/DEV/log_martians</tag>
2700 See the section on reverse path filters.
2701 <tag>/proc/sys/net/ipv4/conf/DEV/mc_forwarding</tag>
2702 If we do multicast forwarding on this interface
2703 <tag>/proc/sys/net/ipv4/conf/DEV/proxy_arp</tag>
2704 If you set this to 1, all other interfaces will respond to arp queries
2705 destined for addresses on this interface. Can be very useful when building 'ip
2706 pseudo bridges'. Do take care that your netmasks are very correct before
2707 enabling this!
2708 <tag>/proc/sys/net/ipv4/conf/DEV/rp_filter</tag>
2709 See the section on reverse path filters.
2710 <tag>/proc/sys/net/ipv4/conf/DEV/secure_redirects</tag>
2711 FIXME: fill this in
2712 <tag>/proc/sys/net/ipv4/conf/DEV/send_redirects</tag>
2713 If we send the above mentioned redirects.
2714 <tag>/proc/sys/net/ipv4/conf/DEV/shared_media</tag>
2715 FIXME: fill this in
2716 <tag>/proc/sys/net/ipv4/conf/DEV/tag</tag>
2717 FIXME: fill this in
2719 </descrip>
2721 <sect2> Neighbor pollicy
2723 Dev can either stand for a real interface, or for 'all' or 'default'.
2724 Default also changes settings for interfaces yet to be created.
2725 <descrip>
2726 <tag>/proc/sys/net/ipv4/neigh/DEV/anycast_delay</tag>
2727 FIXME: fill this in
2728 <tag>/proc/sys/net/ipv4/neigh/DEV/app_solicit</tag>
2729 FIXME: fill this in
2730 <tag>/proc/sys/net/ipv4/neigh/DEV/base_reachable_time</tag>
2731 FIXME: fill this in
2732 <tag>/proc/sys/net/ipv4/neigh/DEV/delay_first_probe_time</tag>
2733 FIXME: fill this in
2734 <tag>/proc/sys/net/ipv4/neigh/DEV/gc_stale_time</tag>
2735 FIXME: fill this in
2736 <tag>/proc/sys/net/ipv4/neigh/DEV/locktime</tag>
2737 FIXME: fill this in
2738 <tag>/proc/sys/net/ipv4/neigh/DEV/mcast_solicit</tag>
2739 FIXME: fill this in
2740 <tag>/proc/sys/net/ipv4/neigh/DEV/proxy_delay</tag>
2741 FIXME: fill this in
2742 <tag>/proc/sys/net/ipv4/neigh/DEV/proxy_qlen</tag>
2743 FIXME: fill this in
2744 <tag>/proc/sys/net/ipv4/neigh/DEV/retrans_time</tag>
2745 FIXME: fill this in
2746 <tag>/proc/sys/net/ipv4/neigh/DEV/ucast_solicit</tag>
2747 FIXME: fill this in
2748 <tag>/proc/sys/net/ipv4/neigh/DEV/unres_qlen</tag>
2749 FIXME: fill this in
2751 </descrip>
2753 <sect2>Routing settings
2755 <descrip>
2756 <tag>/proc/sys/net/ipv4/route/error_burst</tag>
2757 FIXME: fill this in
2758 <tag>/proc/sys/net/ipv4/route/error_cost</tag>
2759 FIXME: fill this in
2760 <tag>/proc/sys/net/ipv4/route/flush</tag>
2761 FIXME: fill this in
2762 <tag>/proc/sys/net/ipv4/route/gc_elasticity</tag>
2763 FIXME: fill this in
2764 <tag>/proc/sys/net/ipv4/route/gc_interval</tag>
2765 FIXME: fill this in
2766 <tag>/proc/sys/net/ipv4/route/gc_min_interval</tag>
2767 FIXME: fill this in
2768 <tag>/proc/sys/net/ipv4/route/gc_thresh</tag>
2769 FIXME: fill this in
2770 <tag>/proc/sys/net/ipv4/route/gc_timeout</tag>
2771 FIXME: fill this in
2772 <tag>/proc/sys/net/ipv4/route/max_delay</tag>
2773 FIXME: fill this in
2774 <tag>/proc/sys/net/ipv4/route/max_size</tag>
2775 FIXME: fill this in
2776 <tag>/proc/sys/net/ipv4/route/min_adv_mss</tag>
2777 FIXME: fill this in
2778 <tag>/proc/sys/net/ipv4/route/min_delay</tag>
2779 FIXME: fill this in
2780 <tag>/proc/sys/net/ipv4/route/min_pmtu</tag>
2781 FIXME: fill this in
2782 <tag>/proc/sys/net/ipv4/route/mtu_expires</tag>
2783 FIXME: fill this in
2784 <tag>/proc/sys/net/ipv4/route/redirect_load</tag>
2785 FIXME: fill this in
2786 <tag>/proc/sys/net/ipv4/route/redirect_number</tag>
2787 FIXME: fill this in
2788 <tag>/proc/sys/net/ipv4/route/redirect_silence</tag>
2789 FIXME: fill this in
2790 </descrip>
2793 <sect>Backbone applications of traffic control
2795 This chapter is meant as an introduction to backbone routing, which often
2796 involves >100 megabit bandwidths, which requires a different approach than
2797 your ADSL modem at home.
2799 <sect1>Router queues
2801 The normal behaviour of router queues on the Internet is called tail-drop.
2802 Tail-drop works by queueing up to a certain amount, then dropping all traffic
2803 that 'spills over'. This is very unfair, and also leads to retransmit
2804 synchronisation. When retransmit synchronisation occurs, the sudden burst
2805 of drops from a router that has reached its fill will cause a delayed burst
2806 of retransmits, which will over fill the congested router again.
2808 In order to cope with transient congestion on links, backbone routers will
2809 often implement large queues. Unfortunately, while these queues are good for
2810 throughput, they can substantially increase latency and cause TCP
2811 connections to behave very bursty during congestion.
2813 These issues with tail-drop are becoming increasingly troublesome on the
2814 Internet because the use of network unfriendly applications is increasing.
2815 The Linux kernel offers us RED, short for Random Early Detect.
2817 RED isn't a cure-all for this, applications which inappropriately fail to
2818 implement exponential backoff still get an unfair share of the bandwidth,
2819 however, with RED they do not cause as much harm to the throughput and
2820 latency of other connections.
2822 RED statistically drops packets from flows before it reaches its hard
2823 limit. This causes a congested backbone link to slow more gracefully, and
2824 prevents retransmit synchronisation. This also helps TCP find its 'fair'
2825 speed faster by allowing some packets to get dropped sooner keeping queue
2826 sizes low and latency under control. The probability of a packet being
2827 dropped from a particular connection is proportional to its bandwidth usage
2828 rather than the number of packets it transmits.
2830 RED is a good queue for backbones, where you can't afford the
2831 complexity of per-session state tracking needed by fairness queueing.
2833 In order to use RED, you must decide on three parameters: Min, Max, and
2834 burst. Min sets the minimum queue size in bytes before dropping will begin,
2835 Max is a soft maximum that the algorithm will attempt to stay under, and
2836 burst sets the maximum number of packets that can 'burst through'.
2838 You should set the min by calculating that highest acceptable base queueing
2839 latency you wish, and multiply it by your bandwidth. For instance, on my
2840 64kbit/s ISDN link, I might want a base queueing latency of 200ms so I set
2841 min to 1600 bytes. Setting min too small will degrade throughput and too
2842 large will degrade latency. Setting a small min is not a replacement for
2843 reducing the MTU on a slow link to improve interactive response.
2845 You should make max at least twice min to prevent synchronisation. On slow
2846 links with small min's it might be wise to make max perhaps four or
2847 more times large then min.
2849 Burst controls how the RED algorithm responds to bursts. Burst must be set
2850 larger then min/avpkt. Experimentally, I've found (min+min+max)/(3*avpkt) to
2851 work okay.
2853 Additionally, you need to set limit and avpkt. Limit is a safety value, after
2854 there are limit bytes in the queue, RED 'turns into' tail-drop. I typical set
2855 limit to eight times max. Avpkt should be your average packet size. 1000
2856 works okay on high speed Internet links with a 1500byte MTU.
2858 Read <url url="http://www.aciri.org/floyd/papers/red/red.html"
2859 name="the paper on RED queueing"> by Sally Floyd and Van Jacobson for technical
2860 information.
2862 FIXME: more needed. This means *you* greg :-) - ahu
2865 <sect>Cookbook
2867 This section contains 'cookbook' entries which may help you solve problems.
2868 A cookbook is no replacement for understanding however, so try and comprehend
2869 what is going on.
2870 <!--
2871 <sect1>Reserving bandwidth for your IRC server
2873 Recently the IRC networks have been plagued by distributed denial of service
2874 attacks. The aim of some of these attacks is to disrupt communication
2875 between servers which split the network. You then join the splitted part
2876 of the network. Because nobody else is there, the server assigns you
2877 operator status. You then stop the disruption, the network rejoins and
2878 voila, you can take over the channel.
2880 This silly behaviour is seriously damaging IRC, and luckily, Linux is there
2881 to protect it :-)
2883 We need to be smarter than your average scriptkid, so we'll use some
2884 advanced netfilter features to help us.
2887 <sect1>Running multiple sites with different SLAs
2889 You can do this in several ways. Apache has some support for this with a
2890 module, but we'll show how Linux can do this for you, and do so for other
2891 services as well. These commands are stolen from a presentation by Jamal
2892 Hadi that's referenced below.
2894 Let's say we have two customers, with http, ftp and streaming audio, and we
2895 want to sell them a limited amount of bandwidth. We do so on the server itself.
2897 Customer A should have at most 2 megabits, customer B has paid for 5
2898 megabits. We separate our customers by creating virtual IP addresses on our
2899 server.
2901 <tscreen><verb>
2902 # ip address add 188.177.166.1 dev eth0
2903 # ip address add 188.177.166.2 dev eth0
2904 </verb></tscreen>
2906 It is up to you to attach the different servers to the right IP address. All
2907 popular daemons have support for this.
2909 We first attach a CBQ qdisc to eth0:
2910 <tscreen><verb>
2911 # tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit cell 8 avpkt 1000 \
2912 mpu 64
2913 </verb></tscreen>
2915 We then create classes for our customers:
2917 <tscreen><verb>
2918 # tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate \
2919 2MBit avpkt 1000 prio 5 bounded isolated allot 1514 weight 1 maxburst 21
2920 # tc class add dev eth0 parent 1:0 classid 1:2 cbq bandwidth 10Mbit rate \
2921 5Mbit avpkt 1000 prio 5 bounded isolated allot 1514 weight 1 maxburst 21
2922 </verb></tscreen>
2924 Then we add filters for our two classes:
2925 <tscreen><verb>
2926 ##FIXME: Why this line, what does it do?, what is a divisor?:
2927 ##FIXME: A divisor has something to do with a hash table, and the number of
2928 ## buckets - ahu
2929 # tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 1: u32 divisor 1
2930 # tc filter add dev eth0 parent 1:0 prio 5 u32 match ip src 188.177.166.1
2931 flowid 1:1
2932 # tc filter add dev eth0 parent 1:0 prio 5 u32 match ip src 188.177.166.2
2933 flowid 1:2
2934 </verb></tscreen>
2936 And we're done.
2938 FIXME: why no token bucket filter? is there a default pfifo_fast fallback
2939 somewhere?
2941 <sect1>Protecting your host from SYN floods
2942 <p>From Alexey's iproute documentation, adapted to netfilter and with more
2943 plausible paths. If you use this, take care to adjust the numbers to
2944 reasonable values for your system.
2946 If you want to protect an entire network, skip this script, which is best
2947 suited for a single host.
2949 It appears that you need the very latest version of the iproute2 tools to
2950 get this to work with 2.4.0.
2952 <tscreen><verb>
2953 #! /bin/sh -x
2955 # sample script on using the ingress capabilities
2956 # this script shows how one can rate limit incoming SYNs
2957 # Useful for TCP-SYN attack protection. You can use
2958 # IPchains to have more powerful additions to the SYN (eg
2959 # in addition the subnet)
2961 #path to various utilities;
2962 #change to reflect yours.
2964 TC=/sbin/tc
2965 IP=/sbin/ip
2966 IPTABLES=/sbin/iptables
2967 INDEV=eth2
2969 # tag all incoming SYN packets through $INDEV as mark value 1
2970 ############################################################
2971 $iptables -A PREROUTING -i $INDEV -t mangle -p tcp --syn \
2972 -j MARK --set-mark 1
2973 ############################################################
2975 # install the ingress qdisc on the ingress interface
2976 ############################################################
2977 $TC qdisc add dev $INDEV handle ffff: ingress
2978 ############################################################
2982 # SYN packets are 40 bytes (320 bits) so three SYNs equals
2983 # 960 bits (approximately 1kbit); so we rate limit below
2984 # the incoming SYNs to 3/sec (not very useful really; but
2985 #serves to show the point - JHS
2986 ############################################################
2987 $TC filter add dev $INDEV parent ffff: protocol ip prio 50 handle 1 fw \
2988 police rate 1kbit burst 40 mtu 9k drop flowid :1
2989 ############################################################
2993 echo "---- qdisc parameters Ingress ----------"
2994 $TC qdisc ls dev $INDEV
2995 echo "---- Class parameters Ingress ----------"
2996 $TC class ls dev $INDEV
2997 echo "---- filter parameters Ingress ----------"
2998 $TC filter ls dev $INDEV parent ffff:
3000 #deleting the ingress qdisc
3001 #$TC qdisc del $INDEV ingress
3002 </verb></tscreen>
3003 <sect1>Ratelimit ICMP to prevent dDoS
3005 Recently, distributed denial of service attacks have become a major nuisance
3006 on the internet. By properly filtering and ratelimiting your network, you can
3007 both prevent becoming a casualty or the cause of these attacks.
3009 You should filter your networks so that you do not allow non-local IP source
3010 addressed packets to leave your network. This stops people from anonymously
3011 sending junk to the internet.
3013 <!-- FIXME: netfilter one liner. Is there a netfilter one-liner? Martijn -->
3016 Rate limiting goes much as shown earlier. To refresh your memory, our
3017 ASCIIgram again:
3019 <tscreen><verb>
3020 [The Internet] ---<E3, T3, whatever>--- [Linux router] --- [Office+ISP]
3021 eth1 eth0
3022 </verb></tscreen>
3024 We first set up the prerequisite parts:
3026 <tscreen><verb>
3027 # tc qdisc add dev eth0 root handle 10: cbq bandwidth 10Mbit avpkt 1000
3028 # tc class add dev eth0 parent 10:0 classid 10:1 cbq bandwidth 10Mbit rate \
3029 10Mbit allot 1514 prio 5 maxburst 20 avpkt 1000
3030 </verb></tscreen>
3032 If you have 100Mbit, or more, interfaces, adjust these numbers. Now you need
3033 to determine how much ICMP traffic you want to allow. You can perform
3034 measurements with tcpdump, by having it write to a file for a while, and
3035 seeing how much ICMP passes your network. Do not forget to raise the
3036 snapshot length!
3038 If measurement is impractical, you might want to choose 5% of your available
3039 bandwidth. Let's set up our class:
3040 <tscreen><verb>
3041 # tc class add dev eth0 parent 10:1 classid 10:100 cbq bandwidth 10Mbit rate \
3042 100Kbit allot 1514 weight 800Kbit prio 5 maxburst 20 avpkt 250 \
3043 bounded
3044 </verb></tscreen>
3046 This limits at 100Kbit. Now we need a filter to assign ICMP traffic to this
3047 class:
3048 <tscreen><verb>
3049 # tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip
3050 protocol 1 0xFF flowid 10:100
3052 </verb></tscreen>
3054 <sect1>Prioritizing interactive traffic
3056 If lots of data is coming down your link, or going up for that matter, and
3057 you are trying to do some maintenance via telnet or ssh, this may not go too
3058 well. Other packets are blocking your keystrokes. Wouldn't it be great if
3059 there were a way for your interactive packets to sneak past the bulk
3060 traffic? Linux can do this for you!
3062 As before, we need to handle traffic going both ways. Evidently, this works
3063 best if there are Linux boxes on both ends of your link, although other
3064 UNIX's are able to do this. Consult your local Solaris/BSD guru for this.
3066 The standard pfifo_fast scheduler has 3 different 'bands'. Traffic in band 0
3067 is transmitted first, after which traffic in band 1 and 2 gets considered.
3068 It is vital that our interactive traffic be in band 0!
3070 We blatantly adapt from the (soon to be obsolete) ipchains HOWTO:
3072 There are four seldom-used bits in the IP header, called the Type of Service
3073 (TOS) bits. They effect the way packets are treated; the four bits are
3074 "Minimum Delay", "Maximum Throughput", "Maximum Reliability" and "Minimum
3075 Cost". Only one of these bits is allowed to be set. Rob van Nieuwkerk, the
3076 author of the ipchains TOS-mangling code, puts it as follows:
3078 <tscreen>
3079 Especially the "Minimum Delay" is important for me. I switch it on for
3080 "interactive" packets in my upstream (Linux) router. I'm
3081 behind a 33k6 modem link. Linux prioritizes packets in 3 queues. This
3082 way I get acceptable interactive performance while doing bulk
3083 downloads at the same time.
3084 </tscreen>
3086 The most common use is to set telnet & ftp control connections to "Minimum
3087 Delay" and FTP data to "Maximum Throughput". This would be
3088 done as follows, on your upstream router:
3090 <tscreen><verb>
3091 # iptables -A PREROUTING -t mangle -p tcp --sport telnet \
3092 -j TOS --set-tos Minimize-Delay
3093 # iptables -A PREROUTING -t mangle -p tcp --sport ftp \
3094 -j TOS --set-tos Minimize-Delay
3095 # iptables -A PREROUTING -t mangle -p tcp --sport ftp-data \
3096 -j TOS --set-tos Maximize-Throughput
3097 </verb></tscreen>
3099 Now, this only works for data going from your telnet foreign host to your
3100 local computer. The other way around appears to be done for you, ie, telnet,
3101 ssh & friends all set the TOS field on outgoing packets automatically.
3103 Should you have a client that does not do this, you can always do it with
3104 netfilter. On your local box:
3106 <tscreen><verb>
3107 # iptables -A OUTPUT -t mangle -p tcp --dport telnet \
3108 -j TOS --set-tos Minimize-Delay
3109 # iptables -A OUTPUT -t mangle -p tcp --dport ftp \
3110 -j TOS --set-tos Minimize-Delay
3111 # iptables -A OUTPUT -t mangle -p tcp --dport ftp-data \
3112 -j TOS --set-tos Maximize-Throughput
3113 </verb></tscreen>
3115 <sect1>Transparent web-caching using netfilter, iproute2, ipchains and squid
3117 <label id="SQUID">
3118 This section was sent in by reader Ram Narula from Internet for Education
3119 (Thailand).
3121 The regular technique in accomplishing this in Linux
3122 is probably with use of ipchains AFTER making sure
3123 that the "outgoing" port 80(web) traffic gets routed through
3124 the server running squid.
3126 There are 3 common methods to make sure "outgoing"
3127 port 80 traffic gets routed to the server running squid
3128 and 4th one is being introduced here.
3130 <descrip>
3131 <tag>Making the gateway router do it.</tag>
3132 If you can tell your gateway router to
3133 match packets that has outgoing destination port
3134 of 80 to be sent to the IP address of squid server.
3138 This would put additional load on the router and
3139 some commercial routers might not even support this.
3140 <tag>Using a Layer 4 switch.</tag>
3141 Layer 4 switches can handle this without any problem.
3145 The cost for this equipment is usually very high. Typical
3146 layer 4 switch would normally cost more than
3147 a typical router+good linux server.
3148 <tag>Using cache server as network's gateway.</tag>
3149 You can force ALL traffic through cache server.
3153 This is quite risky because Squid does
3154 utilize lots of cpu power which might
3155 result in slower over-all network performance
3156 or the server itself might crash and no one on the
3157 network will be able to access the internet if
3158 that occurs.
3161 <tag>Linux+NetFilter router.</tag>
3162 By using NetFilter another technique can be implemented
3163 which is using NetFilter for "mark"ing the packets
3164 with destination port 80 and using iproute2 to
3165 route the "mark"ed packets to the Squid server.
3166 </descrip>
3167 <tscreen><verb>
3168 |----------------|
3169 | Implementation |
3170 |----------------|
3172 Addresses used
3173 10.0.0.1 naret (NetFilter server)
3174 10.0.0.2 silom (Squid server)
3175 10.0.0.3 donmuang (Router connected to the internet)
3176 10.0.0.4 kaosarn (other server on network)
3177 10.0.0.5 RAS
3178 10.0.0.0/24 main network
3179 10.0.0.0/19 total network
3181 |---------------|
3182 |Network diagram|
3183 |---------------|
3185 Internet
3187 donmuang
3189 ------------hub/switch----------
3190 | | | |
3191 naret silom kaosarn RAS etc.
3192 </verb></tscreen>
3193 First, make all traffic pass through naret by making
3194 sure it is the default gateway except for silom.
3195 Silom's default gateway has to be donmuang (10.0.0.3) or
3196 this would create web traffic loop.
3200 (all servers on my network had 10.0.0.1 as the default gateway
3201 which was the former IP address of donmuang router so what I did
3202 was changed the IP address of donmuang to 10.0.0.3 and gave
3203 naret ip address of 10.0.0.1)
3205 <tscreen><verb>
3206 Silom
3207 -----
3208 -setup squid and ipchains
3209 </verb></tscreen>
3212 Setup Squid server on silom, make sure it does support
3213 transparent caching/proxying, the default port is usually
3214 3128, so all traffic for port 80 has to be redirected to port
3215 3128 locally. This can be done by using ipchains with the following:
3217 <tscreen><verb>
3218 silom# ipchains -N allow1
3219 silom# ipchains -A allow1 -p TCP -s 10.0.0.0/19 -d 0/0 80 -j REDIRECT 3128
3220 silom# ipchains -I input -j allow1
3221 </verb></tscreen>
3223 <p>
3225 Or, in netfilter lingo:
3226 <tscreen><verb>
3227 silom# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
3228 </verb></tscreen>
3230 (note: you might have other entries as well)
3233 For more information on setting Squid server please refer
3234 to Squid faq page on <url
3235 url="http://squid.nlanr.net" name="http://squid.nlanr.net">).
3239 Make sure ip forwarding is enabled on this server and the default
3240 gateway for this server is donmuang router (NOT naret).
3244 <tscreen><verb>
3245 Naret
3246 -----
3247 -setup iptables and iproute2
3248 -disable icmp REDIRECT messages (if needed)
3249 </verb></tscreen>
3251 <enum>
3252 <item>"Mark" packets of destination port 80 with value 2
3253 <tscreen><verb>
3254 naret# iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 \
3255 -j MARK --set-mark 2
3256 </verb></tscreen>
3257 </item>
3258 <item>Setup iproute2 so it will route packets with "mark" 2 to silom
3259 <tscreen><verb>
3260 naret# echo 202 www.out >> /etc/iproute2/rt_tables
3261 naret# ip rule add fwmark 2 table www.out
3262 naret# ip route add default via 10.0.0.2 dev eth0 table www.out
3263 naret# ip route flush cache
3265 </verb></tscreen>
3267 If donmuang and naret is on the same subnet then
3268 naret should not send out icmp REDIRECT messages.
3269 In this case it is, so icmp REDIRECTs has to be
3270 disabled by:
3271 <tscreen><verb>
3272 naret# echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
3273 naret# echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
3274 naret# echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
3276 </verb></tscreen>
3277 </item>
3278 </enum>
3280 The setup is complete, check the configuration
3282 <tscreen><verb>
3283 On naret:
3285 naret# iptables -t mangle -L
3286 Chain PREROUTING (policy ACCEPT)
3287 target prot opt source destination
3288 MARK tcp -- anywhere anywhere tcp dpt:www MARK set 0x2
3290 Chain OUTPUT (policy ACCEPT)
3291 target prot opt source destination
3293 naret# ip rule ls
3294 0: from all lookup local
3295 32765: from all fwmark 2 lookup www.out
3296 32766: from all lookup main
3297 32767: from all lookup default
3299 naret# ip route list table www.out
3300 default via 203.114.224.8 dev eth0
3302 naret# ip route
3303 10.0.0.1 dev eth0 scope link
3304 10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.1
3305 127.0.0.0/8 dev lo scope link
3306 default via 10.0.0.3 dev eth0
3308 (make sure silom belongs to one of the above lines, in this case
3309 it's the line with 10.0.0.0/24)
3311 |------|
3312 |-DONE-|
3313 |------|
3316 </verb></tscreen>
3317 <sect2>Traffic flow diagram after implementation
3319 <tscreen><verb>
3321 |-----------------------------------------|
3322 |Traffic flow diagram after implementation|
3323 |-----------------------------------------|
3325 INTERNET
3329 -----------------donmuang router---------------------
3330 /\ /\ ||
3331 || || ||
3332 || \/ ||
3333 naret silom ||
3334 *destination port 80 traffic=========>(cache) ||
3335 /\ || ||
3336 || \/ \/
3337 \\===================================kaosarn, RAS, etc.
3339 </verb></tscreen>
3341 Note that the network is asymmetric as there is one extra hop on
3342 general outgoing path.
3344 <tscreen><verb>
3345 Here is run down for packet traversing the network from kaosarn
3346 to and from the internet.
3348 For web/http traffic:
3349 kaosarn http request->naret->silom->donmuang->internet
3350 http replies from internet->donmuang->silom->kaosarn
3352 For non-web/http requests(eg. telnet):
3353 kaosarn outgoing data->naret->donmuang->internet
3354 incoming data from internet->donmuang->kaosarn
3355 </verb></tscreen>
3357 <sect1>Circumventing Path MTU Discovery issues with per route MTU settings
3359 For sending bulk data, the internet generally works better when using larger
3360 packets. Each packet implies a routing decision, when sending a 1 megabyte
3361 file, this can either mean around 700 packets when using packets that are as
3362 large as possible, or 4000 if using the smallest default.
3364 However, not all parts of the internet support full 1460 bytes of payload
3365 per packet. It is therefore necessary to try and find the largest packet
3366 that will 'fit', in order to optimize a connection.
3368 This process is called 'Path MTU Discovery', where MTU stands for 'Maximum
3369 Transfer Unit.'
3371 When a router encounters a packet that's too big too send in one piece, AND
3372 it has been flagged with the "Don't Fragment" bit, it returns an ICMP
3373 message stating that it was forced to drop a packet because of this. The
3374 sending host acts on this hint by sending smaller packets, and by iterating
3375 it can find the optimum packet size for a connection over a certain path.
3377 This used to work well until the internet was discovered by hooligans who do
3378 their best to disrupt communications. This in turn lead administrators to
3379 either block or shape ICMP traffic in a misguided attempt to improve
3380 security or robustness of their internet service.
3382 What has happened now is that Path MTU Discovery is working less and less
3383 well and fails for certain routes, which leads to strange TCP/IP sessions
3384 which die after a while.
3386 Although I have no proof for this, two sites who I used to have this problem
3387 with both run Alteon Acedirectors before the affected systems - perhaps
3388 somebody more knowledgeable can provide clues as to why this happens.
3390 <sect2>Solution
3392 When you encounter sites that suffer from this problem, you can disable Path
3393 MTU discovery by setting it manually. Koos van den Hout, slightly edited,
3394 writes:
3396 <tscreen>
3398 The following problem: I set the mtu/mru of my leased line running ppp to
3399 296 because it's only 33k6 and I cannot influence the queueing on the
3400 other side. At 296, the response to a keypress is within a reasonable
3401 timeframe.
3403 And, on my side I have a masqrouter running (of course) Linux.
3405 Recently I split 'server' and 'router' so most applications are run on a
3406 different machine than the routing happens on.
3408 I then had trouble logging into irc. Big panic! Some digging did find
3409 out that I got connected to irc, even showed up as 'connected' on irc
3410 but I did not receive the motd from irc. I checked what could be wrong
3411 and noted that I already had some previous trouble reaching certain
3412 websites related to the MTU, since I had no trouble reaching them when
3413 the MTU was 1500, the problem just showed when the MTU was set to 296.
3414 Since irc servers block about every kind of traffic not needed for their
3415 immediate operation, they also block icmp.
3417 I managed to convince the operators of a webserver that this was the cause
3418 of a problem, but the irc server operators were not going to fix this.
3420 So, I had to make sure outgoing masqueraded traffic started with the lower
3421 mtu of the outside link. But I want local ethernet traffic to have the
3422 normal mtu (for things like nfs traffic).
3424 Solution:
3425 <tscreen><verb>
3426 ip route add default via 10.0.0.1 mtu 296
3427 </verb></tscreen>
3429 (10.0.0.1 being the default gateway, the inside address of the
3430 masquerading router)
3431 </tscreen>
3433 In general, it is possible to override PMTU Discovery by setting specific
3434 routes. For example, if only a certain subnet is giving problems, this
3435 should help:
3437 <tscreen><verb>
3438 ip route add 195.96.96.0/24 via 10.0.0.1 mtu 1000
3439 </verb></tscreen>
3440 <sect1>Circumventing Path MTU Discovery issues with MSS Clamping (for ADSL,
3441 cable, PPPoE &amp; PPtP users)
3443 As explained above, Path MTU Discovery doesn't work as well as it should
3444 anymore. If you know for a fact that a hop somewhere in your network has a
3445 limited (&lt;1500) MTU, you cannot rely on PMTU Discovery finding this out.
3447 Besides MTU, there is yet another way to set the maximum packet size, the so
3448 called Maximum Segment Size. This is a field in the TCP Options part of a
3449 SYN packet.
3451 Recent Linux kernels, and a few pppoe drivers (notably, the excellent
3452 Roaring Penguin one), feature the possibility to 'clamp the MSS'.
3454 The good thing about this is that by setting the MSS value, you are telling
3455 the remote side unequivocally 'do not ever try to send me packets bigger
3456 than this value'. No ICMP traffic is needed to get this to work.
3458 The bad thing is that it's an obvious hack - it breaks 'end to end' by
3459 modifying packets. Having said that, we use this trick in many places and it
3460 works like a charm.
3462 In order for this to work you need at least iptables-1.2.1a and Linux 2.4.3
3463 or higher. The basic commandline is:
3464 <tscreen><verb>
3465 # iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
3466 </verb></tscreen>
3468 This calculates the proper MSS for your link. If you are feeling brave, or
3469 think that you know best, you can also do something like this:
3471 <tscreen><verb>
3472 # iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 128
3473 </verb></tscreen>
3475 This sets the MSS of passing SYN packets to 128. Use this if you have VoIP
3476 with tiny packets, and huge http packets which are causing chopping in your
3477 voice calls.
3478 <sect>Building bridges, and pseudo-bridges with Proxy ARP
3480 Bridges are devices which can be installed in a network without any
3481 reconfiguration. A network switch is basically a many-port bridge. A bridge
3482 is often a 2-port switch. Linux does however support multiple interfaces in
3483 a bridge, making it a true switch.
3485 Bridges are often deployed when confronted with a broken network that needs
3486 to be fixed without any alterations. Because the bridge is a layer-2 device,
3487 one layer below IP, routers and servers are not aware of its existence.
3488 This means that you can transparently block or modify certain packets, or do
3489 shaping.
3491 Another good thing is that a bridge can often be replaced by a cross cable
3492 or a hub, should it break down.
3494 The bad news is that a bridge can cause great confusion unless it is very
3495 well documented. It does not appear in traceroutes, but somehow packets
3496 disappear or get changed from point A to point B. You should also wonder if
3497 an organization that 'does not want to change anything' is doing the right
3498 thing.
3500 The Linux 2.4 bridge is documented on
3502 <url url=" http://bridge.sourceforge.net/" name="this page">.
3504 <sect1>State of bridging and iptables
3506 As of Linux 2.4.14, bridging and iptables do not 'see' each other without
3507 help. If you bridge packets from eth0 to eth1, they do not 'pass' by
3508 iptables. This means that you cannot do filtering, or NAT or mangling or
3509 whatever.
3511 There are several projects going on to fix this, the truly right one is by
3512 the author of the Linux 2.4 bridging code, Lennert Buytenhek. He recently
3513 informed us that as of bridge-nf 0.0.2 (see the url above), the code is
3514 stable and usable in production environments. He is now asking the kernel
3515 people if and how the patch can be merged, stay tuned!
3517 <sect1>Bridging and shaping
3519 This does work as advertised. Be sure to figure out which side each
3520 interface is on, otherwise you might be shaping outbound traffic in your
3521 internal interface, which won't work. Use tcpdump if needed.
3523 <sect1>Pseudo-bridges with Proxy-ARP
3525 If you just want to implement a Pseudo-bridge, skip down a few sections
3526 to 'Implementing it', but it is wise to read a bit about how it works in
3527 practice.
3529 A Pseudo-bridge works a bit differently. By default, a bridge passes packets
3530 unaltered from one interface to the other. It only looks at the hardware
3531 address of packets to determine what goes where. This in turn means that you
3532 can bridge traffic that Linux does not understand, as long as it has an
3533 hardware address it does.
3535 A 'Pseudo-bridge' works differently and looks more like a hidden router than
3536 a bridge, but like a bridge, it has little impact on network design.
3538 An advantage of the fact that it is not a brige lies in the fact that
3539 packets really pass through the kernel, and can be filtered, changed,
3540 redirected or rerouted.
3542 A real bridge can also be made to perform these feats, but it needs special
3543 code, like the Ethernet Frame Diverter, or the above mentioned patch.
3545 Another advantage of a pseudo-bridge is that it does not pass packets it
3546 does not understand - thus cleaning your network of a lot of cruft. In cases
3547 where you need this cruft (like SAP packets, or Netbeui), use a real bridge.
3548 <sect2>ARP &amp; Proxy-ARP
3550 When a host wants to talk to another host on the same physical network
3551 segment, it sends out an Address Resolution Protocol packet, which, somewhat
3552 simplified, reads like this 'who has 10.0.0.1, tell 10.0.0.7'. In response
3553 to this, 10.0.0.1 replies with a short 'here' packet.
3555 10.0.0.7 then sends packets to the hardware address mentioned in the 'here'
3556 packet. It caches this hardware address for a relatively long time, and
3557 after the cache expires, it reasks the question.
3559 When building a Pseudo-bridge, we instruct the bridge to reply to these ARP
3560 packets, which causes the hosts in the network to send its packets to the
3561 bridge. The brige then processes these packets, and sends them to the
3562 relevant interface.
3564 So, in short, whenever a host on one side of the bridge asks for the
3565 hardware address of a host on the other, the bridge replies with a packet
3566 that says 'hand it to me'.
3568 This way, all data traffic gets transmitted to the right place, and always
3569 passes through the bridge.
3570 <sect2>Implementing it
3572 In the bad old days, it used to be possible to instruct the Linux Kernel to
3573 perform 'proxy-ARP' for just any subnet. So, to configure a pseudo-bridge,
3574 you would have to specify both the proper routes to both sides of the bridge
3575 AND create matching proxy-ARP rules. This is bad in that it requires a lot
3576 of typing, but also because it easily allows you to make mistakes which make
3577 your bridge respond to ARP queries for networks it does not know how to
3578 route.
3580 With Linux 2.4 (and possibly 2.2), this possibility has been withdrawn and
3581 has been replaced by a flag in the /proc directory, called 'proxy_arp'. The
3582 procedure for building a pseudo-bridge is then:
3584 <enum>
3585 <item>Assign an IP address to both interfaces, the 'left' and the 'right'
3587 <item>Create routes so your machine knows which hosts reside on the left,
3588 and which on the right
3589 <item>Turn on proxy-ARP on both interfaces, echo 1 >
3590 /proc/sys/net/ipv4/conf/ethL/proxy_arp, echo 1 >
3591 /proc/sys/net/ipv4/conf/ethR/proxy_arp, where L and R stand for the numbers
3592 of your interfaces on the left and on the right side
3593 </enum>
3595 Also, do not forget to turn on the ip_forwarding flag! When converting from
3596 a true bridge, you may find that this flag was turned off as it is not
3597 needed when bridging.
3599 Another thing you might note when converting is that you need to clear the
3600 arp cache of computers in the network - the arp cache might contain old
3601 pre-bridge hardware addresses which are no longer correct.
3603 On a Cisco, this is done using the command 'clear arp-cache', under
3604 Linux, use 'arp -d ip.address'. You can also wait for the cache to expire
3605 manually, which can take rather long.
3606 <sect>Advanced Linux Routing
3608 This section is for all you people who either want to understand why the
3609 whole system works or have a configuration that's so bizarre that you
3610 need the low down to make it work.
3612 This section is completely optional. It's quite possible that this section
3613 will be quite complex and really not intended for normal users. You have
3614 been warned.
3616 FIXME: Decide what really needs to go in here.
3617 <sect1>How does packet queueing really work?
3618 <p>This is the low-down on how the packet queueing system really works.
3620 Lists the steps the kernel takes to classify a packet, etc...
3622 FIXME: Write this.
3624 <sect1>Advanced uses of the packet queueing system
3625 <p>Go through Alexey's extremely tricky example involving the unused bits
3626 in the TOS field.
3628 FIXME: Write this.
3630 <sect1>Other packet shaping systems
3631 <p>I'd like to include a brief description of other packet shaping systems
3632 in other operating systems and how they compare to the Linux one. Since Linux
3633 is one of the few OSes that has a completely original (non-BSD derived) TCP/IP
3634 stack, I think it would be useful to see how other people do it.
3636 Unfortunately I have no experience with other systems so cannot write this.
3638 FIXME: Anyone? - Martijn
3640 <sect>Dynamic routing - OSPF and BGP
3642 Once your network starts to get really big, or you start to consider 'the
3643 internet' as your network, you need tools which dynamically route your data.
3644 Sites are often connected to each other with multiple links, and more are
3645 popping up all the time.
3647 The Internet has mostly standardised on OSPF and BGP4 (rfc1771). Linux
3648 supports both, by way of <tt>gated</tt> and <tt>zebra</tt>
3650 While currently not within the scope of this document, we would like to
3651 point you to the definitive works:
3653 Overview:
3655 Cisco Systems
3656 <url
3657 url="http://www.cisco.com/univercd/cc/td/doc/cisintwk/idg4/nd2003.htm"
3658 name="Designing large-scale IP internetworks">
3662 For OSPF:
3664 Moy, John T.
3665 "OSPF. The anatomy of an Internet routing protocol"
3666 Addison Wesley. Reading, MA. 1998.
3668 Halabi has also written a good guide to OSPF routing design, but this
3669 appears to have been dropped from the Cisco web site.
3672 For BGP:
3674 Halabi, Bassam
3675 "Internet routing architectures"
3676 Cisco Press (New Riders Publishing). Indianapolis, IN. 1997.
3678 also
3680 Cisco Systems
3682 <url
3683 url="http://www.cisco.com/univercd/cc/td/doc/cisintwk/ics/icsbgp4.htm"
3684 name="Using the Border Gateway Protocol for interdomain routing">
3687 Although the examples are Cisco-specific, they are remarkably similar
3688 to the configuration language in Zebra :-)
3689 <sect>Other possibilities
3691 This chapter is a list of projects having to do with advanced Linux routing
3692 &amp; traffic shaping. Some of these links may deserve chapters of their
3693 own, some are documented very well of themselves, and don't need more HOWTO.
3695 <descrip>
3696 <tag>802.1Q VLAN Implementation for Linux <url url="http://scry.wanfear.com/~greear/vlan.html"
3697 name="(site)"></tag>
3699 VLANs are a very cool way to segregate your
3700 networks in a more virtual than physical way. Good information on VLANs can
3701 be found <url
3702 url="ftp://ftp.netlab.ohio-state.edu/pub/jain/courses/cis788-97/virtual_lans/index.htm"
3703 name="here">. With this implementation, you can have your Linux box talk
3704 VLANs with machines like Cisco Catalyst, 3Com: {Corebuilder, Netbuilder II,
3705 SuperStack II switch 630}, Extreme Ntwks Summit 48, Foundry: {ServerIronXL,
3706 FastIron}.
3708 Update: has been included in the kernel as of 2.4.14 (perhaps 13).
3709 <tag>Alternate 802.1Q VLAN Implementation for Linux <url
3710 url="http://vlan.sourceforge.net "
3711 name="(site)"></tag>
3712 Alternative VLAN implementation for linux. This project was started out of
3713 disagreement with the 'established' VLAN project's architecture and coding
3714 style, resulting in a cleaner overall design.
3716 <tag>Linux Virtual Server <url url="http://www.LinuxVirtualServer.org/"
3717 name="(site)"></tag>
3719 These people are brilliant. The Linux Virtual Server is a highly scalable and
3720 highly available server built on a cluster of real servers, with the load
3721 balancer running on the Linux operating system. The architecture of the
3722 cluster is transparent to end users. End users only see a single virtual
3723 server.
3725 In short whatever you need to loadbalance, at whatever level of traffic, LVS
3726 will have a way of doing it. Some of their techniques are positively evil!
3727 For example, they let several machines have the same IP address on a
3728 segment, but turn off ARP on them. Only the LVS machine does ARP - it then
3729 decides which of the backend hosts should handle an incoming packet, and
3730 sends it directly to the right MAC address of the backend server. Outgoing
3731 traffic will flow directly to the router, and not via the LVS machine, which
3732 does therefor not need to see your 5Gbit/s of content flowing to the world,
3733 and cannot be a bottleneck.
3735 The LVS is implemented as a kernel patch in Linux 2.0 and 2.2, but as a
3736 Netfilter module in 2.4, so it does not need kernel patches! Their 2.4
3737 support is still in early development, so beat on it and give feedback or
3738 send patches.
3740 <tag>CBQ.init <url url="ftp://ftp.equinox.gu.net/pub/linux/cbq/"
3741 name="(site)"></tag>
3742 Configuring CBQ can be a bit daunting, especially if all you want to do is
3743 shape some computers behind a router. CBQ.init can help you configure Linux
3744 with a simplified syntax.
3746 For example, if you want all computers in your 192.168.1.0/24 subnet
3747 (on 10mbit eth1) to be limited to 28kbit/s download speed, put
3748 this in the CBQ.init configuration file:
3750 <tscreen><verb>
3751 DEVICE=eth1,10Mbit,1Mbit
3752 RATE=28Kbit
3753 WEIGHT=2Kbit
3754 PRIO=5
3755 RULE=192.168.1.0/24
3756 </verb></tscreen>
3758 By all means use this program if the 'how and why' don't interest you.
3759 We're using CBQ.init in production and it works very well. It can even do
3760 some more advanced things, like time dependent shaping. The documentation is
3761 embedded in the script, which explains why you can't find a README.
3763 <tag>Chronox easy shaping scripts <url url="http://www.chronox.de"
3764 name="(site)"></tag>
3766 Stephan Mueller (smueller@chronox.de) wrote two useful scripts, 'limit.conn'
3767 and 'shaper'. The first one allows you to easily throttle a single download
3768 session, like this:
3770 <tscreen><verb>
3771 # limit.conn -s SERVERIP -p SERVERPORT -l LIMIT
3772 </verb></tscreen>
3774 It works on Linux 2.2 and 2.4.
3776 The second script is more complicated, and can be used to make lots of
3777 different queues based on iptables rules, which are used to mark packets
3778 which are then shaped.
3780 <tag>Virtual Router
3781 Redundancy Protocol implementation <url url="http://w3.arobas.net/~jetienne/vrrpd/index.html"
3782 name="(site)"></tag>
3784 This is purely for redundancy. Two machines with their own IP address and
3785 MAC Address together create a third IP Address and MAC Address, which is
3786 virtual. Originally intended purely for routers, which need constant MAC
3787 addresses, it also works for other servers.
3789 The beauty of this approach is the incredibly easy configuration. No kernel
3790 compiling or patching required, all userspace.
3792 Just run this on all machines participating in a service:
3793 <tscreen><verb>
3794 # vrrpd -i eth0 -v 50 10.0.0.22
3795 </verb></tscreen>
3797 And you are in business! 10.0.0.22 is now carried by one of your servers,
3798 probably the first one to run the vrrp daemon. Now disconnect that computer
3799 from the network and very rapidly one of the other computers will assume the
3800 10.0.0.22 address, as well as the MAC address.
3802 I tried this over here and had it up and running in 1 minute. For some
3803 strange reason it decided to drop my default gateway, but the -n flag
3804 prevented that.
3806 This is a 'live' failover:
3808 <tscreen><verb>
3809 64 bytes from 10.0.0.22: icmp_seq=3 ttl=255 time=0.2 ms
3810 64 bytes from 10.0.0.22: icmp_seq=4 ttl=255 time=0.2 ms
3811 64 bytes from 10.0.0.22: icmp_seq=5 ttl=255 time=16.8 ms
3812 64 bytes from 10.0.0.22: icmp_seq=6 ttl=255 time=1.8 ms
3813 64 bytes from 10.0.0.22: icmp_seq=7 ttl=255 time=1.7 ms
3814 </verb></tscreen>
3816 Not *one* ping packet was lost! Just after packet 4, I disconnected my P200
3817 from the network, and my 486 took over, which you can see from the higher
3818 latency.
3820 <tag>HTB queueing CBQ alternative <url url="http://luxik.cdi.cz/~devik/qos/htb/"
3821 name="(site)"></tag>
3822 The main problem with HTB is that I don't know what the acronym stands for.
3823 Martin Devera (&lt;devik&gt;) rightly realised that CBQ is complex and does
3824 not seem optimized for many typical situations. His Hierarchial approach (I
3825 bet the 'H' stands for Hierarchy!) is well suited for setups where you have
3826 a fixed amount of bandwidth, which you want to divide for different
3827 purposes, giving each purpose a guaranteed bandwidth, and possibly a
3828 bandwidth ceiling.
3830 A simple setup with three classes, one of which is the default class that
3831 gets all unfiltered traffic looks like this:
3832 <tscreen><verb>
3833 # tc qdisc add dev eth0 root handle 1: htb default 12
3835 # tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps burst 2k
3836 # tc class add dev eth0 parent 1:1 classid 1:10 htb rate 30kbps ceil 100kbps burst 2k
3837 # tc class add dev eth0 parent 1:1 classid 1:11 htb rate 10kbps ceil 100kbps burst 2k
3838 # tc class add dev eth0 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps burst 2k
3839 </verb></tscreen>
3841 The author then recommends SFQ for beneath these classes:
3842 <tscreen><verb>
3843 # tc qdisc add dev eth0 parent 1:10 handle 20: sfq perturb 10
3844 # tc qdisc add dev eth0 parent 1:11 handle 30: sfq perturb 10
3845 # tc qdisc add dev eth0 parent 1:12 handle 40: sfq perturb 10
3846 </verb></tscreen>
3848 Add the filters which direct traffic to the right classes:
3849 <tscreen><verb>
3850 # U32="tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32"
3851 # $U32 match ip dport 80 0xffff flowid 1:10
3852 # $U32 match ip sport 25 0xffff flowid 1:11
3853 </verb></tscreen>
3854 Note that there is no filter for 1:12 - it is already the default.
3856 And that's it - no unsightly unexplained numbers, no undocumented
3857 parameters.
3859 HTB certainly looks wonderful - if 1:10 and 1:11 both have their guaranteed
3860 bandwidth, and more is left to divide, they borrow in a 30:10 ratio, just as
3861 you would expect.
3863 As your HTB configuration gets more complex, your configurations scales
3864 well. With CBQ it is already complex even in simple cases! HTB is not yet a
3865 part of the standard kernel, but it should soon be!
3866 </descrip>
3867 <sect>Further reading
3869 <descrip>
3870 <tag><url url="http://snafu.freedom.org/linux2.2/iproute-notes.html"
3871 name="http://snafu.freedom.org/linux2.2/iproute-notes.html"></tag>
3872 Contains lots of technical information, comments from the kernel
3873 <tag><url url="http://www.davin.ottawa.on.ca/ols/"
3874 name="http://www.davin.ottawa.on.ca/ols/"></tag>
3875 Slides by Jamal Hadi Salim, one of the authors of Linux traffic control
3876 <tag><url url="http://defiant.coinet.com/iproute2/ip-cref/"
3877 name="http://defiant.coinet.com/iproute2/ip-cref/"></tag>
3878 HTML version of Alexeys LaTeX documentation - explains part of iproute2 in
3879 great detail
3880 <tag><url url="http://www.aciri.org/floyd/cbq.html"
3881 name="http://www.aciri.org/floyd/cbq.html"></tag>
3882 Sally Floyd has a good page on CBQ, including her original papers. None of
3883 it is Linux specific, but it does a fair job discussing the theory and uses
3884 of CBQ.
3885 Very technical stuff, but good reading for those so inclined.
3887 <tag><url url="http://ceti.pl/~kravietz/cbq/NET4_tc.html"
3888 name="http://ceti.pl/~kravietz/cbq/NET4_tc.html"></tag>
3889 Yet another HOWTO, this time in Polish! You can copy/paste command lines
3890 however, they work just the same in every language. The author is
3891 cooperating with us and may soon author sections of this HOWTO.
3893 <tag><url
3894 url="http://snafu.freedom.org/linux2.2/docs/draft-almesberger-wajhak-diffserv-linux-00.txt"
3895 name="Differentiated Services on Linux"></tag>
3896 Discussion on how to use Linux in a diffserv compliant environment. Pretty
3897 far removed from your everyday routing needs, but very interesting none the
3898 less. We may include a section on this at a later date.
3900 <tag><url
3901 url="http://www.cisco.com/univercd/cc/td/doc/product/software/ios111/cc111/car.htm"
3902 name="IOS Committed Access Rate"></tag>
3903 <label id="CAR">
3904 From the helpful folks of Cisco who have the laudable habit of putting
3905 their documentation online. Cisco syntax is different but the concepts are
3906 the same, except that we can do more and do it without routers the price of
3907 cars :-)
3909 <tag>Docum experimental site<url url="http://www.docum.org"
3910 name="(site)"></tag>
3911 Stef Coene is busy convincing his boss to sell Linux support, and so he is
3912 experimenting a lot, especially with managing bandwidth. His site has a lot
3913 of practical information, examples, tests and also points out some CBQ/tc bugs.
3915 <tag>TCP/IP Illustrated, volume 1, W. Richard Stevens, ISBN 0-201-63346-9</tag>
3916 Required reading if you truly want to understand TCP/IP. Entertaining as
3917 well.
3919 </descrip>
3920 <sect>Acknowledgements
3921 <p>
3922 It is our goal to list everybody who has contributed to this HOWTO, or
3923 helped us demystify how things work. While there are currently no plans
3924 for a Netfilter type scoreboard, we do like to recognise the people who are
3925 helping.
3927 <itemize>
3928 <item>Ron Brinker &lt;service%emcis.com&gt;
3929 <item>Lennert Buytenhek &lt;buytenh@gnu.org&gt;
3930 <item>Esteve Camps &lt;esteve@hades.udg.es&gt;
3931 <item>Gerry Creager N5JXS &lt;gerry%cs.tamu.edu&gt;
3932 <item>Marco Davids &lt;marco@sara.nl&gt;
3933 <item>Jonathan Day &lt;jd9812@my-deja.com&gt;
3934 <item>Martin Devera aka devik &lt;devik@cdi.cz&gt;
3935 <item>Stephan "Kobold" Gehring &lt;Stephan.Gehring@bechtle.de&gt;
3936 <item>Nadeem Hasan &lt;nhasan@usa.net&gt;
3937 <item>Vik Heyndrickx &lt;vik.heyndrickx@edchq.com&gt;
3938 <item>Koos van den Hout &lt;koos@kzdoos.xs4all.nl&gt;
3939 <item>Pawel Krawczyk &lt;kravietz%alfa.ceti.pl&gt;
3940 <item>Philippe Latu &lt;philippe.latu%linux-france.org&gt;
3941 <item>Jason Lunz &lt;j@cc.gatech.edu&gt;
3942 <item>Alexey Mahotkin &lt;alexm@formulabez.ru&gt;
3943 <item>Andreas Mohr &lt;andi%lisas.de&gt;
3944 <item>Wim van der Most
3945 <item>Stephan Mueller &lt;smueller@chronox.de&gt;
3946 <item>Ram Narula &lt;ram@princess1.net&gt;
3947 <item>Jorge Novo &lt;jnovo@educanet.net&gt;
3948 <item>Patrik &lt;ph@kurd.nu&gt;
3949 <item>Jason Pyeron &lt;jason%pyeron.com&gt;
3950 <item>Rusty Russell (with apologies for always misspelling your name)
3951 <item>Jamal Hadi Salim &lt;hadi%cyberus.ca&gt;
3952 <item>Sheharyar Suleman Shaikh &lt;sss23@drexel.edu&gt;
3953 <item>Nick Silberstein &lt;nhsilber%yahoo.com&gt;
3954 <item>Konrads Smelkov &lt;konrads@interbaltika.com&gt;
3955 <item>Jason Tackaberry &lt;tack@linux.com&gt;
3956 <item>Charles Tassell &lt;ctassell%isn.net&gt;
3957 <item>Glen Turner &lt;glen.turner%aarnet.edu.au&gt;
3958 <item>Song Wang &lt;wsong@ece.uci.edu&gt;
3959 <item>Jonathan Day &lt;jd9812@my-deja.com&gt;
3960 </itemize>
3962 </article>