rotten
[lartc.git] / 2.4routing.sgml
blob0aa7320d74170dd27335864942482246d27843ec
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 Do not confuse this classless simple qdisc with the classful PRIO one!
1056 <sect3>Parameters &amp; usage
1058 <descrip>
1059 <tag>bands</tag>
1060 Number of bands. Defaults to three. If you change this, also change:
1061 <tag>priomap</tag>
1062 Determines how packet priorities, as assigned by the kernel, map to bands.
1063 Mapping occurs according to the following table, which identical to the one
1064 used by the PRIO qdisc:
1065 <verb>
1066 TC_PRIO.. Num TOS Band
1067 -------------------------------------------------------
1068 BESTEFFORT 0 Maximize Reliablity 1
1069 FILLER 1 Minimize Cost 2
1070 BULK 2 Maximize Throughput (0x8) 2
1071 INTERACTIVE_BULK 4 2
1072 INTERACTIVE 6 Minimize Delay (0x10) 1
1073 CONTROL 7 2
1076 10 1
1077 11 1
1078 12 1
1079 13 1
1080 14 1
1081 15 1
1082 </verb>
1083 FIXME: It is not known what the higher priorities correspond to.
1085 SSH sets TOS to 'Minimize Delay', unless it is doing scp, in which case it
1086 sets 'Maximize Throughput'. The numbers in parentheses denote the TOS value
1087 as reported by tcpdump and the kernel. If you divide this by two, you get
1088 the values mentioned by RFC1349.
1090 The default priomap is reasonable, you probably do not need to change
1091 it.
1092 <tag>txqueuelen</tag>
1093 The length of this queue is gleaned from the interface configuration, which
1094 you can see and set with ifconfig and ip. To set the queue length to 10,
1095 execute: ifconfig eth0 txqueuelen 10
1097 You can't set this parameter with tc!
1098 </descrip>
1099 <sect2>Token Bucket Filter
1101 The Token Bucket Filter (TBF) is a simple queue that only passes packets
1102 arriving at a rate which is not exceeding some administratively set rate,
1103 with the possibility to allow short bursts in excess of this rate.
1105 TBF is very precise, network- and processor friendly. It should be your
1106 first choice if you simple want to slow an interface down!
1108 The TBF implementation consists of a buffer (bucket), constantly filled by
1109 some virtual pieces of information called tokens, at a specific rate (token
1110 rate). The most important parameter of the bucket is its size, that is the
1111 number of tokens it can store.
1113 Each arriving token collects one incoming data packet from the data queue
1114 and is then deleted from the bucket. Associating this algorithm
1115 with the two flows -- token and data, gives us three possible scenarios:
1117 <itemize>
1118 <item> The data arrives in TBF at a rate that's <em>equal</em> to the rate
1119 of incoming tokens. In this case each incoming packet has its matching token
1120 and passes the queue without delay.
1122 <item> The data arrives in TBF at a rate that's <em>smaller</em> than the
1123 token rate. Only a part of the tokens are deleted at output of each data packet
1124 that's sent out the queue, so the tokens accumulate, up to the bucket size.
1125 The unused tokens can then be used to send data a a speed that's exceeding the
1126 standard token rate, in case short data bursts occur.
1128 <item> The data arrives in TBF at a rate <em>bigger</em> than the token rate.
1129 This means that the bucket will soon be devoid of tokens, which causes the
1130 TBF to throttle itself for a while. This is called an 'overlimit situation'.
1131 If packets keep coming in, packets will start to get dropped.
1132 </itemize>
1134 The last scenario is very important, because it allows to
1135 administratively shape the bandwidth available to data that's passing
1136 the filter.
1138 The accumulation of tokens allows a short burst of overlimit data to be
1139 still passed without loss, but any lasting overload will cause packets to be
1140 constantly delayed, and then dropped.
1142 Please note that in the actual implementation, tokens correspond to bytes,
1143 not packets.
1144 <sect3>Parameters &amp; usage
1146 Even though you will probably not need to change them, tbf has some knobs
1147 available. First the parameters that are always available:
1148 <descrip>
1149 <tag>limit or latency</tag>
1150 Limit is the number of bytes that can be queued waiting for tokens to become
1151 available. You can also specify this the other way around by setting the
1152 latency parameter, which specifies the maximum amount of time a packet can
1153 sit in the TBF. The latter calculation takes into account the size of the
1154 bucket, the rate and possibly the peakrate (if set).
1156 <tag>burst/buffer/maxburst</tag>
1157 Size of the bucket, in bytes. This is the maximum amount of bytes that
1158 tokens can be available for instantaneously. In general, larger shaping
1159 rates require a larger buffer. For 10mbit/s on Intel, you need at least
1160 10kbyte buffer if you want to reach your configured rate!
1162 If your buffer is too small, packets may be dropped because more tokens
1163 arrive per timer tick than fit in your bucket.
1164 <tag>mpu</tag>
1165 A zero-sized packet does not use zero bandwidth. For ethernet, no packet
1166 uses less than 64 bytes. The Minimum Packet Unit determines the minimal
1167 token usage for a packet.
1168 <tag>rate</tag>
1169 The speedknob. See remarks above about limits!
1170 </descrip>
1172 If the bucket contains tokens and is allowed to empty, by default it does so
1173 at infinite speed. If this is unacceptable, use the following parameters:
1175 <descrip>
1176 <tag>peakrate</tag>
1177 If tokens are available, and packets arrive, they are sent out immediately
1178 by default, at 'lightspeed' so to speak. That may not be what you want,
1179 especially if you have a large bucket.
1181 The peakrate can be used to specify how quickly the bucket is allowed to be
1182 depleted. If doing everything by the book, this is achieved by releasing a
1183 packet, and then wait just long enough, and release the next. We calculated
1184 our waits so we send just at peakrate.
1186 However, due to de default 10ms timer resolution of Unix, with 10.000 bits
1187 average packets, we are limited to 1mbit/s of peakrate!
1189 <tag>mtu/minburst</tag>
1190 The 1mbit/s peakrate is not very useful if your regular rate is more than
1191 that. A higher peakrate is possible by sending out more packets per
1192 timertick, which effectively means that we create a second bucket!
1194 This second bucket defaults to a single packet, which is not a bucket at
1195 all.
1197 To calculate the maximum possible peakrate, multiply the configured mtu by
1198 100 (or more correctly, HZ, which is 100 on intel, 1024 on Alpha).
1200 </descrip>
1201 <sect3>Sample configuration
1203 A simple but *very* useful configuration is this:
1204 <verb>
1205 # tc qdisc add dev ppp0 root tbf rate 220kbit latency 50ms burst 1500
1206 </verb>
1208 Ok, why is this useful? If you have a networking device with a large queue,
1209 like a DSL modem or a cablemodem, and you talk to it over a fast device,
1210 like over an ethernet interface, you will find that uploading absolutely
1211 destroys interactivity.
1213 This is because uploading will fill the queue in the modem, which is
1214 probably *huge* because this helps actually achieving good data throughput
1215 uploading. But this is not what you want, you want to have the queue not too
1216 big so interactivity remains and you can stil do other stuff while sending
1217 data.
1219 The line above slows down sending to a rate that does not lead to a queue in
1220 the modem - the queue will be in Linux, where we can control it to a limited
1221 size.
1223 Change 220kbit to your uplinks *actual* speed, minus a few percent. If you
1224 have a really fast modem, raise 'burst' a bit.
1225 <sect2>Stochastic Fairness Queueing
1227 Stochastic Fairness Queueing (SFQ) is a simple implementation of the fair
1228 queueing algorithms family. It's less accurate than others, but it also
1229 requires less calculations while being almost perfectly fair.
1231 The key word in SFQ is conversation (or flow), which mostly corresponds to a
1232 TCP session or a UDP stream. Traffic is divided into a pretty large number
1233 of FIFO queues, one for each conversation. Traffic is then sent in a round
1234 robin fashion, giving each session the chance to send data in turn.
1236 This leads to very fair behaviour and disallows any single conversation from
1237 drowning out the rest. SFQ is called 'Stochastic' because it doesn't really
1238 allocate a queue for each session, it has an algorithm which divides traffic
1239 over a limited number of queues using a hashing algorithm.
1241 Because of the hash, multiple sessions might end up in the same bucket, which
1242 would halve each session's chance of sending a packet, thus halving the
1243 effective speed available. To prevent this situation from becoming
1244 noticeable, SFQ changes its hashing algorithm quite often so that any two
1245 colliding sessions will only do so for a small number of seconds.
1247 It is important to note that SFQ is only useful in case your actual outgoing
1248 interface is really full! If it isn't then there will be no queue on your
1249 linux machine and hence no effect. Later on we will describe how to combine
1250 SFQ with other qdiscs to get a best-of-both worlds situation.
1252 Specifically, setting SFQ on the ethernet interface heading to your
1253 cablemodem or DSL router is pointless without further shaping!
1254 <sect3>Parameters &amp; usage
1256 The SFQ is pretty much selftuning:
1257 <descrip>
1258 <tag>perturb</tag>
1259 Reconfigure hashing once this many seconds. If unset, hash will never be
1260 reconfigured. Not recommended. 10 seconds is probably a good value.
1261 <tag>quantum</tag>
1262 Amount of bytes a stream is allowed to dequeue before the next queue gets a
1263 turn. Defaults to 1 maximum sized packet (MTU-sized). Do not set below the
1264 MTU!
1265 </descrip>
1266 <sect3>Sample configuration
1268 If you have a device which has identical link speed as actual available
1269 rate, like a phone modem, this configuration will help promote fairness:
1270 <verb>
1271 # tc qdisc add dev ppp0 root sfq perturb 10
1272 # tc qdisc -s -d ls
1273 qdisc sfq 800c: dev eth0 quantum 1514b limit 128p flows 128/1024 perturb 10sec
1274 Sent 4812 bytes 62 pkts (dropped 0, overlimits 0)
1275 </verb>
1277 The number 800c: is the automatically assigned handle number, limit means
1278 that 128 packets can wait in this queue. There are 1024 hashbuckets
1279 available for accounting, of which 128 can be active at a time (no more
1280 packets fit in the queue!) Once every 10 seconds, the hashes are
1281 reconfigured.
1282 <sect2>Ingress policer qdisc
1283 <p>
1284 The Ingress qdisc comes in handy if you need to ratelimit a host without
1285 help from routers or other Linux boxes. You can police incoming bandwidth
1286 and drop packets when this bandwidth exceeds your desired rate. This can
1287 save your host from a SYN flood, for example, and also works to slow down
1288 TCP/IP, which responds to dropped packets by reducing speed.
1290 FIXME: shaping by dropping packets seems less desirable than using, for
1291 example, a token bucket filter. Not sure though, Cisco CAR works this
1292 way, and people appear to be happy with it.
1294 See the reference to <ref id="CAR" name="IOS Committed Access Rate"> at the
1295 end of this document.
1297 In short: you can use this to limit how fast your computer downloads files,
1298 thus leaving more of the available bandwidth for others.
1300 The ingress policer is not a regular qdisc, although it looks like one. It
1301 is in fact hooked to the interface via the Netfilter infrastructure.
1302 Configuration is achieved using 'tc filter police' commands.
1304 See the section on 'Protecting your host from SYN floods' for an example on
1305 how this works.
1307 <sect2>Summary
1309 Summarizing, these are the simple queues that actually manage traffic by
1310 reordering, slowing or dropping packets.
1312 Advice:
1313 <itemize>
1314 <item>
1315 To purely slow down outgoing traffic, use the Token Bucket Filter.
1316 <item>
1317 If your link is truly full and you want to make sure that no single session
1318 can dominate your outgoing bandwidth, use Stochastical Fairness Queueing.
1319 <item>
1320 If you have a big backbone and know what you are doing, consider Random
1321 Early Drop - see the backbone chapter.
1322 <item>
1323 To 'shape' incoming traffic which you are not forwarding, use the Ingress
1324 Policer. If you *are* forwarding it, use a TBF on the interface you are
1325 forwarding the data to.
1326 </itemize>
1327 <sect1>Classful Queueing Disciplines
1329 Some queueing disciplines can contain other queueing disciplines, which are
1330 then suddenly called 'classes'. A class is nothing short of a qdisc, except
1331 that it lives within another qdisc. We use the terms 'inner qdisc'
1332 , 'sub-qdisc' and 'class' interchangeably.
1334 Classful qdiscs are very useful if you have different kinds of traffic which
1335 should have differing treatment. One of the classful qdiscs is called 'CBQ'
1336 , 'Class Based Queueing' - it is so widely mentioned that people identify
1337 queueing with classes solely with CBQ, but this is not the case.
1339 CBQ is merely the oldest kid on the block - yet it is by far the least
1340 useful qdisc and also the most complex one. I advise *against* using it.
1341 This may come as something of a shock to many who fell for the 'sendmail
1342 effect', which learns us that any complex technology which doesn't come with
1343 documentation must be the best available.
1345 More about CBQ and it's alternatives shortly.
1346 <sect2>Flow within classful qdiscs &amp; classes
1348 When traffic enters a classful qdisc, it needs to be sent to any of the
1349 qdiscs within - the classes. To determine what to do with a packet, the so
1350 called 'filters' are consulted. It is important to know that the filters are
1351 called from within a qdisc, and not the other way around!
1353 The filters attached to that qdisc then return with a decision, and the
1354 qdisc uses this to enqueue the packet into one of the classes. These classes
1355 don't know that they are part of an outer-qdisc, they act as they normally
1356 do: accepting packets on one end and outputting them again when asked.
1358 Besides containing other qdiscs, most classful qdiscs also perform shaping.
1359 This is useful to perform both packet reordering (with SFQ, for example) and
1360 rate control. You need this in cases where you have a high speed
1361 interface (for example, ethernet) to a slower device (a cable modem).
1363 If you were only to run SFQ, nothing would happen, as packets enter &amp;
1364 leave your router without delay: the output interface is far faster than
1365 your actual link speed. There is no queue to process then.
1367 <sect2>The qdisc family: roots, handles, siblings and parents
1369 Each interface has a 'root qdisc', by default the earlier mentioned
1370 classless pfifo_fast queueing discipline. Each qdisc can be assigned a
1371 handle, which can be used by later configuration statements to refer to that
1372 qdisc.
1374 These handles consist of two parts, a major number and a minor number. It is
1375 habitual to name the root qdisc '1:', which is equal to '1:0'.
1377 Because classful qdiscs can have a lot of children, you should give them
1378 their own namespace by giving them a separate major number.
1379 <sect3>How filters are used to classify traffic
1381 Recapping, a typical hierarchy might look like this:
1382 <verb>
1383 root 1:
1385 _1:1_
1386 / | \
1387 / | \
1388 / | \
1389 10: 11: 12:
1390 / \ / \
1391 10:1 10:2 12:1 12:2
1392 </verb>
1394 But don't let this tree fool you! You should *not* imagine the kernel to be
1395 at the apex of the tree and the network below, that is just not the case.
1396 Packets get enqueued and dequeued at the root qdisc, which is the only thing
1397 the kernel talks to.
1399 A packet might get enqueued in a chain like this:
1401 1: -> 1:1 -> 12: -> 12:2
1403 The packet now resides in a queue in qdisc 12:2. In this example, a filter
1404 was attached to each 'node' in the tree, each chosing a branch to take next.
1405 This can make sense. However, tnis is also possible:
1407 1: -> 12:2
1409 In this case, a filter attached to the root decided to send the packet
1410 directly to 12:2.
1412 <sect3>How packets are dequeued to the hardware
1414 When the kernel decides that it needs to extract packets to send to the
1415 interface, the root qdisc 1: gets a dequeue request, which is passed to
1416 1:1, which is in turn passed to 10:, 11: and 12:, which each query their
1417 siblings, and try to dequeue() from them. In this case, the kernel needs to
1418 walk the entire tree, because only 12:2 contains a packet.
1420 In short, nested qdiscs ONLY talk to their parent qdiscs, never to an
1421 interface. Only the root qdisc gets dequeued by the kernel!
1423 The upshot of this is that sub-qdiscs never get dequeued faster than their
1424 parents allow. And this is exactly what we want: this way we can have SFQ as
1425 an inner class, which doesn't do any shaping, only reordering, and have a
1426 shaping outer class, which does the shaping.
1427 <sect2>The PRIO qdisc
1429 The PRIO qdisc doesn't actually shape, it only subdivides traffic based on
1430 how you configured your filters. You can consider the PRIO qdisc a kind
1431 of pfifo_fast on stereoids, whereby each band is a separate qdisc instead of
1432 a simple FIFO.
1434 When a packet is enqueued to the PRIO qdisc, a sub-qdisc is chosen based on
1435 the filter commands you gave. By default, three pfifo sub-qdiscs are
1436 created. These sub-qdiscs are by default pure FIFO queues with no internal
1437 structure, but you can replace them by any qdisc you have available.
1439 Whenever a packet needs to be dequeued, class :1 is tried first. Higher
1440 classes are only used of lower bands all did not give up a packet.
1442 This queue is very useful in case you want to prioritize certain kinds of
1443 traffic without using TOS-flags but using all the power of the tc filters.
1444 Because it doesn't actually shape, the same warning as for SFQ holds: either
1445 use it only if your physical link is really full or wrap it inside a
1446 classful qdisc that does shape.
1448 The last holds for almost all cablemodems and DSL devices.
1449 <sect3>PRIO parameters &amp; usage
1451 The following parameters are recognized by tc:
1452 <descrip>
1453 <tag>bands</tag>
1454 Number of bands to create. Each band is in fact a class. If you change this
1455 number, you should probably also change the priomap.
1456 <tag>priomap</tag>
1457 If you do not provide tc filters to classify traffic, the PRIO qdisc looks
1458 at the TC_PRIO priority to decide how to enqueue traffic. The kernel assigns
1459 each packet a TC_PRIO priority, based on TOS flags or socket options passed
1460 by the application.
1462 The TC_PRIO is decided based on the TOS, and mapped as follows:
1464 <verb>
1465 TC_PRIO.. Num TOS Band
1466 -------------------------------------------------------
1467 BESTEFFORT 0 Maximize Reliablity 1
1468 FILLER 1 Minimize Cost 2
1469 BULK 2 Maximize Throughput (0x8) 2
1470 INTERACTIVE_BULK 4 2
1471 INTERACTIVE 6 Minimize Delay (0x10) 1
1472 CONTROL 7 2
1475 10 1
1476 11 1
1477 12 1
1478 13 1
1479 14 1
1480 15 1
1481 </verb>
1482 FIXME: It is not known what the higher priorities confirm to.
1484 SSH sets TOS to 'Minimize Delay', unless it is doing scp, in which case it
1485 sets 'Maximize Throughput'. The numbers in parentheses denote the TOS value
1486 as reported by tcpdump and the kernel. If you divide this by two, you get
1487 the values mentioned by RFC1349.
1489 The default values are reasonable, you probably do not need to change
1490 them.
1491 </descrip>
1492 The bands are classes, and are called major:1 to major:3 by default, so if
1493 your PRIO qdisc is called 12:, tc filter traffic to 12:1 to grant it more
1494 priority.
1496 Reiterating, band 0 goes to minor number 1! Band 1 to minor number 2, etc.
1497 <sect3>Sample configuration
1499 We will create this tree:
1500 <verb>
1501 root 1: prio
1502 / | \
1503 1:1 1:2 1:3
1504 | | |
1505 10: 20: 30:
1506 sfq tbf sfq
1507 band 0 1 2
1508 </verb>
1510 Bulk traffic will go to 30:, interactive traffic to 20: or 10:.
1512 Commandlines:
1513 <verb>
1514 # tc qdisc add dev eth0 root handle 1: prio
1515 ## This *instantly* creates 1:1, 1:2, 1:3
1517 # tc qdisc add dev eth0 parent 1:1 handle 10: sfq
1518 # tc qdisc add dev eth0 parent 1:2 handle 20: tbf rate 20kbit buffer 1600 limit 3000
1519 # tc qdisc add dev eth0 parent 1:3 handle 30: sfq
1520 </verb>
1522 Now lets's see what we created:
1523 <verb>
1524 # tc -s qdisc ls dev eth0
1525 qdisc sfq 30: quantum 1514b
1526 Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
1528 qdisc tbf 20: rate 20Kbit burst 1599b lat 667.6ms
1529 Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
1531 qdisc sfq 10: quantum 1514b
1532 Sent 132 bytes 2 pkts (dropped 0, overlimits 0)
1534 qdisc prio 1: bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
1535 Sent 174 bytes 3 pkts (dropped 0, overlimits 0)
1536 </verb>
1537 As you can see, band 0 has already had some traffic, and one packet was sent
1538 while running this command!
1540 We now do some bulk data transfer with a tool that properly sets TOS flags,
1541 and take another look:
1542 <verb>
1543 # scp tc ahu@10.0.0.11:./
1544 ahu@10.0.0.11's password:
1545 tc 100% |*****************************| 353 KB 00:00
1546 # tc -s qdisc ls dev eth0
1547 qdisc sfq 30: quantum 1514b
1548 Sent 384228 bytes 274 pkts (dropped 0, overlimits 0)
1550 qdisc tbf 20: rate 20Kbit burst 1599b lat 667.6ms
1551 Sent 2640 bytes 20 pkts (dropped 0, overlimits 0)
1553 qdisc sfq 10: quantum 1514b
1554 Sent 2230 bytes 31 pkts (dropped 0, overlimits 0)
1556 qdisc prio 1: bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
1557 Sent 389140 bytes 326 pkts (dropped 0, overlimits 0)
1558 </verb>
1559 As you can see, all traffic went to handle 30:, which is the lowest priority
1560 band, just as intended. Now to verify that interactive traffic goes to
1561 higher bands, we create some interactive traffic:
1563 <verb>
1564 # tc -s qdisc ls dev eth0
1565 qdisc sfq 30: quantum 1514b
1566 Sent 384228 bytes 274 pkts (dropped 0, overlimits 0)
1568 qdisc tbf 20: rate 20Kbit burst 1599b lat 667.6ms
1569 Sent 2640 bytes 20 pkts (dropped 0, overlimits 0)
1571 qdisc sfq 10: quantum 1514b
1572 Sent 14926 bytes 193 pkts (dropped 0, overlimits 0)
1574 qdisc prio 1: bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
1575 Sent 401836 bytes 488 pkts (dropped 0, overlimits 0)
1576 </verb>
1578 It worked - all additional traffic has gone to 10:, which is our highest
1579 priority qdisc. No traffic was sent to the lowest priority, which previously
1580 received our entire scp.
1582 <sect2>The famous CBQ qdisc
1584 As said before, CBQ is the most complex qdisc available, the most hyped, the
1585 least understood and possibly the worst queueing discipline for you in the
1586 entire Linux kernel. This is not because the authors are evil or
1587 incompetent, far from it, it's just that the CBQ algorithm isn't all that
1588 precise and doesn't really match the way Linux works.
1590 Besides being classful, CBQ is also a shaper and it is in that aspect that
1591 it really doesn't work very well. It should work like this. If you try to
1592 shape a 10mbit/s connection to 1mbit/s, the link should be idle 90% of the
1593 time. If it isn't, we need to throttle so that it IS idle 90% of the time.
1595 This is pretty hard to measure, so CBQ also needs to know how big an average
1596 packet is going to be, and instead derives the idle time from the number of
1597 microseconds that elapse between requests from the hardware layer for more
1598 data. Combined, this can be used to approximate how full or empty the link
1601 This is rather circumspect and doesn't always arrive at proper results. For
1602 example, what is the actual link speed of an interface that is not really
1603 able to transmit the full 100mbit/s of data, perhaps because of a badly
1604 implemented driver? A PCMCIA network card will also never achieve 100mbit/s
1605 because of the way the bus is designed - again, how do we calculate the idle
1606 time?
1608 It gets even worse if we consider not-quite-real network devices like PPP
1609 over Ethernet or PPTP over TCP/IP. The effective bandwidth in that case is
1610 probably determined by the efficiency of pipes to userspace - which is huge.
1612 People who have done measurements discover that CBQ is not very accurate and
1613 sometimes completely misses the mark.
1615 Besides not being all that good, it also comes with little or no
1616 documentation AND with about 20 knobs to tune. In fact, CBQ is so hard to
1617 configure that people use scripts to generate the needed commands.
1619 In short - I would advise AGAINST using CBQ if you want to have accurate
1620 results and want to understand what you are doing.
1621 <sect3>CBQ shaping in detail
1623 Because lots of people are using CBQ anyhow, possibly because they don't
1624 have anything else available, we will describe it here.
1626 As said before, CBQ works by making sure that the link is idle just long
1627 enough to bring down the real bandwidth to the configured rate. To do so, it
1628 calculates the time that should pass between average packets.
1630 During operations, the effective idletime is measured using an exponential
1631 weighted moving average (EWMA), which considers recent packets to be
1632 exponentially more important than past ones. The unix loadaverage is
1633 calculated in the same way.
1635 The calculated idle time is substracted from the EWMA measured one, the
1636 resulting number is called 'avgidle'. A perfectly loaded link has an avgidle
1637 of zero: packets arrive exactly once every calculated interval.
1639 An overloaded link has a negative avgidle and if it gets too negative, CBQ
1640 shuts down for a while and is then 'overlimit'.
1642 Conversely, an idle link might amass a huge avgidle, which would then allow
1643 infinite bandwidths after a few hours of silence. To prevent this, avgidle is
1644 capped at maxidle.
1646 If overlimit, in theory, the CBQ could throttle itself for exactly the
1647 amount of time that was calculated to pass between packets, and then pass
1648 one packet, and throttle again. But see the 'minburst' parameter below.
1650 These are parameters you can specify in order to configure shaping:
1652 <descrip>
1653 <tag>avpkt</tag>
1654 Average size of a packet, measured in bytes. Needed for idle time
1655 approximation.
1656 <tag>bandwidth</tag>
1657 The physical bandwidth of your device, also needed for idle time
1658 calculations.
1659 <tag>cell</tag>
1660 The time a packet takes to be transmitted over an ethernet device grows in
1661 steps, based on the packet size. An 800 and a 806 size packet may take just
1662 as long to send, for example - this sets the granularity. Most often set
1663 to '8'. Must be an integral power of two.
1664 <tag>maxburst</tag>
1665 This number of packets is used to calculate maxidle so that when avgidle is
1666 at maxidle, this number of average packets can be burst before avgidle drops
1667 to 0. Set it higher to be more tolerant of bursts. You can't set maxidle
1668 directly, only via this parameter.
1669 <tag>minburst</tag>
1670 As mentioned before, CBQ needs to throttle in case of overlimit. The ideal
1671 solution is to do so for exactly the calculated idle time, and pass 1
1672 packet. However, Unix kernels generally have a hard time scheduling events
1673 shorter than 10ms, so it is better to throttle for a longer period, and then
1674 pass minburst packets in one go, and then sleep minburst times longer.
1676 The time to wait is called the offtime. Higher values of minburst lead to
1677 more accurate shaping in the long term, but to bigger bursts at millisecond
1678 timescales.
1679 <tag>minidle</tag>
1680 If avgidle is below 0, we are overlimits and need to wait until avgidle will
1681 be big enough to send one packet. To prevent a sudden burst from shutting
1682 down the link for a prolonged period of time, avgidle is reset to minidle if
1683 it gets too low.
1685 Minidle is specified in negative microseconds, so 10 means that avgidle is
1686 capped at -10us.
1687 <tag>mpu</tag>
1688 Mininum packet size - needed because even a zero size packet is padded
1689 to 64 bytes on ethernet, and so takes a certain time to transmit. CBQ needs
1690 to know this to accurately measure the idle time.
1691 <tag>rate</tag>
1692 Desired rate of traffic leaving this qdisc - this is the 'speed knob'!
1693 </descrip>
1695 Internally, CBQ has a lot of finetuning. For example, classes which are
1696 known not to have data enqueued to them aren't queried. Overlimit classes
1697 are penalized by lowering their effective priority. All very smart &amp;
1698 complicated.
1700 <sect3>CBQ classful behaviour
1702 Besides shaping, using the aforementioned idletime approximations, CBQ also
1703 acts like the PRIO queue in the sense that classes can have differing
1704 priorities and that lower priority numbers will be polled before the higher
1705 priority ones.
1707 Each time a packet is requested by the hardware layer to be sent out to the
1708 network, a weighted round robin process starts, beginning with the lower
1709 priority classes.
1711 These are then grouped and queried if they have data available. If so, it is
1712 returned. After a class has been allowed to dequeue a number of bytes, the
1713 next class within that priority is tried.
1715 The following parameters control the WRR process:
1716 <descrip>
1717 <tag>allot</tag>
1718 When the outer cbq is asked for a packet to send out on the interface, it
1719 will try all inner qdiscs (classes) in turn, in order of the 'priority'
1720 parameter. Each time a class gets its turn, it can only send out a limited
1721 amount of data. 'Allot' is the base unit of this amount. See the 'weight'
1722 parameter for more information.
1725 <tag>prio</tag>
1726 The CBQ can also act like the PRIO device. Inner classes with lower priority
1727 are tried first and as long as they have traffic, other classes are not
1728 polled for traffic.
1730 <tag>weight</tag>
1731 Weight helps in the Weighted Round Robin process. Each class gets a chance
1732 to send in turn. If you have classes with significantly more bandwidth than
1733 other classes, it makes sense to allow them to send more data in one round
1734 than the others.
1736 A CBQ adds up all weights within a class, and normalizes them, so you can
1737 use arbitrary numbers: only the ratios are important. People have been
1738 using 'rate/10' as a rule of thumb and it appears to work well. The
1739 renormalized weight is multiplied by the 'allot' parameter to determine how
1740 much data can be sent in one round.
1741 </descrip>
1743 <sect3>CBQ parameters that determine link sharing &amp; borrowing
1745 Besides purely limiting certain kinds of traffic, it is also possible to
1746 specify which classes can borrow capacity from other classes or, conversely,
1747 lend out bandwidth.
1749 <descrip>
1750 <tag>Isolated/sharing</tag>
1751 A class that is configured with 'isolated' will not lend out bandwidth to
1752 sibling classes. Use this if you have competing or mutually-unfriendly
1753 agencies on your link who do want to give eachother freebies.
1755 The control program tc also knows about 'sharing', which is the reverse
1756 of 'isolated'.
1757 <tag>bounded/borrow</tag>
1758 A class can also be 'bounded', which means that it will not try to borrow
1759 bandwidth from sibling classes. tc also knows about 'borrow', which is the
1760 reverse of 'bounded'.
1761 </descrip>
1762 A typical situation might be where you have two agencies on your link which
1763 are both 'isolated' and 'bounded', which means that they are really limited
1764 to their assigened rate, and also won't allow each other to borrow.
1766 Within such an agency class, there might be other classes which are allowed
1767 to swap bandwidth.
1769 <sect3>Other CBQ parameters: split &amp; defmap
1771 As said before, a classful qdisc needs to call filters to determine
1772 which class a packet will be enqueued to.
1774 Besides calling the filter, CBQ offers other options, defmap &amp; split.
1775 This is pretty complicated to understand, and it is not vital. But as this
1776 is the only known place where defmap &amp; split are properly explained, I'm
1777 doing my best.
1779 As you will often want to filter on the Type of Service field only, a special
1780 syntax is provided. Whenever the CBQ needs to figure out where a packet
1781 needs to be enqueued, it checks if this node is a 'split node'. If so, one
1782 of the sub-qdiscs has indicated that it wishes to receive all packets with
1783 a certain configured priority, as might be derived from the TOS field, or
1784 socket options set by applications.
1786 The packets' priority bits are or-ed with the defmap field to see if a match
1787 exists. In other words, this is a short-hand way of creating a very fast
1788 filter, which only matches certain priorities. A defmap of ff (hex) will
1789 match everything, a map of 0 nothing. A sample configuration may help make
1790 things clearer:
1792 <verb>
1793 # tc qdisc add dev eth1 root handle 1: cbq bandwidth 10Mbit allot 1514 \
1794 cell 8 avpkt 1000 mpu 64
1796 # tc class add dev eth1 parent 1:0 classid 1:1 cbq bandwidth 10Mbit \
1797 rate 10Mbit allot 1514 cell 8 weight 1Mbit prio 8 maxburst 20 \
1798 avpkt 1000
1799 </verb>
1800 Standard CBQ preamble. I never get used to the sheer amount of numbers
1801 required!
1803 Defmap refers to TC_PRIO bits, which are defined as follows:
1805 <verb>
1806 TC_PRIO.. Num Corresponds to TOS
1807 -------------------------------------------------
1808 BESTEFFORT 0 Maximuze Reliablity
1809 FILLER 1 Minimize Cost
1810 BULK 2 Maximize Throughput (0x8)
1811 INTERACTIVE_BULK 4
1812 INTERACTIVE 6 Minimize Delay (0x10)
1813 CONTROL 7
1814 </verb>
1816 This corresponds to bits, counted from the right. Now the interactive, and
1817 the bulk classes:
1819 <verb>
1820 # tc class add dev eth1 parent 1:1 classid 1:2 cbq bandwidth 10Mbit \
1821 rate 1Mbit allot 1514 cell 8 weight 100Kbit prio 3 maxburst 20 \
1822 avpkt 1000 split 1:0 defmap c0
1824 # tc class add dev eth1 parent 1:1 classid 1:3 cbq bandwidth 10Mbit \
1825 rate 8Mbit allot 1514 cell 8 weight 800Kbit prio 7 maxburst 20 \
1826 avpkt 1000 split 1:0 defmap 3f
1827 </verb>
1829 The 'split qdisc' is 1:0, which is where the choice will be made. C0 is
1830 binary for 11000000, 3F for 00111111, so these two together will match
1831 everything. The first class matches bits 7 & 6, and thus corresponds
1832 to 'interactive' and 'control' traffic. The second class matches the rest.
1834 Node 1:0 now has a table like this:
1835 <verb>
1836 priority send to
1837 0 1:3
1838 1 1:3
1839 2 1:3
1840 3 1:3
1841 4 1:3
1842 5 1:3
1843 6 1:2
1844 7 1:2
1845 </verb>
1848 For additional fun, you can also pass a 'change mask', which indicates
1849 exactly which priorities you wish to change. You only need to use this if you
1850 are running 'tc class change'. For example, to add best effort traffic to
1851 1:2, we could run this:
1853 <verb>
1854 # tc class change dev eth1 classid 1:2 cbq defmap 01/01
1855 </verb>
1857 The priority map over at 1:0 now looks like this:
1859 <verb>
1860 priority send to
1861 0 1:2
1862 1 1:3
1863 2 1:3
1864 3 1:3
1865 4 1:3
1866 5 1:3
1867 6 1:2
1868 7 1:2
1869 </verb>
1871 FIXME: did not test this, only looked at the source.
1872 <sect2>Hierarchical Token Bucket
1874 Martin Devera (&lt;devik&gt;) rightly realised that CBQ is complex and does
1875 not seem optimized for many typical situations. His Hierarchial approach is
1876 well suited for setups where you have a fixed amount of bandwidth which you
1877 want to divide for different purposes, giving each purpose a guaranteed
1878 bandwidth, with the possibility of specifying how much bandwidth can be
1879 borrowed.
1881 HTB works just like CBQ but does not resort to idle time calculations to
1882 shape. Instead, it is a classful Token Bucket Filter - hence the name. It
1883 has only a few parameters, which are well documented on his
1884 <url url="http://luxik.cdi.cz/~devik/qos/htb/"
1885 name="site">.
1887 As your HTB configuration gets more complex, your configuration scales
1888 well. With CBQ it is already complex even in simple cases! HTB is not yet a
1889 part of the standard kernel, but it should soon be!
1891 If you are in a position to patch your kernel, by all means use HTB instead
1892 of CBQ.
1893 <sect1>Classifying packets with filters
1895 To determine which class shall process a packet, the so-called 'classifier
1896 chain' is called each time a choice needs to be made. This chain consists of
1897 all filters attached to the classful qdisc that needs to decide.
1899 To reiterate the tree, which is not a tree:
1900 <verb>
1901 root 1:
1903 _1:1_
1904 / | \
1905 / | \
1906 / | \
1907 10: 11: 12:
1908 / \ / \
1909 10:1 10:2 12:1 12:2
1910 </verb>
1912 When enqueueing a packet, at each branch the filter chain is consulted for a
1913 relevant instruction. A typical setup might be to have a filter in 1:1 that
1914 directs a packet to 12: and a filter on 12: that sends the packet to 12:2.
1916 You might also attach this latter rule to 1:1, but you can make efficiency
1917 gains by having more specific tests lower in the chain.
1919 You can't filter a packet 'upwards', by the way.
1921 And again - packets are only enqueued downwards! When they are dequeued,
1922 they go up again, where the interface lives. They do NOT fall off the end of
1923 the tree to the network adaptor!
1925 <sect2>Some simple filtering examples
1927 As explained in the Classifier chapter, you can match on literally anything,
1928 using a very complicated syntax. To start, we will show how to do the
1929 obvious things, which luckily are quite easy.
1931 Let's say we have a PRIO qdisc called '10:' which contains three classes, and
1932 we want to assign all traffic from and to port 22 to the highest priority
1933 band, the filters would be:
1935 <tscreen><verb>
1936 # tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match \
1937 ip dport 22 0xffff flowid 10:1
1938 # tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match \
1939 ip sport 80 0xffff flowid 10:1
1940 # tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2
1941 </verb></tscreen>
1943 What does this say? It says: attach to eth0, node 10: a priority 1 u32
1944 filter that matches on IP destination port 22 *exactly* and send it to band
1945 10:1. And it then repeats the same for source port 80. The last command says
1946 that anything unmatched so far should go to band 10:2, the next-highest
1947 priority.
1949 You need to add 'eth0', or whatever your interface is called, because each
1950 interface has a unique namespace of handles.
1952 To select on an IP address, use this:
1953 <tscreen><verb>
1954 # tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 \
1955 match ip dst 4.3.2.1/32 flowid 10:1
1956 # tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 \
1957 match ip src 1.2.3.4/32 flowid 10:1
1958 # tc filter add dev eth0 protocol ip parent 10: prio 2 \
1959 flowid 10:2
1960 </verb></tscreen>
1962 This assigns traffic to 4.3.2.1 and traffic from 1.2.3.4 to the highest
1963 priority queue, and the rest to the next-highest one.
1965 You can concatenate matches, to match on traffic from 1.2.3.4 and from port
1966 80, do this:
1967 <tscreen><verb>
1968 # tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 4.3.2.1/32
1969 match ip sport 80 flowid 10:1
1970 </verb></tscreen>
1972 For far more information, see the 'Using filters to classify packets to
1973 qdiscs' chapter.
1974 <sect1>Commandlines to configure qdiscs, classes and filters
1976 By now the concepts should be pretty clear. If not, reread the previous
1977 sections until you are at least nearly there. Perhaps the following
1978 commandlines will complete your understanding then.
1980 <sect2>CBQ
1982 This configuration limits webserver traffic to 5mbit and smtp traffic to 3
1983 mbit, and limits the sum to 5mbit:
1984 <verb>
1985 # tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 100Mbit \
1986 avpkt 1000 cell 8
1987 # tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 100Mbit \
1988 rate 5Mbit weight 0.5Mbit prio 8 allot 1514 cell 8 maxburst 20 \
1989 avpkt 1000
1990 </verb>
1991 This part installs the root and the customary 1:0 sub-root. While it is
1992 possible to remove the first line, and attach the second line directly to
1993 the root, there are some subtleties involved which are avoided if adding
1994 this extra layer.
1996 As said before, CBQ requires a *lot* of knobs. All parameters are explained
1997 above, however. The corresponding HTB configuration is lots simpler.
1999 <verb>
2000 # tc class add dev eth0 parent 1:1 classid 10: cbq bandwidth 100Mbit \
2001 rate 5Mbit weight 0.5Mbit prio 5 allot 1514 cell 8 maxburst 20 \
2002 avpkt 1000 bounded
2003 # tc class add dev eth0 parent 1:1 classid 20: cbq bandwidth 100Mbit \
2004 rate 3Mbit weight 0.3Mbit prio 5 allot 1514 cell 8 maxburst 20 \
2005 avpkt 1000 bounded
2006 </verb>
2008 These are our two classes. Note how we scale the weight with the configured
2009 rate. Also note that both classes are bounded and won't therefore try to
2010 borrow traffic.
2012 <verb>
2013 # tc qdisc add dev eth0 parent 10: tbf rate 5Mbit buffer 10Kb/8 limit \
2014 15Kb mtu 1500
2015 # tc qdisc add dev eth0 parent 20: tbf rate 3Mbit buffer 10Kb/8 limit \
2016 15Kb mtu 1500
2017 </verb>
2019 Here we install token bucket filters in the two configured subclasses. The
2020 /8 corresponds to the cell size we mentioned earlier for CBQ. We create a
2021 bucket of 10kbytes of tokens, a maximum 'pre-bucket' backlog of 15kbyte.
2023 <verb>
2024 # tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip \
2025 sport 80 0xffff flowid 10:0
2026 # tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip \
2027 sport 25 0xffff flowid 20:0
2028 </verb>
2030 These commands, attached directly to the root, send traffic to the right
2031 qdiscs.
2033 Note that we use 'tc class add' to CREATE classes within a qdisc, but that
2034 we use 'tc qdisc add' to actually configure these classes.
2036 You may wonder what happens to traffic that is not classified by any of the
2037 two rules. It appears that in this case, data will then be processed within
2038 1:0, and be unlimited. This can be configured in a variety of ways, which I
2039 do not understand. Use HTB :-)
2041 If smtp+web together try to exceed the set limit of 5mbit/s, bandwidth will
2042 be divided according to the weight parameter, giving 5/8 of traffic to the
2043 webserver and 3/8 to the mailserver.
2044 <sect2>HTB
2046 The functionally almost identical, but *better*, HTB configuraton is:
2048 <tscreen><verb>
2049 # tc qdisc add dev eth0 root handle 1: htb default 30
2051 # tc class add dev eth0 parent 1: classid 1:1 htb rate 5mbit burst 15k
2053 # tc class add dev eth0 parent 1:1 classid 1:10 htb rate 5mbit burst 15k
2054 # tc class add dev eth0 parent 1:1 classid 1:20 htb rate 3mbit ceil 5mbit burst 15k
2055 # tc class add dev eth0 parent 1:1 classid 1:30 htb rate 1kbit ceil 5mbit burst 15k
2056 </verb></tscreen>
2058 The author then recommends SFQ for beneath these classes:
2059 <tscreen><verb>
2060 # tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
2061 # tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10
2062 # tc qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 10
2063 </verb></tscreen>
2065 Add the filters which direct traffic to the right classes:
2066 <tscreen><verb>
2067 # U32="tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32"
2068 # $U32 match ip dport 80 0xffff flowid 1:10
2069 # $U32 match ip sport 25 0xffff flowid 1:20
2070 </verb></tscreen>
2071 And that's it - no unsightly unexplained numbers, no undocumented
2072 parameters.
2074 HTB certainly looks wonderful - if 10: and 20: both have their guaranteed
2075 bandwidth, and more is left to divide, they borrow in a 5:3 ratio, just as
2076 you would expect.
2078 Unclassified traffic gets routed to 30:, which has little bandwidth of its
2079 own but can borrow everything that is left over. Because we chose SFQ
2080 internally, we get fairness thrown in for free!
2082 <sect>Loadsharing over multiple interfaces
2084 There are several ways of doing this. One of the easiest and straightforward
2085 ways is 'TEQL' - "True" (or "trivial") link equalizer. Like most things
2086 having to do with queueing, loadsharing goes both ways. Both ends of a link
2087 may need to participate for full effect.
2089 Imagine this situation:
2091 <tscreen><verb>
2092 +-------+ eth1 +-------+
2093 | |==========| |
2094 'network 1' ----| A | | B |---- 'network 2'
2095 | |==========| |
2096 +-------+ eth2 +-------+
2097 </verb></tscreen>
2099 A and B are routers, and for the moment we'll assume both run Linux. If
2100 traffic is going from network 1 to network 2, router A needs to distribute
2101 the packets over both links to B. Router B needs to be configured to accept
2102 this. Same goes the other way around, when packets go from network 2 to
2103 network 1, router B needs to send the packets over both eth1 and eth2.
2105 The distributing part is done by a 'TEQL' device, like this (it couldn't be
2106 easier):
2108 <tscreen><verb>
2109 # tc qdisc add dev eth1 root teql0
2110 # tc qdisc add dev eth2 root teql0
2111 </verb></tscreen>
2113 This needs to be done on both hosts. The device teql0 is basically a
2114 roundrobbin distributor over eth1 and eth2, for sending packets. No data
2115 ever comes in over an teql device, that just appears on the 'raw' eth1 and
2116 eth2.
2118 But now we just have devices, we also need proper routing. One way to do
2119 this is to assign a /31 network to both links, and a /31 to the teql0 device
2120 as well:
2122 FIXME: does this need something like 'nobroadcast'? A /31 is too small to
2123 house a network address and a broadcast address - if this doesn't work as
2124 planned, try a /30, and adjust the ip adresses accordingly. You might even
2125 try to make eth1 and eth2 do without an IP address!
2127 On router A:
2128 <tscreen><verb>
2129 # ip addr add dev eth1 10.0.0.0/31
2130 # ip addr add dev eth2 10.0.0.2/31
2131 # ip addr add dev teql0 10.0.0.4/31
2132 </verb></tscreen>
2134 On router B:
2135 <tscreen><verb>
2136 # ip addr add dev eth1 10.0.0.1/31
2137 # ip addr add dev eth2 10.0.0.3/31
2138 # ip addr add dev teql0 10.0.0.5/31
2139 </verb></tscreen>
2141 Router A should now be able to ping 10.0.0.1, 10.0.0.3 and 10.0.0.5 over the
2142 2 real links and the 1 equalized device. Router B should be able to ping
2143 10.0.0.0, 10.0.0.2 and 10.0.0.4 over the links.
2145 If this works, Router A should make 10.0.0.5 its route for reaching network
2146 2, and Router B should make 10.0.0.4 its route for reaching network 1. For
2147 the special case where network 1 is your network at home, and network 2 is
2148 the internet, Router A should make 10.0.0.5 its default gateway.
2150 <sect1>Caveats
2152 Nothing is as easy as it seems. eth1 and eth2 on both router A and B need to
2153 have return path filtering turned off, because they will otherwise drop
2154 packets destined for ip addresses other than their own:
2156 <tscreen><verb>
2157 # echo 0 > /proc/net/ipv4/conf/eth1/rp_filter
2158 # echo 0 > /proc/net/ipv4/conf/eth2/rp_filter
2159 </verb></tscreen>
2161 Then there is the nasty problem of packet reordering. Let's say 6 packets
2162 need to be sent from A to B - eth1 might get 1, 3 and 5. eth2 would then do
2163 2, 4 and 6. In an ideal world, router B would receive this in order, 1, 2,
2164 3, 4, 5, 6. But the possibility is very real that the kernel gets it like
2165 this: 2, 1, 4, 3, 6, 5. The problem is that this confuses TCP/IP. While not
2166 a problem for links carrying many different TCP/IP sessions, you won't be
2167 able to to a bundle multiple links and get to ftp a single file lots faster,
2168 except when your receiving or sending OS is Linux, which is not easily
2169 shaken by some simple reordering.
2171 However, for lots of applications, link loadbalancing is a great idea.
2173 <sect>Special Queues
2174 <sect1>DSMARK
2176 Esteve Camps Chust &lt;marvin@grn.es&gt;&nl;
2177 This text is an extract from my thesis on "QoS Support in Linux", September 2000.&nl;
2179 Source documents:&nl;
2180 <itemize>
2181 <item><url url="http://ica1www.epfl.ch/~almesber" name="Draft-almesberger-wajhak-diffserv-linux-01.txt">.
2182 <item>Examples in iproute2 distribution.
2183 <item><url url="http://www.qosforum.com/white-papers/qosprot_v3.pdf" name="White Paper-QoS protocols and architectures"> and
2184 <url url="http://www.qosforum.com/docs/faq" name="IP QoS Frequently Asked Questions"> both by <em>Quality of Service Forum</em>.
2185 </itemize>
2187 This chapter was written by Esteve Camps &lt;esteve@hades.udg.es&gt;.
2188 <sect2>Introduction
2191 First of all, first of all, it would be a great idea for you to read RFCs
2192 written about this (RFC2474, RFC2475, RFC2597 and RFC2598) at <url
2193 url="http://www.ietf.org/html.carters/diffserv-charter.html" name="IETF
2194 DiffServ working Group web site"> and <url
2195 url="http://ica1www.epfl.ch/~almesber" name="Werner Almesberger web site">
2196 (he wrote the code to support Differentiated Services on Linux).
2198 <sect2>What is Dsmark related to?
2200 Dsmark is a queueing discipline that offers the capabilities needed in
2201 Differentiated Services (also called DiffServ or, simply, DS). DiffServ is
2202 one of two actual QoS architectures (the other one is called Integrated
2203 Services) that is based on a value carried by packets in the DS field of the
2204 IP header.
2207 One of the first solutions in IP designed to offer some QoS level was
2208 the Type of Service field (TOS byte) in IP header. By changing that value,
2209 we could choose a high/low level of throughput, delay or reliability.
2210 But this didn't provide sufficient flexibility to the needs of new
2211 services (such as real-time applications, interactive applications and
2212 others). After this, new architectures appeared. One of these was DiffServ
2213 which kept TOS bits and renamed DS field.
2214 <sect2>Differentiated Services guidelines
2216 Differentiated Services is group-oriented. I mean, we don't know nothing
2217 about flows (this will be the Integrated Services purpose); we know about
2218 flow aggregations and we will apply different behaviours depending on which
2219 aggregation a packet belongs to.
2222 When a packet arrives to an edge node (entry node to a DiffServ domain)
2223 entering to a DiffServ Domain we'll have to policy, shape and/or mark those
2224 packets (marking refers to assigning a value to the DS field. It's just like the
2225 cows :-) ). This will be the mark/value that the internal/core nodes on our
2226 DiffServ Domain will look at to determine which behaviour or QoS level
2227 apply.
2230 As you can deduce, Differentiated Services involves a domain on which
2231 all DS rules will have to be applied. In fact you can think &dquot;I
2232 will classify all the packets entering my domain. Once they enter my
2233 domain they will be subjected to the rules that my classification dictates
2234 and every traversed node will apply that QoS level&dquot;.
2236 In fact, you can apply your own policies into your local domains, but some
2237 <em>Service Level Agreements</em> should be considered when connecting to
2238 other DS domains.
2241 At this point, you maybe have a lot of questions. DiffServ is more than I've
2242 explained. In fact, you can understand that I can not resume more than 3
2243 RFC's in just 50 lines :-).
2245 <sect2>Working with Dsmark
2248 As the DiffServ bibliography specifies, we differentiate boundary nodes and
2249 interior nodes. These are two important points in the traffic path. Both
2250 types perform a classification when the packets arrive. Its result may be
2251 used in different places along the DS process before the packet is released
2252 to the network. It's just because of this that the diffserv code supplies an
2253 structure called sk_buff, including a new field called skb-&gt;tc_index
2254 where we'll store the result of initial classification that may be used in
2255 several points in DS treatment.
2258 The skb-&gt;tc_index value will be initially set by the DSMARK qdisc,
2259 retrieving it from the DS field in IP header of every received packet.
2260 Besides, cls_tcindex classifier will read all or part of skb-&gt;tcindex
2261 value and use it to select classes.
2264 But, first of all, take a look at DSMARK qdisc command and its parameters:
2265 <tscreen><verb>
2266 ... dsmark indices INDICES [ default_index DEFAULT_INDEX ] [ set_tc_index ]
2267 </verb></tscreen>
2268 What do these parameters mean?
2269 <itemize>
2270 <item><bf>indices</bf>: size of table of (mask,value) pairs. Maximum value is 2^n, where n&gt=0.
2271 <item><bf>Default_index</bf>: the default table entry index if classifier finds no match.
2272 <item><bf>Set_tc_index</bf>: instructs dsmark discipline to retrieve the DS field and store it onto skb-&gt;tc_index.
2273 </itemize>
2274 Let's see the DSMARK process.
2276 <sect2>How SCH_DSMARK works.
2278 This qdisc will apply the next steps:
2279 <itemize>
2280 <item>If we have declared set_tc_index option in qdisc command, DS field is retrieved and stored onto
2281 skb-&gt;tc_index variable.
2282 <item>Classifier is invoked. The classifier will be executed and it will return a class ID that will be stored in
2283 skb-&gt;tc_index variable.If no filter matches are found, we consider the default_index option to be the
2284 classId to store. If neither set_tc_index nor default_index has been declared results may be
2285 impredictibles.
2286 <item>After been sent to internal qdisc's where you can reuse the result of the filter, the classid returned by
2287 the internal qdisc is stored into skb-&gt;tc_index. We will use this value in the future to index a mask-
2288 value table. The final result to assign to the packet will be that resulting from next operation:
2289 <tscreen><verb>
2290 New_Ds_field = ( Old_DS_field & mask ) | value
2291 </verb></tscreen>
2293 <item>Thus, new value will result from "anding" ds_field and mask values and next, this result "ORed" with
2294 value parameter. See next diagram to understand all this process:
2295 </itemize>
2296 <tscreen>
2297 <verb>
2298 skb-&gt;ihp-&gt;tos
2299 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - &gt;
2300 | | ^
2301 | -- If you declare set_tc_index, we set DS | | &lt;-----May change
2302 | value into skb-&gt;tc_index variable | |O DS field
2303 | A| |R
2304 +-|-+ +------+ +---+-+ Internal +-+ +---N|-----|----+
2305 | | | | tc |---&gt;| | |--&gt; . . . --&gt;| | | D| | |
2306 | | |-----&gt;|index |---&gt;| | | Qdisc | |----&gt;| v | |
2307 | | | |filter|---&gt;| | | +---------------+ | ----&gt;(mask,value) |
2308 --&gt;| O | +------+ +-|-+--------------^----+ / | (. , .) |
2309 | | | ^ | | | | (. , .) |
2310 | | +----------|---------|----------------|-------|--+ (. , .) |
2311 | | sch_dsmark | | | | |
2312 +-|------------|---------|----------------|-------|------------------+
2313 | | | &lt;- tc_index -&gt; | |
2314 | |(read) | may change | | &lt;--------------Index to the
2315 | | | | | (mask,value)
2316 v | v v | pairs table
2317 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&gt;
2318 skb-&gt;tc_index
2319 </verb>
2320 </tscreen>
2322 How to do marking? Just change the mask and value of the class you want to remark. See next line of code:
2323 <tscreen>
2324 tc class change dev eth0 classid 1:1 dsmark mask 0x3 value 0xb8
2325 </tscreen>
2326 This changes the (mask,value) pair in hash table, to remark packets belonging to class 1:1.You have to "change" this values
2327 because of default values that (mask,value) gets initially (see table below).
2329 Now, we'll explain how TC_INDEX filter works and how fits into this. Besides, TCINDEX filter can be
2330 used in other configurations rather than those including DS services.
2333 <sect2>TC_INDEX Filter
2335 This is the basic command to declare a TC_INDEX filter:
2336 <tscreen>
2337 <verb>
2338 ... tcindex [ hash SIZE ] [ mask MASK ] [ shift SHIFT ]
2339 [ pass_on | fall_through ]
2340 [ classid CLASSID ] [ police POLICE_SPEC ]
2341 </verb>
2342 </tscreen>
2343 Next, we show the example used to explain TC_INDEX operation mode. Pay attention to bolded words:
2344 &nl;&nl;
2345 tc qdisc add dev eth0 handle 1:0 root dsmark indices 64 <bf>set_tc_index</bf>&nl;
2346 tc filter add dev eth0 parent 1:0 protocol ip prio 1 tcindex <bf>mask 0xfc shift 2</bf>&nl;
2347 tc qdisc add dev eth0 parent 1:0 handle 2:0 cbq bandwidth 10Mbit cell 8 avpkt 1000 mpu 64&nl;
2348 # EF traffic class&nl;
2349 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;
2350 # Packet fifo qdisc for EF traffic&nl;
2351 tc qdisc add dev eth0 parent 2:1 pfifo limit 5&nl;
2352 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;
2353 &nl;&nl;
2354 (This code is not complete. It's just an extract from EFCBQ example included in iproute2 distribution).
2356 First of all, suppose we receive a packet marked as EF . If you read RFC2598, you'll see that DSCP
2357 recommended value for EF traffic is 101110. This means that DS field will be 10111000 (remember that
2358 less signifiant bits in TOS byte are not used in DS) or 0xb8 in hexadecimal codification.
2360 <tscreen>
2361 <verb>
2362 TC INDEX
2363 FILTER
2364 +---+ +-------+ +---+-+ +------+ +-+ +-------+
2365 | | | | | | | |FILTER| +-+ +-+ | | | |
2366 | |-----&gt;| MASK | -&gt; | | | -&gt; |HANDLE|-&gt;| | | | -&gt; | | -&gt; | |
2367 | | . | =0xfc | | | | |0x2E | | +----+ | | | | |
2368 | | . | | | | | +------+ +--------+ | | | |
2369 | | . | | | | | | | | |
2370 --&gt;| | . | SHIFT | | | | | | | |--&gt;
2371 | | . | =2 | | | +----------------------------+ | | |
2372 | | | | | | CBQ 2:0 | | |
2373 | | +-------+ +---+--------------------------------+ | |
2374 | | | |
2375 | +-------------------------------------------------------------+ |
2376 | DSMARK 1:0 |
2377 +-------------------------------------------------------------------------+
2379 </verb>
2380 </tscreen>
2382 The packet arrives, then, set with 0xb8 value at DS field. As we explained before, dsmark qdisc identified
2383 by 1:0 id in the example, retrieves DS field and store it in skb-&gt;tc_index variable.
2384 Next step in the example will correspond to the filter associated to this qdisc (second line in the example).
2385 This will perform next operations:
2386 <tscreen>
2387 <verb>
2388 Value1 = skb->tc_index & MASK
2389 Key = Value1 >> SHIFT
2390 </verb>
2391 </tscreen>
2394 In the example, MASK=0xFC i SHIFT=2.
2395 <tscreen>
2396 <verb>
2397 Value1 = 10111000 & 11111100 = 10111000
2398 Key = 10111000 >> 2 = 00101110 -> 0x2E in hexadecimal
2399 </verb>
2400 </tscreen>
2403 The returned value will correspond to a qdisc interal filter handle (in the example, identifier 2:0). If a
2404 filter with this id exists, policing and metering conditions will be verified (in case that filter includes this)
2405 and the classid will be returned (in our example, classid 2:1) and stored in skb-&gt;tc_index variable.
2408 But if any filter with that identifier is found, the result will depend on fall_through flag declaration. If so,
2409 value key is returned as classid. If not, an error is returned and process continues with the rest filters. Be
2410 careful if you use fall_through flag; this can be done if a simple relation exists between values
2411 &nl;of skb-&gt;tc_index variable and class id's.
2414 The latest parameters to comment on are hash and pass_on. The first one
2415 relates to hash table size. Pass_on will be used to indicate that if no classid
2416 equal to the result of this filter is found, try next filter.
2417 The default action is fall_through (look at next table).
2420 Finally, let's see which possible values can be set to all this TCINDEX parameters:
2421 <tscreen>
2422 <verb>
2423 TC Name Value Default
2424 -----------------------------------------------------------------
2425 Hash 1...0x10000 Implementation dependent
2426 Mask 0...0xffff 0xffff
2427 Shift 0...15 0
2428 Fall through / Pass_on Flag Fall_through
2429 Classid Major:minor None
2430 Police ..... None
2431 </verb>
2432 </tscreen>
2434 This kind of filter is very powerful. It's necessary to explore all possibilities. Besides, this filter is not only used in DiffServ configurations.
2435 You can use it as any other kind of filter.
2437 I recommend you to look at all DiffServ examples included in iproute2 distribution. I promise I will try to
2438 complement this text as soon as I can. Besides, all I have explained is the result of a lot of tests.
2439 I would thank you tell me if I'm wrong in any point.
2440 <sect1>WRR
2442 This qdisc is not included in the standard kernels but can be downloaded from
2443 <url url="http://wipl-wrr.dkik.dk/wrr/">.
2444 Currently the qdisc is only tested with Linux 2.2 kernels but it will
2445 probably work with 2.4 kernels too.
2447 The WRR qdisc distributes bandwidth between its classes using the weighted
2448 round robin scheme. That is, like the CBQ qdisc it contains classes
2449 into which arbitrary qdiscs can be plugged. All classes which have sufficient
2450 demand will get bandwidth proportional to the weights associated with the classes.
2451 The weights can be set manually using the <tt>tc</tt> program. But they
2452 can also be made automatically decreasing for classes transferring much data.
2454 The qdisc has a built-in classifier which assigns packets coming from or
2455 sent to different machines to different classes. Either the MAC or IP and
2456 either source or destination addresses can be used. The MAC address can only
2457 be used when the Linux box is acting as an ethernet bridge, however. The
2458 classes are automatically assigned to machines based on the packets seen.
2460 The qdisc can be very useful at sites such as dorms where a lot of unrelated
2461 individuals share an Internet connection. A set of scripts setting up a
2462 relevant behavior for such a site is a central part of the WRR distribution.
2464 <sect>Netfilter &amp; iproute - marking packets
2466 So far we've seen how iproute works, and netfilter was mentioned a few
2467 times. This would be a good time to browse through <url name="Rusty's Remarkably
2468 Unreliable Guides"
2469 url="http://netfilter.samba.org/unreliable-guides/">. Netfilter itself
2470 can be found <url name="here"
2471 url="http://netfilter.filewatcher.org/">.
2473 Netfilter allows us to filter packets, or mangle their headers. One special
2474 feature is that we can mark a packet with a number. This is done with the
2475 --set-mark facility.
2477 As an example, this command marks all packets destined for port 25, outgoing
2478 mail:
2480 <tscreen><verb>
2481 # iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 25 \
2482 -j MARK --set-mark 1
2483 </verb></tscreen>
2485 Let's say that we have multiple connections, one that is fast (and
2486 expensive, per megabyte) and one that is slower, but flat fee. We would most
2487 certainly like outgoing mail to go via the cheap route.
2489 We've already marked the packets with a '1', we now instruct the routing
2490 policy database to act on this:
2492 <tscreen><verb>
2493 # echo 201 mail.out >> /etc/iproute2/rt_tables
2494 # ip rule add fwmark 1 table mail.out
2495 # ip rule ls
2496 0: from all lookup local
2497 32764: from all fwmark 1 lookup mail.out
2498 32766: from all lookup main
2499 32767: from all lookup default
2500 </verb></tscreen>
2502 Now we generate the mail.out table with a route to the slow but cheap link:
2503 <tscreen><verb>
2504 # /sbin/ip route add default via 195.96.98.253 dev ppp0 table mail.out
2505 </verb></tscreen>
2507 And we are done. Should we want to make exceptions, there are lots of ways
2508 to achieve this. We can modify the netfilter statement to exclude certain
2509 hosts, or we can insert a rule with a lower priority that points to the main
2510 table for our excepted hosts.
2512 We can also use this feature to honour TOS bits by marking packets with a
2513 different type of service with different numbers, and creating rules to act
2514 on that. This way you can even dedicate, say, an ISDN line to interactive
2515 sessions.
2517 Needless to say, this also works fine on a host that's doing NAT
2518 ('masquerading').
2520 IMPORTANT: We received a report that MASQ and SNAT at least collide
2521 with marking packets. Rusty Russell explains it in
2522 <url
2523 url="http://lists.samba.org/pipermail/netfilter/2000-November/006089.html"
2524 name="this posting">. Turn off the reverse path filter to make it work
2525 properly.
2527 Note: to mark packets, you need to have some options enabled in your
2528 kernel:
2530 <tscreen><verb>
2531 IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) [Y/n/?]
2532 IP: policy routing (CONFIG_IP_MULTIPLE_TABLES) [Y/n/?]
2533 IP: use netfilter MARK value as routing key (CONFIG_IP_ROUTE_FWMARK) [Y/n/?]
2534 </verb></tscreen>
2536 See also <ref id="SQUID" name="Transparent web-caching using netfilter, iproute2, ipchains and squid">
2537 in the Cookbook.
2538 <sect>Using filters to classify packets to qdiscs
2540 As explained in the section on classful queueing disciplines, filters are
2541 needed to classify packets into any of the sub-queues. These filters are
2542 called from within the classful qdisc.
2544 Here is an incomplete list of classifiers available:
2545 <descrip>
2546 <tag>fw</tag>
2547 Bases the decision on how the firewall has marked the packet.
2549 <tag>u32</tag>
2550 Bases the decision on fields within the packet (i.e. source IP address, etc)
2552 <tag>route</tag>
2553 Bases the decision on which route the packet will be routed by.
2555 <tag>rsvp, rsvp6</tag>
2556 Bases the decision on the target (destination,protocol) and optionally the source as well. (I think)
2558 <tag>tcindex</tag>
2559 FIXME: Fill me in
2560 </descrip>
2562 Note that in general there are many ways in which you can classify packet
2563 and that it generally comes down to preference as to which system you wish
2564 to use.
2566 Classifiers in general accept a few arguments in common. They are listed here for convenience:
2568 <descrip>
2569 <tag>protocol</tag>
2570 The protocol this classifier will accept. Generally you will only be
2571 accepting only IP traffic. Required.
2573 <tag>parent</tag>
2574 The handle this classifier is to be attached to. This handle must be
2575 an already existing class. Required.
2577 <tag>prio</tag>
2578 The priority of this classifier. Lower numbers get tested first.
2580 <tag>handle</tag>
2581 This handle means different things to different filters.
2583 FIXME: Add more
2584 </descrip>
2586 All the following sections will assume you are trying to shape the traffic
2587 going to <tt>HostA</tt>. They will assume that the root class has been
2588 configured on 1: and that the class you want to send the selected traffic to
2589 is 1:1.
2591 <sect1>The "fw" classifier
2592 <p> The "fw" classifier relies on the firewall tagging the packets to be shaped. So,
2593 first we will setup the firewall to tag them:
2595 <tscreen><verb>
2596 # iptables -I PREROUTING -t mangle -p tcp -d HostA \
2597 -j MARK --set-mark 1
2598 </verb></tscreen>
2600 Now all packets to that machine are tagged with the mark 1. Now we build
2601 the packet shaping rules to actually shape the packets. Now we just need
2602 to indicate that we want the packets that are tagged with the mark 1 to go
2603 to class 1:1. This is accomplished with the command:
2605 <tscreen><verb>
2606 # tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 1 fw classid 1:1
2607 </verb></tscreen>
2609 This should be fairly self-explanatory. Attach to the 1:0 class a filter
2610 with priority 1 to filter all packet marked with 1 in the firewall to
2611 class 1:1. Note how the handle here is used to indicate what the mark
2612 should be.
2614 That's all there is to it! This is the (IMHO) easy way, the other ways are
2615 harder to understand, I think. Note that you can apply the full power of
2616 the firewalling code with this classifier, including matching MAC
2617 addresses, user IDs and anything else the firewall can match.
2619 <sect1>The "u32" classifier
2621 The U32 filter is the most advanced filter available in the current
2622 implementation. It entirely based on hashing tables, which make it
2623 robust when there are many filter rules.
2625 In its simplest form the U32 filter is a list of records, each
2626 consisting of two fields: a selector and an action. The selectors,
2627 described below, are compared with the currently processed IP packet
2628 until the first match occurs, and then the associated action is performed.
2629 The simplest type of action would be directing the packet into defined
2630 CBQ class.
2632 The commandline of <tt>tc filter</tt> program, used to configure the filter,
2633 consists of three parts: filter specification, a selector and an action.
2634 The filter specification can be defined as:
2636 <tscreen><verb>
2637 tc filter add dev IF [ protocol PROTO ]
2638 [ (preference|priority) PRIO ]
2639 [ parent CBQ ]
2640 </verb></tscreen>
2642 The <tt>protocol</tt> field describes protocol that the filter will be
2643 applied to. We will only discuss case of <tt>ip</tt> protocol. The
2644 <tt>preference</tt> field (<tt>priority</tt> can be used alternatively)
2645 sets the priority of currently defined filter. This is important, since
2646 you can have several filters (lists of rules) with different priorities.
2647 Each list will be passed in the order the rules were added, then list with
2648 lower priority (higher preference number) will be processed. The <tt>parent</tt>
2649 field defines the CBQ tree top (e.g. 1:0), the filter should be attached
2652 The options decribed apply to all filters, not only U32.
2654 <sect2>U32 selector
2656 The U32 selector contains definition of the pattern, that will be matched
2657 to the currently processed packet. Precisely, it defines which bits are
2658 to be matched in the packet header and nothing more, but this simple
2659 method is very powerful. Let's take a look at the following examples,
2660 taken directly from a pretty complex, real-world filter:
2662 <tscreen><verb>
2663 # filter parent 1: protocol ip pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:3 \
2664 match 00100000/00ff0000 at 0
2665 </verb></tscreen>
2668 For now, leave the first line alone - all these parameters describe
2669 the filter's hash tables. Focus on the selector line, containing
2670 <tt>match</tt> keyword. This selector will match to IP headers, whose
2671 second byte will be 0x10 (0010). As you can guess, the 00ff number is
2672 the match mask, telling the filter exactly which bits to match. Here
2673 it's 0xff, so the byte will match if it's exactly 0x10. The <tt>at</tt>
2674 keyword means that the match is to be started at specified offset (in
2675 bytes) -- in this case it's beginning of the packet. Translating all
2676 that to human language, the packet will match if its Type of Service
2677 field will have `low delay' bits set. Let's analyze another rule:
2679 <tscreen><verb>
2680 # filter parent 1: protocol ip pref 10 u32 fh 800::803 order 2051 key ht 800 bkt 0 flowid 1:3 \
2681 match 00000016/0000ffff at nexthdr+0
2682 </verb></tscreen>
2685 The <tt>nexthdr</tt> option means next header encapsulated in the IP packet,
2686 i.e. header of upper-layer protocol. The match will also start here
2687 at the beginning of the next header. The match should occur in the
2688 second, 32-bit word of the header. In TCP and UDP protocols this field
2689 contains packet's destination port. The number is given in big-endian
2690 format, i.e. older bits first, so we simply read 0x0016 as 22 decimal,
2691 which stands for SSH service if this was TCP. As you guess, this match
2692 is ambigous without a context, and we will discuss this later.
2695 Having understood all the above, we will find the following selector
2696 quite easy to read: <tt>match c0a80100/ffffff00 at 16</tt>. What we
2697 got here is a three byte match at 17-th byte, counting from the IP
2698 header start. This will match for packets with destination address
2699 anywhere in 192.168.1/24 network. After analyzing the examples, we
2700 can summarize what we have learnt.
2702 <sect2>General selectors
2705 General selectors define the pattern, mask and offset the pattern
2706 will be matched to the packet contents. Using the general selectors
2707 you can match virtually any single bit in the IP (or upper layer)
2708 header. They are more difficult to write and read, though, than
2709 specific selectors that described below. The general selector syntax
2712 <tscreen><verb>
2713 match [ u32 | u16 | u8 ] PATTERN MASK [ at OFFSET | nexthdr+OFFSET]
2714 </verb></tscreen>
2717 One of the keywords <tt>u32</tt>, <tt>u16</tt> or <tt>u8</tt> specifies
2718 length of the pattern in bits. PATTERN and MASK should follow, of length
2719 defined by the previous keyword. The OFFSET parameter is the offset,
2720 in bytes, to start matching. If <tt>nexthdr+</tt> keyword is given,
2721 the offset is relative to start of the upper layer header.
2724 Some examples:
2726 <tscreen><verb>
2727 # tc filter add dev ppp14 parent 1:0 prio 10 u32 \
2728 match u8 64 0xff at 8 \
2729 flowid 1:4
2730 </verb></tscreen>
2733 Packet will match to this rule, if its time to live (TTL) is 64.
2734 TTL is the field starting just after 8-th byte of the IP header.
2736 <tscreen><verb>
2737 # tc filter add dev ppp14 parent 1:0 prio 10 u32 \
2738 match u8 0x10 0xff at nexthdr+13 \
2739 protocol tcp \
2740 flowid 1:3 \
2741 </verb></tscreen>
2744 This rule will only match TCP packets with ACK bit set. Here we can see
2745 an example of using two selectors, the final result will be logical AND
2746 of their results. If we take a look at TCP header diagram, we can see
2747 that the ACK bit is second older bit (0x10) in the 14-th byte of the TCP
2748 header (<tt>at nexthdr+13</tt>). As for the second selector, if we'd like
2749 to make our life harder, we could write <tt>match u8 0x06 0xff at 9</tt>
2750 instead of using the specific selector <tt>protocol tcp</tt>, because
2751 6 is the number of TCP protocol, present in 10-th byte of the IP header.
2752 On the other hand, in this example we couldn't use any specific selector
2753 for the first match - simply because there's no specific selector to match
2754 TCP ACK bits.
2756 <sect2>Specific selectors
2758 The following table contains a list of all specific selectors
2759 the author of this section has found in the <tt>tc</tt> program
2760 source code. They simply make your life easier and increase readability
2761 of your filter's configuration.
2763 FIXME: table placeholder - the table is in separate file ,,selector.html''
2765 FIXME: it's also still in Polish :-(
2767 FIXME: must be sgml'ized
2769 Some examples:
2772 <tscreen><verb>
2773 # tc filter add dev ppp0 parent 1:0 prio 10 u32 \
2774 match ip tos 0x10 0xff \
2775 flowid 1:4
2776 </verb></tscreen>
2778 The above rule will match packets which have the TOS field set to 0x10.
2779 The TOS field starts at second byte of the packet and is one byte big,
2780 so we could write an equivalent general selector: <tt>match u8 0x10 0xff
2781 at 1</tt>. This gives us hint to the internals of U32 filter -- the
2782 specific rules are always translated to general ones, and in this
2783 form they are stored in the kernel memory. This leads to another conclusion
2784 -- the <tt>tcp</tt> and <tt>udp</tt> selectors are exactly the same
2785 and this is why you can't use single <tt>match tcp dst 53 0xffff</tt>
2786 selector to match TCP packets sent to given port -- they will also
2787 match UDP packets sent to this port. You must remember to also specify
2788 the protocol and end up with the following rule:
2790 <tscreen><verb>
2791 # tc filter add dev ppp0 parent 1:0 prio 10 u32 \
2792 match tcp dst 53 0xffff \
2793 match ip protocol 0x6 0xff \
2794 flowid 1:2
2795 </verb></tscreen>
2797 <!--
2798 TODO:
2800 describe more options
2802 match
2803 offset
2804 hashkey
2805 classid | flowid
2806 divisor
2807 order
2808 link
2810 sample
2811 police
2815 <sect1>The "route" classifier
2818 This classifier filters based on the results of the routing tables. When a
2819 packet that is traversing through the classes reaches one that is marked
2820 with the "route" filter, it splits the packets up based on information in
2821 the routing table.
2823 <tscreen><verb>
2824 # tc filter add dev eth1 parent 1:0 protocol ip prio 100 route
2825 </verb></tscreen>
2827 Here we add a route classifier onto the parent node 1:0 with priority 100.
2828 When a packet reaches this node (which, since it is the root, will happen
2829 immediately) it will consult the routing table and if one matches will
2830 send it to the given class and give it a priority of 100. Then, to finally
2831 kick it into action, you add the appropriate routing entry:
2833 The trick here is to define 'realm' based on either destination or source.
2834 The way to do it is like this:
2836 <tscreen><verb>
2837 # ip route add Host/Network via Gateway dev Device realm RealmNumber
2838 </verb></tscreen>
2840 For instance, we can define our destination network 192.168.10.0 with a realm
2841 number 10:
2843 <tscreen><verb>
2844 # ip route add 192.168.10.0/24 via 192.168.10.1 dev eth1 realm 10
2845 </verb></tscreen>
2847 When adding route filters, we can use realm numbers to represent the
2848 networks or hosts and specify how the routes match the filters.
2850 <tscreen><verb>
2851 # tc filter add dev eth1 parent 1:0 protocol ip prio 100 \
2852 route to 10 classid 1:10
2853 </verb></tscreen>
2855 The above rule says packets going to the network 192.168.10.0 match class id
2856 1:10.
2858 Route filter can also be used to match source routes. For example, there is
2859 a subnetwork attached to the Linux router on eth2.
2861 <tscreen><verb>
2862 # ip route add 192.168.2.0/24 dev eth2 realm 2
2863 # tc filter add dev eth1 parent 1:0 protocol ip prio 100 \
2864 route from 2 classid 1:2
2865 </verb></tscreen>
2867 Here the filter specifies that packets from the subnetwork 192.168.2.0
2868 (realm 2) will match class id 1:2.
2870 <sect1>The "rsvp" classifier
2871 <p>FIXME: Fill me in
2874 <sect1>The "tcindex" classifier
2875 <p>FIXME: Fill me in
2877 <sect>Kernel network parameters
2879 The kernel has lots of parameters which can be tuned for different
2880 circumstances. While, as usual, the default parameters serve 99% of
2881 installations very well, we don't call this the Advanced HOWTO for the fun
2882 of it!
2884 The interesting bits are in /proc/sys/net, take a look there. Not everything
2885 will be documented here initially, but we're working on it.
2887 (FIXME)
2889 <sect1>Reverse Path Filtering
2891 By default, routers route everything, even packets which 'obviously' don't
2892 belong on your network. A common example is private IP space escaping onto
2893 the internet. If you have an interface with a route of 195.96.96.0/24 to it,
2894 you do not expect packets from 212.64.94.1 to arrive there.
2896 Lots of people will want to turn this feature off, so the kernel hackers
2897 have made it easy. There are files in <file>/proc</file> where you can tell
2898 the kernel to do this for you. The method is called "Reverse Path
2899 Filtering". Basically, if the reply to this packet wouldn't go out the
2900 interface this packet came in, then this is a bogus packet and should be
2901 ignored.
2903 The following fragment will turn this on for all current and future
2904 interfaces.
2906 <tscreen><verb>
2907 # for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do
2908 &gt; echo 2 > $i
2909 &gt; done
2910 </verb></tscreen>
2912 Going by the example above, if a packet arrived on the Linux router on eth1
2913 claiming to come from the Office+ISP subnet, it would be dropped. Similarly,
2914 if a packet came from the Office subnet, claiming to be from somewhere
2915 outside your firewall, it would be dropped also.
2917 The above is full reverse path filtering. The default is to only filter
2918 based on IPs that are on directly connected networks. This is because the
2919 full filtering breaks in the case of asymmetric routing (where packets come
2920 in one way and go out another, like satellite traffic, or if you have
2921 dynamic (bgp, ospf, rip) routes in your network. The data comes down
2922 through the satellite dish and replies go back through normal land-lines).
2924 If this exception applies to you (and you'll probably know if it does) you
2925 can simply turn off the <file>rp_filter</file> on the interface where the
2926 satellite data comes in. If you want to see if any packets are being
2927 dropped, the <file>log_martians</file> file in the same directory will tell
2928 the kernel to log them to your syslog.
2930 <tscreen><verb>
2931 # echo 1 >/proc/sys/net/ipv4/conf/<interfacename>/log_martians
2932 </verb></tscreen>
2934 FIXME: is setting the conf/{default,all}/* files enough? - martijn
2936 <sect1>Obscure settings
2938 Ok, there are a lot of parameters which can be modified. We try to list them
2939 all. Also documented (partly) in <file>Documentation/ip-sysctl.txt</file>.
2941 Some of these settings have different defaults based on whether you
2942 answered 'Yes' to 'Configure as router and not host' while compiling your
2943 kernel.
2945 <sect2>Generic ipv4
2947 As a generic note, most rate limiting features don't work on loopback, so
2948 don't test them locally. The limits are supplied in 'jiffies', and are
2949 enforced using the earlier mentioned token bucket filter.
2951 The kernel has an internal clock which runs at 'HZ' ticks (or 'jiffies') per
2952 second. On intel, 'HZ' is mostly 100. So setting a *_rate file to, say 50,
2953 would allow for 2 packets per second. The token bucket filter is also
2954 configured to allow for a burst of at most 6 packets, if enough tokens have
2955 been earned.
2957 Several entries in the following list have been copied from
2958 /usr/src/linux/Documentation/networking/ip-sysctl.txt, written by Alexey
2959 Kuznetsov &lt;kuznet@ms2.inr.ac.ru&gt; and Andi Kleen &lt;ak@muc.de&gt;
2960 <descrip>
2961 <tag>/proc/sys/net/ipv4/icmp_destunreach_rate</tag>
2962 If the kernel decides that it can't deliver a packet, it will drop it, and
2963 send the source of the packet an ICMP notice to this effect.
2964 <tag>/proc/sys/net/ipv4/icmp_echo_ignore_all</tag>
2965 Don't act on echo packets at all. Please don't set this by default, but if
2966 you are used as a relay in a DoS attack, it may be useful.
2967 <tag>/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts [Useful]</tag>
2968 If you ping the broadcast address of a network, all hosts are supposed to
2969 respond. This makes for a dandy denial-of-service tool. Set this to 1 to
2970 ignore these broadcast messages.
2971 <tag>/proc/sys/net/ipv4/icmp_echoreply_rate</tag>
2972 The rate at which echo replies are sent to any one destination.
2973 <tag>/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses</tag>
2974 Set this to ignore ICMP errors caused by hosts in the network reacting badly
2975 to frames sent to what they perceive to be the broadcast address.
2976 <tag>/proc/sys/net/ipv4/icmp_paramprob_rate</tag>
2977 A relatively unknown ICMP message, which is sent in response to incorrect
2978 packets with broken IP or TCP headers. With this file you can control the
2979 rate at which it is sent.
2980 <tag>/proc/sys/net/ipv4/icmp_timeexceed_rate</tag>
2981 This the famous cause of the 'Solaris middle star' in traceroutes. Limits
2982 number of ICMP Time Exceeded messages sent.
2983 <tag>/proc/sys/net/ipv4/igmp_max_memberships</tag>
2984 Maximum number of listening igmp (multicast) sockets on the host.
2985 FIXME: Is this true?
2986 <tag>/proc/sys/net/ipv4/inet_peer_gc_maxtime</tag>
2987 FIXME: Add a little explanation about the inet peer storage?&nl;
2988 Minimum interval between garbage collection passes. This interval is in
2989 effect under low (or absent) memory pressure on the pool. Measured in
2990 jiffies.
2991 <tag>/proc/sys/net/ipv4/inet_peer_gc_mintime</tag>
2992 Minimum interval between garbage collection passes. This interval is in
2993 effect under high memory pressure on the pool. Measured in jiffies.
2994 <tag>/proc/sys/net/ipv4/inet_peer_maxttl</tag>
2995 Maximum time-to-live of entries. Unused entries will expire after this
2996 period of time if there is no memory pressure on the pool (i.e. when the
2997 number of entries in the pool is very small). Measured in jiffies.
2998 <tag>/proc/sys/net/ipv4/inet_peer_minttl</tag>
2999 Minimum time-to-live of entries. Should be enough to cover fragment
3000 time-to-live on the reassembling side. This minimum time-to-live
3001 is guaranteed if the pool size is less than inet_peer_threshold.
3002 Measured in jiffies.
3003 <tag>/proc/sys/net/ipv4/inet_peer_threshold</tag>
3004 The approximate size of the INET peer storage. Starting from this threshold
3005 entries will be thrown aggressively. This threshold also determines
3006 entries' time-to-live and time intervals between garbage collection passes.
3007 More entries, less time-to-live, less GC interval.
3008 <tag>/proc/sys/net/ipv4/ip_autoconfig</tag>
3009 This file contains the number one if the host received its IP configuration by
3010 RARP, BOOTP, DHCP or a similar mechanism. Otherwise it is zero.
3011 <tag>/proc/sys/net/ipv4/ip_default_ttl</tag>
3012 Time To Live of packets. Set to a safe 64. Raise it if you have a huge
3013 network. Don't do so for fun - routing loops cause much more damage that
3014 way. You might even consider lowering it in some circumstances.
3015 <tag>/proc/sys/net/ipv4/ip_dynaddr</tag>
3016 You need to set this if you use dial-on-demand with a dynamic interface
3017 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
3018 connection that brings up your interface itself does not work, but the
3019 second try does.
3020 <tag>/proc/sys/net/ipv4/ip_forward</tag>
3021 If the kernel should attempt to forward packets. Off by default.
3022 <tag>/proc/sys/net/ipv4/ip_local_port_range</tag>
3023 Range of local ports for outgoing connections. Actually quite small by
3024 default, 1024 to 4999.
3025 <tag>/proc/sys/net/ipv4/ip_no_pmtu_disc</tag>
3026 Set this if you want to disable Path MTU discovery - a technique to
3027 determine the largest Maximum Transfer Unit possible on your path. See also
3028 the section on Path MTU discovery in the cookbook chapter.
3029 <tag>/proc/sys/net/ipv4/ipfrag_high_thresh</tag>
3030 Maximum memory used to reassemble IP fragments. When
3031 ipfrag_high_thresh bytes of memory is allocated for this purpose,
3032 the fragment handler will toss packets until ipfrag_low_thresh
3033 is reached.
3034 <tag>/proc/sys/net/ipv4/ip_nonlocal_bind</tag>
3035 Set this if you want your applications to be able to bind to an address
3036 which doesn't belong to a device on your system. This can be useful when
3037 your machine is on a non-permanent (or even dynamic) link, so your services
3038 are able to start up and bind to a specific address when your link is down.
3039 <tag>/proc/sys/net/ipv4/ipfrag_low_thresh</tag>
3040 Minimum memory used to reassemble IP fragments.
3041 <tag>/proc/sys/net/ipv4/ipfrag_time</tag>
3042 Time in seconds to keep an IP fragment in memory.
3043 <tag>/proc/sys/net/ipv4/tcp_abort_on_overflow</tag>
3044 A boolean flag controlling the behaviour under lots of incoming connections.
3045 When enabled, this causes the kernel to actively send RST packets when a
3046 service is overloaded.
3047 <tag>/proc/sys/net/ipv4/tcp_fin_timeout</tag>
3048 Time to hold socket in state FIN-WAIT-2, if it was closed by our side. Peer
3049 can be broken and never close its side, or even died unexpectedly. Default
3050 value is 60sec. Usual value used in 2.2 was 180 seconds, you may restore it,
3051 but remember that if your machine is even underloaded WEB server, you risk
3052 to overflow memory with kilotons of dead sockets, FIN-WAIT-2 sockets are
3053 less dangerous than FIN-WAIT-1, because they eat maximum 1.5K of memory, but
3054 they tend to live longer. Cf. tcp_max_orphans.
3055 <tag>/proc/sys/net/ipv4/tcp_keepalive_time</tag>
3056 How often TCP sends out keepalive messages when keepalive is enabled. &nl;
3057 Default: 2hours.
3058 <tag>/proc/sys/net/ipv4/tcp_keepalive_intvl</tag>
3059 How frequent probes are retransmitted, when a probe isn't acknowledged. &nl;
3060 Default: 75 seconds.
3061 <tag>/proc/sys/net/ipv4/tcp_keepalive_probes</tag>
3062 How many keepalive probes TCP will send, until it decides that the
3063 connection is broken. &nl;
3064 Default value: 9. &nl;
3065 Multiplied with tcp_keepalive_intvl, this gives the time a link can be
3066 nonresponsive after a keepalive has been sent.
3067 <tag>/proc/sys/net/ipv4/tcp_max_orphans</tag>
3068 Maximal number of TCP sockets not attached to any user file handle, held by
3069 system. If this number is exceeded orphaned connections are reset
3070 immediately and warning is printed. This limit exists only to prevent simple
3071 DoS attacks, you _must_ not rely on this or lower the limit artificially,
3072 but rather increase it (probably, after increasing installed memory), if
3073 network conditions require more than default value, and tune network
3074 services to linger and kill such states more aggressively. Let me remind you
3075 again: each orphan eats up to ~64K of unswappable memory.
3076 <tag>/proc/sys/net/ipv4/tcp_orphan_retries</tag>
3077 How may times to retry before killing TCP connection, closed by our side.
3078 Default value 7 corresponds to ~50sec-16min depending on RTO. If your machine
3079 is a loaded WEB server, you should think about lowering this value, such
3080 sockets may consume significant resources. Cf. tcp_max_orphans.
3081 <tag>/proc/sys/net/ipv4/tcp_max_syn_backlog</tag>
3082 Maximal number of remembered connection requests, which still did not
3083 receive an acknowledgement from connecting client. Default value is 1024 for
3084 systems with more than 128Mb of memory, and 128 for low memory machines. If
3085 server suffers of overload, try to increase this number. Warning! If you
3086 make it greater than 1024, it would be better to change TCP_SYNQ_HSIZE in
3087 include/net/tcp.h to keep TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog and to
3088 recompile kernel.
3089 <tag>/proc/sys/net/ipv4/tcp_max_tw_buckets</tag>
3090 Maximal number of timewait sockets held by system simultaneously. If this
3091 number is exceeded time-wait socket is immediately destroyed and warning is
3092 printed. This limit exists only to prevent simple DoS attacks, you _must_
3093 not lower the limit artificially, but rather increase it (probably, after
3094 increasing installed memory), if network conditions require more than
3095 default value.
3096 <tag>/proc/sys/net/ipv4/tcp_retrans_collapse</tag>
3097 Bug-to-bug compatibility with some broken printers.
3098 On retransmit try to send bigger packets to work around bugs in
3099 certain TCP stacks.
3100 <tag>/proc/sys/net/ipv4/tcp_retries1</tag>
3101 How many times to retry before deciding that something is wrong
3102 and it is necessary to report this suspection to network layer.
3103 Minimal RFC value is 3, it is default, which corresponds
3104 to ~3sec-8min depending on RTO.
3105 <tag>/proc/sys/net/ipv4/tcp_retries2</tag>
3106 How may times to retry before killing alive TCP connection.
3107 RFC1122 says that the limit should be longer than 100 sec.
3108 It is too small number. Default value 15 corresponds to ~13-30min
3109 depending on RTO.
3110 <tag>/proc/sys/net/ipv4/tcp_rfc1337</tag>
3111 This boolean enables a fix for 'time-wait assassination hazards in tcp', described
3112 in RFC 1337. If enabled, this causes the kernel to drop RST packets for
3113 sockets in the time-wait state.&nl;
3114 Default: 0
3115 <tag>/proc/sys/net/ipv4/tcp_sack</tag>
3116 Use Selective ACK which can be used to signify that specific packets are
3117 missing - therefore helping fast recovery.
3118 <tag>/proc/sys/net/ipv4/tcp_stdurg</tag>
3119 Use the Host requirements interpretation of the TCP urg pointer
3120 field. &nl;
3121 Most hosts use the older BSD interpretation, so if you turn this on
3122 Linux might not communicate correctly with them. &nl;
3123 Default: FALSE
3124 <tag>/proc/sys/net/ipv4/tcp_syn_retries</tag>
3125 Number of SYN packets the kernel will send before giving up on the new
3126 connection.
3127 <tag>/proc/sys/net/ipv4/tcp_synack_retries</tag>
3128 To open the other side of the connection, the kernel sends a SYN with a
3129 piggybacked ACK on it, to acknowledge the earlier received SYN. This is part
3130 2 of the threeway handshake. This setting determines the number of SYN+ACK
3131 packets sent before the kernel gives up on the connection.
3132 <tag>/proc/sys/net/ipv4/tcp_timestamps</tag>
3133 Timestamps are used, amongst other things, to protect against wrapping
3134 sequence numbers. A 1 gigabit link might conceivably re-encounter a previous
3135 sequence number with an out-of-line value, because it was of a previous
3136 generation. The timestamp will let it recognise this 'ancient packet'.
3137 <tag>/proc/sys/net/ipv4/tcp_tw_recycle</tag>
3138 Enable fast recycling TIME-WAIT sockets. Default value is 1.
3139 It should not be changed without advice/request of technical experts.
3141 <tag>/proc/sys/net/ipv4/tcp_window_scaling</tag>
3142 TCP/IP normally allows windows up to 65535 bytes big. For really fast
3143 networks, this may not be enough. The window scaling options allows for
3144 almost gigabyte windows, which is good for high bandwidth*delay products.
3146 </descrip>
3147 <sect2>Per device settings
3149 DEV can either stand for a real interface, or for 'all' or 'default'.
3150 Default also changes settings for interfaces yet to be created.
3151 <descrip>
3152 <tag>/proc/sys/net/ipv4/conf/DEV/accept_redirects</tag>
3153 If a router decides that you are using it for a wrong purpose (ie, it needs
3154 to resend your packet on the same interface), it will send us a ICMP
3155 Redirect. This is a slight security risk however, so you may want to turn it
3156 off, or use secure redirects.
3157 <tag>/proc/sys/net/ipv4/conf/DEV/accept_source_route</tag>
3158 Not used very much anymore. You used to be able to give a packet a list of
3159 IP addresses it should visit on its way. Linux can be made to honor this IP
3160 option.
3161 <tag>/proc/sys/net/ipv4/conf/DEV/bootp_relay</tag>
3162 FIXME: fill this in
3163 <tag>/proc/sys/net/ipv4/conf/DEV/forwarding</tag>
3164 FIXME:
3165 <tag>/proc/sys/net/ipv4/conf/DEV/log_martians</tag>
3166 See the section on reverse path filters.
3167 <tag>/proc/sys/net/ipv4/conf/DEV/mc_forwarding</tag>
3168 If we do multicast forwarding on this interface
3169 <tag>/proc/sys/net/ipv4/conf/DEV/proxy_arp</tag>
3170 If you set this to 1, all other interfaces will respond to arp queries
3171 destined for addresses on this interface. Can be very useful when building 'ip
3172 pseudo bridges'. Do take care that your netmasks are very correct before
3173 enabling this!
3174 <tag>/proc/sys/net/ipv4/conf/DEV/rp_filter</tag>
3175 See the section on reverse path filters.
3176 <tag>/proc/sys/net/ipv4/conf/DEV/secure_redirects</tag>
3177 FIXME: fill this in
3178 <tag>/proc/sys/net/ipv4/conf/DEV/send_redirects</tag>
3179 If we send the above mentioned redirects.
3180 <tag>/proc/sys/net/ipv4/conf/DEV/shared_media</tag>
3181 FIXME: fill this in
3182 <tag>/proc/sys/net/ipv4/conf/DEV/tag</tag>
3183 FIXME: fill this in
3185 </descrip>
3187 <sect2> Neighbor policy
3189 Dev can either stand for a real interface, or for 'all' or 'default'.
3190 Default also changes settings for interfaces yet to be created.
3191 <descrip>
3192 <tag>/proc/sys/net/ipv4/neigh/DEV/anycast_delay</tag>
3193 FIXME: fill this in
3194 <tag>/proc/sys/net/ipv4/neigh/DEV/app_solicit</tag>
3195 FIXME: fill this in
3196 <tag>/proc/sys/net/ipv4/neigh/DEV/base_reachable_time</tag>
3197 FIXME: fill this in
3198 <tag>/proc/sys/net/ipv4/neigh/DEV/delay_first_probe_time</tag>
3199 FIXME: fill this in
3200 <tag>/proc/sys/net/ipv4/neigh/DEV/gc_stale_time</tag>
3201 FIXME: fill this in
3202 <tag>/proc/sys/net/ipv4/neigh/DEV/locktime</tag>
3203 FIXME: fill this in
3204 <tag>/proc/sys/net/ipv4/neigh/DEV/mcast_solicit</tag>
3205 FIXME: fill this in
3206 <tag>/proc/sys/net/ipv4/neigh/DEV/proxy_delay</tag>
3207 FIXME: fill this in
3208 <tag>/proc/sys/net/ipv4/neigh/DEV/proxy_qlen</tag>
3209 FIXME: fill this in
3210 <tag>/proc/sys/net/ipv4/neigh/DEV/retrans_time</tag>
3211 FIXME: fill this in
3212 <tag>/proc/sys/net/ipv4/neigh/DEV/ucast_solicit</tag>
3213 FIXME: fill this in
3214 <tag>/proc/sys/net/ipv4/neigh/DEV/unres_qlen</tag>
3215 FIXME: fill this in
3217 </descrip>
3219 <sect2>Routing settings
3221 <descrip>
3222 <tag>/proc/sys/net/ipv4/route/error_burst</tag>
3223 FIXME: fill this in
3224 <tag>/proc/sys/net/ipv4/route/error_cost</tag>
3225 FIXME: fill this in
3226 <tag>/proc/sys/net/ipv4/route/flush</tag>
3227 FIXME: fill this in
3228 <tag>/proc/sys/net/ipv4/route/gc_elasticity</tag>
3229 FIXME: fill this in
3230 <tag>/proc/sys/net/ipv4/route/gc_interval</tag>
3231 FIXME: fill this in
3232 <tag>/proc/sys/net/ipv4/route/gc_min_interval</tag>
3233 FIXME: fill this in
3234 <tag>/proc/sys/net/ipv4/route/gc_thresh</tag>
3235 FIXME: fill this in
3236 <tag>/proc/sys/net/ipv4/route/gc_timeout</tag>
3237 FIXME: fill this in
3238 <tag>/proc/sys/net/ipv4/route/max_delay</tag>
3239 FIXME: fill this in
3240 <tag>/proc/sys/net/ipv4/route/max_size</tag>
3241 FIXME: fill this in
3242 <tag>/proc/sys/net/ipv4/route/min_adv_mss</tag>
3243 FIXME: fill this in
3244 <tag>/proc/sys/net/ipv4/route/min_delay</tag>
3245 FIXME: fill this in
3246 <tag>/proc/sys/net/ipv4/route/min_pmtu</tag>
3247 FIXME: fill this in
3248 <tag>/proc/sys/net/ipv4/route/mtu_expires</tag>
3249 FIXME: fill this in
3250 <tag>/proc/sys/net/ipv4/route/redirect_load</tag>
3251 FIXME: fill this in
3252 <tag>/proc/sys/net/ipv4/route/redirect_number</tag>
3253 FIXME: fill this in
3254 <tag>/proc/sys/net/ipv4/route/redirect_silence</tag>
3255 FIXME: fill this in
3256 </descrip>
3259 <sect>Advanced &amp; less common queueing disciplines
3261 Besides the queues mentioned earlier, the kernel contains some other more
3262 specialized queues which are mentioned here, should you find that you have
3263 needs not addressed by the other queues.
3264 <sect1>Random Early Drop
3266 This section is meant as an introduction to backbone routing, which often
3267 involves >100 megabit bandwidths, which requires a different approach than
3268 your ADSL modem at home.
3270 <sect2>Router queues
3272 The normal behaviour of router queues on the Internet is called tail-drop.
3273 Tail-drop works by queueing up to a certain amount, then dropping all traffic
3274 that 'spills over'. This is very unfair, and also leads to retransmit
3275 synchronisation. When retransmit synchronisation occurs, the sudden burst
3276 of drops from a router that has reached its fill will cause a delayed burst
3277 of retransmits, which will over fill the congested router again.
3279 In order to cope with transient congestion on links, backbone routers will
3280 often implement large queues. Unfortunately, while these queues are good for
3281 throughput, they can substantially increase latency and cause TCP
3282 connections to behave very bursty during congestion.
3284 These issues with tail-drop are becoming increasingly troublesome on the
3285 Internet because the use of network unfriendly applications is increasing.
3286 The Linux kernel offers us RED, short for Random Early Detect.
3288 RED isn't a cure-all for this, applications which inappropriately fail to
3289 implement exponential backoff still get an unfair share of the bandwidth,
3290 however, with RED they do not cause as much harm to the throughput and
3291 latency of other connections.
3293 RED statistically drops packets from flows before it reaches its hard
3294 limit. This causes a congested backbone link to slow more gracefully, and
3295 prevents retransmit synchronisation. This also helps TCP find its 'fair'
3296 speed faster by allowing some packets to get dropped sooner keeping queue
3297 sizes low and latency under control. The probability of a packet being
3298 dropped from a particular connection is proportional to its bandwidth usage
3299 rather than the number of packets it transmits.
3301 RED is a good queue for backbones, where you can't afford the
3302 complexity of per-session state tracking needed by fairness queueing.
3304 In order to use RED, you must decide on three parameters: Min, Max, and
3305 burst. Min sets the minimum queue size in bytes before dropping will begin,
3306 Max is a soft maximum that the algorithm will attempt to stay under, and
3307 burst sets the maximum number of packets that can 'burst through'.
3309 You should set the min by calculating that highest acceptable base queueing
3310 latency you wish, and multiply it by your bandwidth. For instance, on my
3311 64kbit/s ISDN link, I might want a base queueing latency of 200ms so I set
3312 min to 1600 bytes. Setting min too small will degrade throughput and too
3313 large will degrade latency. Setting a small min is not a replacement for
3314 reducing the MTU on a slow link to improve interactive response.
3316 You should make max at least twice min to prevent synchronisation. On slow
3317 links with small min's it might be wise to make max perhaps four or
3318 more times large then min.
3320 Burst controls how the RED algorithm responds to bursts. Burst must be set
3321 larger then min/avpkt. Experimentally, I've found (min+min+max)/(3*avpkt) to
3322 work okay.
3324 Additionally, you need to set limit and avpkt. Limit is a safety value, after
3325 there are limit bytes in the queue, RED 'turns into' tail-drop. I typical set
3326 limit to eight times max. Avpkt should be your average packet size. 1000
3327 works okay on high speed Internet links with a 1500byte MTU.
3329 Read <url url="http://www.aciri.org/floyd/papers/red/red.html"
3330 name="the paper on RED queueing"> by Sally Floyd and Van Jacobson for technical
3331 information.
3333 FIXME: more needed. This means *you* greg :-) - ahu
3336 <sect>Cookbook
3338 This section contains 'cookbook' entries which may help you solve problems.
3339 A cookbook is no replacement for understanding however, so try and comprehend
3340 what is going on.
3341 <!--
3342 <sect1>Reserving bandwidth for your IRC server
3344 Recently the IRC networks have been plagued by distributed denial of service
3345 attacks. The aim of some of these attacks is to disrupt communication
3346 between servers which split the network. You then join the splitted part
3347 of the network. Because nobody else is there, the server assigns you
3348 operator status. You then stop the disruption, the network rejoins and
3349 voila, you can take over the channel.
3351 This silly behaviour is seriously damaging IRC, and luckily, Linux is there
3352 to protect it :-)
3354 We need to be smarter than your average scriptkid, so we'll use some
3355 advanced netfilter features to help us.
3358 <sect1>Running multiple sites with different SLAs
3360 You can do this in several ways. Apache has some support for this with a
3361 module, but we'll show how Linux can do this for you, and do so for other
3362 services as well. These commands are stolen from a presentation by Jamal
3363 Hadi that's referenced below.
3365 Let's say we have two customers, with http, ftp and streaming audio, and we
3366 want to sell them a limited amount of bandwidth. We do so on the server itself.
3368 Customer A should have at most 2 megabits, customer B has paid for 5
3369 megabits. We separate our customers by creating virtual IP addresses on our
3370 server.
3372 <tscreen><verb>
3373 # ip address add 188.177.166.1 dev eth0
3374 # ip address add 188.177.166.2 dev eth0
3375 </verb></tscreen>
3377 It is up to you to attach the different servers to the right IP address. All
3378 popular daemons have support for this.
3380 We first attach a CBQ qdisc to eth0:
3381 <tscreen><verb>
3382 # tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit cell 8 avpkt 1000 \
3383 mpu 64
3384 </verb></tscreen>
3386 We then create classes for our customers:
3388 <tscreen><verb>
3389 # tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate \
3390 2MBit avpkt 1000 prio 5 bounded isolated allot 1514 weight 1 maxburst 21
3391 # tc class add dev eth0 parent 1:0 classid 1:2 cbq bandwidth 10Mbit rate \
3392 5Mbit avpkt 1000 prio 5 bounded isolated allot 1514 weight 1 maxburst 21
3393 </verb></tscreen>
3395 Then we add filters for our two classes:
3396 <tscreen><verb>
3397 ##FIXME: Why this line, what does it do?, what is a divisor?:
3398 ##FIXME: A divisor has something to do with a hash table, and the number of
3399 ## buckets - ahu
3400 # tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 1: u32 divisor 1
3401 # tc filter add dev eth0 parent 1:0 prio 5 u32 match ip src 188.177.166.1
3402 flowid 1:1
3403 # tc filter add dev eth0 parent 1:0 prio 5 u32 match ip src 188.177.166.2
3404 flowid 1:2
3405 </verb></tscreen>
3407 And we're done.
3409 FIXME: why no token bucket filter? is there a default pfifo_fast fallback
3410 somewhere?
3412 <sect1>Protecting your host from SYN floods
3413 <p>From Alexey's iproute documentation, adapted to netfilter and with more
3414 plausible paths. If you use this, take care to adjust the numbers to
3415 reasonable values for your system.
3417 If you want to protect an entire network, skip this script, which is best
3418 suited for a single host.
3420 It appears that you need the very latest version of the iproute2 tools to
3421 get this to work with 2.4.0.
3423 <tscreen><verb>
3424 #! /bin/sh -x
3426 # sample script on using the ingress capabilities
3427 # this script shows how one can rate limit incoming SYNs
3428 # Useful for TCP-SYN attack protection. You can use
3429 # IPchains to have more powerful additions to the SYN (eg
3430 # in addition the subnet)
3432 #path to various utilities;
3433 #change to reflect yours.
3435 TC=/sbin/tc
3436 IP=/sbin/ip
3437 IPTABLES=/sbin/iptables
3438 INDEV=eth2
3440 # tag all incoming SYN packets through $INDEV as mark value 1
3441 ############################################################
3442 $iptables -A PREROUTING -i $INDEV -t mangle -p tcp --syn \
3443 -j MARK --set-mark 1
3444 ############################################################
3446 # install the ingress qdisc on the ingress interface
3447 ############################################################
3448 $TC qdisc add dev $INDEV handle ffff: ingress
3449 ############################################################
3453 # SYN packets are 40 bytes (320 bits) so three SYNs equals
3454 # 960 bits (approximately 1kbit); so we rate limit below
3455 # the incoming SYNs to 3/sec (not very useful really; but
3456 #serves to show the point - JHS
3457 ############################################################
3458 $TC filter add dev $INDEV parent ffff: protocol ip prio 50 handle 1 fw \
3459 police rate 1kbit burst 40 mtu 9k drop flowid :1
3460 ############################################################
3464 echo "---- qdisc parameters Ingress ----------"
3465 $TC qdisc ls dev $INDEV
3466 echo "---- Class parameters Ingress ----------"
3467 $TC class ls dev $INDEV
3468 echo "---- filter parameters Ingress ----------"
3469 $TC filter ls dev $INDEV parent ffff:
3471 #deleting the ingress qdisc
3472 #$TC qdisc del $INDEV ingress
3473 </verb></tscreen>
3474 <sect1>Ratelimit ICMP to prevent dDoS
3476 Recently, distributed denial of service attacks have become a major nuisance
3477 on the internet. By properly filtering and ratelimiting your network, you can
3478 both prevent becoming a casualty or the cause of these attacks.
3480 You should filter your networks so that you do not allow non-local IP source
3481 addressed packets to leave your network. This stops people from anonymously
3482 sending junk to the internet.
3484 <!-- FIXME: netfilter one liner. Is there a netfilter one-liner? Martijn -->
3487 Rate limiting goes much as shown earlier. To refresh your memory, our
3488 ASCIIgram again:
3490 <tscreen><verb>
3491 [The Internet] ---<E3, T3, whatever>--- [Linux router] --- [Office+ISP]
3492 eth1 eth0
3493 </verb></tscreen>
3495 We first set up the prerequisite parts:
3497 <tscreen><verb>
3498 # tc qdisc add dev eth0 root handle 10: cbq bandwidth 10Mbit avpkt 1000
3499 # tc class add dev eth0 parent 10:0 classid 10:1 cbq bandwidth 10Mbit rate \
3500 10Mbit allot 1514 prio 5 maxburst 20 avpkt 1000
3501 </verb></tscreen>
3503 If you have 100Mbit, or more, interfaces, adjust these numbers. Now you need
3504 to determine how much ICMP traffic you want to allow. You can perform
3505 measurements with tcpdump, by having it write to a file for a while, and
3506 seeing how much ICMP passes your network. Do not forget to raise the
3507 snapshot length!
3509 If measurement is impractical, you might want to choose 5% of your available
3510 bandwidth. Let's set up our class:
3511 <tscreen><verb>
3512 # tc class add dev eth0 parent 10:1 classid 10:100 cbq bandwidth 10Mbit rate \
3513 100Kbit allot 1514 weight 800Kbit prio 5 maxburst 20 avpkt 250 \
3514 bounded
3515 </verb></tscreen>
3517 This limits at 100Kbit. Now we need a filter to assign ICMP traffic to this
3518 class:
3519 <tscreen><verb>
3520 # tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip
3521 protocol 1 0xFF flowid 10:100
3523 </verb></tscreen>
3525 <sect1>Prioritizing interactive traffic
3527 If lots of data is coming down your link, or going up for that matter, and
3528 you are trying to do some maintenance via telnet or ssh, this may not go too
3529 well. Other packets are blocking your keystrokes. Wouldn't it be great if
3530 there were a way for your interactive packets to sneak past the bulk
3531 traffic? Linux can do this for you!
3533 As before, we need to handle traffic going both ways. Evidently, this works
3534 best if there are Linux boxes on both ends of your link, although other
3535 UNIX's are able to do this. Consult your local Solaris/BSD guru for this.
3537 The standard pfifo_fast scheduler has 3 different 'bands'. Traffic in band 0
3538 is transmitted first, after which traffic in band 1 and 2 gets considered.
3539 It is vital that our interactive traffic be in band 0!
3541 We blatantly adapt from the (soon to be obsolete) ipchains HOWTO:
3543 There are four seldom-used bits in the IP header, called the Type of Service
3544 (TOS) bits. They effect the way packets are treated; the four bits are
3545 "Minimum Delay", "Maximum Throughput", "Maximum Reliability" and "Minimum
3546 Cost". Only one of these bits is allowed to be set. Rob van Nieuwkerk, the
3547 author of the ipchains TOS-mangling code, puts it as follows:
3549 <tscreen>
3550 Especially the "Minimum Delay" is important for me. I switch it on for
3551 "interactive" packets in my upstream (Linux) router. I'm
3552 behind a 33k6 modem link. Linux prioritizes packets in 3 queues. This
3553 way I get acceptable interactive performance while doing bulk
3554 downloads at the same time.
3555 </tscreen>
3557 The most common use is to set telnet & ftp control connections to "Minimum
3558 Delay" and FTP data to "Maximum Throughput". This would be
3559 done as follows, on your upstream router:
3561 <tscreen><verb>
3562 # iptables -A PREROUTING -t mangle -p tcp --sport telnet \
3563 -j TOS --set-tos Minimize-Delay
3564 # iptables -A PREROUTING -t mangle -p tcp --sport ftp \
3565 -j TOS --set-tos Minimize-Delay
3566 # iptables -A PREROUTING -t mangle -p tcp --sport ftp-data \
3567 -j TOS --set-tos Maximize-Throughput
3568 </verb></tscreen>
3570 Now, this only works for data going from your telnet foreign host to your
3571 local computer. The other way around appears to be done for you, ie, telnet,
3572 ssh & friends all set the TOS field on outgoing packets automatically.
3574 Should you have a client that does not do this, you can always do it with
3575 netfilter. On your local box:
3577 <tscreen><verb>
3578 # iptables -A OUTPUT -t mangle -p tcp --dport telnet \
3579 -j TOS --set-tos Minimize-Delay
3580 # iptables -A OUTPUT -t mangle -p tcp --dport ftp \
3581 -j TOS --set-tos Minimize-Delay
3582 # iptables -A OUTPUT -t mangle -p tcp --dport ftp-data \
3583 -j TOS --set-tos Maximize-Throughput
3584 </verb></tscreen>
3586 <sect1>Transparent web-caching using netfilter, iproute2, ipchains and squid
3588 <label id="SQUID">
3589 This section was sent in by reader Ram Narula from Internet for Education
3590 (Thailand).
3592 The regular technique in accomplishing this in Linux
3593 is probably with use of ipchains AFTER making sure
3594 that the "outgoing" port 80(web) traffic gets routed through
3595 the server running squid.
3597 There are 3 common methods to make sure "outgoing"
3598 port 80 traffic gets routed to the server running squid
3599 and 4th one is being introduced here.
3601 <descrip>
3602 <tag>Making the gateway router do it.</tag>
3603 If you can tell your gateway router to
3604 match packets that has outgoing destination port
3605 of 80 to be sent to the IP address of squid server.
3609 This would put additional load on the router and
3610 some commercial routers might not even support this.
3611 <tag>Using a Layer 4 switch.</tag>
3612 Layer 4 switches can handle this without any problem.
3616 The cost for this equipment is usually very high. Typical
3617 layer 4 switch would normally cost more than
3618 a typical router+good linux server.
3619 <tag>Using cache server as network's gateway.</tag>
3620 You can force ALL traffic through cache server.
3624 This is quite risky because Squid does
3625 utilize lots of cpu power which might
3626 result in slower over-all network performance
3627 or the server itself might crash and no one on the
3628 network will be able to access the internet if
3629 that occurs.
3632 <tag>Linux+NetFilter router.</tag>
3633 By using NetFilter another technique can be implemented
3634 which is using NetFilter for "mark"ing the packets
3635 with destination port 80 and using iproute2 to
3636 route the "mark"ed packets to the Squid server.
3637 </descrip>
3638 <tscreen><verb>
3639 |----------------|
3640 | Implementation |
3641 |----------------|
3643 Addresses used
3644 10.0.0.1 naret (NetFilter server)
3645 10.0.0.2 silom (Squid server)
3646 10.0.0.3 donmuang (Router connected to the internet)
3647 10.0.0.4 kaosarn (other server on network)
3648 10.0.0.5 RAS
3649 10.0.0.0/24 main network
3650 10.0.0.0/19 total network
3652 |---------------|
3653 |Network diagram|
3654 |---------------|
3656 Internet
3658 donmuang
3660 ------------hub/switch----------
3661 | | | |
3662 naret silom kaosarn RAS etc.
3663 </verb></tscreen>
3664 First, make all traffic pass through naret by making
3665 sure it is the default gateway except for silom.
3666 Silom's default gateway has to be donmuang (10.0.0.3) or
3667 this would create web traffic loop.
3671 (all servers on my network had 10.0.0.1 as the default gateway
3672 which was the former IP address of donmuang router so what I did
3673 was changed the IP address of donmuang to 10.0.0.3 and gave
3674 naret ip address of 10.0.0.1)
3676 <tscreen><verb>
3677 Silom
3678 -----
3679 -setup squid and ipchains
3680 </verb></tscreen>
3683 Setup Squid server on silom, make sure it does support
3684 transparent caching/proxying, the default port is usually
3685 3128, so all traffic for port 80 has to be redirected to port
3686 3128 locally. This can be done by using ipchains with the following:
3688 <tscreen><verb>
3689 silom# ipchains -N allow1
3690 silom# ipchains -A allow1 -p TCP -s 10.0.0.0/19 -d 0/0 80 -j REDIRECT 3128
3691 silom# ipchains -I input -j allow1
3692 </verb></tscreen>
3694 <p>
3696 Or, in netfilter lingo:
3697 <tscreen><verb>
3698 silom# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
3699 </verb></tscreen>
3701 (note: you might have other entries as well)
3704 For more information on setting Squid server please refer
3705 to Squid faq page on <url
3706 url="http://squid.nlanr.net" name="http://squid.nlanr.net">).
3710 Make sure ip forwarding is enabled on this server and the default
3711 gateway for this server is donmuang router (NOT naret).
3715 <tscreen><verb>
3716 Naret
3717 -----
3718 -setup iptables and iproute2
3719 -disable icmp REDIRECT messages (if needed)
3720 </verb></tscreen>
3722 <enum>
3723 <item>"Mark" packets of destination port 80 with value 2
3724 <tscreen><verb>
3725 naret# iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 \
3726 -j MARK --set-mark 2
3727 </verb></tscreen>
3728 </item>
3729 <item>Setup iproute2 so it will route packets with "mark" 2 to silom
3730 <tscreen><verb>
3731 naret# echo 202 www.out >> /etc/iproute2/rt_tables
3732 naret# ip rule add fwmark 2 table www.out
3733 naret# ip route add default via 10.0.0.2 dev eth0 table www.out
3734 naret# ip route flush cache
3736 </verb></tscreen>
3738 If donmuang and naret is on the same subnet then
3739 naret should not send out icmp REDIRECT messages.
3740 In this case it is, so icmp REDIRECTs has to be
3741 disabled by:
3742 <tscreen><verb>
3743 naret# echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
3744 naret# echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
3745 naret# echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
3747 </verb></tscreen>
3748 </item>
3749 </enum>
3751 The setup is complete, check the configuration
3753 <tscreen><verb>
3754 On naret:
3756 naret# iptables -t mangle -L
3757 Chain PREROUTING (policy ACCEPT)
3758 target prot opt source destination
3759 MARK tcp -- anywhere anywhere tcp dpt:www MARK set 0x2
3761 Chain OUTPUT (policy ACCEPT)
3762 target prot opt source destination
3764 naret# ip rule ls
3765 0: from all lookup local
3766 32765: from all fwmark 2 lookup www.out
3767 32766: from all lookup main
3768 32767: from all lookup default
3770 naret# ip route list table www.out
3771 default via 203.114.224.8 dev eth0
3773 naret# ip route
3774 10.0.0.1 dev eth0 scope link
3775 10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.1
3776 127.0.0.0/8 dev lo scope link
3777 default via 10.0.0.3 dev eth0
3779 (make sure silom belongs to one of the above lines, in this case
3780 it's the line with 10.0.0.0/24)
3782 |------|
3783 |-DONE-|
3784 |------|
3787 </verb></tscreen>
3788 <sect2>Traffic flow diagram after implementation
3790 <tscreen><verb>
3792 |-----------------------------------------|
3793 |Traffic flow diagram after implementation|
3794 |-----------------------------------------|
3796 INTERNET
3800 -----------------donmuang router---------------------
3801 /\ /\ ||
3802 || || ||
3803 || \/ ||
3804 naret silom ||
3805 *destination port 80 traffic=========>(cache) ||
3806 /\ || ||
3807 || \/ \/
3808 \\===================================kaosarn, RAS, etc.
3810 </verb></tscreen>
3812 Note that the network is asymmetric as there is one extra hop on
3813 general outgoing path.
3815 <tscreen><verb>
3816 Here is run down for packet traversing the network from kaosarn
3817 to and from the internet.
3819 For web/http traffic:
3820 kaosarn http request->naret->silom->donmuang->internet
3821 http replies from internet->donmuang->silom->kaosarn
3823 For non-web/http requests(eg. telnet):
3824 kaosarn outgoing data->naret->donmuang->internet
3825 incoming data from internet->donmuang->kaosarn
3826 </verb></tscreen>
3828 <sect1>Circumventing Path MTU Discovery issues with per route MTU settings
3830 For sending bulk data, the internet generally works better when using larger
3831 packets. Each packet implies a routing decision, when sending a 1 megabyte
3832 file, this can either mean around 700 packets when using packets that are as
3833 large as possible, or 4000 if using the smallest default.
3835 However, not all parts of the internet support full 1460 bytes of payload
3836 per packet. It is therefore necessary to try and find the largest packet
3837 that will 'fit', in order to optimize a connection.
3839 This process is called 'Path MTU Discovery', where MTU stands for 'Maximum
3840 Transfer Unit.'
3842 When a router encounters a packet that's too big too send in one piece, AND
3843 it has been flagged with the "Don't Fragment" bit, it returns an ICMP
3844 message stating that it was forced to drop a packet because of this. The
3845 sending host acts on this hint by sending smaller packets, and by iterating
3846 it can find the optimum packet size for a connection over a certain path.
3848 This used to work well until the internet was discovered by hooligans who do
3849 their best to disrupt communications. This in turn lead administrators to
3850 either block or shape ICMP traffic in a misguided attempt to improve
3851 security or robustness of their internet service.
3853 What has happened now is that Path MTU Discovery is working less and less
3854 well and fails for certain routes, which leads to strange TCP/IP sessions
3855 which die after a while.
3857 Although I have no proof for this, two sites who I used to have this problem
3858 with both run Alteon Acedirectors before the affected systems - perhaps
3859 somebody more knowledgeable can provide clues as to why this happens.
3861 <sect2>Solution
3863 When you encounter sites that suffer from this problem, you can disable Path
3864 MTU discovery by setting it manually. Koos van den Hout, slightly edited,
3865 writes:
3867 <tscreen>
3869 The following problem: I set the mtu/mru of my leased line running ppp to
3870 296 because it's only 33k6 and I cannot influence the queueing on the
3871 other side. At 296, the response to a keypress is within a reasonable
3872 timeframe.
3874 And, on my side I have a masqrouter running (of course) Linux.
3876 Recently I split 'server' and 'router' so most applications are run on a
3877 different machine than the routing happens on.
3879 I then had trouble logging into irc. Big panic! Some digging did find
3880 out that I got connected to irc, even showed up as 'connected' on irc
3881 but I did not receive the motd from irc. I checked what could be wrong
3882 and noted that I already had some previous trouble reaching certain
3883 websites related to the MTU, since I had no trouble reaching them when
3884 the MTU was 1500, the problem just showed when the MTU was set to 296.
3885 Since irc servers block about every kind of traffic not needed for their
3886 immediate operation, they also block icmp.
3888 I managed to convince the operators of a webserver that this was the cause
3889 of a problem, but the irc server operators were not going to fix this.
3891 So, I had to make sure outgoing masqueraded traffic started with the lower
3892 mtu of the outside link. But I want local ethernet traffic to have the
3893 normal mtu (for things like nfs traffic).
3895 Solution:
3896 <tscreen><verb>
3897 ip route add default via 10.0.0.1 mtu 296
3898 </verb></tscreen>
3900 (10.0.0.1 being the default gateway, the inside address of the
3901 masquerading router)
3902 </tscreen>
3904 In general, it is possible to override PMTU Discovery by setting specific
3905 routes. For example, if only a certain subnet is giving problems, this
3906 should help:
3908 <tscreen><verb>
3909 ip route add 195.96.96.0/24 via 10.0.0.1 mtu 1000
3910 </verb></tscreen>
3911 <sect1>Circumventing Path MTU Discovery issues with MSS Clamping (for ADSL,
3912 cable, PPPoE &amp; PPtP users)
3914 As explained above, Path MTU Discovery doesn't work as well as it should
3915 anymore. If you know for a fact that a hop somewhere in your network has a
3916 limited (&lt;1500) MTU, you cannot rely on PMTU Discovery finding this out.
3918 Besides MTU, there is yet another way to set the maximum packet size, the so
3919 called Maximum Segment Size. This is a field in the TCP Options part of a
3920 SYN packet.
3922 Recent Linux kernels, and a few pppoe drivers (notably, the excellent
3923 Roaring Penguin one), feature the possibility to 'clamp the MSS'.
3925 The good thing about this is that by setting the MSS value, you are telling
3926 the remote side unequivocally 'do not ever try to send me packets bigger
3927 than this value'. No ICMP traffic is needed to get this to work.
3929 The bad thing is that it's an obvious hack - it breaks 'end to end' by
3930 modifying packets. Having said that, we use this trick in many places and it
3931 works like a charm.
3933 In order for this to work you need at least iptables-1.2.1a and Linux 2.4.3
3934 or higher. The basic commandline is:
3935 <tscreen><verb>
3936 # iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
3937 </verb></tscreen>
3939 This calculates the proper MSS for your link. If you are feeling brave, or
3940 think that you know best, you can also do something like this:
3942 <tscreen><verb>
3943 # iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 128
3944 </verb></tscreen>
3946 This sets the MSS of passing SYN packets to 128. Use this if you have VoIP
3947 with tiny packets, and huge http packets which are causing chopping in your
3948 voice calls.
3949 <sect>Building bridges, and pseudo-bridges with Proxy ARP
3951 Bridges are devices which can be installed in a network without any
3952 reconfiguration. A network switch is basically a many-port bridge. A bridge
3953 is often a 2-port switch. Linux does however support multiple interfaces in
3954 a bridge, making it a true switch.
3956 Bridges are often deployed when confronted with a broken network that needs
3957 to be fixed without any alterations. Because the bridge is a layer-2 device,
3958 one layer below IP, routers and servers are not aware of its existence.
3959 This means that you can transparently block or modify certain packets, or do
3960 shaping.
3962 Another good thing is that a bridge can often be replaced by a cross cable
3963 or a hub, should it break down.
3965 The bad news is that a bridge can cause great confusion unless it is very
3966 well documented. It does not appear in traceroutes, but somehow packets
3967 disappear or get changed from point A to point B. You should also wonder if
3968 an organization that 'does not want to change anything' is doing the right
3969 thing.
3971 The Linux 2.4 bridge is documented on
3973 <url url=" http://bridge.sourceforge.net/" name="this page">.
3975 <sect1>State of bridging and iptables
3977 As of Linux 2.4.14, bridging and iptables do not 'see' each other without
3978 help. If you bridge packets from eth0 to eth1, they do not 'pass' by
3979 iptables. This means that you cannot do filtering, or NAT or mangling or
3980 whatever.
3982 There are several projects going on to fix this, the truly right one is by
3983 the author of the Linux 2.4 bridging code, Lennert Buytenhek. He recently
3984 informed us that as of bridge-nf 0.0.2 (see the url above), the code is
3985 stable and usable in production environments. He is now asking the kernel
3986 people if and how the patch can be merged, stay tuned!
3988 <sect1>Bridging and shaping
3990 This does work as advertised. Be sure to figure out which side each
3991 interface is on, otherwise you might be shaping outbound traffic in your
3992 internal interface, which won't work. Use tcpdump if needed.
3994 <sect1>Pseudo-bridges with Proxy-ARP
3996 If you just want to implement a Pseudo-bridge, skip down a few sections
3997 to 'Implementing it', but it is wise to read a bit about how it works in
3998 practice.
4000 A Pseudo-bridge works a bit differently. By default, a bridge passes packets
4001 unaltered from one interface to the other. It only looks at the hardware
4002 address of packets to determine what goes where. This in turn means that you
4003 can bridge traffic that Linux does not understand, as long as it has an
4004 hardware address it does.
4006 A 'Pseudo-bridge' works differently and looks more like a hidden router than
4007 a bridge, but like a bridge, it has little impact on network design.
4009 An advantage of the fact that it is not a brige lies in the fact that
4010 packets really pass through the kernel, and can be filtered, changed,
4011 redirected or rerouted.
4013 A real bridge can also be made to perform these feats, but it needs special
4014 code, like the Ethernet Frame Diverter, or the above mentioned patch.
4016 Another advantage of a pseudo-bridge is that it does not pass packets it
4017 does not understand - thus cleaning your network of a lot of cruft. In cases
4018 where you need this cruft (like SAP packets, or Netbeui), use a real bridge.
4019 <sect2>ARP &amp; Proxy-ARP
4021 When a host wants to talk to another host on the same physical network
4022 segment, it sends out an Address Resolution Protocol packet, which, somewhat
4023 simplified, reads like this 'who has 10.0.0.1, tell 10.0.0.7'. In response
4024 to this, 10.0.0.1 replies with a short 'here' packet.
4026 10.0.0.7 then sends packets to the hardware address mentioned in the 'here'
4027 packet. It caches this hardware address for a relatively long time, and
4028 after the cache expires, it reasks the question.
4030 When building a Pseudo-bridge, we instruct the bridge to reply to these ARP
4031 packets, which causes the hosts in the network to send its packets to the
4032 bridge. The brige then processes these packets, and sends them to the
4033 relevant interface.
4035 So, in short, whenever a host on one side of the bridge asks for the
4036 hardware address of a host on the other, the bridge replies with a packet
4037 that says 'hand it to me'.
4039 This way, all data traffic gets transmitted to the right place, and always
4040 passes through the bridge.
4041 <sect2>Implementing it
4043 In the bad old days, it used to be possible to instruct the Linux Kernel to
4044 perform 'proxy-ARP' for just any subnet. So, to configure a pseudo-bridge,
4045 you would have to specify both the proper routes to both sides of the bridge
4046 AND create matching proxy-ARP rules. This is bad in that it requires a lot
4047 of typing, but also because it easily allows you to make mistakes which make
4048 your bridge respond to ARP queries for networks it does not know how to
4049 route.
4051 With Linux 2.4 (and possibly 2.2), this possibility has been withdrawn and
4052 has been replaced by a flag in the /proc directory, called 'proxy_arp'. The
4053 procedure for building a pseudo-bridge is then:
4055 <enum>
4056 <item>Assign an IP address to both interfaces, the 'left' and the 'right'
4058 <item>Create routes so your machine knows which hosts reside on the left,
4059 and which on the right
4060 <item>Turn on proxy-ARP on both interfaces, echo 1 >
4061 /proc/sys/net/ipv4/conf/ethL/proxy_arp, echo 1 >
4062 /proc/sys/net/ipv4/conf/ethR/proxy_arp, where L and R stand for the numbers
4063 of your interfaces on the left and on the right side
4064 </enum>
4066 Also, do not forget to turn on the ip_forwarding flag! When converting from
4067 a true bridge, you may find that this flag was turned off as it is not
4068 needed when bridging.
4070 Another thing you might note when converting is that you need to clear the
4071 arp cache of computers in the network - the arp cache might contain old
4072 pre-bridge hardware addresses which are no longer correct.
4074 On a Cisco, this is done using the command 'clear arp-cache', under
4075 Linux, use 'arp -d ip.address'. You can also wait for the cache to expire
4076 manually, which can take rather long.
4077 <sect>Advanced Linux Routing
4079 This section is for all you people who either want to understand why the
4080 whole system works or have a configuration that's so bizarre that you
4081 need the low down to make it work.
4083 This section is completely optional. It's quite possible that this section
4084 will be quite complex and really not intended for normal users. You have
4085 been warned.
4087 FIXME: Decide what really needs to go in here.
4088 <sect1>How does packet queueing really work?
4089 <p>This is the low-down on how the packet queueing system really works.
4091 Lists the steps the kernel takes to classify a packet, etc...
4093 FIXME: Write this.
4095 <sect1>Advanced uses of the packet queueing system
4096 <p>Go through Alexey's extremely tricky example involving the unused bits
4097 in the TOS field.
4099 FIXME: Write this.
4101 <sect1>Other packet shaping systems
4102 <p>I'd like to include a brief description of other packet shaping systems
4103 in other operating systems and how they compare to the Linux one. Since Linux
4104 is one of the few OSes that has a completely original (non-BSD derived) TCP/IP
4105 stack, I think it would be useful to see how other people do it.
4107 Unfortunately I have no experience with other systems so cannot write this.
4109 FIXME: Anyone? - Martijn
4111 <sect>Dynamic routing - OSPF and BGP
4113 Once your network starts to get really big, or you start to consider 'the
4114 internet' as your network, you need tools which dynamically route your data.
4115 Sites are often connected to each other with multiple links, and more are
4116 popping up all the time.
4118 The Internet has mostly standardised on OSPF and BGP4 (rfc1771). Linux
4119 supports both, by way of <tt>gated</tt> and <tt>zebra</tt>
4121 While currently not within the scope of this document, we would like to
4122 point you to the definitive works:
4124 Overview:
4126 Cisco Systems
4127 <url
4128 url="http://www.cisco.com/univercd/cc/td/doc/cisintwk/idg4/nd2003.htm"
4129 name="Designing large-scale IP internetworks">
4133 For OSPF:
4135 Moy, John T.
4136 "OSPF. The anatomy of an Internet routing protocol"
4137 Addison Wesley. Reading, MA. 1998.
4139 Halabi has also written a good guide to OSPF routing design, but this
4140 appears to have been dropped from the Cisco web site.
4143 For BGP:
4145 Halabi, Bassam
4146 "Internet routing architectures"
4147 Cisco Press (New Riders Publishing). Indianapolis, IN. 1997.
4149 also
4151 Cisco Systems
4153 <url
4154 url="http://www.cisco.com/univercd/cc/td/doc/cisintwk/ics/icsbgp4.htm"
4155 name="Using the Border Gateway Protocol for interdomain routing">
4158 Although the examples are Cisco-specific, they are remarkably similar
4159 to the configuration language in Zebra :-)
4160 <sect>Other possibilities
4162 This chapter is a list of projects having to do with advanced Linux routing
4163 &amp; traffic shaping. Some of these links may deserve chapters of their
4164 own, some are documented very well of themselves, and don't need more HOWTO.
4166 <descrip>
4167 <tag>802.1Q VLAN Implementation for Linux <url url="http://scry.wanfear.com/~greear/vlan.html"
4168 name="(site)"></tag>
4170 VLANs are a very cool way to segregate your
4171 networks in a more virtual than physical way. Good information on VLANs can
4172 be found <url
4173 url="ftp://ftp.netlab.ohio-state.edu/pub/jain/courses/cis788-97/virtual_lans/index.htm"
4174 name="here">. With this implementation, you can have your Linux box talk
4175 VLANs with machines like Cisco Catalyst, 3Com: {Corebuilder, Netbuilder II,
4176 SuperStack II switch 630}, Extreme Ntwks Summit 48, Foundry: {ServerIronXL,
4177 FastIron}.
4179 Update: has been included in the kernel as of 2.4.14 (perhaps 13).
4180 <tag>Alternate 802.1Q VLAN Implementation for Linux <url
4181 url="http://vlan.sourceforge.net "
4182 name="(site)"></tag>
4183 Alternative VLAN implementation for linux. This project was started out of
4184 disagreement with the 'established' VLAN project's architecture and coding
4185 style, resulting in a cleaner overall design.
4187 <tag>Linux Virtual Server <url url="http://www.LinuxVirtualServer.org/"
4188 name="(site)"></tag>
4190 These people are brilliant. The Linux Virtual Server is a highly scalable and
4191 highly available server built on a cluster of real servers, with the load
4192 balancer running on the Linux operating system. The architecture of the
4193 cluster is transparent to end users. End users only see a single virtual
4194 server.
4196 In short whatever you need to loadbalance, at whatever level of traffic, LVS
4197 will have a way of doing it. Some of their techniques are positively evil!
4198 For example, they let several machines have the same IP address on a
4199 segment, but turn off ARP on them. Only the LVS machine does ARP - it then
4200 decides which of the backend hosts should handle an incoming packet, and
4201 sends it directly to the right MAC address of the backend server. Outgoing
4202 traffic will flow directly to the router, and not via the LVS machine, which
4203 does therefor not need to see your 5Gbit/s of content flowing to the world,
4204 and cannot be a bottleneck.
4206 The LVS is implemented as a kernel patch in Linux 2.0 and 2.2, but as a
4207 Netfilter module in 2.4, so it does not need kernel patches! Their 2.4
4208 support is still in early development, so beat on it and give feedback or
4209 send patches.
4211 <tag>CBQ.init <url url="ftp://ftp.equinox.gu.net/pub/linux/cbq/"
4212 name="(site)"></tag>
4213 Configuring CBQ can be a bit daunting, especially if all you want to do is
4214 shape some computers behind a router. CBQ.init can help you configure Linux
4215 with a simplified syntax.
4217 For example, if you want all computers in your 192.168.1.0/24 subnet
4218 (on 10mbit eth1) to be limited to 28kbit/s download speed, put
4219 this in the CBQ.init configuration file:
4221 <tscreen><verb>
4222 DEVICE=eth1,10Mbit,1Mbit
4223 RATE=28Kbit
4224 WEIGHT=2Kbit
4225 PRIO=5
4226 RULE=192.168.1.0/24
4227 </verb></tscreen>
4229 By all means use this program if the 'how and why' don't interest you.
4230 We're using CBQ.init in production and it works very well. It can even do
4231 some more advanced things, like time dependent shaping. The documentation is
4232 embedded in the script, which explains why you can't find a README.
4234 <tag>Chronox easy shaping scripts <url url="http://www.chronox.de"
4235 name="(site)"></tag>
4237 Stephan Mueller (smueller@chronox.de) wrote two useful scripts, 'limit.conn'
4238 and 'shaper'. The first one allows you to easily throttle a single download
4239 session, like this:
4241 <tscreen><verb>
4242 # limit.conn -s SERVERIP -p SERVERPORT -l LIMIT
4243 </verb></tscreen>
4245 It works on Linux 2.2 and 2.4.
4247 The second script is more complicated, and can be used to make lots of
4248 different queues based on iptables rules, which are used to mark packets
4249 which are then shaped.
4251 <tag>Virtual Router
4252 Redundancy Protocol implementation <url url="http://w3.arobas.net/~jetienne/vrrpd/index.html"
4253 name="(site)"></tag>
4255 This is purely for redundancy. Two machines with their own IP address and
4256 MAC Address together create a third IP Address and MAC Address, which is
4257 virtual. Originally intended purely for routers, which need constant MAC
4258 addresses, it also works for other servers.
4260 The beauty of this approach is the incredibly easy configuration. No kernel
4261 compiling or patching required, all userspace.
4263 Just run this on all machines participating in a service:
4264 <tscreen><verb>
4265 # vrrpd -i eth0 -v 50 10.0.0.22
4266 </verb></tscreen>
4268 And you are in business! 10.0.0.22 is now carried by one of your servers,
4269 probably the first one to run the vrrp daemon. Now disconnect that computer
4270 from the network and very rapidly one of the other computers will assume the
4271 10.0.0.22 address, as well as the MAC address.
4273 I tried this over here and had it up and running in 1 minute. For some
4274 strange reason it decided to drop my default gateway, but the -n flag
4275 prevented that.
4277 This is a 'live' failover:
4279 <tscreen><verb>
4280 64 bytes from 10.0.0.22: icmp_seq=3 ttl=255 time=0.2 ms
4281 64 bytes from 10.0.0.22: icmp_seq=4 ttl=255 time=0.2 ms
4282 64 bytes from 10.0.0.22: icmp_seq=5 ttl=255 time=16.8 ms
4283 64 bytes from 10.0.0.22: icmp_seq=6 ttl=255 time=1.8 ms
4284 64 bytes from 10.0.0.22: icmp_seq=7 ttl=255 time=1.7 ms
4285 </verb></tscreen>
4287 Not *one* ping packet was lost! Just after packet 4, I disconnected my P200
4288 from the network, and my 486 took over, which you can see from the higher
4289 latency.
4290 </descrip>
4291 <sect>Further reading
4293 <descrip>
4294 <tag><url url="http://snafu.freedom.org/linux2.2/iproute-notes.html"
4295 name="http://snafu.freedom.org/linux2.2/iproute-notes.html"></tag>
4296 Contains lots of technical information, comments from the kernel
4297 <tag><url url="http://www.davin.ottawa.on.ca/ols/"
4298 name="http://www.davin.ottawa.on.ca/ols/"></tag>
4299 Slides by Jamal Hadi Salim, one of the authors of Linux traffic control
4300 <tag><url url="http://defiant.coinet.com/iproute2/ip-cref/"
4301 name="http://defiant.coinet.com/iproute2/ip-cref/"></tag>
4302 HTML version of Alexeys LaTeX documentation - explains part of iproute2 in
4303 great detail
4304 <tag><url url="http://www.aciri.org/floyd/cbq.html"
4305 name="http://www.aciri.org/floyd/cbq.html"></tag>
4306 Sally Floyd has a good page on CBQ, including her original papers. None of
4307 it is Linux specific, but it does a fair job discussing the theory and uses
4308 of CBQ.
4309 Very technical stuff, but good reading for those so inclined.
4311 <tag><url url="http://ceti.pl/~kravietz/cbq/NET4_tc.html"
4312 name="http://ceti.pl/~kravietz/cbq/NET4_tc.html"></tag>
4313 Yet another HOWTO, this time in Polish! You can copy/paste command lines
4314 however, they work just the same in every language. The author is
4315 cooperating with us and may soon author sections of this HOWTO.
4317 <tag><url
4318 url="http://snafu.freedom.org/linux2.2/docs/draft-almesberger-wajhak-diffserv-linux-00.txt"
4319 name="Differentiated Services on Linux"></tag>
4320 Discussion on how to use Linux in a diffserv compliant environment. Pretty
4321 far removed from your everyday routing needs, but very interesting none the
4322 less. We may include a section on this at a later date.
4324 <tag><url
4325 url="http://www.cisco.com/univercd/cc/td/doc/product/software/ios111/cc111/car.htm"
4326 name="IOS Committed Access Rate"></tag>
4327 <label id="CAR">
4328 From the helpful folks of Cisco who have the laudable habit of putting
4329 their documentation online. Cisco syntax is different but the concepts are
4330 the same, except that we can do more and do it without routers the price of
4331 cars :-)
4333 <tag>Docum experimental site<url url="http://www.docum.org"
4334 name="(site)"></tag>
4335 Stef Coene is busy convincing his boss to sell Linux support, and so he is
4336 experimenting a lot, especially with managing bandwidth. His site has a lot
4337 of practical information, examples, tests and also points out some CBQ/tc bugs.
4339 <tag>TCP/IP Illustrated, volume 1, W. Richard Stevens, ISBN 0-201-63346-9</tag>
4340 Required reading if you truly want to understand TCP/IP. Entertaining as
4341 well.
4343 </descrip>
4344 <sect>Acknowledgements
4345 <p>
4346 It is our goal to list everybody who has contributed to this HOWTO, or
4347 helped us demystify how things work. While there are currently no plans
4348 for a Netfilter type scoreboard, we do like to recognise the people who are
4349 helping.
4351 <itemize>
4352 <item>Ron Brinker &lt;service%emcis.com&gt;
4353 <item>Lennert Buytenhek &lt;buytenh@gnu.org&gt;
4354 <item>Esteve Camps &lt;esteve@hades.udg.es&gt;
4355 <item>Gerry Creager N5JXS &lt;gerry%cs.tamu.edu&gt;
4356 <item>Marco Davids &lt;marco@sara.nl&gt;
4357 <item>Jonathan Day &lt;jd9812@my-deja.com&gt;
4358 <item>Martin Devera aka devik &lt;devik@cdi.cz&gt;
4359 <item>Stephan "Kobold" Gehring &lt;Stephan.Gehring@bechtle.de&gt;
4360 <item>Nadeem Hasan &lt;nhasan@usa.net&gt;
4361 <item>Vik Heyndrickx &lt;vik.heyndrickx@edchq.com&gt;
4362 <item>Koos van den Hout &lt;koos@kzdoos.xs4all.nl&gt;
4363 <item>Martin Josefsson &lt;gandalf%wlug.westbo.se&gt;
4364 <item>Pawel Krawczyk &lt;kravietz%alfa.ceti.pl&gt;
4365 <item>Philippe Latu &lt;philippe.latu%linux-france.org&gt;
4366 <item>Jason Lunz &lt;j@cc.gatech.edu&gt;
4367 <item>Alexey Mahotkin &lt;alexm@formulabez.ru&gt;
4368 <item>Andreas Mohr &lt;andi%lisas.de&gt;
4369 <item>Wim van der Most
4370 <item>Stephan Mueller &lt;smueller@chronox.de&gt;
4371 <item>Ram Narula &lt;ram@princess1.net&gt;
4372 <item>Jorge Novo &lt;jnovo@educanet.net&gt;
4373 <item>Patrik &lt;ph@kurd.nu&gt;
4374 <item>Jason Pyeron &lt;jason%pyeron.com&gt;
4375 <item>Rusty Russell (with apologies for always misspelling your name)
4376 <item>Jamal Hadi Salim &lt;hadi%cyberus.ca&gt;
4377 <item>David Sauer &lt;davids%penguin.cz&gt;
4378 <item>Sheharyar Suleman Shaikh &lt;sss23@drexel.edu&gt;
4379 <item>Nick Silberstein &lt;nhsilber%yahoo.com&gt;
4380 <item>Konrads Smelkov &lt;konrads@interbaltika.com&gt;
4381 <item>Andreas Steinmetz &lt;ast%domdv.de&gt;
4382 <item>Jason Tackaberry &lt;tack@linux.com&gt;
4383 <item>Charles Tassell &lt;ctassell%isn.net&gt;
4384 <item>Glen Turner &lt;glen.turner%aarnet.edu.au&gt;
4385 <item>Song Wang &lt;wsong@ece.uci.edu&gt;
4386 <item>Jonathan Day &lt;jd9812@my-deja.com&gt;
4387 </itemize>
4389 </article>