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