%!PS %%Title: HOWTO du routage avancé et du contrôle de trafic sous Linux %%Creator: html2ps version 1.0 beta5 %%EndComments save 2000 dict begin /d {bind def} bind def /D {def} d /t true D /f false D /FL [/Times-Roman /Times-Italic /Times-Bold /Times-BoldItalic /Courier /Courier-Oblique /Courier-Bold /Courier-BoldOblique /Helvetica /Helvetica-Oblique /Helvetica-Bold /Helvetica-BoldOblique] D /WF t D /WI 0 D /F 1 D /IW 471 F div D /IL 621 F div D /PS 791 D /EF [0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 2 2] D /EZ [11 9 19 17 15 13 12 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 8 8] D /Ey [0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] D /EG [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1] D /Tm [1 1 0.8 0.8 0.8 0.8 0.8 0.8 0 0 0 0 0 0 0.5 1 1 1 1 0 0 1.3 0 0] D /Bm [1 1 0.5 0.5 0.5 0.5 0.5 0.5 0 0 0 0 0 0 0.5 1 1 1 1 0 0 1 0 0] D /Lm [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 0 0 2 0 0 0] D /Rm [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0] D /EU [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0] D /NO f D /YY [[{()}1][{()}0][{()}2]] D /ZZ [[{()}1][{()}0][{()}2]] D /Ts EZ 0 get D /TU f D /Xp t D /AU f D /SN 0 D /Cf f D /Tp f D /Fe f D /TI 1 Ts mul D /Fm 14 D /xL 71 D /xR 71 D /yL 706 D /yR 706 D /Wl 471 F div D /Wr 471 F div D /hL 621 F div D /hR 621 F div D /FE {newpath Fm neg Fm M CP BB IW Fm add Fm L IW Fm add IL Fm add neg L CP BB Fm neg IL Fm add neg L closepath} D /LA {PM 0 eq{/IW Wl D /IL hL D}{/IW Wr D /IL hR D}ie /W IW D /LL W D /LS W D TU PM 0 eq and{IW 56 F div add SA{Sf div}if 0 translate} {PM 0 eq{xL yL}{xR yR}ie translate F SA{Sf mul}if dup scale CS CF FS Cf{CA CL get VC}if /Bb f D}ie 0 0 M TF not Tc or {Cf{gsave SA{1 Sf div dup scale}if Cb VC FE fill grestore}if}if}D /Pi 0 Ts mul D /SG [0.8 1 1] D /Ab 15 D /J 0 D /Tc f D /NH 6 D /Nf f D /Pa f D /LH 1.2 D /XR f D /Xr {/pN E D ( [p ] )WB} D /Db [16#FF 16#FF 16#FF] D /Dt [16#00 16#00 16#00] D /eA f D /Fi f D /bT f D /Lc t D /Dl [16#00 16#00 16#00] D /LX f D /Br 0.25 D /IA ([IMAGE]) D /DS {/PF f D()WB NL NP()pop RC ZF} D /Gb f D /Mb t D /Hc [16#00 16#00 16#00] D /Bl 3 D /MI -15.2 D /DX (DRAFT) D /Di 0 D /Tt 113.385826771654 D /Th {()2 Al()BR ( ) 0 1 -1 H()4 FZ()ES()EH ( ) 0 2 -1 H (0author]) EH()Ea()BR()} D /tH {()0 1 -1 H (Table of Contents) EH()} D /FD 2 D /Dy 2 D /cD [16#F0 16#F0 16#F0] D /FW 0.6 D /FU [16#00 16#00 16#00] D /ET {/RM f D /A0 0 D /PN SN D /OU t D /Ou t D /W IW D /LL W D D1 Ms not TP and{Ip}if /TF f D} D %-- End of variable part -- /MySymbol 10 dict dup begin /FontType 3 D /FontMatrix [.001 0 0 .001 0 0 ] D /FontBBox [25 -10 600 600] D /Encoding 256 array D 0 1 255{Encoding exch /.notdef put}for Encoding (e) 0 get /euro put /Metrics 2 dict D Metrics begin /.notdef 0 D /euro 651 D end /BBox 2 dict D BBox begin /.notdef [0 0 0 0] D /euro [25 -10 600 600] D end /CharacterDefs 2 dict D CharacterDefs begin /.notdef {} D /euro{newpath 114 600 moveto 631 600 lineto 464 200 lineto 573 200 lineto 573 0 lineto -94 0 lineto 31 300 lineto -10 300 lineto closepath clip 50 setlinewidth newpath 656 300 moveto 381 300 275 0 360 arc stroke -19 350 moveto 600 0 rlineto -19 250 moveto 600 0 rlineto stroke}d end /BuildChar{0 begin /char E D /fontdict E D /charname fontdict /Encoding get char get D fontdict begin Metrics charname get 0 BBox charname get aload pop setcachedevice CharacterDefs charname get exec end end}D /BuildChar load 0 3 dict put /UniqueID 1 D end definefont pop /Cd {aload length 2 idiv dup dict begin {D} repeat currentdict end} D /EX {EC cvx exec} D /DU {} d /BB {pop pop}d /ie {ifelse} d /E {exch} d /M {moveto} d /R {rmoveto} d /L {lineto} d /RL {rlineto} d /CP {currentpoint} d /SW {stringwidth} d /GI {getinterval} d /PI {putinterval} d /Sg {setgray} d /LW {setlinewidth} d /S {dup () ne OU and{0 Co R AT 3 eq LB and HF not and A1 0 ne A2 0 ne or and {A2 0 32 A1 0 6 -1 roll awidthshow}{show}ie 0 Co neg R}{pop}ie OU PH 3 eq or{/Ms t D}if} D /U {OU{gsave CP currentfont /FontInfo get /UnderlinePosition get 0 E currentfont /FontMatrix get dtransform E pop add newpath M dup SW pop CJ 0 RL stroke grestore}if} D /B {OU Br 0 gt and{CP Ts neg Ts .33 mul R gsave 0 Sg CP newpath Ts Br mul 0 360 arc closepath UI 2 mod 0 eq{stroke}{fill}ie grestore M CP E Ts Br 1 add mul sub E BB /Ms t D}if}D /NP {Ms TP not or PA and OU and{TP{OR}if f1{mF k2 /mF E D /YC 0 D}if TP TU not PM 0 eq or and{showpage}if DU Ip TE not{LA}if 0.6 LW /CI 0 D /TP t D /Hs f D /hl 6 D /Hv 6 D /HI hi D /Ms f D}if Bs XO BO M} D /Np {LE sub CP E pop gt PL 0 eq and{NP}if}D /Ip {/PN PN 1 add D /Pn RM{1}{4}ie PN Ns D /PM PN SN sub 2 mod D} D /GP {E dup 3 -1 roll get PN 1 add 2 mod get dup type /integertype eq {get 0 get}{E pop}ie}d /Fc {dup 2 GP exec SW pop /S1 E D dup 1 GP exec SW pop /S2 E D 0 GP exec SW pop /S3 E D S1 0 gt{S2 2 mul S1 add S3 2 mul S1 add 2 copy lt{E}if pop}{0}ie S2 S3 add 2 copy lt{E}if pop IW .9 mul div dup 1 gt{1 E div}{pop 1}ie}D /OR {Df{Sd}if tp not{gsave SA{1 Sf div dup scale}if Fe{Cf{FU VC}if FW LW 1 setlinejoin FE stroke}if /YO {60 F div dup 40 gt{pop 40}if}D /cs CS D /cf CF D /CF 0 D /pf PF D /PF f D /Fn FN D /At AT D /AT 0 D /FN EF Hf 1 add get D Fz Fs FS ZZ Fc Fz mul Fs FS EU Hf 1 add get dup type /arraytype eq Cf and{VC}{pop 0 Sg}ie IW IL neg YO sub M ZZ 1 GP exec dup SW pop neg 0 R Sh 0 IL neg YO sub M ZZ 0 GP exec Sh ZZ 2 GP exec dup SW pop IW E sub 2 div IL neg YO sub M Sh Fz Fs FS NO{/AW IW Pn SW pop sub D AW 2 div IL neg YO sub S1 0 gt S2 AW .45 mul gt or S3 AW .45 mul gt or{Fz 2 mul sub}if M Pn Sh}if EU Hf get dup type /arraytype eq Cf and{VC}{pop 0 Sg}ie YY Fc /FN EF Hf get D Hz mul HS FS IW YO M YY 1 GP exec dup SW pop neg 0 R Sh 0 YO M YY 0 GP exec Sh YY 2 GP exec dup SW pop IW E sub 2 div YO M Sh /FN Fn D /AT At D t Pb XO SZ SL get neg R /PF pf D grestore /CF 0 D cs cf FS}if}D /Sh {dup () ne{CP Hz 4 div sub BB show CP CS add BB}{pop}ie}D /Pb {/OU E D /Ou OU D /PB t D 0 0 M Ba{/Sa save D /BP t D /Fl t D RC /PL 0 D /PH 0 D /W IW D /LE IL .7 mul D /EO 0 D SI ZF /YA 0 D /BO 0 D /C1 () D BA 0 Ts neg R Bb{Xl Yl Xh Yh}if Bb CP Sa restore M {/Yh E D /Xh E D /Yl E D /Xl E D}if /Fl t D}if BL /OU t D /HM f D /Ou t D /PB f D} D /Bs {/BP Ba not D}D /reencodeISO { dup dup findfont dup length dict begin{1 index /FID ne{D}{pop pop}ie}forall /Encoding ISOLatin1Encoding D currentdict end definefont} D /ISOLatin1Encoding [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon /less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N /O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright /asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m /n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/space/exclamdown/cent/sterling/currency/yen/brokenbar /section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot /hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior /acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine /guillemotright/onequarter/onehalf/threequarters/questiondown /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex /Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis /multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute /Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis /aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave /iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex /otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis /yacute/thorn/ydieresis ] D [128/backslash 129/parenleft 130/parenright 141/circumflex 142/tilde 143/perthousand 144/dagger 145/daggerdbl 146/Ydieresis 147/scaron 148/Scaron 149/oe 150/OE 151/guilsinglleft 152/guilsinglright 153/quotesinglbase 154/quotedblbase 155/quotedblleft 156/quotedblright 157/endash 158/emdash 159/trademark] aload length 2 idiv 1 1 3 -1 roll{pop ISOLatin1Encoding 3 1 roll put}for /colorimage where{pop}{ /colorimage { pop pop /Pr E D {/Cv Pr D /Gr Cv length 3 idiv string D 0 1 Gr length 1 sub {Gr E dup /i E 3 mul D Cv i get 0.299 mul Cv i 1 add get 0.587 mul add Cv i 2 add get 0.114 mul add cvi put}for Gr} image} D }ie /pdfmark where{pop}{userdict /pdfmark /cleartomark load put}ie WF{FL{reencodeISO D}forall}{4 1 FL length 1 sub{FL E get reencodeISO D}for}ie /Symbol dup dup findfont dup length dict begin {1 index /FID ne{D}{pop pop}ie}forall /Encoding [Encoding aload pop] dup 128 /therefore put D currentdict end definefont D /SF {/CS E D SZ SL CS put FO SL FN put /YI CS LH neg mul D dup ST cvs ( ) join CS ST cvs join C1 E join ( NF ) join /C1 E D CS NF /Wf WF FN 0 gt or D /BW Wf{( ) SW pop}{0}ie D}D /NF {/cS E D /cF E D cF 0 ge{FL cF get}{cF -1 eq{/Symbol}{/MySymbol}ie}ie findfont cS scalefont setfont} D /FS {CF or /CF E D FR SL CF put CF CF 0 ge{FN 4 mul add}if E SF} D /PC {SH /BP f D fin not GL not and{NL}if /HM t D /LL LS D} D /BS {/TX E D Wf{/fin f D /CW 0 D /LK 0 D /SC 0 D /RT TX D {RT ( ) search{/NW E D pop /RT E D /WH NW SW pop D CW WH add LL gt {TX SC LK SC sub 1 sub NN GI GL{SH cF cS OC 2 copy cS ne E cF ne or{NF}{pop pop}ie}{PC /CW WH BW add D}ie /SC LK D} {GL{JC}if /CW CW WH add BW add D /HM t D}ie /GL f D /Ph f D /LK LK NW length 1 add add D}{pop exit}ie}loop /fin t D TX SC LK SC sub GI SH RT () ne{GL not{CC}if}if /LC TX length D /WH RT SW pop D CW WH add Hy{HC SW pop add}if LL gt {RT GL{SH cF cS OC 2 copy cS ne E cF ne or{NF}{pop pop}ie Hy{/Ph t D}if /LL LS D}{NL /LL LS D SH}ie} {RT PC Hy{CC}if /Ph Ph Hy or D}ie RT () ne{/GL t D /HM t D}if} {TX SW pop LL le{TX SH}{/NW () D 0 2 TX length 1 sub {/CW E D TX 0 CW GI dup SW pop LL gt{pop NW SH /HM t D NL/LL W XO sub MR sub D /CW CW 2 sub NN D /TX TX CW TX length CW sub GI D TX BS exit} {/NW E D}ie}for}ie}ie /HM t D}D /CC {C0 length 0 gt{JC}if /C0 [C1 L1 YA YB Mf NS NB TB AF Bw] D /C1 () D /L0 L1 D /YA 0 D /YB 0 D /Mf 0 D /NS 0 D /NB 0 D}D /JC {C0 aload length 0 gt{pop pop pop NB add /NB E D NS add /NS E D dup Mf gt{/Mf E D}{pop}ie dup YB gt{/YB E D}{pop}ie dup YA gt{/YA E D}{pop}ie pop C1 join /C1 E D /C0 [] D}if}D /OC {C0 length 0 gt{C1 L1 L0 sub YA YB Mf NS NB TB AF Bw GL C0 aload pop /Bw E D /AF E D /TB E D /NB E D /NS E D /Mf E D /YB E D /YA E D /C0 [] D /L1 E D /C1 E D Ph{HC SH}if NL /GL E D /Bw E D /AF E D /TB E D /NB E D /NS E D /Mf E D /YB E D /YA E D /L1 E D /LL W L1 sub XO sub MR sub WH sub D /CW 0 D C1 E join /C1 E D}if}D /BT {/LB t D dup length string copy RS dup dup () ne E ( ) ne and {/CI 0 D /LS LL D /LL W L1 sub XO sub MR sub D BS} {dup ( ) eq{/GL f D}if dup () eq L1 0 eq or{pop}{SH /BP f D /Ph f D}ie}ie /LB f D} D /BL {CP E pop XO E M} D /NL {JC /GL f D /SK W XO sub MR sub L1 sub TB{Bw add}if D /YA LF{Mf HM Fl not and PF or{LH mul}if}{0 /LF t D}ie YA 2 copy lt{E}if pop D C1 () ne{/FB YB Mf SA{Sf mul}if 4 div 2 copy lt{E}if pop D}if Fl{/Ya YA D}if CP E pop YA sub YB sub LE neg lt Fl not and PB not and{NP}if NT TL BL OU PF not and PB or{/RE L1 TB{Bw sub}if W XO sub MR sub div YA YB add LE BO add div 2 copy lt{E}if pop D RE 1 gt{BL 1 RE div dup scale}if}if AT 2 le{SK AT mul 2 div YA neg R}if AT 3 eq{0 YA neg R TB{/NB NB 1 sub D /NS NS 1 sub D}if /NB NB 1 sub NN D /A3 NS 6 mul NB add D NS NB add 0 eq {/A1 0 D /A2 0 D} {NS 0 eq{/A1 SK NB div dup J gt{pop 0}if D /A2 0 D}{J A3 mul SK lt {/A1 J D /A2 SK J NB mul sub NS div dup Ab gt{/A1 0 D pop 0}if D} {/A1 SK A3 div D /A2 A1 6 mul D}ie}ie}ie /A1 A1 NN D /A2 A2 NN D}if AT 4 eq{0 YA neg R PH 2 le{PD 0 lt{/PD L1 D}if PD M1 gt{/M1 PD D}if L1 PD sub M2 gt{/M2 L1 PD sub D}if}{DV ID 1 sub get 0 ge{Lo 0 R}if}ie}if F0 cF ne Cs cS ne or{F0 Cs NF}if /ms Ms D /Ms f D CP FB sub C1 cvx exec XO EO sub L1 add TB{BW sub}if dup LM gt{/LM E D}{pop}ie PH 0 eq PH 4 eq or Ms and{HF not{/PO t D /AH t D}if BB CP YA add E AT 3 eq LB and{A1 sub}if TB{BW sub}if E BB} {pop pop}ie Ms HM PH 3 eq and or{/BP f D /Fl f D}if /Lo 0 D /L1 0 D /F0 cF D /Cs cS D BP not{0 YB NN neg R}if OU f1 and mF not and{k2 /f1 f D}if OU PF not and PB or{RE 1 gt{RE dup scale}if}if /Ms ms Ms or D /C1 AF{(Cp )}{()}ie D /YA 0 D /YB 0 D BL AT 4 eq LB not and PH 3 ge and {ID DV length lt{DV ID get dup 0 ge{DO E sub /Lo E D /L1 Lo D}{pop}ie /ID ID 1 add D}if}if /T t D CD{/LN LN 1 add D PD}if /PD -1 D /NS 0 D /NB 0 D /TB f D /Ph f D /Mf 0 D /HM f D} D /RS {/TM E D /CN 0 D TM{10 eq{TM CN ( ) PI}if /CN CN 1 add D}forall /CN 0 D /BK HM EN and{0}{1}ie D TM {dup 32 ne{TM CN 3 2 roll put /CN CN 1 add D /BK 0 D} {pop BK 0 eq{TM CN 32 put /CN CN 1 add D}if /BK 1 D}ie}forall TM 0 CN GI dup dup () ne E ( ) ne and {dup CN 1 sub get 32 eq{/EN f D}{/EN t D}ie}if} D /join {2 copy length E length add string dup 4 2 roll 2 index 0 3 index PI E length E PI}d /WR {(\n) search{dup () ne BP not or {Li 4 le CP E pop YI Li mul add LE add 0 lt and PL 0 eq and{NP}if SH NL pop /Li Li 1 sub D WR}{pop pop WR}ie}{SH}ie /CI 0 D /BP f D} D /SH {dup dup () ne E ( ) ne and PF or CS Mf gt and{/Mf CS D}if T not Wf and{( ) E join /T t D}if dup BP{/MF CS D}if AT 3 eq{2 copy length dup 0 gt{/NB E NB add D {( ) search{/NS NS 1 add D pop pop}{pop exit}ie}loop}{pop pop}ie}if CD PD 0 lt and{dup DC search{SW pop /PD E L1 add D pop pop}{pop}ie}if 0 Np dup SW pop L1 add /L1 E D dup () ne {C1 (\() join E join (\)) join AU AF and UF or Wf and{( U ) join}if sF{( s ) join}if ( S ) join /C1 E D dup length 1 sub get 32 eq /TB E D /Bw BW D}{pop pop}ie} D /BG {AI LG BC add add 0 eq} D /ON {OU{Ty AR AI NN get dup 1 add Ln Ns Ty 2 mod 0 eq{(. )}{(\) )}ie join dup SW pop neg 0 R CP E 0 lt{0 E M}{pop}ie CP BB show /Ms t D}if} D /Ln {AR AI 3 -1 roll put}D /SP {dup CI lt BP not and{dup CI sub 0 E R /CI E D}{pop}ie} D /BN {PF{WR /HM f D}{BT NL}ie} D /NN {dup 0 lt{pop 0}if} D /h {(h) HI ST cvs join cvx exec dup 1 get E Nf{0 get E join}{pop}ie} D /H {/fn FN D /Hi E 1 add D 1 sub /HL E D /H2 HL 2 add D /GS EZ H2 get D E Tm H2 get GS mul BE dup 0 gt{1 sub}{pop EG H2 get dup 0 lt{pop AT}if}ie NA WW Np /SL SL 1 add D /FN EF H2 get D GS Ey H2 get FS EU H2 get Sc Hs not HL Hl lt and Hs HL hl lt and or Hi 0 eq or {/HI Hi D /Hs t D /hl HL D /Hv HL D}if HL Hl lt{/hi Hi D}if Nf HI 0 gt and{(h) Hi ST cvs join cvx exec 0 get WB}if /HF t D /AH f D /PO f D} D /EH {Bm H2 get GS mul BE OA /SL SL 1 sub NN D /CF 0 D /FN fn D SZ SL get FR SL get FS /HF f D /GS Ts D ()Ec} D /P {E PF{WR}{PO{EP}{BN}ie Ts 4 mul Np AE not{Tm 0 get Ts mul neg SP}if dup 0 ge AH and{Pi Pd}if}ie 1 sub dup 0 lt{pop AV AL get}if /AT E D /PO t D} D /EP {PF{WR}{BN Ts 4 mul Np}ie AE not{Bm 0 get Ts mul neg SP}if /AT AV AL get D /PO f D} D /BE {E PO{EP}{BN}ie Ts 4 mul Np neg SP} D /HR {/Aw W EO sub D /RW E dup 0 gt{Aw mul}{neg}ie dup Aw gt{pop Aw}if D /RZ E D E BN Ts neg SP 1 sub 2 div Aw RW sub mul EO add CP E pop M PF{0 Ps neg R}if 0 Np OU{gsave RZ LW Cf{Hc VC}{0 Sg}ie CP BB RW 0 RL CP BB stroke grestore}if /CI 0 D /BP f D PF not{Ts neg SP}if /Ms t D} D /AD {I NL EG 14 get dup 0 lt{pop AT}if NA /AE t D Tm 14 get Ts mul neg SP Cf{EU 14 get dup -1 eq{pop CA CL get}if Sc}if} D /DA {BN ()ES OA /AE f D ()Ec Bm 14 get Ts mul neg SP} D /PR {/MW E D /Li E D Tm 1 get Ps mul BE 0 NA /FN Fp D /PF t D SI /SL SL 1 add D /CF 0 D Ps CS mul Ts div MW WC mul CS mul Ts div dup LL gt PL 0 eq and {LL div div}{pop}ie Ey 1 get FS CP E pop LE add YI neg div cvi dup Li lt AH and{4 lt YI Li mul 5 mul LE add 0 gt or PL 0 eq and{NP}if}{pop}ie EU 1 get Sc /GS Ps D}D /RP {WR NL () /PF f D SI /FN 0 D ES Bm 1 get Ps mul neg SP OA /GS Ts D} D /SI {/XO Lm 15 get BC NN mul Lm 16 get AI UI sub NN mul add Lm 17 get UI NN mul add Lm 20 get LG NN mul add Ts mul PF{Lm 1 get Ps mul add}if EO add D /MR Rm 15 get BC NN mul Rm 16 get AI UI sub NN mul add Rm 17 get UI NN mul add Rm 20 get LG NN mul add Ts mul PF{Rm 1 get Ps mul add}if D /LL W XO sub MR sub D} D /DT {/cC E D BN /LG LG 1 sub D SI /LG LG 1 add D WW 2 div Np BL} D /DD {WB Cc 0 eq cC 0 eq and L1 0 eq or Lm 20 get Ts mul L1 sub TB{BW add}if Ts 2 div lt or NL /LF E D SI BL /cC 0 D} D /DL {Dc LG Cc put /Cc E D BG{Tm 18 get Ts mul BE}{BN}ie /LG LG 1 add D BL} D /LD {BN LG 0 gt{/LG LG 1 sub D}if /Cc Dc LG get D SI BG{()Bm 18 get Ts mul BE}if BL} D /UL {BG{Tm 17 get Ts mul BE}{BN}ie NR AI NN 0 put /UI UI 1 add D /AI AI 1 add D SI BL} D /LU {BN /UI UI 1 sub D /AI AI 1 sub D SI BG{()Bm 17 get Ts mul BE}if BL} D /OL {E BG{Tm 16 get Ts mul BE}{BN}ie TR AI NN Ty put /Ty E D NR AI NN 1 put /AI AI 1 add D SI BL 1 Ln} D /LO {BN /AI AI 1 sub D /Ty TR AI get D SI BG{()Bm 16 get Ts mul BE}if BL} D /LI {E BN -1 SP /BP f D /CI 0 D 0 Np NR AI 1 sub NN get 1 eq {dup dup 0 gt E 4 le and{/Ty E D}{pop}ie /L1 L1 Ty AR AI NN get Ns SW pop XO sub dup 0 lt{pop 0}if add D ( ON )} {pop ( B )}ie C1 E join /C1 E D CS Mf gt{/Mf CS D}if BL} D /BQ {Tm 15 get Ts mul BE /BC BC 1 add D SI BL} D /QB {Bm 15 get Ts mul BE /BC BC 1 sub D SI BL} D /Al {E EP 1 sub dup 0 lt{pop AV AL get}if NA} D /Ea {EP OA} D /WB {PF{WR}{BT}ie} D /F1 {WB /FN 0 D CS 0 FS} D /F2 {WB /FN WI D CS 0 FS} D /HY {/Hy t D WB /Hy f D} D /YH {WB} D /A {/LT E D LT 1 eq{/RN E D}if /Lh E D WB /C1 C1 ( Cp ) join D Lc AF not and{Cl Sc}if /AF t D} D /EA {Lc AF and{Ec}{WB}ie TL Pa AF and Lh 0 ne and {( \() Lh join (\)) join /AF f D WB}if /AF f D} D /TL {C1 ( Tl ) apa /C1 E D} d /apa {AF OU and Lh 0 ne LT 1 eq or and{LT 1 eq{RN ( /) E ST cvs join} {(\() Lh join (\)) join}ie E join join}{pop}ie} d /Cp {/Xc CP /Yc E D D} D /SS {Cf{dup 0 ge{EU E get dup -1 eq{pop CA CL get}if}{pop CA CL get}ie Sc} {pop}ie SZ SL get /SL SL 1 add D} D /I {WB 8 SS 1 FS} D /EM {WB 8 SS /CF CF 1 xor D 0 FS} D /BD {WB 9 SS 2 FS} D /TT {WB 10 SS /FN Fp D 0 FS} D /KB {WB 11 SS /FN Fp D 2 FS} D /CT {WB 12 SS 1 FS} D /SM {WB 13 SS /FN Fp D 0 FS} D /Q {/QL QL 1 add D QO QL 2 mod get La get join WB} D /EQ {QC QL 2 mod get La get join WB /QL QL 1 sub D} D /RO {WB -1 SS /CF 0 D 0 FS} D /SY {WB -1 SS -1 FS} D /MY {WB -1 SS -2 FS} D /ES {WB /SL SL 1 sub NN D /CF 0 D /FN FO SL get D SZ SL get FR SL get FS ()Ec}D /FZ {3 sub 1.2 E exp GS mul E WB TL /C1 C1 ( Cp ) join D /SL SL 1 add D 0 FS} D /Ef {WB TL ()ES /C1 C1 ( Cp ) join D} D /BZ {dup /Bf E D FZ}D /Sc {dup -1 ne Cf and{/CL CL 1 add D dup 0 eq{pop [0 0 0]}if dup CA E CL E put VS ( VC ) join C1 E join /C1 E D}{pop}ie} D /Ec {WB Cf{/CL CL 1 sub NN D CA CL get VS ( VC ) join C1 E join /C1 E D}if} D /VS {dup type /arraytype eq{([) E {ST cvs join ( ) join}forall (]) join}if} D /VC {{255 div}forall setrgbcolor} D /Sl {dup type /integertype ne{Ds}if /La E D WB}d /UN {WB /UF t D} D /NU {WB /UF f D} D /SE {WB /sF t D} D /XE {WB /sF f D} D /sM {/C1 C1 ( k1 ) join D}d /eM {/C1 C1 ( k2 ) join D}d /k1 {/YC CP E pop Ts add D /mF t D /f1 t D}d /k2 {gsave 3 LW -9 CP E pop Ts 0.2 mul sub M -9 YC L stroke grestore /mF f D}d /Ac {/AC E D WB}d /Ca {eA{( \()join AC join(\) )join}if WB}d /s {OU{gsave 0 CS .25 mul R dup SW pop CJ 0 RL stroke grestore}if}D /CJ {AT 3 eq LB and{E dup dup length 1 sub A1 mul E {( ) search{pop pop E A2 add E}{pop exit}ie}loop 3 -1 roll add W CP pop sub 2 copy gt{E}if pop}if}D /So {/Co E D} D /SO {C1 Yo ST cvs join ( So ) join /C1 E D (j) SW pop 2 div Pd} D /Se {E WB CS E div Pd}D /Pd {dup type /stringtype eq{SW pop}if dup /L1 E L1 add D ST cvs ( 0 R ) join C1 E join /C1 E D} D /Sp {0.35 CO} D /Sb {-0.2 CO} D /CO {OV Io Yo put /Yo E CS mul Yo add D /Io Io 1 add D -1.5 Io mul 3 add FZ SO CS Yo add dup YA gt{/YA E D}{pop}ie Yo neg dup YB gt{/YB E D}{pop}ie} D /Es {ES /Io Io 1 sub NN D /Yo OV Io get D SO} D /SB {/N2 0 D 0 1 NI{/N E D{IX N2 get 0 lt{/N2 N2 1 add D}{exit}ie}loop /K WS N get FC N get mul D /NY AY N2 get D /BV NY array D 0 1 NY 1 sub{/TM K string D currentfile TM readhexstring pop pop BV E TM put} for BM N BV put /N2 N2 1 add D}for} D /IC [{/MA E D /MB 0 D}{2 div /MA E D /MB MA D}{/MB E CS sub D /MA CS D} {pop /MA YS AB mul D /MB 1 AB sub YS mul D}{pop /MA 0 D /MB 0 D}] D /IP {BV N get /N N 1 add D} D /II {/K E D IX K get 0 lt{/EC E D}if /TY E D TY 4 eq{/Y E D /X E D}if TY 3 eq{/AB E D}if /XW AX K get D /YW AY K get D /IS SG IT K get get D /XS XW IS mul D /YS YW IS mul D YS IC TY get exec /MA MA Fl not{3 add}if D} D /IM {II /ty TY D /xs XS D /ys YS D /ya YA D /yb YB D /ma MA D /mb MB D /k K D /ec EC D /BP f D /CI 0 D WB TL L1 xs add dup XO add MR add W gt {pop /ma ma Fl{3 add}if D NL /YA ma D /YB mb D /YS ys D /L1 xs D} {/L1 E D ma YA gt{/YA ma D}if mb YB gt{/YB mb D}if}ie /TB f D OU{CP E pop YS sub LE neg lt Fl not and PB not and{NP /YA ma D /YB mb D}if /BP f D ty ST cvs ( ) join IX k get 0 lt{(\() join ec join (\) ) join}if k ST cvs join ty 3 eq{AB ST cvs ( ) join E join}if ty 4 eq{X ST cvs ( ) join Y ST cvs join ( ) join E join}if C1 E join ( DI ) join FP 2 eq FP 1 eq AF and or{( FM ) join}if ( Il Cp ) apa /C1 E D /EN f D}if /HM t D /T f D} D /DI {II /Xc CP /Yc E D D /YN YW neg D /HM t D /CI 0 D /K2 IX K get D gsave TY 4 eq{OX X IS mul add OY FY add YS sub Y IS mul sub} {/FY YS D CP MB sub 2 copy /OY E D /OX E D}ie translate K2 0 ge{/DP AZ K2 get D /BV BM K2 get D XS YS scale /N 0 D XW YW DP [XW 0 0 YN 0 YW] {IP} FC K2 get 1 eq{image}{f 3 colorimage}ie} {EX}ie grestore XS 0 R /Ms t D} D /FM {gsave 0 Sg CP MB sub translate XS neg 0 M 0 YS RL XS 0 RL 0 YS neg RL XS neg 0 RL stroke grestore} D /NA {/AT E D /AL AL 1 add D AV AL AT put} D /OA {AL 0 gt{/AL AL 1 sub D /AT AV AL get D}if} D /D1 {/BR {CP E pop E BN Mb{CP E pop eq{0 YI R}if}{pop}ie} D /Sn {OU{C1 E ST cvs join ( Ld ) join /C1 E D}{pop}ie} D} D /D1 {/BR {BN} D /Sn {OU {C1 E ST cvs join ( Ld ) join /C1 E D} {pop} ie} D} D /TC {/TF t D /ML 0 D HN{SW pop dup ML gt{/ML E D}{pop}ie}forall NP /RM RM not D RC /OU Tc D Ep /PN 0 D Ms not TP and{Ip}if /W IW ML sub Ts sub D /A0 0 D TH{/BR {( ) join BT} D /Sn {pop} D /Au () D}if} D /TN {0 eq{E EA PF HF or not XR and{HN E get Xr}{pop}ie} {OU{Tn 0 ge{() BN}if /Tn E D}{pop}ie WB}ie} D /NT {OU LB not and Tn 0 ge and{PL 0 eq{Ms not{CS CF FS}if CP dup /y E YA sub D W 9 sub CS -1.8 mul XO L1 add 2 add{y M (.) show}for HN Tn get dup SW pop IW E sub y M show CP BB M}if /Tn -1 D}if} D /Ld {/DN E D HN DN Pn put [/View [/XYZ -4 Fl{PS}{CP YA add US E pop}ie null] /Dest DN ST cvs cvn /DEST pdfmark} D /C {ND 1 eq{1 sub}if TI mul /XO E D NL Nf not{pop()}if 0 3 -1 roll 1 A} D /OP {BP not{NP}if PN 2 mod 0 eq{/Ms t D NP}if}D /Ep {Xp PN 2 mod 0 eq and OU and{/Pn (-) D showpage /PM 1 D LA}if}D /Dg [73 86 88 76 67 68 77] D /Rd [0 [1 1 0][2 1 0][3 1 0][2 1 1][1 1 1][2 2 1][3 3 1][4 4 1][2 1 2]] D /Ns {/m E D /c E 32 mul D /j m 1000 idiv D /p j 12 add string D c 96 le m 0 gt and{c 32 le {/i 0 D /d 77 D /l 100 D /m m j 1000 mul sub D j -1 1 {pop p i d c add put /i i 1 add D}for 4 -2 0 {/j E D /n m l idiv D /m m n l mul sub D /d Dg j get D n 0 gt {/x Rd n get D x 0 get -1 1 {pop p i d c add put /i i 1 add D}for p i x 1 get sub Dg x 2 get j add get c add put}if /l l 10 idiv D }for p 0 i GI} {/i ST length 1 sub D m {1 sub dup 0 ge{dup 26 mod c add 1 add ST i 3 -1 roll put 26 idiv dup 0 eq{pop exit}if}if /i i 1 sub D}loop ST i ST length i sub GI}ie} {m p cvs}ie} D /US {matrix currentmatrix matrix defaultmatrix matrix invertmatrix matrix concatmatrix transform} D /GB {Gb{US}if}D /Tl {/Rn E D Xc CP pop ne{ [/Rect [Xc 1 sub Yc cS 0.25 mul sub GB CP E 1 add E cS 0.85 mul add GB] /Subtype /Link /Border [0 0 Cf Lc and LX and AU or{0}{1}ie] Rn type /nametype eq {/Dest Rn}{/Action [/Subtype /URI /URI Rn] Cd}ie /ANN pdfmark}if} D /Il {/Rn E D [/Rect [Xc Yc GB Xc XS add Yc YS add GB] /Subtype /Link /Border [0 0 0] Rn type /nametype eq{/Dest Rn} {/Action [/Subtype /URI /URI Rn] Cd}ie /ANN pdfmark} D /XP {[{/Z Bz 2 div D Z 0 R Z Z RL Z neg Z RL Z neg Z neg RL Z Z neg RL Fi cH 1 eq and{fill}if} {Bz 0 RL 0 Bz RL Bz neg 0 RL 0 Bz neg RL Fi cH 1 eq and{fill}if} {0 -5 R Bz 0 RL 0 21 RL Bz neg 0 RL 0 -21 RL}]} D /MS {/Sm E D WB}D /O {BN()0 Sm BX} D /BX {/Bt E D Bt 2 lt{/Ch E D CS 0.8 mul}{11 mul}ie W XO sub MR sub 2 copy gt{E}if pop /HZ E D Bt 2 eq{Fi not{pop()}if ( )E join /Ft E D TT /PF t D /MW 1 D /Li 1 D /Fw Ft SW pop D Fw HZ gt{/HZ Fw 8 add D}if HZ ST cvs( )join}{WB Ch ST cvs( )join}ie L1 HZ add XO add MR add W gt{NL}if Bt 2 eq{Ft ES Fw neg HM{CS sub}if Pd}if Bt ST cvs join( Bx )join Bt 2 eq HM and{CS Pd}if C1 E join /C1 E D /L1 L1 HZ add D /T f D ( ) Pd /PF f D Bt 2 lt{YA CS .8 mul lt{/YA CS .8 mul D}if} {YB 5 lt{/YB 5 D}if YA 21 lt{/YA 21 D}if}ie /CI 0 D} D /Bx {dup 2 eq{E /Bz E D}{E /cH E D /Bz CS .8 mul D}ie OU {gsave 0 Sg XP E get exec stroke grestore}{pop}ie Bz 0 R /Ms t D}D /SD {FD 4 mul Dy add DZ NF newpath 0 0 M DX t charpath pathbbox 3 -1 roll sub /DY E D E dup /X1 E D sub WM mul WX DY mul add WM DG mul E div /DF E D /DR WX DF mul DY mul WM div 2 div D} d /Sd {gsave 0 IL Di mul neg translate IL IW atan Di 0 eq{neg}if rotate FD 4 mul Dy add DZ NF DR X1 sub DY 2 div neg M cD VC DX show grestore} d /Pt {/tp t D Tp{NP /Pn (TP) D 0 Tt neg R Th BN NP Ep ET RC ZF}if /tp f D} D /RC {/AI 0 D /LG 0 D /BC 0 D /UI 0 D /PF f D /Cc 0 D /cC 0 D /Dc 10 array D /NR [0 1 9{pop 0}for] D /La Ds D /AR 10 array D /TR 10 array D /AV 30 array D SI /AL -1 D /AT A0 D AT NA /OV 9 array D /Yo 0 D /Co 0 D /Io 0 D /Hy f D /Ph f D /CL -1 D Ct Sc}D /ZF {/FR [0 1 30{pop 0}for] D /SZ [0 1 30{pop 0}for] D /FO [0 1 30{pop 0}for] D /SL 0 D /CF 0 D /FN 0 D 0 Ts SF}D /QO [[(\234)(\233)(\253\240)(\232)(\273)(\253)][(')(`)(\253\240)(\231)(\273)(\253)]] D /QC [[(\234)(\234)(\240\273)(\233)(\253)(\273)][(')(')(\240\273)(`)(\253)(\273)]] D /Hf EF length 2 sub D /Hz EZ Hf get D /HS Ey Hf get D /Fz EZ Hf 1 add get D /Fs Ey Hf 1 add get D /LE IL D /Ps EZ 1 get D /Fp EF 1 get D /XO 0 D /YI 0 D /CI 0 D /FP 0 D /WW Ts 7 mul D /Mf 0 D /YA 0 D /YB 0 D /Cs Ts D /GS Ts D /F0 0 D /NS 0 D /NB 0 D /N 0 D /C0 [] D /C1 () D /Lo 0 D /L1 0 D /LM 0 D /PH 0 D /EC 0 D /Lh 0 D /LT 0 D /CH 1 string D /ST 16 string D /CA 9 array D /HC (\255) D /HM f D /PF f D /EN f D /TB f D /UF f D /sF f D /AE f D /AF f D /BP t D /CD f D /PA t D /GL f D /T t D /HF f D /AH f D /SA f D /PB f D /f1 f D /mF f D /OX 0 D /OY 0 D /FY 0 D /EO 0 D /FB 0 D /PL 0 D /Bw 0 D /PD -1 D /TP f D /tp f D /TH t D /Ty 4 D /Tn -1 D /Fl t D /LB t D /PM 1 D /Ms f D /Ba f D /Bb f D /Hl 3 D /hl 6 D /Hv 6 D /Hs f D /HI 0 D /hi 0 D /PO t D /TE f D /LF t D /BO 0 D /Sm 1 D /Bf 3 D /A1 0 D /A2 0 D /Ds 1 D /QL -1 D /Cb Db D /Ct Dt D /Cl Dl D /AX [24 24] D /AY [24 24] D /IX [0 1] D /IT [0 0] D /AZ [8 8] D /WS [24 24] D /FC [3 3] D /NI 1 D /BM 2 array D SB ffffffffffffffffffffffffffffffffffffffffffdededed6d6d6d6d6d6 d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6efefefffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c6c6c69c5252b52929ad3131b52929ad3131b52929ad3131b52929ad3131 ad3131ad9494efefefffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffb5b5b5a54a4aef0808f70000f70000f70000f70000 f70000f70000f70000f70000f70000c61818ad9494efefefffffffffffff ffffffffffffffffffffffffffffffefefefc6c6c6a53939ef0808f70000 f70000f70000f70000f70000f70000f70000f70000f70000f70000f70000 c61818a58484efefefffffffffffffffffffffffffffffffffffffc6c6c6 9c5a5aef0808f70000f70000f70000f70000f70000f70000f70000f70000 f70000f70000f70000f70000f70000c61818a5a5a5efefefffffffffffff ffffffffffffb5b5b5a53939ef0808f70000f70000f70000f70000f70000 f70000b50000940000d60000f70000f70000f70000f70000f70000f70000 c61818a58484efefefffffffffffffc6c6c6a54a4aef0808f70000f70000 f70000f70000f70000f70000bd00002900001000005a0000ef0808f70000 f70000f70000f70000f70000f70000c61818ad9494efefefdedede9c5252 ef0808f70000f70000f70000f70000f70000f70000f70000940000100000 100000290000d60000f70000f70000f70000f70000f70000f70000f70000 c61818b5a5a5d6d6d6ad3131f70000f70000f70000f70000f70000f70000 f70000f70000ad0000180000100000420000de0000f70000f70000f70000 f70000f70000f70000f70000ef0808947b7bd6d6d6b52929f70000f70000 f70000f70000f70000f70000f70000f70000c60000210000080000520000 ef0808f70000f70000f70000f70000f70000f70000f70000ef0808947b7b d6d6d6ad3131f70000f70000f70000f70000f70000f70000f70000f70000 de0000310000100000730000f70000f70000f70000f70000f70000f70000 f70000f70000ef0808947b7bd6d6d6b52929f70000f70000f70000f70000 f70000f70000f70000f70000e700004a00001000008c0000f70000f70000 f70000f70000f70000f70000f70000f70000ef0808947b7bd6d6d6ad3131 f70000f70000f70000f70000f70000f70000f70000f70000f70000520000 100000a50000f70000f70000f70000f70000f70000f70000f70000f70000 ef0808947b7bd6d6d6b52929f70000f70000f70000f70000f70000f70000 f70000f70000f700006b0000180000ad0000f70000f70000f70000f70000 f70000f70000f70000f70000ef0808947b7bd6d6d6ad3131f70000f70000 f70000f70000f70000f70000f70000f70000f70000bd0000840000d60000 f70000f70000f70000f70000f70000f70000f70000f70000ef0808947b7b d6d6d6b52929f70000f70000f70000f70000f70000f70000f70000f70000 e700007b0000520000ad0000f70000f70000f70000f70000f70000f70000 f70000f70000ef0808947b7bdededead3131f70000f70000f70000f70000 f70000f70000f70000f70000ad0000100000100000420000de0000f70000 f70000f70000f70000f70000f70000f70000ce2929a59494efefefb59c9c c61818f70000f70000f70000f70000f70000f70000f70000b50000210000 1000004a0000e70000f70000f70000f70000f70000f70000f70000d62929 9c7b7bdededeffffffefefefb59c9cc61818f70000f70000f70000f70000 f70000f70000f70000b50000840000ce0000f70000f70000f70000f70000 f70000f70000d62929a58484dededeffffffffffffffffffefefefad9494 c61010f70000f70000f70000f70000f70000f70000f70000f70000f70000 f70000f70000f70000f70000f70000e72121947b7bdededeffffffffffff fffffffffffffffffff7f7f7b5b5b5c61010f70000f70000f70000f70000 f70000f70000f70000f70000f70000f70000f70000f70000d62929947b7b efefefffffffffffffffffffffffffffffffffffffffffffefefefad9494 c61818f70000f70000f70000f70000f70000f70000f70000f70000f70000 f70000d62929a58484dededeffffffffffffffffffffffffffffffffffff ffffffffffffffffffefefefb59c9cc61818ef0808e70000ef0808e70000 ef0808e70000ef0808e70000ce2929947b7bdededeffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffff7f7f7bdadad 9c7b7b9c7b7b9c7b7b9c7b7b9c7b7b9c7b7b9c7b7b9c7b7ba59494dedede ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffbdbdbda5a5a5949494a5a5a5a5a5a5a5a5a5949494a5a5a5 cececeffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffefefefc6c6c68c8c8ca5a5a5d6d6d6e7e7e7efefef efefefefefefe7e7e7c6c6c6949494949494cececeffffffffffffffffff ffffffffffffffffffffffffffffffffffffe7e7e7949494a5a5a5dedede ffffffffffffffffffffffffffffffffffffffffffffffffffffffcecece 949494b5b5b5ffffffffffffffffffffffffffffffffffffffffffefefef a5a5a5b5b5b5ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffefefefa5a5a5bdbdbdffffffffffffffffff ffffffffffffefefef949494bdbdbdffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 949494bdbdbdffffffffffffffffffffffffcececea5a5a5ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffefefefa5a5a5dededeffffffffffffffffff a5a5a5dededeffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffcecece a5a5a5ffffffffffffcececea5a5a5ffffffffffffffffffffffffffffff c6c6c6bdbdbdb5b5b5bdbdbdb5b5b5bdbdbddededee7e7e7e7e7e7e7e7e7 e7e7e7e7e7e7ffffffffffffa5a5a5e7e7e7ffffffa5a5a5dededeefefef d6d6d6d6d6d6a5a5a58c8c8cb5b5b5cececedededed6d6d6cecece8c8c8c 848484a5a5a5a5a5a5a5a5a5a5a5a5949494949494e7e7e7b5b5b5cecece e7e7e7a5a5a5e7e7e7949494949494b5b5b5cececeffffffffffffe7e7e7 cecece949494c6c6c6cecece737373bdbdbddededededededededed6d6d6 949494cececededede949494e7e7e7a5a5a5d6d6d6949494e7e7e7ffffff ffffffffffffefefef9494946363635a5a5a4a4a4a5252527b7b7b949494 bdbdbdb5b5b5b5b5b5bdbdbdc6c6c6efefefe7e7e7949494dededea5a5a5 d6d6d6949494e7e7e7ffffffffffffffffffbdbdbd7b7b7bcececededede dededea5a5a5949494ffffffefefefffffffefefefffffffffffffffffff dedede949494e7e7e7a5a5a5dedede8c8c8ce7e7e7ffffffffffffefefef 949494737373949494b5b5b5bdbdbd8c8c8ca5a5a5ffffffffffffffffff ffffffffffffffffffffffffe7e7e7949494e7e7e7a5a5a5dedede949494 7b7b7ba5a5a5efefefefefef6b6b6b7b7b7bd6d6d6cececec6c6c67b7b7b dededeffffffffffffffffffffffffffffffffffffffffffe7e7e7a5a5a5 ffffffb5b5b5d6d6d6ffffffffffffb5b5b5949494cecece6b6b6bbdbdbd 8c8c8c737373636363bdbdbdffffffffffffffffffffffffffffffffffff ffffffffffffa5a5a5cececeffffffd6d6d6a5a5a5ffffffffffffefefef c6c6c67b7b7b525252737373949494848484c6c6c6ffffffffffffffffff ffffffffffffffffffffffffffffffefefefa5a5a5efefefffffffffffff a5a5a5cececeffffffffffffffffffdededee7e7e7dededee7e7e7dedede ffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdbd bdbdbdffffffffffffffffffd6d6d6a5a5a5e7e7e7ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffcececea5a5a5efefefffffffffffffffffffffffffb5b5b5 a5a5a5ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff8c8c8ccececeffffffffffff ffffffffffffffffffffffffbdbdbd949494efefefffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffcecece8c8c8c cececeffffffffffffffffffffffffffffffffffffffffffffffffb5b5b5 949494c6c6c6efefefffffffffffffffffffffffffffffffffffffffffff e7e7e7b5b5b5949494c6c6c6ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffd6d6d6a5a5a58c8c8ca5a5a5dededededede e7e7e7dededecececea5a5a58c8c8cb5b5b5e7e7e7ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff dededececece949494949494949494949494a5a5a5cececeefefefffffff ffffffffffffffffffffffffffffffffffff [/Creator (html2ps version 1.0 beta5) /Author () /Keywords () /Subject () /Title (HOWTO du routage avancé et du contrôle de trafic sous Linux) /DOCINFO pdfmark /ND 1 D /HN [1 1 335{pop (??)}for] D /h0 [()(Table of Contents)] D /h1 [(1\240\240)(HOWTO du routage avanc\351 et du contr\364le de trafic sous Linux)] D /h2 [(1.0.1\240\240)(Bert Hubert)] D /h3 [(1.0.2\240\240)(Laurent Foucher)] D /h4 [(1.1\240\240)(Chapitre\2401.\240D\351dicace)] D /h5 [(1.2\240\240)(Chapitre\2402.\240Introduction)] D /h6 [(1.3\240\240)(1.\240Conditions de distribution et Mise en garde)] D /h7 [(1.4\240\240)(2.\240Connaissances pr\351alables)] D /h8 [(1.5\240\240)(3.\240Ce que Linux peut faire pour vous)] D /h9 [(1.6\240\240)(4.\240Notes diverses)] D /h10 [(1.7\240\240)(5.\240Acc\350s, CVS et propositions de mises \340 jour)] D /h11 [(1.8\240\240)(6.\240Liste de diffusion)] D /h12 [(1.9\240\240)(7.\240Plan du document)] D /h13 [(1.10\240\240)(Chapitre\2403.\240Introduction \340 iproute2)] D /h14 [(1.11\240\240)(1.\240Pourquoi iproute2\240?)] D /h15 [(1.12\240\240)(2.\240Un tour d'horizon d'iproute2)] D /h16 [(1.13\240\240)(3.\240Pr\351requis)] D /h17 [(1.14\240\240)(4.\240Explorer votre configuration courante)] D /h18 [(1.14.1\240\240)(4.1.\240ip nous montre nos liens)] D /h19 [(1.14.2\240\240)(4.2.\240ip nous montre nos adresses IP)] D /h20 [(1.14.3\240\240)(4.3.\240ip nous montre nos routes)] D /h21 [(1.15\240\240)(5.\240ARP)] D /h22 [(1.16\240\240)(Chapitre\2404.\240R\350gles - bases de donn\351es des politiques de routage)] D /h23 [(1.17\240\240)(1.\240Politique de routage simple par l'adresse source)] D /h24 [(1.18\240\240)(2.\240Routage avec plusieurs acc\350s Internet/fournisseurs d'acc\350s)] D /h25 [(1.18.1\240\240)(2.1.\240Acc\350s s\351par\351)] D /h26 [(1.18.2\240\240)(2.2.\240Balance de charge)] D /h27 [(1.19\240\240)(Chapitre\2405.\240GRE et autres tunnels)] D /h28 [(1.20\240\240)(1.\240Quelques remarques g\351n\351rales \340 propos des tunnels\240:)] D /h29 [(1.21\240\240)(2.\240IP dans un tunnel IP)] D /h30 [(1.22\240\240)(3.\240Le tunnel GRE)] D /h31 [(1.22.1\240\240)(3.1.\240Le tunnel IPv4)] D /h32 [(1.22.2\240\240)(3.2.\240Le tunnel IPv6)] D /h33 [(1.23\240\240)(4.\240Tunnels dans l'espace utilisateur)] D /h34 [(1.24\240\240)(Chapitre\2406.\240Tunnel IPv6 avec Cisco et/ou une dorsale IPv6 \(6bone\))] D /h35 [(1.25\240\240)(1.\240Tunnel IPv6)] D /h36 [(1.26\240\240)(Chapitre\2407.\240IPSEC: IP s\351curis\351 \340 travers Internet)] D /h37 [(1.27\240\240)(1.\240Introduction sur la gestion manuelle des cl\351s)] D /h38 [(1.28\240\240)(2.\240Gestion automatique des cl\351s)] D /h39 [(1.28.1\240\240)(2.1.\240Th\351orie)] D /h40 [(1.28.2\240\240)(2.2.\240Exemple)] D /h41 [(1.28.2.1\240\240)(2.2.1.\240Probl\350mes et d\351fauts connus)] D /h42 [(1.28.3\240\240)(2.3.\240Gestion automatique des cl\351s en utilisant les certificats X.509)] D /h43 [(1.28.3.1\240\240)(2.3.1.\240Construire un certificat X.509 pour votre h\364te)] D /h44 [(1.28.3.2\240\240)(2.3.2.\240Configuration et lancement)] D /h45 [(1.28.3.3\240\240)(2.3.3.\240Comment configurer des tunnels s\351curis\351s)] D /h46 [(1.29\240\240)(3.\240tunnels IPSEC)] D /h47 [(1.30\240\240)(4.\240Autre logiciel IPSEC)] D /h48 [(1.31\240\240)(5.\240Interop\351rabilit\351 d'IPSEC avec d'autres syst\350mes)] D /h49 [(1.31.1\240\240)(5.1.\240Windows)] D /h50 [(1.31.2\240\240)(5.2.\240 Check Point VPN-1 NG)] D /h51 [(1.32\240\240)(Chapitre\2408.\240Routage multidistribution \(multicast\))] D /h52 [(1.33\240\240)(Chapitre\2409.\240Gestionnaires de mise en file d'attente pour l'administration de la bande passante)] D /h53 [(1.34\240\240)(1.\240Explication sur les files d'attente et la gestion de la mise en file d'attente)] D /h54 [(1.35\240\240)(2.\240Gestionnaires de mise en file d'attente simples, sans classes)] D /h55 [(1.35.1\240\240)(2.1.\240pfifo_fast)] D /h56 [(1.35.1.1\240\240)(2.1.1.\240Param\350tres & usage)] D /h57 [(1.35.2\240\240)(2.2.\240Filtre \340 seau de jetons \(Token Bucket Filter\))] D /h58 [(1.35.2.1\240\240)(2.2.1.\240Param\350tres & usage)] D /h59 [(1.35.2.2\240\240)(2.2.2.\240Configuration simple)] D /h60 [(1.35.3\240\240)(2.3.\240Mise en file d'attente stochastiquement \351quitable \(Stochastic Fairness Queueing\))] D /h61 [(1.35.3.1\240\240)(2.3.1.\240Param\350tres & usage)] D /h62 [(1.35.3.2\240\240)(2.3.2.\240Configuration simple)] D /h63 [(1.36\240\240)(3.\240Conseils pour le choix de la file d'attente)] D /h64 [(1.37\240\240)(4.\240terminologie)] D /h65 [(1.38\240\240)(5.\240Gestionnaires de file d'attente bas\351s sur les classes)] D /h66 [(1.38.1\240\240)(5.1.\240Flux \340 l'int\351rieur des gestionnaires bas\351s sur des classes & \340 l'int\351rieur des classes)] D /h67 [(1.38.2\240\240)(5.2.\240La famille des gestionnaires de mise en file d'attente\240: racines, descripteurs, descendances et parents)] D /h68 [(1.38.2.1\240\240)(5.2.1.\240Comment les filtres sont utilis\351s pour classifier le trafic)] D /h69 [(1.38.2.2\240\240)(5.2.2.\240Comment les paquets sont retir\351s de la file d'attente et envoy\351s vers le mat\351riel)] D /h70 [(1.38.3\240\240)(5.3.\240Le gestionnaire de mise en file d'attente PRIO)] D /h71 [(1.38.3.1\240\240)(5.3.1.\240Param\350tres PRIO & usage)] D /h72 [(1.38.3.2\240\240)(5.3.2.\240Configuration simple)] D /h73 [(1.38.4\240\240)(5.4.\240Le c\351l\350bre gestionnaire de mise en file d'attente CBQ)] D /h74 [(1.38.4.1\240\240)(5.4.1.\240Mise en forme CBQ en d\351tail)] D /h75 [(1.38.4.2\240\240)(5.4.2.\240Le comportement CBQ classful)] D /h76 [(1.38.4.3\240\240)(5.4.3.\240Param\350tres CBQ qui d\351terminent le partage & le pr\352t du lien)] D /h77 [(1.38.4.4\240\240)(5.4.4.\240Configuration simple)] D /h78 [(1.38.4.5\240\240)(5.4.5.\240D'autres param\350tres CBQ\240: split & defmap)] D /h79 [(1.38.5\240\240)(5.5.\240Seau de jetons \340 contr\364le hi\351rarchique \(Hierarchical Token Bucket\))] D /h80 [(1.38.5.1\240\240)(5.5.1.\240Configuration simple)] D /h81 [(1.39\240\240)(6.\240Classifier des paquets avec des filtres)] D /h82 [(1.39.1\240\240)(6.1.\240Quelques exemples simples de filtrage)] D /h83 [(1.39.2\240\240)(6.2.\240Toutes les commandes de filtres dont vous aurez normalement besoin)] D /h84 [(1.40\240\240)(7.\240Le p\351riph\351rique de file d'attente interm\351diaire \(The Intermediate queueing device \(IMQ\)\))] D /h85 [(1.40.1\240\240)(7.1.\240Configuration simple)] D /h86 [(1.41\240\240)(Chapitre\24010.\240\311quilibrage de charge sur plusieurs interfaces)] D /h87 [(1.42\240\240)(1.\240Avertissement)] D /h88 [(1.43\240\240)(Chapitre\24011.\240Netfilter et iproute - marquage de paquets)] D /h89 [(1.44\240\240)(Chapitre\24012.\240Filtres avanc\351s pour la \(re-\)classification des paquets)] D /h90 [(1.45\240\240)(1.\240Le classificateur u32)] D /h91 [(1.45.1\240\240)(1.1.\240Le s\351lecteur U32)] D /h92 [(1.45.2\240\240)(1.2.\240S\351lecteurs g\351n\351raux)] D /h93 [(1.45.3\240\240)(1.3.\240Les s\351lecteurs sp\351cifiques)] D /h94 [(1.46\240\240)(2.\240Le classificateur route)] D /h95 [(1.47\240\240)(3.\240Les filtres de r\351glementation \(Policing filters\))] D /h96 [(1.47.1\240\240)(3.1.\240Techniques de r\351glementation)] D /h97 [(1.47.1.1\240\240)(3.1.1.\240Avec l'estimateur du noyau)] D /h98 [(1.47.1.2\240\240)(3.1.2.\240Avec le Token Bucket Filter)] D /h99 [(1.47.2\240\240)(3.2.\240Actions de d\351passement de limite \(Overlimit actions\))] D /h100 [(1.47.3\240\240)(3.3.\240Exemples)] D /h101 [(1.48\240\240)(4.\240Filtres hach\351s pour un filtrage massif tr\350s rapide)] D /h102 [(1.49\240\240)(5.\240Filtrer le trafic IPv6)] D /h103 [(1.49.1\240\240)(5.1.\240Comment se fait-il que ces filtres tc IPv6 ne fonctionnent pas\240?)] D /h104 [(1.49.2\240\240)(5.2.\240Marquer les paquets IPv6 en utilisant ip6tables)] D /h105 [(1.49.3\240\240)(5.3.\240Utiliser le s\351lecteur u32 pour rep\351rer le paquet IPv6)] D /h106 [(1.50\240\240)(Chapitre\24013.\240Param\350tres r\351seau du noyau)] D /h107 [(1.51\240\240)(1.\240Filtrage de Chemin Inverse \(Reverse Path Filtering\))] D /h108 [(1.52\240\240)(2.\240Configurations obscures)] D /h109 [(1.52.1\240\240)(2.1.\240ipv4 g\351n\351rique)] D /h110 [(1.52.2\240\240)(2.2.\240Configuration des p\351riph\351riques)] D /h111 [(1.52.3\240\240)(2.3.\240Politique de voisinage)] D /h112 [(1.52.4\240\240)(2.4.\240Configuration du routage)] D /h113 [(1.53\240\240)(Chapitre\24014.\240Gestionnaires de mise en file d'attente avanc\351s & moins communs)] D /h114 [(1.54\240\240)(1.\240bfifo/pfifo)] D /h115 [(1.54.1\240\240)(1.1.\240Param\350tres & usage)] D /h116 [(1.55\240\240)(2.\240Algorithme Clark-Shenker-Zhang \(CSZ\))] D /h117 [(1.56\240\240)(3.\240DSMARK)] D /h118 [(1.56.1\240\240)(3.1.\240Introduction)] D /h119 [(1.56.2\240\240)(3.2.\240A quoi DSMARK est-il reli\351\240?)] D /h120 [(1.56.3\240\240)(3.3.\240Guide des services diff\351renci\351s)] D /h121 [(1.56.4\240\240)(3.4.\240Travailler avec DSMARK)] D /h122 [(1.56.5\240\240)(3.5.\240Comment SCH_DSMARK travaille.)] D /h123 [(1.56.6\240\240)(3.6.\240Le filtre TC_INDEX)] D /h124 [(1.57\240\240)(4.\240Gestionnaire de mise en file d'attente d'entr\351e \(Ingress qdisc\))] D /h125 [(1.57.1\240\240)(4.1.\240Param\350tres & usage)] D /h126 [(1.58\240\240)(5.\240Random Early Detection \(RED\))] D /h127 [(1.59\240\240)(6.\240Generic Random Early Detection)] D /h128 [(1.60\240\240)(7.\240Emulation VC/ATM)] D /h129 [(1.61\240\240)(8.\240Weighted Round Robin \(WRR\))] D /h130 [(1.62\240\240)(Chapitre\24015.\240Recettes de cuisine)] D /h131 [(1.63\240\240)(1.\240Faire tourner plusieurs sites avec diff\351rentes SLA \(autorisations\))] D /h132 [(1.64\240\240)(2.\240Prot\351ger votre machine des inondations SYN)] D /h133 [(1.65\240\240)(3.\240Limiter le d\351bit ICMP pour emp\352cher les d\351nis de service)] D /h134 [(1.66\240\240)(4.\240Donner la priorit\351 au trafic interactif)] D /h135 [(1.67\240\240)(5.\240Cache web transparent utilisant netfilter, iproute2, ipchains et squid)] D /h136 [(1.67.1\240\240)(5.1.\240Sch\351ma du trafic apr\350s l'impl\351mentation)] D /h137 [(1.68\240\240)(6.\240Circonvenir aux probl\350mes de la d\351couverte du MTU de chemin en configurant un MTU par routes)] D /h138 [(1.68.1\240\240)(6.1.\240Solution)] D /h139 [(1.69\240\240)(7.\240Circonvenir aux probl\350mes de la d\351couverte du MTU de chemin en imposant le MSS \(pour les utilisateurs de l'ADSL, du c\342ble, de PPPoE & PPtP\))] D /h140 [(1.70\240\240)(8.\240Le Conditionneur de Trafic Ultime\240: Faible temps de latence, T\351l\351chargement vers l'amont et l'aval rapide)] D /h141 [(1.70.1\240\240)(8.1.\240Pourquoi cela ne marche t-il pas bien par d\351faut\240?)] D /h142 [(1.70.2\240\240)(8.2.\240Le script \(CBQ\))] D /h143 [(1.70.3\240\240)(8.3.\240Le script \(HTB\))] D /h144 [(1.71\240\240)(9.\240Limitation du d\351bit pour un h\364te ou un masque de sous-r\351seau)] D /h145 [(1.72\240\240)(10.\240Exemple d'une solution de traduction d'adresse avec de la QoS)] D /h146 [(1.72.1\240\240)(10.1.\240Commen\347ons l'optimisation de cette rare bande passante)] D /h147 [(1.72.2\240\240)(10.2.\240Classification des paquets)] D /h148 [(1.72.3\240\240)(10.3.\240Am\351liorer notre configuration)] D /h149 [(1.72.4\240\240)(10.4.\240Rendre tout ceci actif au d\351marrage)] D /h150 [(1.73\240\240)(Chapitre\24016.\240Construire des ponts et des pseudo ponts avec du Proxy ARP)] D /h151 [(1.74\240\240)(1.\240Etat des ponts et iptables)] D /h152 [(1.75\240\240)(2.\240Pont et mise en forme)] D /h153 [(1.76\240\240)(3.\240Pseudo-pont avec du Proxy-ARP)] D /h154 [(1.76.1\240\240)(3.1.\240ARP & Proxy-ARP)] D /h155 [(1.76.2\240\240)(3.2.\240Impl\351mentez-le)] D /h156 [(1.77\240\240)(Chapitre\24017.\240Routage Dynamique - OSPF et BGP)] D /h157 [(1.78\240\240)(1.\240Configurer OSPF avec Zebra)] D /h158 [(1.78.1\240\240)(Pedro Larroy Tovar)] D /h159 [(1.78.2\240\240)(1.1.\240Pr\351requis)] D /h160 [(1.78.3\240\240)(1.2.\240Configurer Zebra)] D /h161 [(1.78.4\240\240)(1.3.\240Ex\351cuter Zebra)] D /h162 [(1.79\240\240)(2.\240Configurer BGP4 avec Zebra)] D /h163 [(1.79.1\240\240)(2.1.\240sch\351ma r\351seau \(Exemple\))] D /h164 [(1.79.2\240\240)(2.2.\240Configuration \(Exemple\))] D /h165 [(1.79.3\240\240)(2.3.\240V\351rification de la configuration)] D /h166 [(1.80\240\240)(Chapitre\24018.\240Autres possibilit\351s)] D /h167 [(1.81\240\240)(Chapitre\24019.\240Lectures suppl\351mentaires)] D /h168 [(1.82\240\240)(Chapitre\24020.\240Remerciements)] D /Hr [167 -168 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334]D /HV [1 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 2 2 2 2 3 3 2 2 2 2 3 3 2 2 2 2 2 2 3 3 4 3 4 4 4 2 2 2 3 3 2 2 2 2 3 4 3 4 4 3 4 4 2 2 2 3 3 4 4 3 4 4 3 4 4 4 4 4 3 4 2 3 3 2 3 2 2 2 2 2 3 3 3 2 2 3 4 4 3 3 2 2 3 3 3 2 2 2 3 3 3 3 2 2 3 2 2 3 3 3 3 3 3 2 3 2 2 2 2 2 2 2 2 2 2 3 2 3 2 2 3 3 3 2 2 3 3 3 3 2 2 2 2 3 3 2 2 3 3 3 3 2 3 3 3 2 2 2]D /Cn [83 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 2 0 0 0 0 0 2 0 0 0 0 0 0 0 3 0 1 0 3 0 0 0 0 0 2 0 0 0 0 0 3 1 0 2 0 0 2 0 0 0 0 5 0 2 0 0 2 0 0 5 0 0 0 0 0 1 0 2 0 0 1 0 0 0 0 0 3 0 0 0 0 3 2 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 1 0 0 6 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 3 0 0 0 0 4 0 0 0 0 0 0 0 2 0 0 0 4 0 0 0 0 3 0 0 0 0 0 0]D Hr length 0 gt{[/PageMode /UseOutlines /DOCVIEW pdfmark}if /Hn 1 D 0 1 Hr length 1 sub{ /Bn E D [Cn Bn get dup 0 gt{/Count E HV Bn get Bl ge{neg}if}{pop}ie /Dest Hr Bn get dup abs ST cvs cvn E 0 ge{(h)Hn ST cvs join cvx exec dup 1 get E Nf{0 get E join}{pop}ie /Hn Hn 1 add D}{()}ie /Title E dup length 255 gt{0 255 getinterval}if /OUT pdfmark}for ZF /FN Fp D Ps 0 FS /WC Wf{( )}{}ie SW pop D ET RC ZF /Df f D /R1 (http://netfilter.samba.org/unreliable-guides/networking-concepts-HOWTO/index.html) D /R2 (http://www.linuxports.com/howto/networking) D /R3 (http://www.ds9a.nl/lartc) D /R4 (http://mailman.ds9a.nl/mailman/listinfo/lartc) D /R5 (http://netfilter.samba.org/unreliable-guides/) D /R6 (ftp://ftp.inr.ac.ru/ip-routing/iproute2-current.tar.gz) D /R7 (http://www.faqs.org/rfcs/rfc826.html) D /R8 (http://www.ssi.bg/~ja/#routes) D /R9 (http://www.freeswan.org/) D /R10 (http://www.freeswan.ca/) D /R11 (http://www.edlug.ed.ac.uk/archive/Sep2002/msg00244.html) D /R12 (http://lists.freeswan.org/pipermail/design/2002-November/003901.html) D /R13 (http://www.freeswan.ca/code/old/freeswan-Snapshot/doc/index.html) D /R14 (http://www.freeswan.org/doc.html) D /R15 (http://gondor.apana.org.au/~herbert/freeswan/) D /R16 (http://sourceforge.net/projects/ipsec-tools) D /R17 (http://ds9a.nl/ipsec/racoon.bz2) D /R18 (http://bender.thinknerd.de/~thomas/IPsec/isakmpd-linux.html) D /R19 (http://www.openbsd.org/cgi-bin/cvsweb/src/sbin/isakmpd/) D /R20 (http://www.openbsd.org/anoncvs.html) D /R21 (http://bender.thinknerd.de/~thomas/IPsec/isakmpd.tgz) D /R22 (http://www.fw-1.de/aerasec/ng/vpn-racoon/CP-VPN1-NG-Linux-racoon.html) D /R23 (http://www.ietf.org/internet-drafts/draft-ietf-diffserv-model-04.txt) D /R24 (http://luxik.cdi.cz/~devik/qos/htb/) D /R25 (http://luxik.cdi.cz/~patrick/imq/) D /R26 (http://netfilter.filewatcher.org/) D /R27 (http://lists.samba.org/pipermail/netfilter/2000-November/006089.html) D /R28 (http://www.isi.edu/div7/rsvp/overview.html) D /R29 (http://ipsysctl-tutorial.frozentux.net/) D /R30 (http://www.ietf.org/rfc/rfc1122.txt) D /R31 (http://mailman.ds9a.nl/pipermail/lartc/2002q1/002667.html) D /R32 (ftp://icaftp.epfl.ch/pub/linux/diffserv/misc/dsid-01.txt.gz) D /R33 (http://www.qosforum.com/white-papers/qosprot_v3.pdf) D /R34 (http://www.qosforum.com/docs/faq) D /R35 (http://www.ietf.org/html.charters/diffserv-charter.html) D /R36 (http://diffserv.sf.net/) D /R37 (http://www.aciri.org/floyd/papers/red/red.html) D /R38 (http://www.davin.ottawa.on.ca/ols/img22.htm) D /R39 (http://linux-atm.sourceforge.net/) D /R40 (http://wipl-wrr.dkik.dk/wrr/) D /R41 (http://squid.nlanr.net/) D /R42 (http://omega.resa.es/piotr/files/packetfilter.tar.bz2) D /R43 (http://bridge.sourceforge.net/) D /R44 (http://www.cisco.com/univercd/cc/td/doc/cisintwk/idg4/nd2003.htm) D /R45 (http://www.cisco.com/univercd/cc/td/doc/cisintwk/ics/icsbgp4.htm) D /R46 (http://www.zebra.org/) D /R47 (http://www.soi.wide.ad.jp/class/99007/slides/13/07.html) D /R48 (http://scry.wanfear.com/~greear/vlan.html) D /R49 (ftp://ftp.netlab.ohio-state.edu/pub/jain/courses/cis788-97/virtual_lans/index.htm) D /R50 (http://vlan.sourceforge.net/) D /R51 (http://scry.wanfear.com/~greear/vlan/cisco_howto.html) D /R52 (http://www.LinuxVirtualServer.org/) D /R53 (ftp://ftp.equinox.gu.net/pub/linux/cbq/) D /R54 (http://www.chronox.de/) D /R55 (http://w3.arobas.net/~jetienne/vrrpd/index.html) D /R56 (http://snafu.freedom.org/linux2.2/iproute-notes.html) D /R57 (http://www.davin.ottawa.on.ca/ols/) D /R58 (http://defiant.coinet.com/iproute2/ip-cref/) D /R59 (http://www.aciri.org/floyd/cbq.html) D /R60 (http://ceti.pl/~ekravietz/cbq/NET4_tc.html) D /R61 (http://www.cisco.com/univercd/cc/td/doc/product/software/ios111/cc111/car.htm) D /TS { tables E get /table E D table aload pop /rdesc E D /cdesc E D /tdesc E D tdesc aload pop /capalg E D /caption E D /rules E D /frame E D /nfoot E D /nhead E D /ncol E D /nrow E D /border E D /twid E D /units E D /talign E D /flow E D /clear E D /tclass E D pop pop /w W D /eps 0.1 D /OU f D /PL 1 D /FN EF 21 get D EZ 21 get Ey 21 get FS 0 1 1{ /pass E D 0 1 nrow{ /irow E D /cells rdesc irow get 6 get D 0 1 ncol{ /icol E D /cell cells icol get D cell 0 ne{ cell aload pop /ang E D /CB E D pop pop pop /DV E D /bot E D /top E D /right E D /left E D /nowrap E D /valign E D /dp E D /align E D /rspan E D /cspan E D /cclass E D /ctype E D /cmax E D /cmin E D /proc E D rspan 0 eq{/rspan nrow irow sub 1 add D}if cspan 0 eq{/cspan ncol icol sub 1 add D}if pass 0 eq cspan 1 eq and pass 1 eq cspan 1 gt and or{ /W 1e5 D /LL W D /PH 1 D ctype 1 eq{() BD}if RC align NA AT 4 eq{/CD t D /DC dp D /LN 0 D /M1 0 D /M2 0 D}{/CD f D}ie 0 0 M /LM 0 D proc exec BN AT 4 eq{ LN array astore cell 15 3 -1 roll put cdesc icol get dup dup 5 get M1 lt{5 M1 put}{5 get /M1 E D}ie dup 6 get M2 lt{6 M2 put}{6 get /M2 E D}ie /LM M1 M2 add D }if /CD f D ang 0 ne{/LM CP E pop neg D}if /thiswid LM left add right add eps add D /oldmin 0 D /oldmax 0 D 0 1 cspan 1 sub{ icol add cdesc E get dup 2 get /oldmax E oldmax add D 1 get /oldmin E oldmin add D }for thiswid oldmax ge{ 0 1 cspan 1 sub{ icol add cdesc E get dup 2 E 2 get oldmax 0 eq {pop thiswid cspan div}{thiswid mul oldmax div}ie put }for }if nowrap 1 eq{ thiswid oldmin ge{ 0 1 cspan 1 sub{ icol add cdesc E get dup 1 E 1 get oldmin 0 eq {pop thiswid cspan div}{thiswid mul oldmin div}ie put }for }if }{ /W 0 D /LL W D /PH 2 D ctype 1 eq{() ES () BD}if 0 0 M /LM 0 D RC proc exec BN /thiswid LM left add right add eps add D thiswid oldmin ge{ 0 1 cspan 1 sub{ icol add cdesc E get dup 1 E 1 get oldmin 0 eq {pop thiswid cspan div}{thiswid mul oldmin div}ie put }for }if }ie ctype 1 eq{() ES}if }if }if }for }for }for /tmin 0 D /tmax 0 D 0 1 ncol{ cdesc E get dup 1 get E 2 get 2 copy gt{pop dup}if tmax add /tmax E D tmin add /tmin E D }for twid 0 lt{twid neg IW gt{IW neg}{twid}ie /twid E D}if tdesc 0 twid neg tmin 2 copy lt{E}if pop put tdesc 1 twid neg tmax 2 copy lt{E}if pop put /W w D /LL W D /OU t D /PH 0 D /PL 0 D } D /PT { /PL PL 1 add D tables E get /table E D Tm 21 get Ts mul BE PL 2 ge{save}if /SL SL 1 add D /FN EF 21 get D EZ 21 get Ey 21 get FS table aload pop /rdesc E D /cdesc E D /tdesc E D tdesc aload pop /capalg E D /caption E D /rules E D /frame E D /nfoot E D /nhead E D /ncol E D /nrow E D /border E D /twid E D /units E D /talign E D /flow E D /clear E D /tclass E D /tmax E D /tmin E D /w W D /xo XO D /mr MR D /ll LL D /lg LG D /ai AI D /bc BC D /nr NR D /ar AR D /tr TR D /ui UI D /ph PH D /a0 A0 D /pf PF D /at AT D /av AV D /al AL D /Le LE D /la La D talign 0 lt{/talign AL 0 gt{AV AL get}{A0 2 le{A0}{0}ie}ie D}if ph 1 eq ph 2 eq or{ NL ph 1 eq{tmax}{tmin}ie dup XO add LM gt{/LM E XO add D}{pop}ie LM E }{ /PH 3 D /LE 1e5 D RC %ZF border 0 gt{/border 1 D}if /twidth 0 D /avail W xo sub D twid 0 eq{0 1 ncol{cdesc E get dup 2 get E 3 get dup 0 gt{div neg dup twid lt {/twid E D}{pop}ie}{pop pop}ie}for}if /twid twid dup 0 lt{neg avail 2 copy gt{E}if pop}{avail mul}ie D /OK t D 0 1 ncol{cdesc E get dup 1 get E 3 get twid mul gt{/OK f D}if}for 0 1 ncol{ cdesc E get dup 1 get /colmin E D dup 3 get /cwid E twid mul D dup tmax avail le{2 get}if tmin avail le tmax avail gt and{ dup 2 get E 1 get dup 3 1 roll sub avail tmin sub mul tmax tmin sub div add }if tmin avail gt{1 get}if 0 E colmin cwid lt OK and{pop cwid}if dup /twidth E twidth add D put }for /OU f D CP tmin twid le{ 0 1 ncol{cdesc E get dup 0 get twidth div twid mul 0 E put}for /twidth twid D }if CP printcap CP E pop sub /caphig E D pop 0 1 1{ /pass E D 0 1 nrow{ /irow E D /cells rdesc irow get 6 get D 0 1 ncol{ /icol E D /cell cells icol get D cell 0 ne{ cell aload pop /ang E D /CB E D pop pop pop /DV E D /bot E D /top E D /right E D /left E D /nowrap E D /valign E D /dp E D /align E D /rspan E D /cspan E D /cclass E D /ctype E D /cmax E D /cmin E D /proc E D rspan 0 eq{/rspan nrow irow sub 1 add D}if cspan 0 eq{/cspan ncol icol sub 1 add D}if /W 0 D 0 1 cspan 1 sub{icol add cdesc E get 0 get /W E W add D}for pass 0 eq rspan 1 eq and pass 1 eq rspan 1 gt and or{ ctype 1 eq{() BD}if /W W left sub right sub D /XO 0 D /EO 0 D SI /A0 align D RC align NA AT 4 eq{ /DC dp D /DO 0 D /ID 1 D 0 1 DV length 1 sub{DV E get dup DO gt{/DO E D}{pop}ie}for /Lo DO DV 0 get sub D /L1 Lo D }if 0 0 M /BP t D /Fl t D /MF 0 D /FB 0 D proc exec T not{/CI 0 D}if BN 0 FB neg R MF 0 eq{/MF CS D}if CP /thishig E neg bot add top add CI add D pop ang 0 ne{/thishig LM bot add top add D}if cell 16 MF put cell 17 Ya put cell 18 thishig put valign 4 eq{ /below thishig Ya sub D rdesc irow get dup dup 4 get Ya lt {4 Ya put}{4 get /Ya E D}ie dup 5 get below lt{5 below put}{5 get /below E D}ie /thishig Ya below add D }if ctype 1 eq{()ES}if /oldhig 0 D 0 1 rspan 1 sub{ irow add rdesc E get 0 get /oldhig E oldhig add D }for thishig oldhig ge{ 0 1 rspan 1 sub{ irow add rdesc E get dup 0 E 0 get oldhig 0 eq {pop thishig rspan div}{thishig mul oldhig div}ie put }for }if }if }if }for }for }for M RC %ZF /thight 0 D /racc 0 D /maxh 0 D /brk 0 D /rbeg nhead nfoot add D 0 1 nrow{ rdesc E get dup 0 get dup /thight E thight add D brk 0 eq{/racc E D}{/racc E racc add D}ie racc maxh gt{/maxh racc D}if 2 get /brk E D }for ph 3 ge{thight caphig add E}if ph 0 eq ph 4 eq or{ /PH 4 D /LE Le D /OU Ou D /yoff 0 D /headsz 0 D 0 1 nhead 1 sub{rdesc E get 0 get headsz add /headsz E D}for /footsz 0 D 0 1 nfoot 1 sub{rdesc E nhead add get 0 get footsz add /footsz E D}for /ahig LE BO add MI add D /maxh maxh headsz add footsz add D /thight thight headsz add footsz add D tmin avail gt maxh ahig gt or {/Sf avail tmin div dup ahig maxh div gt{pop ahig maxh div}if D /SA t D} {/Sf 1 D}ie tclass 1 eq thight LE 15 sub gt and {/SA t D LE 15 sub thight div dup Sf lt{/Sf E D}{pop}ie}if SA{Sf Sf scale /ll ll Sf div D /xo xo Sf div D /LE LE Sf div D /mr mr Sf div D /BO BO Sf div D /ahig ahig Sf div D}if nhead nfoot add getwid LE CP E pop add capalg 0 eq{caphig sub}if bT{f}{dup thight lt thight ahig lt and}ie E headsz sub footsz sub rwid lt or{NP}if capalg 0 eq{printcap -8 SP}if CP /ycur E D pop printhead rbeg 1 nrow{/row E D row getwid ycur yoff add rwid sub footsz sub LE add 0 lt {nfoot 0 gt{printfoot}if Tf NP /rbeg irow1 D Ba{MI /MI MI SA{Sf div}if D MI SP /MI E D}if CP /ycur E D pop /yoff 0 D printhead}if irow1 printrow }for printfoot /row row 1 add D Tf 0 ycur yoff add M capalg 1 eq{/EO 0 D SI -3 SP printcap}if Sf 1 lt{1 Sf div dup scale /ll ll Sf mul D /xo xo Sf mul D /LE LE Sf mul D /mr mr Sf mul D /BO BO Sf mul D /SA f D}if /EO 0 D }if }ie /W w D /XO xo D /MR mr D /LL ll D /LG lg D /AI ai D /BC bc D /NR nr D /AR ar D /TR tr D /UI ui D /PH ph D /A0 a0 D /PF pf D /AT at D /AV av D /AL al D /La la D /SL SL 1 sub NN D /CF 0 D /FN 0 D SZ SL get FR SL get FS Wf not{()F2}if PL 2 ge{Ms E restore Ms or /Ms E D PH 1 eq PH 2 eq or {/LM E D}if PH 3 ge{/CI 0 D NL 0 E neg R}if }if /PL PL 1 sub D /CI 0 D /BP f D /PO f D () Bm 21 get Ts mul BE BL %CF CS SF } D /printcap{ capalg 0 ge{ SA{/W w Sf div D} {talign 1 eq{/XO xo ll twidth sub 2 div add D}if talign 2 eq{/XO xo ll twidth sub add D}if /W XO twidth add D }ie /XO xo D /LL W XO sub MR sub D /PA f D /Fl capalg 0 eq D 1 NA BL caption exec BN OA /PA t D }if } D /getwid{ /irow1 E D /irow2 irow1 D /rwid 0 D {rdesc irow2 get dup 0 get rwid add /rwid E D 2 get 0 eq {exit}{/irow2 irow2 1 add D}ie }loop } D /printrow{ /xoff ll twidth PL 2 ge{Sf div}if sub talign mul 2 div D /xleft xoff xo add D /irow E D /cells rdesc irow get 6 get D 0 1 ncol{ /icol E D /cell cells icol get D cell 0 ne{ cell aload pop /ang E D /CB E D /cvsize E D /above E D /fontsz E D /DV E D /bot E D /top E D /right E D /left E D /nowrap E D /valign E D /dp E D /align E D /rspan E D /cspan E D /cclass E D /ctype E D /cmax E D /cmin E D /proc E D rspan 0 eq{/rspan nrow irow sub 1 add D}if cspan 0 eq{/cspan ncol icol sub 1 add D}if /width 0 D 0 1 cspan 1 sub{icol add cdesc E get 0 get /width E width add D}for /rhight rdesc irow get 0 get D /hight rhight D 1 1 rspan 1 sub{irow add rdesc E get 0 get /hight E hight add D}for /W xo xoff add width add right sub D ang 0 ne{/W xo xoff add hight add right sub D}if /EO xo xoff add left add D SI Cf{ gsave CB VC xo xoff add ycur yoff add M 0 hight neg RL width 0 RL 0 hight RL width neg 0 RL fill grestore }if ctype 1 eq{() BD}if /A0 align D RC AT 4 eq{ /DC dp D /ID 1 D /DO cdesc icol get 5 get D /Lo DO DV 0 get sub D /L1 Lo D }if ang 0 ne{ gsave ang 90 eq {xoff ycur add hight cvsize sub 2 div sub ycur hight sub xoff sub} {xoff ycur sub width add hight cvsize sub 2 div add ycur xoff add}ie translate ang rotate }if valign 3 le{0 ycur yoff add top sub hight cvsize sub valign 1 sub mul 2 div sub M} {0 ycur yoff add top sub above add rdesc irow get 4 get sub M}ie /PA f D /BP t D /Fl t D BL proc exec BN ang 0 ne{grestore}if /PA t D ctype 1 eq{() ES}if }if /xoff xoff cdesc icol get 0 get add D }for /yoff yoff rhight sub D } D /printhead {0 1 nhead 1 sub{printrow}for} D /printfoot {nhead 1 nhead nfoot add 1 sub{printrow}for} D /Tf { OU{rules 2 ge{/yoff 0 D gsave 0 Sg [0 1 nhead 1 sub{}for rbeg 1 row 1 sub{}for nhead 1 nhead nfoot add 1 sub{}for]{ /irow E D /xoff ll twidth PL 2 ge{Sf div}if sub talign mul 2 div D /cells rdesc irow get 6 get D 0 1 ncol{ /icol E D /cell cells icol get D cell 0 ne{ /rspan cell 6 get D /cspan cell 5 get D rspan 0 eq{/rspan nrow irow sub 1 add D}if cspan 0 eq{/cspan ncol icol sub 1 add D}if /width 0 D 0 1 cspan 1 sub{icol add cdesc E get 0 get /width E width add D}for /rhight rdesc irow get 0 get D /hight rhight D 1 1 rspan 1 sub{irow add rdesc E get 0 get /hight E hight add D}for xo xoff add width add ycur yoff add M 0 hight neg icol cspan add 1 sub ncol lt {cdesc icol 1 add get 4 get dup rules 3 le{1 eq}{pop t}ie {1 eq{0.8}{0.3}ie LW RL CP stroke M}{pop R}ie}{R}ie irow nhead nfoot add 1 sub ne nfoot 0 eq or {irow rspan add 1 sub nrow lt {rdesc irow rspan add get 3 get}{nfoot 0 eq{0}{1}ie}ie dup rules 2 mod 0 eq{1 eq}{pop t}ie {1 eq irow rspan add nhead eq or irow rspan add row eq nfoot 0 gt and or {0.8}{0.3}ie LW width neg 0 RL CP stroke M}{pop}ie}if }if /xoff xoff cdesc icol get 0 get add D }for /yoff yoff rhight sub D }forall grestore /Ms t D }if frame 1 gt{ gsave 1 LW 0 Sg xleft ycur M CP BB 0 yoff frame 5 eq frame 7 ge or{RL}{R}ie twidth 0 frame 3 eq frame 4 eq or frame 8 ge or{RL}{R}ie CP BB 0 yoff neg frame 6 ge{RL}{R}ie twidth neg 0 frame 2 eq frame 4 eq or frame 8 ge or{RL}{R}ie closepath stroke grestore /Ms t D }if }if } D /tables [[[0 0 0 0 0 -1 0 1 1 2 2 0 0 9 5 {()} -1] [[0 0 0 0 0 0 0][0 0 0 0 0 0 0][0 0 0 0 0 0 0]] [[0 0 0 0 0 0 [[{()2 Sl()WB()BD(Histo)HY(rique)YH( des versions)ES()} 0 0 1 0 3 1 0 (.) 1 0 4 4 2 6 0 0 0 0 Db 0 ] 0 0 ]] [0 0 0 0 0 0 [[{()2 Sl()WB(Version $Revi)HY(sion)YH(: 1112 $)} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] [{()2 Sl()WB($Date: 2007-04-21 16:52:00 +0200 \201sam, 21 avr 2007\202 $)} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] [{()2 Sl()WB($Author: latu $)} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] ]] [0 0 0 0 0 0 [[{()2 Sl()WB(IPSEC, OSPF & BGP)} 0 0 0 0 3 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] 0 0 ]] ]] [[0 0 0 0 0 -1 0 0 0 1 1 0 0 1 1 {()} -1] [[0 0 0 25 0 0 0][0 0 0 0 0 0 0]] [[0 0 1 0 0 0 [[{()2 Sl()WB()0 0 IM()} 0 0 0 0 1 2 1 (.) 1 0 8 8 2 6 0 0 0 0 Db 0 ] [{()2 Sl()WB(Aver)HY(tis)HY(se)HY(ment)YH()} 0 0 1 0 1 1 0 (.) 2 0 8 8 2 6 0 0 0 0 Db 0 ] ]] [0 0 0 0 0 0 [0 [{()2 Sl()WB()0 P( Notes d'un lecteur\240: si $P0_NET est le r\351seau local et $IF0 est son inter)HY(face)YH(, alors les entr\351es suivantes sont d\351si)HY(rables)YH(\240: )9 9 PR(ip route add $P0_NET dev $IF0 table T1 ip route add $P2_NET dev $IF2 table T1 ip route add 127.0.0.0/8 dev lo table T1 ip route add $P0_NET dev $IF0 table T2 ip route add $P1_NET dev $IF1 table T2 ip route add 127.0.0.0/8 dev lo table T2)RP( )EP()} 0 0 0 0 1 1 0 (.) 1 0 8 8 2 6 0 0 0 0 Db 0 ] ]] ]] [[0 0 0 0 0 -1 0 0 0 1 1 0 0 1 1 {()} -1] [[0 0 0 25 0 0 0][0 0 0 0 0 0 0]] [[0 0 1 0 0 0 [[{()2 Sl()WB()0 1 IM()} 0 0 0 0 1 2 1 (.) 1 0 8 8 2 6 0 0 0 0 Db 0 ] [{()2 Sl()WB(Note)} 0 0 1 0 1 1 0 (.) 2 0 8 8 2 6 0 0 0 0 Db 0 ] ]] [0 0 0 0 0 0 [0 [{()2 Sl()WB()0 P( Les outils de l'espace utili)HY(sa)HY(teur)YH( sont dispo)HY(nibles)YH( )R16 2 A(ici)EA(. Il y a plusieurs programmes dispo)HY(nibles)YH(\240; celui qui est propos\351 dans le lien est bas\351 sur Racoon. )EP()0 P( Lors de la compi)HY(la)HY(tion)YH( du noyau, soyez s\373r d'activer 'PF_KEY', 'AH' et tous les \351l\351ments de Cryp)HY(toAPI)YH(\240! )EP()} 0 0 0 0 1 1 0 (.) 1 0 8 8 2 6 0 0 0 0 Db 0 ] ]] ]] [[0 0 0 0 0 -1 0 0 0 1 1 0 0 1 1 {()} -1] [[0 0 0 25 0 0 0][0 0 0 0 0 0 0]] [[0 0 1 0 0 0 [[{()2 Sl()WB()0 0 IM()} 0 0 0 0 1 2 1 (.) 1 0 8 8 2 6 0 0 0 0 Db 0 ] [{()2 Sl()WB(Aver)HY(tis)HY(se)HY(ment)YH()} 0 0 1 0 1 1 0 (.) 2 0 8 8 2 6 0 0 0 0 Db 0 ] ]] [0 0 0 0 0 0 [0 [{()2 Sl()WB()0 P( L'auteur de ce chapitre est un complet nigaud en ce qui concerne IPSEC\240! Si vous trouvez les in\351vi)HY(tables)YH( erreurs, envoyez un cour)HY(rier)YH( \351lec)HY(tro)HY(nique)YH( \340 Bert Hubert )SM(<)0 2 A(ahu@ds9a.nl)EA(>)ES(. )EP()} 0 0 0 0 1 1 0 (.) 1 0 8 8 2 6 0 0 0 0 Db 0 ] ]] ]] [[0 0 0 0 0 -1 0 0 0 1 1 0 0 1 1 {()} -1] [[0 0 0 25 0 0 0][0 0 0 0 0 0 0]] [[0 0 1 0 0 0 [[{()2 Sl()WB()0 1 IM()} 0 0 0 0 1 2 1 (.) 1 0 8 8 2 6 0 0 0 0 Db 0 ] [{()2 Sl()WB(Note)} 0 0 1 0 1 1 0 (.) 2 0 8 8 2 6 0 0 0 0 Db 0 ] ]] [0 0 0 0 0 0 [0 [{()2 Sl()WB()0 P( Certaines confi)HY(gu)HY(ra)HY(tions)YH( iptables rejettent les paquets IPSEC\240! Pour trans)HY(mettre)YH( IPSEC, utili)HY(sez)YH(\240: )BD(iptables -A xxx -p 50 -j ACCEPT)ES( et )BD('iptables -A xxx -p 51 -j ACCEPT)ES(. )EP()} 0 0 0 0 1 1 0 (.) 1 0 8 8 2 6 0 0 0 0 Db 0 ] ]] ]] [[0 0 0 0 0 -1 0 0 0 1 1 0 0 1 1 {()} -1] [[0 0 0 25 0 0 0][0 0 0 0 0 0 0]] [[0 0 1 0 0 0 [[{()2 Sl()WB()0 1 IM()} 0 0 0 0 1 2 1 (.) 1 0 8 8 2 6 0 0 0 0 Db 0 ] [{()2 Sl()WB(Note)} 0 0 1 0 1 1 0 (.) 2 0 8 8 2 6 0 0 0 0 Db 0 ] ]] [0 0 0 0 0 0 [0 [{()2 Sl()WB()0 P( L'Echange de Cl\351 sur Inter)HY(net)YH( \201IKE\202 doit avoir acc\350s au port UDP 500. Soyez s\373r que iptables ne le bloque pas. )EP()} 0 0 0 0 1 1 0 (.) 1 0 8 8 2 6 0 0 0 0 Db 0 ] ]] ]] [[0 0 0 0 0 -1 0 0 0 1 1 0 0 1 1 {()} -1] [[0 0 0 25 0 0 0][0 0 0 0 0 0 0]] [[0 0 1 0 0 0 [[{()2 Sl()WB()0 1 IM()} 0 0 0 0 1 2 1 (.) 1 0 8 8 2 6 0 0 0 0 Db 0 ] [{()2 Sl()WB(Note)} 0 0 1 0 1 1 0 (.) 2 0 8 8 2 6 0 0 0 0 Db 0 ] ]] [0 0 0 0 0 0 [0 [{()2 Sl()WB()0 P( Le tunnel IPSEC a besoin d'avoir la trans)HY(mis)HY(sion)YH( IP activ\351e dans le noyau\240! )EP()} 0 0 0 0 1 1 0 (.) 1 0 8 8 2 6 0 0 0 0 Db 0 ] ]] ]] ] D 0 1 6{TS}for RC ZF /Ba f D /BO 0 D Bs /UR (lartc.html.iso-8859-1) D /Ti (HOWTO du routage avancé et du contrôle de trafic sous Linux) D /Au () D /Df f D /ME [] D /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc Pt /Ba f D /BO 0 D Bs /UR (lartc.html.iso-8859-1) D /Ti (HOWTO du routage avancé et du contrôle de trafic sous Linux) D /Au () D /Df f D /ME [] D NP RC ZF ()1 Sl()WB 0 Sn()2 Sl()BR()BR()BR()BR()0 1 0 H(HOWTO)WB 167 Sn()WB 1 Sn( du routage avanc\351 et du contr\364le de trafic sous Linux)EH()BR()BR()BR()BR()0 3 1 H(Bert)WB 168 Sn( Hubert)EH()BR(Nether)HY(labs)YH( BV)BR()BR()0 P()SM(<)0 2 A(bert.hubert@nether)HY(labs)YH(.nl)EA(>)ES()EP()BR()BR()BR(Thomas Graf \201Auteur d'une section\202)BR()BR()0 P()SM(<)0 2 A(tgraf%suug.ch)EA(>)ES()EP()BR()BR()BR(Gregory Maxwell \201Auteur d'une section\202)BR(Remco van Mook \201Auteur d'une section\202)BR()BR()0 P()SM(<)0 2 A(remco@virtu.nl)EA(>)ES()EP()BR()BR()BR(Martijn van Ooste)HY(rhout)YH( \201Auteur d'une section\202)BR()BR()0 P()SM(<)0 2 A(kleptog@cupid.sunin)HY(ter)HY(net)YH(.com)EA(>)ES()EP()BR()BR()BR(Paul B. Schroe)HY(der)YH( \201Auteur d'une section\202)BR()BR()0 P()SM(<)0 2 A(paulsch@us.ibm.com)EA(>)ES()EP()BR()BR()BR(Jasper Spaans \201Auteur d'une section\202)BR()BR()0 P()SM(<)0 2 A(jasper@spaans.ds9a.nl)EA(>)ES()EP()BR()BR()BR(Pedro Larroy \201Auteur d'une section\202)BR()BR()0 P()SM(<)0 2 A(piotr%member.fsf.org)EA(>)ES()EP()BR()BR()BR()BR()BR()BR()BR()BR()0 3 2 H(Laurent)WB 169 Sn( Foucher)EH()BR(Traduc)HY(teur)YH()BR()BR()0 P()SM(<)0 2 A(foucher\201at\202gch.iut-tlse3.fr)EA(>)ES()EP()BR()BR()BR(Philippe Latu)BR(Traduc)HY(teur)YH(/Relec)HY(teur)YH()BR()BR()0 P()SM(<)0 2 A(philippe.latu\201at\202linux-france.org)EA(>)ES()EP()BR()BR()BR(Guillaume All\350gre)BR(Relec)HY(teur)YH()BR()BR()0 P()SM(<)0 2 A(Guillaume.Allegre\201at\202imag.fr)EA(>)ES()EP()BR()BR()BR()BR()BR()BR()BR()0 PT()BR()BR()BR()BR()0 P()BD(R\351sum\351)ES()EP()0 P( Une approche pratique d'iproute2, de la mise en forme du trafic et un peu de netfil)HY(ter)YH(. )EP()BR()BR()BR()2 0.6 1 HR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 2 1 A(1. D\351di)HY(cace)YH()2 0 TN TL()Ec /AF f D()0 DT()0 3 1 A(2. Intro)HY(duc)HY(tion)YH()3 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 4 1 A(1. Condi)HY(tions)YH( de distri)HY(bu)HY(tion)YH( et Mise en garde )4 0 TN TL()Ec /AF f D()0 DT()0 5 1 A(2. Connais)HY(sances)YH( pr\351a)HY(lables)YH()5 0 TN TL()Ec /AF f D()0 DT()0 6 1 A(3. Ce que Linux peut faire pour vous)6 0 TN TL()Ec /AF f D()0 DT()0 7 1 A(4. Notes diverses)7 0 TN TL()Ec /AF f D()0 DT()0 8 1 A(5. Acc\350s, CVS et propo)HY(si)HY(tions)YH( de mises \340 jour)8 0 TN TL()Ec /AF f D()0 DT()0 9 1 A(6. Liste de diffu)HY(sion)YH()9 0 TN TL()Ec /AF f D()0 DT()0 10 1 A(7. Plan du docu)HY(ment)YH()10 0 TN TL()Ec /AF f D()LD()0 DT()0 11 1 A(3. Intro)HY(duc)HY(tion)YH( \340 iproute2)11 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 12 1 A(1. Pourquoi iproute2\240?)12 0 TN TL()Ec /AF f D()0 DT()0 13 1 A(2. Un tour d'horizon d'iproute2)13 0 TN TL()Ec /AF f D()0 DT()0 14 1 A(3. Pr\351requis)14 0 TN TL()Ec /AF f D()0 DT()0 15 1 A(4. Explo)HY(rer)YH( votre confi)HY(gu)HY(ra)HY(tion)YH( courante)15 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 16 1 A(4.1. )BD(ip)ES( nous montre nos liens)16 0 TN TL()Ec /AF f D()0 DT()0 17 1 A(4.2. )BD(ip)ES( nous montre nos adresses IP)17 0 TN TL()Ec /AF f D()0 DT()0 18 1 A(4.3. )BD(ip)ES( nous montre nos routes)18 0 TN TL()Ec /AF f D()LD()0 DT()0 19 1 A(5. ARP)19 0 TN TL()Ec /AF f D()LD()0 DT()0 20 1 A(4. R\350gles - bases de donn\351es des poli)HY(tiques)YH( de routage)20 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 21 1 A(1. Poli)HY(tique)YH( de routage simple par l'adresse source)21 0 TN TL()Ec /AF f D()0 DT()0 22 1 A(2. Routage avec plusieurs acc\350s Inter)HY(net)YH(/four)HY(nis)HY(seurs)YH( d'acc\350s)22 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 23 1 A(2.1. Acc\350s s\351par\351)23 0 TN TL()Ec /AF f D()0 DT()0 24 1 A(2.2. Balance de charge)24 0 TN TL()Ec /AF f D()LD()LD()0 DT()0 25 1 A(5. GRE et autres tunnels)25 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 26 1 A(1. Quelques remarques g\351n\351)HY(rales)YH( \340 propos des tunnels\240:)26 0 TN TL()Ec /AF f D()0 DT()0 27 1 A(2. IP dans un tunnel IP)27 0 TN TL()Ec /AF f D()0 DT()0 28 1 A(3. Le tunnel GRE)28 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 29 1 A(3.1. Le tunnel IPv4)29 0 TN TL()Ec /AF f D()0 DT()0 30 1 A(3.2. Le tunnel IPv6)30 0 TN TL()Ec /AF f D()LD()0 DT()0 31 1 A(4. Tunnels dans l'espace utili)HY(sa)HY(teur)YH()31 0 TN TL()Ec /AF f D()LD()0 DT()0 32 1 A(6. Tunnel IPv6 avec Cisco et/ou une dorsale IPv6 \2016bone\202)32 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 33 1 A(1. Tunnel IPv6)33 0 TN TL()Ec /AF f D()LD()0 DT()0 34 1 A(7. IPSEC: IP s\351cu)HY(ris\351)YH( \340 travers Inter)HY(net)YH()34 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 35 1 A(1. Intro)HY(duc)HY(tion)YH( sur la gestion manuelle des cl\351s)35 0 TN TL()Ec /AF f D()0 DT()0 36 1 A(2. Gestion auto)HY(ma)HY(tique)YH( des cl\351s)36 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 37 1 A(2.1. Th\351orie)37 0 TN TL()Ec /AF f D()0 DT()0 38 1 A(2.2. Exemple)38 0 TN TL()Ec /AF f D()0 DT()0 40 1 A(2.3. Gestion auto)HY(ma)HY(tique)YH( des cl\351s en utili)HY(sant)YH( les certi)HY(fi)HY(cats)YH( X.509)40 0 TN TL()Ec /AF f D()LD()0 DT()0 44 1 A(3. tunnels IPSEC)44 0 TN TL()Ec /AF f D()0 DT()0 45 1 A(4. Autre logi)HY(ciel)YH( IPSEC)45 0 TN TL()Ec /AF f D()0 DT()0 46 1 A(5. Inter)HY(op\351)HY(ra)HY(bi)HY(lit\351)YH( d'IPSEC avec d'autres syst\350mes)46 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 47 1 A(5.1. Windows)47 0 TN TL()Ec /AF f D()0 DT()0 48 1 A(5.2. Check Point VPN-1 NG)48 0 TN TL()Ec /AF f D()LD()LD()0 DT()0 49 1 A(8. Routage multi)HY(dis)HY(tri)HY(bu)HY(tion)YH( \201)EM(multi)HY(cast)YH()ES(\202)49 0 TN TL()Ec /AF f D()0 DT()0 50 1 A(9. Gestion)HY(naires)YH( de mise en file d'attente pour l'admi)HY(nis)HY(tra)HY(tion)YH( de la bande passante)50 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 51 1 A(1. Expli)HY(ca)HY(tion)YH( sur les files d'attente et la gestion de la mise en file d'attente)51 0 TN TL()Ec /AF f D()0 DT()0 52 1 A(2. Gestion)HY(naires)YH( de mise en file d'attente simples, sans classes)52 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 53 1 A(2.1. )SM(pfifo_fast)ES()53 0 TN TL()Ec /AF f D()0 DT()0 55 1 A(2.2. Filtre \340 seau de jetons \201)EM(Token Bucket Filter)ES(\202)55 0 TN TL()Ec /AF f D()0 DT()0 58 1 A(2.3. Mise en file d'attente stochas)HY(tique)HY(ment)YH( \351qui)HY(table)YH( \201)EM(Stochas)HY(tic)YH( Fair)HY(ness)YH( Queueing)ES(\202)58 0 TN TL()Ec /AF f D()LD()0 DT()0 61 1 A(3. Conseils pour le choix de la file d'attente)61 0 TN TL()Ec /AF f D()0 DT()0 62 1 A(4. termi)HY(no)HY(lo)HY(gie)YH()62 0 TN TL()Ec /AF f D()0 DT()0 63 1 A(5. Gestion)HY(naires)YH( de file d'attente bas\351s sur les classes)63 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 64 1 A(5.1. Flux \340 l'int\351)HY(rieur)YH( des gestion)HY(naires)YH( bas\351s sur des classes & \340 l'int\351)HY(rieur)YH( des classes)64 0 TN TL()Ec /AF f D()0 DT()0 65 1 A(5.2. La famille des gestion)HY(naires)YH( de mise en file d'attente\240: racines, descrip)HY(teurs)YH(, descen)HY(dances)YH( et parents)65 0 TN TL()Ec /AF f D()0 DT()0 68 1 A(5.3. Le gestion)HY(naire)YH( de mise en file d'attente PRIO)68 0 TN TL()Ec /AF f D()0 DT()0 71 1 A(5.4. Le c\351l\350bre gestion)HY(naire)YH( de mise en file d'attente CBQ)71 0 TN TL()Ec /AF f D()0 DT()0 77 1 A(5.5. Seau de jetons \340 contr\364le hi\351rar)HY(chique)YH( \201)EM(Hierar)HY(chi)HY(cal)YH( Token Bucket)ES(\202)77 0 TN TL()Ec /AF f D()LD()0 DT()0 79 1 A(6. Clas)HY(si)HY(fier)YH( des paquets avec des filtres)79 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 80 1 A(6.1. Quelques exemples simples de filtrage)80 0 TN TL()Ec /AF f D()0 DT()0 81 1 A(6.2. Toutes les commandes de filtres dont vous aurez norma)HY(le)HY(ment)YH( besoin)81 0 TN TL()Ec /AF f D()LD()0 DT()0 82 1 A(7. Le p\351ri)HY(ph\351)HY(rique)YH( de file d'attente inter)HY(m\351)HY(diaire)YH( \201The Inter)HY(me)HY(diate)YH( queueing device \201IMQ\202\202)82 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 83 1 A(7.1. Confi)HY(gu)HY(ra)HY(tion)YH( simple)83 0 TN TL()Ec /AF f D()LD()LD()0 DT()0 84 1 A(10. \311qui)HY(li)HY(brage)YH( de charge sur plusieurs inter)HY(faces)YH()84 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 85 1 A(1. Aver)HY(tis)HY(se)HY(ment)YH()85 0 TN TL()Ec /AF f D()LD()0 DT()0 86 1 A(11. Netfil)HY(ter)YH( et iproute - marquage de paquets)86 0 TN TL()Ec /AF f D()0 DT()0 87 1 A(12. Filtres avanc\351s pour la \201re-\202clas)HY(si)HY(fi)HY(ca)HY(tion)YH( des paquets)87 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 88 1 A(1. Le clas)HY(si)HY(fi)HY(ca)HY(teur)YH( )SM(u32)ES()88 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 89 1 A(1.1. Le s\351lec)HY(teur)YH( U32)89 0 TN TL()Ec /AF f D()0 DT()0 90 1 A(1.2. S\351lec)HY(teurs)YH( g\351n\351)HY(raux)YH()90 0 TN TL()Ec /AF f D()0 DT()0 91 1 A(1.3. Les s\351lec)HY(teurs)YH( sp\351ci)HY(fiques)YH()91 0 TN TL()Ec /AF f D()LD()0 DT()0 92 1 A(2. Le clas)HY(si)HY(fi)HY(ca)HY(teur)YH( )SM(route)ES()92 0 TN TL()Ec /AF f D()0 DT()0 93 1 A(3. Les filtres de r\351gle)HY(men)HY(ta)HY(tion)YH( \201)EM(Poli)HY(cing)YH( filters)ES(\202)93 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 94 1 A(3.1. Tech)HY(niques)YH( de r\351gle)HY(men)HY(ta)HY(tion)YH()94 0 TN TL()Ec /AF f D()0 DT()0 97 1 A(3.2. Actions de d\351pas)HY(se)HY(ment)YH( de limite \201)EM(Over)HY(li)HY(mit)YH( actions)ES(\202)97 0 TN TL()Ec /AF f D()0 DT()0 98 1 A(3.3. Exemples)98 0 TN TL()Ec /AF f D()LD()0 DT()0 99 1 A(4. Filtres hach\351s pour un filtrage massif tr\350s rapide)99 0 TN TL()Ec /AF f D()0 DT()0 100 1 A(5. Filtrer le trafic IPv6)100 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 101 1 A(5.1. Comment se fait-il que ces filtres tc IPv6 ne fonc)HY(tionnent)YH( pas\240?)101 0 TN TL()Ec /AF f D()0 DT()0 102 1 A(5.2. Marquer les paquets IPv6 en utili)HY(sant)YH( ip6tables)102 0 TN TL()Ec /AF f D()0 DT()0 103 1 A(5.3. Utili)HY(ser)YH( le s\351lec)HY(teur)YH( u32 pour rep\351rer le paquet IPv6)103 0 TN TL()Ec /AF f D()LD()LD()0 DT()0 104 1 A(13. Para)HY(m\350tres)YH( r\351seau du noyau)104 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 105 1 A(1. Filtrage de Chemin Inverse \201)EM(Reverse Path Filte)HY(ring)YH()ES(\202)105 0 TN TL()Ec /AF f D()0 DT()0 106 1 A(2. Confi)HY(gu)HY(ra)HY(tions)YH( obscures)106 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 107 1 A(2.1. ipv4 g\351n\351)HY(rique)YH()107 0 TN TL()Ec /AF f D()0 DT()0 108 1 A(2.2. Confi)HY(gu)HY(ra)HY(tion)YH( des p\351ri)HY(ph\351)HY(riques)YH()108 0 TN TL()Ec /AF f D()0 DT()0 109 1 A(2.3. Poli)HY(tique)YH( de voisi)HY(nage)YH()109 0 TN TL()Ec /AF f D()0 DT()0 110 1 A(2.4. Confi)HY(gu)HY(ra)HY(tion)YH( du routage)110 0 TN TL()Ec /AF f D()LD()LD()0 DT()0 111 1 A(14. Gestion)HY(naires)YH( de mise en file d'attente avanc\351s & moins communs)111 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 112 1 A(1. )SM(bfifo)ES(/)SM(pfifo)ES()112 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 113 1 A(1.1. Para)HY(m\350tres)YH( & usage)113 0 TN TL()Ec /AF f D()LD()0 DT()0 114 1 A(2. Algo)HY(rithme)YH( Clark-Shenker-Zhang \201CSZ\202)114 0 TN TL()Ec /AF f D()0 DT()0 115 1 A(3. )SM(DSMARK)ES()115 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 116 1 A(3.1. Intro)HY(duc)HY(tion)YH()116 0 TN TL()Ec /AF f D()0 DT()0 117 1 A(3.2. A quoi )SM(DSMARK)ES( est-il reli\351\240?)117 0 TN TL()Ec /AF f D()0 DT()0 118 1 A(3.3. Guide des services diff\351)HY(ren)HY(ci\351s)YH()118 0 TN TL()Ec /AF f D()0 DT()0 119 1 A(3.4. Travailler avec )SM(DSMARK)ES()119 0 TN TL()Ec /AF f D()0 DT()0 120 1 A(3.5. Comment )SM(SCH_DSMARK)ES( travaille.)120 0 TN TL()Ec /AF f D()0 DT()0 121 1 A(3.6. Le filtre TC_INDEX)121 0 TN TL()Ec /AF f D()LD()0 DT()0 122 1 A(4. Gestion)HY(naire)YH( de mise en file d'attente d'entr\351e \201)EM(Ingress qdisc)ES(\202)122 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 123 1 A(4.1. Para)HY(m\350tres)YH( & usage)123 0 TN TL()Ec /AF f D()LD()0 DT()0 124 1 A(5. )EM(Random Early Detec)HY(tion)YH()ES( \201RED\202)124 0 TN TL()Ec /AF f D()0 DT()0 125 1 A(6. Generic Random Early Detec)HY(tion)YH()125 0 TN TL()Ec /AF f D()0 DT()0 126 1 A(7. Emula)HY(tion)YH( VC/ATM)126 0 TN TL()Ec /AF f D()0 DT()0 127 1 A(8. Weigh)HY(ted)YH( Round Robin \201WRR\202)127 0 TN TL()Ec /AF f D()LD()0 DT()0 128 1 A(15. Recettes de cuisine)128 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 129 1 A(1. Faire tourner plusieurs sites avec diff\351)HY(rentes)YH( SLA \201auto)HY(ri)HY(sa)HY(tions)YH(\202)129 0 TN TL()Ec /AF f D()0 DT()0 130 1 A(2. Prot\351)HY(ger)YH( votre machine des inon)HY(da)HY(tions)YH( SYN)130 0 TN TL()Ec /AF f D()0 DT()0 131 1 A(3. Limiter le d\351bit ICMP pour emp\352)HY(cher)YH( les d\351nis de service)131 0 TN TL()Ec /AF f D()0 DT()0 132 1 A(4. Donner la prio)HY(rit\351)YH( au trafic inter)HY(ac)HY(tif)YH()132 0 TN TL()Ec /AF f D()0 DT()0 133 1 A(5. Cache web trans)HY(pa)HY(rent)YH( utili)HY(sant)YH( netfil)HY(ter)YH(, iproute2, ipchains et squid)133 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 134 1 A(5.1. Sch\351ma du trafic apr\350s l'impl\351)HY(men)HY(ta)HY(tion)YH()134 0 TN TL()Ec /AF f D()LD()0 DT()0 135 1 A(6. Circon)HY(ve)HY(nir)YH( aux probl\350mes de la d\351cou)HY(verte)YH( du MTU de chemin en confi)HY(gu)HY(rant)YH( un MTU par routes)135 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 136 1 A(6.1. Solu)HY(tion)YH()136 0 TN TL()Ec /AF f D()LD()0 DT()0 137 1 A(7. Circon)HY(ve)HY(nir)YH( aux probl\350mes de la d\351cou)HY(verte)YH( du MTU de chemin en impo)HY(sant)YH( le MSS \201pour les utili)HY(sa)HY(teurs)YH( de l'ADSL, du c\342ble, de PPPoE & PPtP\202)137 0 TN TL()Ec /AF f D()0 DT()0 138 1 A(8. Le Condi)HY(tion)HY(neur)YH( de Trafic Ultime\240: Faible temps de latence, T\351l\351)HY(char)HY(ge)HY(ment)YH( vers l'amont et l'aval rapide)138 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 139 1 A(8.1. Pourquoi cela ne marche t-il pas bien par d\351faut\240?)139 0 TN TL()Ec /AF f D()0 DT()0 140 1 A(8.2. Le script \201CBQ\202)140 0 TN TL()Ec /AF f D()0 DT()0 141 1 A(8.3. Le script \201HTB\202)141 0 TN TL()Ec /AF f D()LD()0 DT()0 142 1 A(9. Limi)HY(ta)HY(tion)YH( du d\351bit pour un h\364te ou un masque de sous-r\351seau)142 0 TN TL()Ec /AF f D()0 DT()0 143 1 A(10. Exemple d'une solu)HY(tion)YH( de traduc)HY(tion)YH( d'adresse avec de la QoS)143 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 144 1 A(10.1. Commen\347ons l'opti)HY(mi)HY(sa)HY(tion)YH( de cette rare bande passante)144 0 TN TL()Ec /AF f D()0 DT()0 145 1 A(10.2. Clas)HY(si)HY(fi)HY(ca)HY(tion)YH( des paquets)145 0 TN TL()Ec /AF f D()0 DT()0 146 1 A(10.3. Am\351lio)HY(rer)YH( notre confi)HY(gu)HY(ra)HY(tion)YH()146 0 TN TL()Ec /AF f D()0 DT()0 147 1 A(10.4. Rendre tout ceci actif au d\351mar)HY(rage)YH()147 0 TN TL()Ec /AF f D()LD()LD()0 DT()0 148 1 A(16. Construire des ponts et des pseudo ponts avec du Proxy ARP)148 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 149 1 A(1. Etat des ponts et iptables)149 0 TN TL()Ec /AF f D()0 DT()0 150 1 A(2. Pont et mise en forme)150 0 TN TL()Ec /AF f D()0 DT()0 151 1 A(3. Pseudo-pont avec du Proxy-ARP)151 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 152 1 A(3.1. ARP & Proxy-ARP)152 0 TN TL()Ec /AF f D()0 DT()0 153 1 A(3.2. Impl\351)HY(men)HY(tez)YH(-le)153 0 TN TL()Ec /AF f D()LD()LD()0 DT()0 154 1 A(17. Routage Dyna)HY(mique)YH( - OSPF et BGP)154 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 155 1 A(1. Confi)HY(gu)HY(rer)YH( OSPF avec Zebra)155 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 156 1 A(1.1. Pr\351requis)156 0 TN TL()Ec /AF f D()0 DT()0 157 1 A(1.2. Confi)HY(gu)HY(rer)YH( Zebra)157 0 TN TL()Ec /AF f D()0 DT()0 158 1 A(1.3. Ex\351cu)HY(ter)YH( Zebra)158 0 TN TL()Ec /AF f D()LD()0 DT()0 159 1 A(2. Confi)HY(gu)HY(rer)YH( BGP4 avec Zebra)159 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 160 1 A(2.1. sch\351ma r\351seau \201Exemple\202)160 0 TN TL()Ec /AF f D()0 DT()0 161 1 A(2.2. Confi)HY(gu)HY(ra)HY(tion)YH( \201Exemple\202)161 0 TN TL()Ec /AF f D()0 DT()0 162 1 A(2.3. V\351ri)HY(fi)HY(ca)HY(tion)YH( de la confi)HY(gu)HY(ra)HY(tion)YH()162 0 TN TL()Ec /AF f D()LD()LD()0 DT()0 163 1 A(18. Autres possi)HY(bi)HY(li)HY(t\351s)YH()163 0 TN TL()Ec /AF f D()0 DT()0 164 1 A(19. Lectures suppl\351)HY(men)HY(taires)YH()164 0 TN TL()Ec /AF f D()0 DT()0 166 1 A(20. Remer)HY(cie)HY(ments)YH()166 0 TN TL()Ec /AF f D()LD()BR()2 Sl()BR()BR()BR()BR()0 2 3 H(Chapitre\2401.\240D\351di)WB 170 Sn()HY(cace)YH()WB 2 Sn()EH()BR()BR()BR()0 P( Ce docu)HY(ment)YH( est d\351di\351 \340 beau)HY(coup)YH( de gens\240; dans ma tenta)HY(tive)YH( de tous me les rappe)HY(ler)YH(, je peux en citer quelques-uns\240: )EP()BR()UL()0 P()-1 LI(Rusty Russell)EP()0 P()-1 LI(Alexey N. Kuznet)HY(sov)YH()EP()0 P()-1 LI(La fine \351quipe de Google)EP()0 P()-1 LI(L'\351quipe de Casema Inter)HY(net)YH()EP()LU()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 4 H(Chapitre\2402.\240Intro)WB 171 Sn()HY(duc)HY(tion)YH()WB 3 Sn()EH()BR()BR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 4 1 A(1. Condi)HY(tions)YH( de distri)HY(bu)HY(tion)YH( et Mise en garde )4 0 TN TL()Ec /AF f D()0 DT()0 5 1 A(2. Connais)HY(sances)YH( pr\351a)HY(lables)YH()5 0 TN TL()Ec /AF f D()0 DT()0 6 1 A(3. Ce que Linux peut faire pour vous)6 0 TN TL()Ec /AF f D()0 DT()0 7 1 A(4. Notes diverses)7 0 TN TL()Ec /AF f D()0 DT()0 8 1 A(5. Acc\350s, CVS et propo)HY(si)HY(tions)YH( de mises \340 jour)8 0 TN TL()Ec /AF f D()0 DT()0 9 1 A(6. Liste de diffu)HY(sion)YH()9 0 TN TL()Ec /AF f D()0 DT()0 10 1 A(7. Plan du docu)HY(ment)YH()10 0 TN TL()Ec /AF f D()LD()BR()0 P(Bien)HY(ve)HY(nue)YH(, cher lecteur. )EP()0 P(Ce docu)HY(ment)YH( a pour but de vous \351clai)HY(rer)YH( sur la mani\350re de faire du routage avanc\351 avec Linux 2.2/2.4. M\351con)HY(nus)YH( par les utili)HY(sa)HY(teurs)YH(, les outils stan)HY(dard)YH( de ces noyaux permettent de faire des choses spec)HY(ta)HY(cu)HY(laires)YH(. Les commandes comme )BD(route)ES( et )BD(ifcon)HY(fig)YH()ES( sont des inter)HY(faces)YH( vrai)HY(ment)YH( pauvres par rapport \340 la grande puis)HY(sance)YH( poten)HY(tielle)YH( d'iproute2. )EP()0 P(J'esp\350re que ce HOWTO devien)HY(dra)YH( aussi lisible que ceux de Rusty Russell, tr\350s r\351put\351 \201parmi d'autres choses\202 pour son netfil)HY(ter)YH(. )EP()0 P(Vous pouvez nous contac)HY(ter)YH( en nous \351cri)HY(vant)YH( \340 )0 2 A(l'\351quipe HOWTO)EA(. Cepen)HY(dant)YH(, postez, s'il vous pla\356t, vos ques)HY(tions)YH( sur la liste de diffu)HY(sion)YH( \201voir la section corres)HY(pon)HY(dante)YH(\202 pour celles qui ne sont pas direc)HY(te)HY(ment)YH( li\351es \340 ce HOWTO. )EP()0 P(Avant de vous perdre dans ce HOWTO, si la seule chose que vous souhai)HY(tez)YH( faire est de la simple mise en forme de trafic, allez direc)HY(te)HY(ment)YH( au chapitre )EM()0 163 1 A(Autres possi)HY(bi)HY(li)HY(t\351s)YH()163 0 TN TL()Ec /AF f D()ES(, et lisez ce qui concerne CBQ.init. )EP()2 Sl()BR()BR()BR()BR()0 2 5 H(1.\240Condi)WB 172 Sn()HY(tions)YH()WB 4 Sn( de distri)HY(bu)HY(tion)YH( et Mise en garde )EH()BR()BR()BR()0 P(Ce docu)HY(ment)YH( est distri)HY(bu\351)YH( dans l'espoir qu'il sera utile et utilis\351, mais SANS AUCUNE GARAN)HY(TIE)YH( ; sans m\352me une garan)HY(tie)YH( impli)HY(cite)YH( de qualit\351 l\351gale et marchande ni apti)HY(tude)YH( \340 un quel)HY(conque)YH( usage.)EP()0 P(En un mot, si votre dorsale STM-64 est tomb\351e ou distri)HY(bue)YH( de la porno)HY(gra)HY(phie)YH( \340 vos estim\351s clients, cela n'est pas de notre faute. D\351sol\351.)EP()0 P(Copy)HY(right)YH( \201c\202 2001 par Bert Hubert, Gregory Maxwell et Martijn van Ooste)HY(rhout)YH(, Remco van Mook, Paul B. Schroe)HY(der)YH( et autres. Ce docu)HY(ment)YH( ne peut \352tre distri)HY(bu\351)YH( qu'en respec)HY(tant)YH( les termes et les condi)HY(tions)YH( expos\351s dans la Open Publi)HY(ca)HY(tion)YH( License, v1.0 ou sup\351)HY(rieure)YH( \201la derni\350re version est actuel)HY(le)HY(ment)YH( dispo)HY(nible)YH( sur http://www.open)HY(content)YH(.org/openpub/\202.)EP()0 P(Copiez et distri)HY(buez)YH( \201vendez ou donnez\202 libre)HY(ment)YH( ce docu)HY(ment)YH(, dans n'importe quel format. Les demandes de correc)HY(tions)YH( et/ou de commen)HY(taires)YH( sont \340 adres)HY(ser)YH( \340 la personne qui main)HY(tient)YH( ce docu)HY(ment)YH(.)EP()0 P(Il est aussi demand\351 que, si vous publiez cet HOWTO sur un support papier, vous en envoyiez des exem)HY(plaires)YH( aux auteurs pour une \253\240relec)HY(ture)YH( critique\240\273 :-\202 )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 6 H(2.\240Connais)WB 173 Sn()HY(sances)YH()WB 5 Sn( pr\351a)HY(lables)YH()EH()BR()BR()BR()0 P(Comme le titre l'implique, ceci est un HOWTO \253\240avanc\351\240\273. Bien qu'il ne soit pas besoin d'\352tre un expert r\351seau, certains pr\351-requis sont n\351ces)HY(saires)YH(.)EP()0 P(Voici d'autres r\351f\351)HY(rences)YH( qui pour)HY(ront)YH( vous aider \340 en apprendre plus\240: )BR()0 DL()0 DT( )R1 2 A( Rusty Russell's networ)HY(king)YH(-concepts-HOWTO)EA( )DD()0 P(Tr\350s bonne intro)HY(duc)HY(tion)YH(, expliquant ce qu'est un r\351seau, et comment on le connecte \340 d'autres r\351seaux. )EP()0 DT(Linux Networ)HY(king)YH(-HOWTO \201ex Net-3 HOWTO\202)DD()0 P(Excellent docu)HY(ment)YH(, bien que tr\350s bavard. Il vous appren)HY(dra)YH( beau)HY(coup)YH( de choses qui sont d\351j\340 confi)HY(gu)HY(r\351es)YH( si vous \352tes capable de vous connec)HY(ter)YH( \340 Inter)HY(net)YH(. Il peut \351ven)HY(tuel)HY(le)HY(ment)YH( \352tre situ\351 \340 )SM(/usr/doc/HOWTO/NET-HOWTO.txt)ES(, mais peut \351gale)HY(ment)YH( \352tre trouv\351 )R2 2 A(en ligne)EA( )EP()LD()BR()EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 7 H(3.\240Ce)WB 174 Sn()WB 6 Sn( que Linux peut faire pour vous)EH()BR()BR()BR()0 P(Une petite liste des choses qui sont possibles\240:)EP()BR()UL()0 P()-1 LI(Limiter la bande passante pour certains ordi)HY(na)HY(teurs)YH( )EP()0 P()-1 LI(Limiter la bande passante VERS certains ordi)HY(na)HY(teurs)YH( )EP()0 P()-1 LI(Vous aider \340 parta)HY(ger)YH( \351qui)HY(ta)HY(ble)HY(ment)YH( votre bande passante )EP()0 P()-1 LI(Prot\351)HY(ger)YH( votre r\351seau des attaques de type D\351ni de Service )EP()0 P()-1 LI(Prot\351)HY(ger)YH( Inter)HY(net)YH( de vos clients )EP()0 P()-1 LI(Multi)HY(plexer)YH( plusieurs serveurs en un seul, pour l'\351qui)HY(li)HY(brage)YH( de charge ou une dispo)HY(ni)HY(bi)HY(lit\351)YH( am\351lio)HY(r\351e)YH( )EP()0 P()-1 LI(Restreindre l'acc\350s \340 vos ordi)HY(na)HY(teurs)YH( )EP()0 P()-1 LI(Limiter l'acc\350s de vos utili)HY(sa)HY(teurs)YH( vers d'autres h\364tes )EP()0 P()-1 LI(Faire du routage bas\351 sur l'ID utili)HY(sa)HY(teur)YH( \201eh oui\240!\202, l'adresse MAC, l'adresse IP source, le port, le type de service, l'heure ou le contenu. )EP()LU()BR()0 P(Peu de personnes utilisent couram)HY(ment)YH( ces fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( avan)HY(c\351es)YH(. Il y a plusieurs raisons \340 cela. Bien que la docu)HY(men)HY(ta)HY(tion)YH( soit fournie, la prise en main est diffi)HY(cile)YH(. Les commandes de contr\364le du trafic ne sont pratique)HY(ment)YH( pas docu)HY(men)HY(t\351es)YH(. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 8 H(4.\240Notes)WB 175 Sn()WB 7 Sn( diverses)EH()BR()BR()BR()0 P(Il y a plusieurs choses qui doivent \352tre not\351es au sujet de ce docu)HY(ment)YH(. Bien que j'en ai \351crit la majeure partie, je ne veux vrai)HY(ment)YH( pas qu'il reste tel quel. Je crois beau)HY(coup)YH( \340 l'Open Source, je vous encou)HY(rage)YH( donc \340 envoyer des remarques, des mises \340 jour, des correc)HY(tions)YH(, etc. N'h\351sitez pas \340 m'avertir des coquilles ou d'erreurs pures et simples. Si mon anglais vous para\356t parfois peu naturel, ayez en t\352te, s'il vous pla\356t, que l'anglais n'est pas ma langue natale. N'h\351sitez pas \340 m'envoyer vos sugges)HY(tions)YH( [NdT\240: en anglais\240!])EP()0 P(Si vous pensez que vous \352tes plus quali)HY(fi\351)YH( que moi pour main)HY(te)HY(nir)YH( une section ou si vous pensez que vous pouvez \351crire et main)HY(te)HY(nir)YH( de nouvelles sections, vous \352tes le bien)HY(venu)YH(. La version SGML de ce HOWTO est dispo)HY(nible)YH( via CVS. J'envi)HY(sage)YH( que d'autres personnes puissent travailler dessus.)EP()0 P(Pour vous aider, vous trou)HY(ve)HY(rez)YH( beau)HY(coup)YH( de mentions FIXME \201NdT\240: A CORRI)HY(GER)YH(\202. Les correc)HY(tions)YH( sont toujours les bien)HY(ve)HY(nues)YH(. Si vous trouvez une mention FIXME, vous saurez que vous \352tes en terri)HY(toire)YH( inconnu. Cela ne veut pas dire qu'il n'y a pas d'erreurs ailleurs, faites donc tr\350s atten)HY(tion)YH(. Si vous avez valid\351 quelque chose, faites-nous le savoir, ce qui nous permet)HY(tra)YH( de retirer la mention FIXME.)EP()0 P(Je pren)HY(drai)YH( quelques liber)HY(t\351s)YH( tout au long de cet HOWTO. Par exemple, je pars de l'hypo)HY(th\350se)YH( d'une connexion Inter)HY(net)YH( \340 10 Mbits, bien que je sache tr\350s bien que cela ne soit pas vrai)HY(ment)YH( courant.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 9 H(5.\240Acc\350s,)WB 176 Sn()WB 8 Sn( CVS et propo)HY(si)HY(tions)YH( de mises \340 jour)EH()BR()BR()BR()0 P(L'adresse cano)HY(nique)YH( de cet HOWTO est )R3 2 A(Ici)EA(.)EP()0 P(Nous avons main)HY(te)HY(nant)YH( un CVS en acc\350s anonyme dispo)HY(nible)YH( depuis le monde entier. Cela est int\351)HY(res)HY(sant)YH( pour plusieurs raisons. Vous pouvez faci)HY(le)HY(ment)YH( t\351l\351)HY(char)HY(ger)YH( les nouvelles versions de ce HOWTO et soumettre des mises \340 jour.)EP()0 P(En outre, cela permet aux auteurs de travailler sur la source de fa\347on ind\351)HY(pen)HY(dante)YH(, ce qui est une bonne chose aussi.)EP() 6 59 PR($ export CVSROOT=:pserver:anon@outpost.ds9a.nl:/var/cvsroot $ cvs login CVS password: [enter 'cvs' \201sans les caract\350res '\202] $ cvs co 2.4routing cvs server: Updating 2.4routing U 2.4routing/lartc.db)RP()0 P(Si vous avez fait des chan)HY(ge)HY(ments)YH( et que vous vouliez contri)HY(buer)YH( au HOWTO, ex\351cu)HY(tez)YH( )BD()SM(cvs -z3 diff -uBb)ES()ES(, et envoyez-nous le r\351sul)HY(tat)YH( par cour)HY(rier)YH( \351lec)HY(tro)HY(nique)YH( de fa\347on \340 pouvoir faci)HY(le)HY(ment)YH( int\351)HY(grer)YH( les modi)HY(fi)HY(ca)HY(tions)YH(. Merci\240! Au fait, soyez s\373r que vous avez \351dit\351 le fichier .db, les autres docu)HY(ments)YH( \351tant g\351n\351r\351s \340 partir de celui-ci.)EP()0 P(Un fichier Make)HY(file)YH( est fourni pour vous aider \340 cr\351er des fichiers Post)HY(Script)YH(, dvi, pdf, html et texte. Vous pouvez avoir \340 instal)HY(ler)YH( les docbook, docbook-utils, ghosts)HY(cript)YH( et tetex pour obtenir tous les formats de sortie. )EP()0 P(Faites atten)HY(tion)YH( de ne pas \351diter le fichier 2.4routing.sgml\240! Il contient une ancienne version du HOWTO. Le bon fichier est lartc.db.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 10 H(6.\240Liste)WB 177 Sn()WB 9 Sn( de diffu)HY(sion)YH()EH()BR()BR()BR()0 P(Les auteurs re\347oivent de plus en plus de cour)HY(riers)YH( \351lec)HY(tro)HY(niques)YH( \340 propos de cet HOWTO. Vu l'int\351r\352t de la commu)HY(naut\351)YH(, il a \351t\351 d\351cid\351 la mise en place d'une liste de diffu)HY(sion)YH( o\371 les personnes pour)HY(ront)YH( discu)HY(ter)YH( du routage avanc\351 et du contr\364le de trafic. Vous pouvez vous abonner \340 la liste )R4 2 A(ici)EA(.)EP()0 P(Il devra \352tre not\351 que les auteurs sont tr\350s h\351si)HY(tants)YH( \340 r\351pondre \340 des ques)HY(tions)YH( qui n'ont pas \351t\351 pos\351es sur la liste. Nous aime)HY(rions)YH( que la liste devienne une sorte de base de connais)HY(sance)YH(. Si vous avez une ques)HY(tion)YH(, recher)HY(chez)YH(, s'il vous pla\356t, d'abord dans l'archive, et ensuite postez-l\340 dans la liste de diffu)HY(sion)YH(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 11 H(7.\240Plan)WB 178 Sn()WB 10 Sn( du docu)HY(ment)YH()EH()BR()BR()BR()0 P(Nous allons essayer de faire des mani)HY(pu)HY(la)HY(tions)YH( int\351)HY(res)HY(santes)YH( d\350s le d\351but, ce qui veut dire que tout ne sera pas expliqu\351 en d\351tail tout de suite. Veuillez passer sur ces d\351tails, et accep)HY(ter)YH( de consi)HY(d\351)HY(rer)YH( qu'ils devien)HY(dront)YH( clairs par la suite.)EP()0 P(Le routage et le filtrage sont deux choses distinctes. Le filtrage est tr\350s bien docu)HY(ment\351)YH( dans le HOWTO de Rusty, dispo)HY(nible)YH( ici\240:)EP()BR()UL()0 P()-1 LI()R5 2 A( Rusty's Remar)HY(ka)HY(bly)YH( Unre)HY(liable)YH( Guides)EA( )EP()LU()BR()0 P(Nous nous foca)HY(li)HY(se)HY(rons)YH( prin)HY(ci)HY(pa)HY(le)HY(ment)YH( sur ce qu'il est possible de faire en combi)HY(nant)YH( netfil)HY(ter)YH( et iproute2.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 12 H(Chapitre\2403.\240Intro)WB 179 Sn()HY(duc)HY(tion)YH()WB 11 Sn( \340 iproute2)EH()BR()BR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 12 1 A(1. Pourquoi iproute2\240?)12 0 TN TL()Ec /AF f D()0 DT()0 13 1 A(2. Un tour d'horizon d'iproute2)13 0 TN TL()Ec /AF f D()0 DT()0 14 1 A(3. Pr\351requis)14 0 TN TL()Ec /AF f D()0 DT()0 15 1 A(4. Explo)HY(rer)YH( votre confi)HY(gu)HY(ra)HY(tion)YH( courante)15 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 16 1 A(4.1. )BD(ip)ES( nous montre nos liens)16 0 TN TL()Ec /AF f D()0 DT()0 17 1 A(4.2. )BD(ip)ES( nous montre nos adresses IP)17 0 TN TL()Ec /AF f D()0 DT()0 18 1 A(4.3. )BD(ip)ES( nous montre nos routes)18 0 TN TL()Ec /AF f D()LD()0 DT()0 19 1 A(5. ARP)19 0 TN TL()Ec /AF f D()LD()BR()2 Sl()BR()BR()BR()BR()0 2 13 H(1.\240Pourquoi)WB 180 Sn()WB 12 Sn( iproute2\240?)EH()BR()BR()BR()0 P(La plupart des distri)HY(bu)HY(tions)YH( Linux et des UNIX utilisent couram)HY(ment)YH( les v\351n\351)HY(rables)YH( commandes )BD(arp)ES(, )BD(ifcon)HY(fig)YH()ES( et )BD(route)ES(. Bien que ces outils fonc)HY(tionnent)YH(, ils montrent quelques compor)HY(te)HY(ments)YH( inat)HY(ten)HY(dus)YH( avec les noyaux Linux des s\351ries 2.2 et plus. Par exemple, les tunnels GRE font partie int\351)HY(grante)YH( du routage de nos jours, mais ils n\351ces)HY(sitent)YH( des outils compl\350)HY(te)HY(ment)YH( diff\351)HY(rents)YH(.)EP()0 P(Avec iproute2, les tunnels font partie int\351)HY(grante)YH( des outils.)EP()0 P(Les noyaux Linux des s\351ries 2.2 et plus ont un sous-syst\350me r\351seau compl\350)HY(te)HY(ment)YH( r\351\351crit. Ce nouveau codage de la partie r\351seau apporte \340 Linux des perfor)HY(mances)YH( et des fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( qui n'ont pratique)HY(ment)YH( pas d'\351qui)HY(valent)YH( parmi les autres syst\350mes d'exploi)HY(ta)HY(tion)YH(. En fait, le nouveau logi)HY(ciel)YH( de filtrage, routage et de clas)HY(si)HY(fi)HY(ca)HY(tion)YH( poss\350de plus de fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( que les logi)HY(ciels)YH( fournis sur beau)HY(coup)YH( de routeurs d\351di\351s, de pare-feu et de produits de mise en forme \201)EM(shaping)ES(\202 du trafic.)EP()0 P(Dans les syst\350mes d'exploi)HY(ta)HY(tion)YH( exis)HY(tants)YH(, au fur et \340 mesure que de nouveaux concepts r\351seau appa)HY(rais)HY(saient)YH(, les d\351ve)HY(lop)HY(peurs)YH( sont parve)HY(nus)YH( \340 les greffer sur les struc)HY(tures)YH( exis)HY(tantes)YH(. Ce travail constant d'empi)HY(lage)YH( de couches a conduit \340 des codes r\351seau aux compor)HY(te)HY(ments)YH( \351tranges, un peu comme les langues humaines. Dans le pass\351, Linux \351mulait le mode de fonc)HY(tion)HY(ne)HY(ment)YH( de SunOS, ce qui n'\351tait pas l'id\351al.)EP()0 P(La nouvelle struc)HY(ture)YH( d'iproute2 a permis de formu)HY(ler)YH( clai)HY(re)HY(ment)YH( des fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( impos)HY(sibles)YH( \340 impl\351)HY(men)HY(ter)YH( dans le sous-syst\350me r\351seau pr\351c\351)HY(dent)YH(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 14 H(2.\240Un)WB 181 Sn()WB 13 Sn( tour d'horizon d'iproute2)EH()BR()BR()BR()0 P(Linux poss\350de un syst\350me sophis)HY(tiqu\351)YH( d'allo)HY(ca)HY(tion)YH( de bande passante appel\351 Contr\364le de trafic \201)EM(Traffic Control)ES(\202. Ce syst\350me supporte diff\351)HY(rentes)YH( m\351thodes pour classer, ranger par ordre de prio)HY(rit\351)YH(, parta)HY(ger)YH( et limiter le trafic entrant et sortant.)EP()0 P(Nous commen)HY(ce)HY(rons)YH( par un petit tour d'horizon des possi)HY(bi)HY(li)HY(t\351s)YH( d'iproute2.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 15 H(3.\240Pr\351requis)WB 182 Sn()WB 14 Sn()EH()BR()BR()BR()0 P(Vous devez \352tre s\373r que vous avez install\351 les outils utili)HY(sa)HY(teur)YH( \201NdT\240: user)HY(land)YH( tools, par oppo)HY(si)HY(tion)YH( \340 la partie \253\240noyau\240\273 d'iproute2\202. Le paquet concern\351 s'appelle iproute sur RedHat et Debian. Autre)HY(ment)YH(, il peut \352tre trouv\351 \340 )SM(ftp://ftp.inr.ac.ru/ip-routing/iproute2-2.2.4-now-ss??????.tar.gz)ES(. )EP()0 P(Vous pouvez aussi essayer )R6 2 A(iproute2-current.tar.gz)EA( pour la derni\350re version.)EP()0 P(Certains \351l\351ments d'iproute vous imposent l'acti)HY(va)HY(tion)YH( de certaines options du noyau. Il devra \351gale)HY(ment)YH( \352tre not\351 que toutes les versions de RedHat jusqu'\340 la version 6.2 incluse n'ont pas les fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( du contr\364le de trafic acti)HY(v\351es)YH( dans le noyau fourni par d\351faut.)EP()0 P(RedHat 7.2 contient tous les \351l\351ments par d\351faut.)EP()0 P(Soyez \351gale)HY(ment)YH( s\373r que vous avez le support )SM(netlink)ES(, m\352me si vous devez choisir de compi)HY(ler)YH( votre propre noyau ; iproute2 en a besoin.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 16 H(4.\240Explo)WB 183 Sn()HY(rer)YH()WB 15 Sn( votre confi)HY(gu)HY(ra)HY(tion)YH( courante)EH()BR()BR()BR()0 P(Cela peut vous para\356tre surpre)HY(nant)YH(, mais iproute2 est d\351j\340 confi)HY(gur\351)YH(\240! Les commandes courantes )BD(ifcon)HY(fig)YH()ES( et )BD(route)ES( utilisent d\351j\340 les appels syst\350me avanc\351s d'iproute2, mais essen)HY(tiel)HY(le)HY(ment)YH( avec les options par d\351faut \201c'est-\340-dire ennuyeuses\202.)EP()0 P(L'outil )BD(ip)ES( est central, et nous allons lui deman)HY(der)YH( de nous montrer les inter)HY(faces)YH(.)EP()2 Sl()BR()BR()BR()BR()0 3 17 H(4.1.\240)WB 184 Sn()WB 16 Sn()BD(ip)ES( nous montre nos liens)EH()BR()BR()BR() 11 78 PR([ahu@home ahu]$ ip link list 1: lo: mtu 3924 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: dummy: mtu 1500 qdisc noop link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff 3: eth0: mtu 1400 qdisc pfifo_fast qlen 100 link/ether 48:54:e8:2a:47:16 brd ff:ff:ff:ff:ff:ff 4: eth1: mtu 1500 qdisc pfifo_fast qlen 100 link/ether 00:e0:4c:39:24:78 brd ff:ff:ff:ff:ff:ff 3764: ppp0: mtu 1492 qdisc pfifo_fast qlen 10 link/ppp)RP()0 P(La sortie peut varier, mais voici ce qui est affich\351 pour mon routeur NAT)Ca( \201NdT\240: traduc)HY(tion)YH( d'adresse\202 chez moi. J'explique)HY(rai)YH( seule)HY(ment)YH( une partie de la sortie, dans la mesure o\371 tout n'est pas direc)HY(te)HY(ment)YH( perti)HY(nent)YH(.)EP()0 P(La premi\350re inter)HY(face)YH( que nous voyons est l'inter)HY(face)YH( )SM(loop)HY(back)YH()ES(. Bien que votre ordi)HY(na)HY(teur)YH( puisse fonc)HY(tion)HY(ner)YH( sans, je vous le d\351con)HY(seille)YH(. La taille de MTU)Ca( \201unit\351 maximum de trans)HY(mis)HY(sion)YH(\202 est de 3924 octets, et )SM(loop)HY(back)YH()ES( n'est pas suppos\351 \352tre mis en file d'attente, ce qui prend tout son sens dans la mesure o\371 cette inter)HY(face)YH( est le fruit de l'imagi)HY(na)HY(tion)YH( de votre noyau.)EP()0 P(Je vais passer sur l'inter)HY(face)YH( )SM(dummy)ES( pour l'instant, et il se peut qu'elle ne soit pas pr\351sente sur votre ordi)HY(na)HY(teur)YH(. Il y a ensuite mes deux inter)HY(faces)YH( physiques, l'une du c\364t\351 de mon modem c\342ble, l'autre servant mon segment ether)HY(net)YH( \340 la maison. De plus, nous voyons une inter)HY(face)YH( )SM(ppp0)ES(.)EP()0 P(Notons l'absence d'adresses IP)Ca(. Iproute d\351con)HY(necte)YH( les concepts de \253\240liens\240\273 et \253\240d'adresses IP\240\273. Avec l')EM(IP alia)HY(sing)YH()ES(, le concept de l'adresse IP)Ca( cano)HY(nique)YH( est devenu, de toute fa\347on, sans signi)HY(fi)HY(ca)HY(tion)YH(.)EP()0 P()BD(ip)ES( nous montre bien, cepen)HY(dant)YH(, l'adresse MAC)Ca(, l'iden)HY(ti)HY(fiant)YH( mat\351)HY(riel)YH( de nos inter)HY(faces)YH( ether)HY(net)YH(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 18 H(4.2.\240)WB 185 Sn()WB 17 Sn()BD(ip)ES( nous montre nos adresses IP)EH()BR()BR()BR() 14 78 PR([ahu@home ahu]$ ip address show 1: lo: mtu 3924 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 brd 127.255.255.255 scope host lo 2: dummy: mtu 1500 qdisc noop link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff 3: eth0: mtu 1400 qdisc pfifo_fast qlen 100 link/ether 48:54:e8:2a:47:16 brd ff:ff:ff:ff:ff:ff inet 10.0.0.1/8 brd 10.255.255.255 scope global eth0 4: eth1: mtu 1500 qdisc pfifo_fast qlen 100 link/ether 00:e0:4c:39:24:78 brd ff:ff:ff:ff:ff:ff 3764: ppp0: mtu 1492 qdisc pfifo_fast qlen 10 link/ppp inet 212.64.94.251 peer 212.64.94.1/32 scope global ppp0)RP()0 P(Cela contient plus d'infor)HY(ma)HY(tions)YH(\240: )BD(ip)ES( montre toutes nos adresses, et \340 quelles cartes elles appar)HY(tiennent)YH(. )SM(inet)ES( signi)HY(fie)YH( Inter)HY(net)YH( \201IPv4\202. Il y a beau)HY(coup)YH( d'autres familles d'adresses, mais elles ne nous concernent pas pour le moment.)EP()0 P(Exami)HY(nons)YH( l'inter)HY(face)YH( )SM(eth0)ES( de plus pr\350s. Il est dit qu'elle est reli\351e \340 l'adresse inter)HY(net)YH( )SM(10.0.0.1/8)ES(. Qu'est-ce que cela signi)HY(fie)YH(\240? Le /8 d\351signe le nombre de bits r\351ser)HY(v\351s)YH( \340 l'adresse r\351seau. Il y a 32 bits, donc il reste 24 bits pour d\351si)HY(gner)YH( une partie de notre r\351seau. Les 8 premiers bits de )SM(10.0.0.1)ES( corres)HY(pondent)YH( \340 )SM(10.0.0.0)ES(, notre adresse r\351seau, et notre masque de sous-r\351seau est )SM(255.0.0.0)ES(.)EP()0 P(Les autres bits rep\350rent des machines direc)HY(te)HY(ment)YH( connec)HY(t\351es)YH( \340 cette inter)HY(face)YH(. Donc, )SM(10.250.3.13)ES( est direc)HY(te)HY(ment)YH( dispo)HY(nible)YH( sur )SM(eth0)ES(, comme l'est )SM(10.0.0.1)ES( dans notre exemple.)EP()0 P(Avec )SM(ppp0)ES(, le m\352me concept existe, bien que les nombres soient diff\351)HY(rents)YH(. Son adresse est )SM(212.64.94.251)ES(, sans masque de sous-r\351seau. Cela signi)HY(fie)YH( que vous avez une liaison point \340 point et que toutes les adresses, \340 l'exception de )SM(212.64.94.251)ES(, sont distantes. Il y a cepen)HY(dant)YH( plus d'infor)HY(ma)HY(tions)YH(. En effet, on nous dit que de l'autre c\364t\351 du lien, il n'y a encore qu'une seule adresse, )SM(212.64.94.1)ES(. Le /32 nous pr\351cise qu'il n'y a pas de \253\240bits r\351seau\240\273.)EP()0 P(Il est abso)HY(lu)HY(ment)YH( vital que vous compre)HY(niez)YH( ces concepts. R\351f\351rez-vous \340 la docu)HY(men)HY(ta)HY(tion)YH( mention)HY(n\351e)YH( au d\351but de ce HOWTO si vous avez des doutes.)EP()0 P(Vous pouvez aussi noter )SM(qdisc)ES(, qui d\351signe la gestion de la mise en file d'attente \201)EM(Queueing Disci)HY(pline)YH()ES(\202. Cela devien)HY(dra)YH( vital plus tard.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 19 H(4.3.\240)WB 186 Sn()WB 18 Sn()BD(ip)ES( nous montre nos routes)EH()BR()BR()BR()0 P(Nous savons main)HY(te)HY(nant)YH( comment trouver les adresses )SM(10.x.y.z)ES(, et nous sommes capables d'atteindre )SM(212.64.94.1)ES(. Cela n'est cepen)HY(dant)YH( pas suffi)HY(sant)YH(, et nous avons besoin d'instruc)HY(tions)YH( pour atteindre le monde. L'Inter)HY(net)YH( est dispo)HY(nible)YH( via notre connexion PPP)Ca(, et il se trouve que )SM(212.64.94.1)ES( est pr\352t \340 propa)HY(ger)YH( nos paquets \340 travers le monde, et \340 nous renvoyer le r\351sul)HY(tat)YH(.)EP() 5 65 PR([ahu@home ahu]$ ip route show 212.64.94.1 dev ppp0 proto kernel scope link src 212.64.94.251 10.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.1 127.0.0.0/8 dev lo scope link default via 212.64.94.1 dev ppp0)RP()0 P(Cela se comprend de soi-m\352me. Les 4 premi\350res lignes donnent expli)HY(ci)HY(te)HY(ment)YH( ce qui \351tait sous-entendu par )BD()SM(ip address show)ES()ES(, la derni\350re ligne nous indiquant que le reste du monde peut \352tre trouv\351 via )SM(212.64.94.1)ES(, notre passe)HY(relle)YH( par d\351faut. Nous pouvons voir que c'est une passe)HY(relle)YH( \340 cause du mot \253\240via\240\273, qui nous indique que nous avons besoin d'envoyer les paquets vers )SM(212.64.94.1)ES(, et que c'est elle qui se char)HY(gera)YH( de tout.)EP()0 P(En r\351f\351)HY(rence)YH(, voici ce que l'ancien utili)HY(taire)YH( )BD(route)ES( nous propose\240:)EP() 8 76 PR([ahu@home ahu]$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 212.64.94.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0 10.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 eth0 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo 0.0.0.0 212.64.94.1 0.0.0.0 UG 0 0 0 ppp0)RP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 20 H(5.\240ARP)WB 187 Sn()WB 19 Sn()EH()BR()BR()BR()0 P(ARP)Ca( est le Proto)HY(cole)YH( de R\351so)HY(lu)HY(tion)YH( d'Adresse \201)EM(Address Reso)HY(lu)HY(tion)YH( Proto)HY(col)YH()ES(\202. Il est d\351crit dans le )R7 2 A(RFC 826)EA(. ARP)Ca( est utilis\351 par une machine d'un r\351seau local pour retrou)HY(ver)YH( l'adresse mat\351)HY(rielle)YH( \201la loca)HY(li)HY(sa)HY(tion)YH(\202 d'une autre machine sur le m\352me r\351seau. Les machines sur Inter)HY(net)YH( sont g\351n\351)HY(ra)HY(le)HY(ment)YH( connues par leur nom auquel corres)HY(pond)YH( une adresse IP. C'est ainsi qu'une machine sur le r\351seau )SM(foo.com)ES( est capable de commu)HY(niquer)YH( avec une autre machine qui est sur le r\351seau )SM(bar.net)ES(. Une adresse IP, cepen)HY(dant)YH(, ne peut pas vous indiquer la loca)HY(li)HY(sa)HY(tion)YH( physique de la machine. C'est ici que le proto)HY(cole)YH( ARP)Ca( entre en jeu.)EP()0 P(Prenons un exemple tr\350s simple. Suppo)HY(sons)YH( que j'aie un r\351seau compos\351 de plusieurs machines, dont la machine )SM(foo)ES( d'adresse IP )SM(10.0.0.1)ES( et la machine )SM(bar)ES( qui a l'adresse IP )SM(10.0.0.2)ES(. Main)HY(te)HY(nant)YH(, )SM(foo)ES( veut envoyer un )BD(ping)ES( vers )SM(bar)ES( pour voir s'il est actif, mais )SM(foo)ES( n'a aucune indi)HY(ca)HY(tion)YH( sur la loca)HY(li)HY(sa)HY(tion)YH( de )SM(bar)ES(. Donc, si )SM(foo)ES( d\351cide d'envoyer un )BD(ping)ES( vers )SM(bar)ES(, il a besoin d'envoyer une requ\352te ARP)Ca(. Cette requ\352te ARP)Ca( est une fa\347on pour )SM(foo)ES( de crier sur le r\351seau \253\240Bar \20110.0.0.2\202\240! O\371 es-tu\240?\240\273. Par cons\351)HY(quent)YH(, toutes les machines sur le r\351seau enten)HY(dront)YH( )SM(foo)ES( crier, mais seul )SM(bar)ES( \201)SM(10.0.0.2)ES(\202 r\351pon)HY(dra)YH(. )SM(Bar)ES( enverra une r\351ponse ARP)Ca( direc)HY(te)HY(ment)YH( \340 )SM(foo)ES(\240; ce qui revient \340 dire\240: \253\240Foo \20110.0.0.1\202\240! je suis ici, \340 l'adresse 00:60:94:E:08:12\240\273. Apr\350s cette simple tran)HY(sac)HY(tion)YH( utili)HY(s\351e)YH( pour loca)HY(li)HY(ser)YH( son ami sur le r\351seau, )SM(foo)ES( est capable de commu)HY(niquer)YH( avec )SM(bar)ES( jusqu'\340 ce qu'il \201le cache ARP)Ca( de )SM(foo)ES(\202 oublie o\371 bar est situ\351 \201typique)HY(ment)YH( au bout de 15 minutes sur Unix\202.)EP()0 P(Main)HY(te)HY(nant)YH(, voyons comment cela fonc)HY(tionne)YH(. Vous pouvez consul)HY(ter)YH( votre cache \201table\202 ARP)Ca( \201)EM(neigh)HY(bor)YH()ES(\202 comme ceci\240:)EP() 3 57 PR([root@espa041 /home/src/iputils]# ip neigh show 9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable 9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud reachable)RP()0 P(Comme vous pouvez le voir, ma machine )SM(espa041)ES( \201)SM(9.3.76.41)ES(\202 sait o\371 trouver )SM(espa042)ES( \201)SM(9.3.76.42)ES(\202 et )SM(espa)HY(gate)YH()ES( \201)SM(9.3.76.1)ES(\202. Main)HY(te)HY(nant)YH(, ajou)HY(tons)YH( une autre machine dans le cache ARP)Ca(.)EP() 11 78 PR([root@espa041 /home/paulsch/.gnome-desktop]# ping -c 1 espa043 PING espa043.austin.ibm.com \2019.3.76.43\202 from 9.3.76.41 : 56\20184\202 bytes of data. 64 bytes from 9.3.76.43: icmp_seq=0 ttl=255 time=0.9 ms 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.9/0.9/0.9 ms [root@espa041 /home/src/iputils]# ip neigh show 9.3.76.43 dev eth0 lladdr 00:06:29:21:80:20 nud reachable 9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable 9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud reachable)RP()0 P(Par cons\351)HY(quent)YH(, lorsque )SM(espa041)ES( a essay\351 de contac)HY(ter)YH( )SM(espa043)ES(, l'adresse mat\351)HY(rielle)YH( de )SM(espa043)ES( \201sa loca)HY(li)HY(sa)HY(tion)YH(\202 a alors \351t\351 ajout\351e dans le cache ARP)Ca(. Donc, tant que la dur\351e de vie de l'entr\351e corres)HY(pon)HY(dant)YH( \340 )SM(espa043)ES( dans le cache ARP)Ca( n'est pas d\351pas)HY(s\351e)YH(, )SM(espa041)ES( sait loca)HY(li)HY(ser)YH( )SM(espa043)ES( et n'a plus besoin d'envoyer de requ\352te ARP)Ca(.)EP()0 P(Main)HY(te)HY(nant)YH(, effa\347ons )SM(espa043)ES( de notre cache ARP)Ca(.)EP() 5 68 PR([root@espa041 /home/src/iputils]# ip neigh delete 9.3.76.43 dev eth0 [root@espa041 /home/src/iputils]# ip neigh show 9.3.76.43 dev eth0 nud failed 9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable 9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud stale)RP()0 P(Main)HY(te)HY(nant)YH(, )SM(espa041)ES( a \340 nouveau oubli\351 la loca)HY(li)HY(sa)HY(tion)YH( d')SM(espa043)ES( et aura besoin d'envoyer une autre requ\352te ARP)Ca( la prochaine fois qu'il voudra commu)HY(niquer)YH( avec lui. Vous pouvez aussi voir ci-dessus que l'\351tat d')SM(espa)HY(gate)YH()ES( \201)SM(9.3.76.1)ES(\202 est pass\351 en )EM(stale)ES(. Cela signi)HY(fie)YH( que la loca)HY(li)HY(sa)HY(tion)YH( connue est encore valide, mais qu'elle devra \352tre confir)HY(m\351e)YH( \340 la premi\350re tran)HY(sac)HY(tion)YH( avec cette machine.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 21 H(Chapitre\2404.\240R\350gles)WB 188 Sn()WB 20 Sn( - bases de donn\351es des poli)HY(tiques)YH( de routage)EH()BR()BR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 21 1 A(1. Poli)HY(tique)YH( de routage simple par l'adresse source)21 0 TN TL()Ec /AF f D()0 DT()0 22 1 A(2. Routage avec plusieurs acc\350s Inter)HY(net)YH(/four)HY(nis)HY(seurs)YH( d'acc\350s)22 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 23 1 A(2.1. Acc\350s s\351par\351)23 0 TN TL()Ec /AF f D()0 DT()0 24 1 A(2.2. Balance de charge)24 0 TN TL()Ec /AF f D()LD()LD()BR()0 P(Si vous avez un routeur impor)HY(tant)YH(, il se peut que vous vouliez satis)HY(faire)YH( les besoins de diff\351)HY(rentes)YH( personnes, qui peuvent \352tre trai)HY(t\351es)YH( diff\351)HY(rem)HY(ment)YH(. Les bases de donn\351es des poli)HY(tiques)YH( de routage vous aident \340 faire cela, en g\351rant plusieurs ensembles de tables de routage.)EP()0 P(Si vous voulez utili)HY(ser)YH( cette fonc)HY(tion)HY(na)HY(lit\351)YH(, assurez-vous que le noyau est compil\351 avec les options )SM(IP\240: Advan)HY(ced)YH( router)ES( et )SM(IP\240: policy routing)ES(.)EP()0 P(Quand le noyau doit prendre une d\351ci)HY(sion)YH( de routage, il recherche quelle table consul)HY(ter)YH(. Par d\351faut, il y a trois tables. L'ancien outil )BD(route)ES( modifie les tables prin)HY(ci)HY(pale)YH( \201)EM(main)ES(\202 et locale \201)EM(local)ES(\202, comme le fait l'outil )BD(ip)ES( \201par d\351faut\202.)EP()0 P(Les r\350gles par d\351faut\240:)EP() 4 31 PR([ahu@home ahu]$ ip rule list 0: from all lookup local 32766: from all lookup main 32767: from all lookup default)RP()0 P(Ceci liste la prio)HY(rit\351)YH( de toutes les r\350gles. Nous voyons que toutes les r\350gles sont appliqu\351es \340 tous les paquets \201)EM(from all)ES(\202. Nous avons vu la table )EM(main)ES( pr\351c\351)HY(dem)HY(ment)YH(, sa sortie s'effec)HY(tuant)YH( avec )BD()SM(ip route ls)ES()ES(, mais les tables )SM(local)ES( et )SM(default)ES( sont nouvelles. )EP()0 P(Si nous voulons faire des choses fantai)HY(sistes)YH(, nous pouvons cr\351er des r\350gles qui pointent vers des tables diff\351)HY(rentes)YH( et qui nous permettent de red\351)HY(fi)HY(nir)YH( les r\350gles de routage du syst\350me.)EP()0 P(Pour savoir exac)HY(te)HY(ment)YH( ce que fait le noyau en pr\351sence d'un assor)HY(ti)HY(ment)YH( de r\350gles plus complet, r\351f\351rez-vous \340 la docu)HY(men)HY(ta)HY(tion)YH( ip-cref d'Alexey [NdT\240: dans le paquet iproute2 de votre distri)HY(bu)HY(tion)YH(].)EP()2 Sl()BR()BR()BR()BR()0 2 22 H(1.\240Poli)WB 189 Sn()HY(tique)YH()WB 21 Sn( de routage simple par l'adresse source)EH()BR()BR()BR()0 P(Prenons encore une fois un exemple r\351el. J'ai 2 modems c\342ble, connec)HY(t\351s)YH( \340 un routeur Linux NAT)Ca( \201)EM(masque)HY(ra)HY(ding)YH()ES(\202. Les personnes habi)HY(tant)YH( avec moi me paient pour avoir acc\350s \340 Inter)HY(net)YH(. Suppo)HY(sons)YH( qu'un de mes co-loca)HY(taires)YH( consulte seule)HY(ment)YH( hotmail et veuille payer moins. C'est d'accord pour moi, mais il utili)HY(sera)YH( le modem le plus lent.)EP()0 P(Le modem c\342ble \253\240rapide\240\273 est connu sous )SM(212.64.94.251)ES( et est en liaison PPP)Ca( avec )SM(212.64.94.1)ES(. Le modem c\342ble \253\240lent\240\273 est connu sous diverses adresses IP)Ca(\240: )SM(212.64.78.148)ES( dans notre exemple avec un lien vers )SM(195.96.98.253)ES(.)EP()0 P(La table locale\240:)EP() 10 73 PR([ahu@home ahu]$ ip route list table local broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 local 10.0.0.1 dev eth0 proto kernel scope host src 10.0.0.1 broadcast 10.0.0.0 dev eth0 proto kernel scope link src 10.0.0.1 local 212.64.94.251 dev ppp0 proto kernel scope host src 212.64.94.251 broadcast 10.255.255.255 dev eth0 proto kernel scope link src 10.0.0.1 broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 local 212.64.78.148 dev ppp2 proto kernel scope host src 212.64.78.148 local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1)RP()0 P(Il y a beau)HY(coup)YH( de choses \351videntes, mais aussi des choses qui ont besoin d'\352tre pr\351ci)HY(s\351es)YH( quelque peu, ce que nous allons faire. La table de routage par d\351faut est vide.)EP()0 P(Regar)HY(dons)YH( la table prin)HY(ci)HY(pale)YH( \201)EM(main)ES(\202\240:)EP() 6 67 PR([ahu@home ahu]$ ip route list table main 195.96.98.253 dev ppp2 proto kernel scope link src 212.64.78.148 212.64.94.1 dev ppp0 proto kernel scope link src 212.64.94.251 10.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.1 127.0.0.0/8 dev lo scope link default via 212.64.94.1 dev ppp0)RP()0 P(Main)HY(te)HY(nant)YH(, nous g\351n\351)HY(rons)YH( une nouvelle r\350gle que nous appel)HY(le)HY(rons)YH( )SM(John)ES(, pour notre hypo)HY(th\351)HY(tique)YH( co-loca)HY(taire)YH(. Bien que nous puis)HY(sions)YH( travailler avec des nombres IP purs, il est plus facile d'ajouter notre table dans le fichier )SM(/etc/iproute2/rt_tables)ES(. )EP() 7 42 PR(# echo 200 John >> /etc/iproute2/rt_tables # ip rule add from 10.0.0.10 table John # ip rule ls 0: from all lookup local 32765: from 10.0.0.10 lookup John 32766: from all lookup main 32767: from all lookup default)RP()0 P(Main)HY(te)HY(nant)YH(, tout ce qu'il reste \340 faire est de g\351n\351rer la table )SM(John)ES(, et de vider le cache des routes\240:)EP() 2 60 PR(# ip route add default via 195.96.98.253 dev ppp2 table John # ip route flush cache)RP()0 P(Et voil\340 qui est fait. Il ne reste plus, comme exer)HY(cice)YH( laiss\351 au lecteur, qu'\340 impl\351)HY(men)HY(ter)YH( cela dans )BD(ip-up)ES(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 23 H(2.\240Routage)WB 190 Sn()WB 22 Sn( avec plusieurs acc\350s Inter)HY(net)YH(/four)HY(nis)HY(seurs)YH( d'acc\350s)EH()BR()BR()BR()0 P(Une confi)HY(gu)HY(ra)HY(tion)YH( clas)HY(sique)YH( est la suivante, o\371 deux four)HY(nis)HY(seurs)YH( d'acc\350s permettent la connexion d'un r\351seau local \201ou m\352me d'une simple machine\202 \340 Inter)HY(net)YH(. ) 16 75 PR( ________ +--------------+ / | | | +-------------+ Fournisseur 1+------- __ | | | / ___/ \200_ +------+-------+ +--------------+ | _/ \200__ | if1 | / / \200 | | | | R\351seau Local -----+ Routeur Linux| | Internet \200_ __/ | | | \200__ __/ | if2 | \200 \200___/ +------+-------+ +--------------+ | | | | \200 +-------------+ Fournisseur 2+------- | | | +--------------+ \200________)RP()EP()0 P(Il y a g\351n\351)HY(ra)HY(le)HY(ment)YH( deux ques)HY(tions)YH( \340 se poser pour cette confi)HY(gu)HY(ra)HY(tion)YH(.)EP()2 Sl()BR()BR()BR()BR()0 3 24 H(2.1.\240Acc\350s)WB 191 Sn()WB 23 Sn( s\351par\351)EH()BR()BR()BR()0 P( La premi\350re est de savoir comment router les r\351ponses aux paquets entrants par un four)HY(nis)HY(seur)YH( parti)HY(cu)HY(lier)YH(, disons le Four)HY(nis)HY(seur)YH( 1, vers ce m\352me four)HY(nis)HY(seur)YH(. )EP()0 P( Commen\347ons par d\351finir quelques symboles. )BD($IF1)ES( sera le nom de la premi\350re inter)HY(face)YH( \201if1 sur la figure au-dessus\202 et )BD($IF2)ES( le nom de la deuxi\350me inter)HY(face)YH(. )BD($IP1)ES( sera alors l'adresse IP asso)HY(ci\351e)YH( \340 )BD($IF1)ES( et )BD($IP2)ES( sera l'adresse IP asso)HY(ci\351e)YH( \340 )BD($IF2)ES(. )BD($P1)ES( sera l'adresse IP de la passe)HY(relle)YH( du four)HY(nis)HY(seur)YH( d'acc\350s 1 et )BD($P2)ES( sera l'adresse IP de la passe)HY(relle)YH( du four)HY(nis)HY(seur)YH( d'acc\350s 2. Enfin, )BD($P1_NET)ES( sera l'adresse r\351seau \340 l'int\351)HY(rieur)YH( duquel se situe )BD($P1)ES( et )BD($P2_NET)ES( sera l'adresse r\351seau \340 l'int\351)HY(rieur)YH( duquel se situe )BD($P2)ES(. )EP()0 P( Deux tables de routage suppl\351)HY(men)HY(taires)YH( sont cr\351\351es, par exemple )BD(T1)ES( et )BD(T2)ES(. Celles-ci sont ajou)HY(t\351es)YH( dans )SM(/etc/iproute2/rt_tables)ES(. La confi)HY(gu)HY(ra)HY(tion)YH( du routage dans ces tables s'effec)HY(tue)YH( de la fa\347on suivante\240: )EP()0 P() 4 47 PR(ip route add $P1_NET dev $IF1 src $IP1 table T1 ip route add default via $P1 table T1 ip route add $P2_NET dev $IF2 src $IP2 table T2 ip route add default via $P2 table T2)RP( Rien de vrai)HY(ment)YH( spec)HY(ta)HY(cu)HY(laire)YH(. Une route est simple)HY(ment)YH( posi)HY(tion)HY(n\351e)YH( vers la passe)HY(relle)YH( et une route par d\351faut via cette passe)HY(relle)YH( est mise en place, comme nous le ferions dans le cas d'un seul four)HY(nis)HY(seur)YH( d'acc\350s. Ici, les routes sont plac\351es dans des tables s\351pa)HY(r\351es)YH(, une par four)HY(nis)HY(seur)YH( d'acc\350s. Il est \340 noter que la route vers le r\351seau suffit, dans la mesure o\371 elle indique comment trouver n'importe quel h\364te dans ce r\351seau, ce qui inclut la passe)HY(relle)YH(. )EP()0 P( La table de routage prin)HY(ci)HY(pale)YH( est main)HY(te)HY(nant)YH( confi)HY(gu)HY(r\351e)YH(. C'est une bonne id\351e de router les \351l\351ments \340 desti)HY(na)HY(tion)YH( d'un voisin direct \340 travers l'inter)HY(face)YH( connec)HY(t\351e)YH( \340 ce voisin. Notez les argu)HY(ments)YH( "src" qui assurent que la bonne adresse IP source sera choisie. ) 2 38 PR(ip route add $P1_NET dev $IF1 src $IP1 ip route add $P2_NET dev $IF2 src $IP2)RP( Indiquez main)HY(te)HY(nant)YH( votre pr\351f\351)HY(rence)YH( pour votre route par d\351faut\240: ) 1 28 PR(ip route add default via $P1)RP( Vous confi)HY(gu)HY(rez)YH( ensuite les r\350gles de routage. Celles-ci d\351fi)HY(nissent)YH( la table qui sera vrai)HY(ment)YH( choisie pour le routage. Il faut s'assurer que le routage s'effec)HY(tue)YH( \340 travers une inter)HY(face)YH( donn\351e si vous avez l'adresse source corres)HY(pon)HY(dante)YH(\240: ) 2 30 PR(ip rule add from $IP1 table T1 ip rule add from $IP2 table T2)RP( Cet ensemble de commandes vous assure que toutes les r\351ponses au trafic entrant sur une inter)HY(face)YH( parti)HY(cu)HY(li\350re)YH( seront envoy\351es par cette inter)HY(face)YH(. )EP()0 P( )BR()1 PT()BR( Nous avons main)HY(te)HY(nant)YH( une confi)HY(gu)HY(ra)HY(tion)YH( tr\350s basique. Elle marchera pour tous les proces)HY(sus)YH( ex\351cu)HY(t\351s)YH( sur le routeur lui-m\352me, ainsi que pour le r\351seau local si celui-ci est masqu\351. Si ce n'est pas le cas, soit vous avez une plage d'adresses IP pour chaque four)HY(nis)HY(seur)YH( d'acc\350s, soit vous masquez vers l'un des deux four)HY(nis)HY(seurs)YH( d'acc\350s. Dans les deux cas, vous ajou)HY(te)HY(rez)YH( des r\350gles indiquant, en fonc)HY(tion)YH( de l'adresse IP de la machine du r\351seau local, vers quel four)HY(nis)HY(seur)YH( vous allez router. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 25 H(2.2.\240Balance)WB 192 Sn()WB 24 Sn( de charge)EH()BR()BR()BR()0 P( La seconde ques)HY(tion)YH( concerne la balance de charge du trafic sortant vers les deux four)HY(nis)HY(seurs)YH( d'acc\350s. Ceci n'est pas vrai)HY(ment)YH( tr\350s dur si vous avez d\351j\340 confi)HY(gur\351)YH( l'acc\350s s\351par\351 comme d\351crit ci-dessus. )EP()0 P( Au lieu de choisir l'un des deux four)HY(nis)HY(seurs)YH( d'acc\350s comme route par d\351faut, celle-ci peut \352tre une route multi-chemin. Par d\351faut, le noyau r\351par)HY(tira)YH( les routes vers les deux four)HY(nis)HY(seurs)YH( d'acc\350s. Ceci est r\351alis\351 de la fa\347on suivante \201construit \351gale)HY(ment)YH( sur l'exemple de la section de l'acc\350s s\351par\351\202\240: ) 2 69 PR(ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \200 nexthop via $P2 dev $IF2 weight 1)RP( Ceci r\351ali)HY(sera)YH( la balance des routes vers les deux four)HY(nis)HY(seurs)YH(. Les para)HY(m\350tres)YH( )BD(weight)ES( peuvent permettre de favo)HY(ri)HY(ser)YH( un four)HY(nis)HY(seur)YH( par rapport \340 un autre. )EP()0 P( Il est \340 noter que la balance de charge ne sera pas parfaite dans la mesure o\371 elle est bas\351e sur les routes et que celles-ci sont mises dans des caches. Ceci signi)HY(fie)YH( que les routes vers les sites les plus souvent utili)HY(s\351s)YH( passe)HY(ront)YH( toujours par le m\352me four)HY(nis)HY(seur)YH( d'acc\350s. )EP()0 P( De plus, si vous voulez vrai)HY(ment)YH( mettre en oeuvre ceci, vous devriez \351gale)HY(ment)YH( aller consul)HY(ter)YH( les mises \340 jour de Julien Anas)HY(ta)HY(sov)YH( \340 )R8 2 A(http://www.ssi.bg/~ja/#routes )EA( Elles rendront le travail plus facile. )EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 26 H(Chapitre\2405.\240GRE)WB 193 Sn()WB 25 Sn( et autres tunnels)EH()BR()BR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 26 1 A(1. Quelques remarques g\351n\351)HY(rales)YH( \340 propos des tunnels\240:)26 0 TN TL()Ec /AF f D()0 DT()0 27 1 A(2. IP dans un tunnel IP)27 0 TN TL()Ec /AF f D()0 DT()0 28 1 A(3. Le tunnel GRE)28 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 29 1 A(3.1. Le tunnel IPv4)29 0 TN TL()Ec /AF f D()0 DT()0 30 1 A(3.2. Le tunnel IPv6)30 0 TN TL()Ec /AF f D()LD()0 DT()0 31 1 A(4. Tunnels dans l'espace utili)HY(sa)HY(teur)YH()31 0 TN TL()Ec /AF f D()LD()BR()0 P(Il y a trois sortes de tunnels sous Linux\240: l'IP dans un tunnel IP, le tunnel GRE)Ca( et les tunnels qui existent en dehors du noyau \201comme PPTP)Ca(, par exemple\202.)EP()2 Sl()BR()BR()BR()BR()0 2 27 H(1.\240Quelques)WB 194 Sn()WB 26 Sn( remarques g\351n\351)HY(rales)YH( \340 propos des tunnels\240:)EH()BR()BR()BR()0 P(Les tunnels peuvent faire des choses tr\350s inha)HY(bi)HY(tuelles)YH( et vrai)HY(ment)YH( sympas. Ils peuvent aussi abso)HY(lu)HY(ment)YH( tout d\351traquer si vous ne les avez pas confi)HY(gu)HY(r\351s)YH( correc)HY(te)HY(ment)YH(. Ne d\351fi)HY(nis)HY(sez)YH( pas votre route par d\351faut sur un tunnel, \340 moins que vous ne sachiez )EM(EXAC)HY(TE)HY(MENT)YH()ES( ce que vous faites.)EP()0 P(De plus, le passage par un tunnel augmente le poids des en-t\352tes \201)EM(overhead)ES(\202, puisqu'un en-t\352te IP suppl\351)HY(men)HY(taire)YH( est n\351ces)HY(saire)YH(. Typique)HY(ment)YH(, ce surco\373t est de 20 octets par paquet. Donc, si la taille maximum de votre paquet sur votre r\351seau \201MTU)Ca(\202 est de 1500 octets, un paquet qui est envoy\351 \340 travers un tunnel sera limit\351 \340 une taille de 1480 octets. Ce n'est pas n\351ces)HY(sai)HY(re)HY(ment)YH( un probl\350me, mais soyez s\373r d'avoir bien \351tudi\351 la frag)HY(men)HY(ta)HY(tion)YH( et le r\351as)HY(sem)HY(blage)YH( des paquets IP quand vous pr\351voyez de relier des r\351seaux de grande taille par des tunnels. Et bien s\373r, la mani\350re la plus rapide de creuser un tunnel est de creuser des deux c\364t\351s.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 28 H(2.\240IP)WB 195 Sn()WB 27 Sn( dans un tunnel IP)EH()BR()BR()BR()0 P(Ce type de tunnel est dispo)HY(nible)YH( dans Linux depuis un long moment. Il n\351ces)HY(site)YH( deux modules, )BD(ipip.o)ES( et )BD(new_tunnel.o)ES(.)EP()0 P(Disons que vous avez trois r\351seaux\240: 2 r\351seaux internes A et B, et un r\351seau inter)HY(m\351)HY(diaire)YH( C \201ou disons Inter)HY(net)YH(\202. Les carac)HY(t\351)HY(ris)HY(tiques)YH( du r\351seau A sont\240:)EP() 3 35 PR(r\351seau 10.0.1.0 masque de sous-r\351seau 255.255.255.0 routeur 10.0.1.1)RP()0 P(Le routeur a l'adresse )SM(172.16.17.18)ES( sur le r\351seau C.)EP()0 P(et le r\351seau B\240:)EP() 3 35 PR(r\351seau 10.0.2.0 masque de sous-r\351seau 255.255.255.0 routeur 10.0.2.1)RP()0 P(Le routeur a l'adresse )SM(172.19.20.21)ES( sur le r\351seau C.)EP()0 P(En ce qui concerne le r\351seau C, nous suppo)HY(se)HY(rons)YH( qu'il trans)HY(met)HY(tra)YH( n'importe quel paquet de A vers B et vice-versa. Il est \351gale)HY(ment)YH( possible d'utili)HY(ser)YH( l'Inter)HY(net)YH( pour cela.)EP()0 P(Voici ce qu'il faut faire\240: )EP()0 P(Premi\350)HY(re)HY(ment)YH(, assurez-vous que les modules soient instal)HY(l\351s)YH(\240:)EP() 2 19 PR(insmod ipip.o insmod new_tunnel.o)RP()0 P(Ensuite, sur le routeur du r\351seau A, faites la chose suivante\240:)EP() 2 55 PR(ifconfig tunl0 10.0.1.1 pointopoint 172.19.20.21 route add -net 10.0.2.0 netmask 255.255.255.0 dev tunl0)RP()0 P(et sur le routeur du r\351seau B\240:)EP() 2 55 PR(ifconfig tunl0 10.0.2.1 pointopoint 172.16.17.18 route add -net 10.0.1.0 netmask 255.255.255.0 dev tunl0)RP()0 P(Et quand vous aurez termin\351 avec votre tunnel\240:)EP() 1 19 PR(ifconfig tunl0 down)RP()0 P(Vite fait, bien fait. Vous ne pouvez pas trans)HY(mettre)YH( les paquets de diffu)HY(sion)YH( \201)EM(broad)HY(cast)YH()ES(\202, ni le trafic IPv6 \340 travers un tunnel IP-IP. Vous ne pouvez connec)HY(ter)YH( que deux r\351seaux IPv4 qui, norma)HY(le)HY(ment)YH(, ne seraient pas capables de se \253\240parler\240\273, c'est tout. Dans la mesure o\371 la compa)HY(ti)HY(bi)HY(lit\351)YH( a \351t\351 conser)HY(v\351e)YH(, ce code tourne depuis un bon moment, et il reste compa)HY(tible)YH( depuis les noyaux 1.3. Le tunnel Linux IP dans IP ne fonc)HY(tionne)YH( pas avec d'autres syst\350mes d'exploi)HY(ta)HY(tion)YH( ou routeurs, pour autant que je sache. C'est simple, \347a marche. Utili)HY(sez)YH(-le si vous le pouvez, autre)HY(ment)YH( utili)HY(sez)YH( GRE)Ca(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 29 H(3.\240Le)WB 196 Sn()WB 28 Sn( tunnel GRE)EH()BR()BR()BR()0 P(GRE)Ca( est un proto)HY(cole)YH( de tunnel qui a \351t\351 \340 l'origine d\351ve)HY(lopp\351)YH( par Cisco, et qui peut r\351ali)HY(ser)YH( plus de choses que le tunnel IP dans IP. Par exemple, vous pouvez aussi trans)HY(por)HY(ter)YH( du trafic multi-diffu)HY(sion)YH( \201)EM(multi)HY(cast)YH()ES(\202 et de l'IPv6 \340 travers un tunnel GRE)Ca(.)EP()0 P(Dans Linux, vous aurez besoin du module ip_gre.o.)EP()2 Sl()BR()BR()BR()BR()0 3 30 H(3.1.\240Le)WB 197 Sn()WB 29 Sn( tunnel IPv4)EH()BR()BR()BR()0 P(Dans un premier temps, int\351)HY(res)HY(sons)YH(-nous au tunnel IPv4\240:)EP()0 P(Disons que vous avez trois r\351seaux\240: 2 r\351seaux internes A et B, et un r\351seau inter)HY(m\351)HY(diaire)YH( C \201ou disons inter)HY(net)YH(\202.)EP()0 P(Les carac)HY(t\351)HY(ris)HY(tiques)YH( du r\351seau A sont\240:)EP() 3 35 PR(r\351seau 10.0.1.0 masque de sous-r\351seau 255.255.255.0 routeur 10.0.1.1)RP()0 P(Le routeur a l'adresse )SM(172.16.17.18)ES( sur le r\351seau C. Appe)HY(lons)YH( ce r\351seau )SM(neta)ES(.)EP()0 P(Et pour le r\351seau B\240:)EP() 3 35 PR(r\351seau 10.0.2.0 masque de sous-r\351seau 255.255.255.0 routeur 10.0.2.1)RP()0 P(Le routeur a l'adresse )SM(172.19.20.21)ES( sur le r\351seau C. Appe)HY(lons)YH( ce r\351seau )SM(netb)ES(.)EP()0 P(En ce qui concerne le r\351seau C, nous suppo)HY(se)HY(rons)YH( qu'il trans)HY(met)HY(tra)YH( n'importe quels paquets de A vers B et vice-versa. Comment et pourquoi, on s'en moque.)EP()0 P(Sur le routeur du r\351seau A, nous faisons la chose suivante\240:)EP() 4 74 PR(ip tunnel add netb mode gre remote 172.19.20.21 local 172.16.17.18 ttl 255 ip link set netb up ip addr add 10.0.1.1 dev netb ip route add 10.0.2.0/24 dev netb)RP()0 P(Discu)HY(tons)YH( un peu de cela. Sur la ligne 1, nous avons ajout\351 un p\351ri)HY(ph\351)HY(rique)YH( tunnel, que nous avons appel\351 )SM(netb)ES( \201ce qui est \351vident, dans la mesure o\371 c'est l\340 que nous voulons aller\202. De plus, nous lui avons dit d'utili)HY(ser)YH( le proto)HY(cole)YH( GRE)Ca( \201)SM(mode gre)ES(\202, que l'adresse distante est )SM(172.19.20.21)ES( \201le routeur de l'autre c\364t\351\202, que nos paquets \253\240tunne)HY(l\351s)YH(\240\273 devront \352tre g\351n\351r\351s \340 partir de )SM(172.16.17.18)ES( \201ce qui auto)HY(rise)YH( votre serveur \340 avoir plusieurs adresses IP sur le r\351seau C et ainsi vous permet de choisir laquelle sera utili)HY(s\351e)YH( pour votre tunnel\202 et que le champ TTL)Ca( de vos paquets sera fix\351 \340 255 \201)SM(ttl 255)ES(\202.)EP()0 P(La deuxi\350me ligne active le p\351ri)HY(ph\351)HY(rique)YH(.)EP()0 P(Sur la troi)HY(si\350me)YH( ligne, nous avons donn\351 \340 cette nouvelle inter)HY(face)YH( l'adresse )SM(10.0.1.1)ES(. C'est bon pour de petits r\351seaux, mais quand vous commen)HY(cez)YH( une exploi)HY(ta)HY(tion)YH( mini\350re \201)EM(BEAU)HY(COUP)YH()ES( de tunnels\240!\202, vous pouvez utili)HY(ser)YH( une autre gamme d'adresses IP pour vos inter)HY(faces)YH( \253\240tunnel\240\273 \201dans cet exemple, vous pour)HY(riez)YH( utili)HY(ser)YH( )SM(10.0.3.0)ES(\202.)EP()0 P(Sur la quatri\350me ligne, nous posi)HY(tion)HY(nons)YH( une route pour le r\351seau B. Notez la nota)HY(tion)YH( diff\351)HY(rente)YH( pour le masque de sous-r\351seau. Si vous n'\352tes pas fami)HY(lia)HY(ris\351)YH( avec cette nota)HY(tion)YH(, voici comment \347a marche\240: vous \351crivez le masque de sous-r\351seau sous sa forme binaire, et vous comptez tous les 1. Si vous ne savez pas comment faire cela, rappe)HY(lez)YH(-vous juste que )SM(255.0.0.0)ES( est /8, )SM(255.255.0.0)ES( est /16 et )SM(255.255.255.0)ES( est /24. Et )SM(255.255.254.0)ES( est /23, au cas o\371 \347a vous int\351)HY(res)HY(se)HY(rait)YH(.)EP()0 P(Mais arr\352)HY(tons)YH( ici, et conti)HY(nuons)YH( avec le routeur du r\351seau B.)EP() 4 74 PR(ip tunnel add neta mode gre remote 172.16.17.18 local 172.19.20.21 ttl 255 ip link set neta up ip addr add 10.0.2.1 dev neta ip route add 10.0.1.0/24 dev neta)RP()0 P(Et quand vous voudrez retirer le tunnel sur le routeur A\240:)EP() 2 21 PR(ip link set netb down ip tunnel del netb)RP()0 P(Bien s\373r, vous pouvez rempla)HY(cer)YH( )SM(netb)ES( par )SM(neta)ES( pour le routeur B.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 31 H(3.2.\240Le)WB 198 Sn()WB 30 Sn( tunnel IPv6)EH()BR()BR()BR()0 P(Voir la section 6 pour une courte descrip)HY(tion)YH( des adresses IPv6.)EP()0 P(\300 propos des tunnels.)EP()0 P(Suppo)HY(sons)YH( que vous ayez le r\351seau IPv6 suivant, et que vous vouliez le connec)HY(ter)YH( \340 une dorsale IPv6 \2016bone\202 ou \340 un ami.)EP() 1 30 PR(R\351seau 3ffe:406:5:1:5:a:2:1/96)RP()0 P(Votre adresse IPv4 est )SM(172.16.17.18)ES(, et le routeur 6bone a une adresse IPv4 )SM(172.22.23.24)ES(. )EP() 4 77 PR(ip tunnel add sixbone mode sit remote 172.22.23.24 local 172.16.17.18 ttl 255 ip link set sixbone up ip addr add 3ffe:406:5:1:5:a:2:1/96 dev sixbone ip route add 3ffe::/15 dev sixbone)RP()0 P(Voyons cela de plus pr\350s. Sur la premi\350re ligne, nous avons cr\351\351 un p\351ri)HY(ph\351)HY(rique)YH( tunnel appel\351 )SM(sixbone)ES(. Nous lui avons affect\351 le mode )SM(sit)ES( \201qui est le tunnel IPv6 sur IPv4\202 et lui avons dit o\371 l'on va \201)SM(remote)ES(\202 et d'o\371 l'on vient \201)SM(local)ES(\202. )SM(TTL)ES( est confi)HY(gur\351)YH( \340 son maximum\240: )SM(255)ES(. Ensuite, nous avons rendu le p\351ri)HY(ph\351)HY(rique)YH( actif \201)SM(up)ES(\202. Puis, nous avons ajout\351 notre propre adresse r\351seau et confi)HY(gur\351)YH( une route pour )SM(3ffe::/15)ES( \340 travers le tunnel.)EP()0 P(Les tunnels GRE)Ca( consti)HY(tuent)YH( actuel)HY(le)HY(ment)YH( le type de tunnel pr\351f\351r\351. C'est un stan)HY(dard)YH( qui est large)HY(ment)YH( adopt\351, m\352me \340 l'ext\351)HY(rieur)YH( de la commu)HY(naut\351)YH( Linux, ce qui consti)HY(tue)YH( une bonne raison de l'utili)HY(ser)YH(.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 32 H(4.\240Tunnels)WB 199 Sn()WB 31 Sn( dans l'espace utili)HY(sa)HY(teur)YH()EH()BR()BR()BR()0 P(Il y a des dizaines d'impl\351)HY(men)HY(ta)HY(tions)YH( de tunnels \340 l'ext\351)HY(rieur)YH( du noyau. Les plus connues sont bien s\373r PPP)Ca( et PPTP)Ca(, mais il y en a bien plus \201certaines propri\351)HY(taires)YH(, certaines s\351cu)HY(ri)HY(s\351s)YH(, d'autres qui n'utilisent pas IP\202, qui d\351passent le cadre de ce HOWTO.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 33 H(Chapitre\2406.\240Tunnel)WB 200 Sn()WB 32 Sn( IPv6 avec Cisco et/ou une dorsale IPv6 \2016bone\202)EH()BR()BR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 33 1 A(1. Tunnel IPv6)33 0 TN TL()Ec /AF f D()LD()BR()0 P(Par Marco Davids )EP()0 P(NOTE au main)HY(te)HY(neur)YH(\240:)EP()0 P(En ce qui me concerne, ce tunnel IPv6-IPv4 n'est pas, par d\351fi)HY(ni)HY(tion)YH(, un tunnel GRE)Ca(. Vous pouvez r\351ali)HY(ser)YH( un tunnel IPv6 sur IPv4 au moyen des p\351ri)HY(ph\351)HY(riques)YH( tunnels GRE)Ca( \201tunnels GRE)Ca( )EM(N'IMPORTE QUOI)ES( vers IPv4\202, mais le p\351ri)HY(ph\351)HY(rique)YH( utilis\351 ici \201)SM(sit)ES(\202 ne permet que des tunnels IPv6 sur IPv4, ce qui est quelque chose de diff\351)HY(rent)YH(. )EP()2 Sl()BR()BR()BR()BR()0 2 34 H(1.\240Tunnel)WB 201 Sn()WB 33 Sn( IPv6)EH()BR()BR()BR()0 P(Voici une autre appli)HY(ca)HY(tion)YH( des possi)HY(bi)HY(li)HY(t\351s)YH( de tunnels de Linux. Celle-ci est popu)HY(laire)YH( parmi les premiers adeptes d'IPv6 ou les pion)HY(niers)YH( si vous pr\351f\351)HY(rez)YH(. L'exemple pratique d\351crit ci-dessous n'est certai)HY(ne)HY(ment)YH( pas la seule mani\350re de r\351ali)HY(ser)YH( un tunnel IPv6. Cepen)HY(dant)YH(, c'est la m\351thode qui est souvent utili)HY(s\351e)YH( pour r\351ali)HY(ser)YH( un tunnel entre Linux et un routeur Cisco IPv6 et l'exp\351)HY(rience)YH( m'a appris que c'est ce type d'\351qui)HY(pe)HY(ment)YH( que beau)HY(coup)YH( de personnes ont. Dix contre un que ceci s'appliquera aussi pour vous ;-\202.)EP()0 P(De petites choses \340 propos des adresses IPv6\240:)EP()0 P(Les adresses IPv6 sont, en compa)HY(rai)HY(son)YH( avec les adresses IPv4, vrai)HY(ment)YH( grandes\240: 128 bits contre 32 bits. Et ceci nous fournit la chose dont nous avons besoin\240: beau)HY(coup)YH(, beau)HY(coup)YH( d'adresses IP\240: 340,282,266,920,938,463,463,374,607,431,768,211,465 pour \352tre pr\351cis. A part ceci, IPv6 \201ou IPng g\351n\351)HY(ra)HY(tion)YH( suivante \201)EM(Next Gene)HY(ra)HY(tion)YH()ES(\202\202 est suppos\351 fournir des tables de routage plus petites sur les routeurs des dorsales Inter)HY(net)YH(, une confi)HY(gu)HY(ra)HY(tion)YH( plus simple des \351qui)HY(pe)HY(ments)YH(, une meilleure s\351cu)HY(rit\351)YH( au niveau IP et un meilleur support pour la Qualit\351 de Service \201QoS)Ca(\202.)EP()0 P(Un exemple\240: )SM(2002:836b:9820:0000:0000:0000:836b:9886)ES()EP()0 P(Ecrire les adresses IPv6 peut \352tre un peu lourd. Il existe donc des r\350gles qui rendent la vie plus facile\240:)EP()BR()UL()0 P()-1 LI(Ne pas utili)HY(ser)YH( les z\351ros de t\352te, comme dans IPv4\240; )EP()0 P()-1 LI(Utili)HY(ser)YH( des double-points de s\351pa)HY(ra)HY(tion)YH( tous les 16 bits ou 2 octets\240; )EP()0 P()-1 LI(Quand vous avez beau)HY(coup)YH( de z\351ros cons\351)HY(cu)HY(tifs)YH(, vous pouvez \351crire )SM(::)ES(. Vous ne pouvez, cepen)HY(dant)YH(, faire cela qu'une seule fois par adresse et seule)HY(ment)YH( pour une longueur de 16 bits. )EP()LU()BR()0 P(L'adresse )SM(2002:836b:9820:0000:0000:0000:836b:9886)ES( peut \352tre \351crite )SM(2002:836b:9820::836b:9886)ES(, ce qui est plus amical.)EP()0 P(Un autre exemple\240: l'adresse )SM(3ffe:0000:0000:0000:0000:0000:34A1:F32C)ES( peut \352tre \351crite )SM(3ffe::20:34A1:F32C)ES(, ce qui est beau)HY(coup)YH( plus court.)EP()0 P(IPv6 a pour but d'\352tre le succes)HY(seur)YH( de l'actuel IPv4. Dans la mesure o\371 cette tech)HY(no)HY(lo)HY(gie)YH( est rela)HY(ti)HY(ve)HY(ment)YH( r\351cente, il n'y a pas encore de r\351seau natif IPv6 \340 l'\351chelle mondiale. Pour permettre un d\351ve)HY(lop)HY(pe)HY(ment)YH( rapide, la dorsale IPv6 \2016bone\202 a \351t\351 intro)HY(duite)YH(.)EP()0 P(Les r\351seaux natifs IPv6 sont inter)HY(con)HY(nec)HY(t\351s)YH( gr\342ce \340 l'encap)HY(su)HY(la)HY(tion)YH( du proto)HY(cole)YH( IPv6 dans des paquets IPv4, qui sont envoy\351s \340 travers l'infra)HY(struc)HY(ture)YH( IPv4 exis)HY(tante)YH(, d'un site IPv6 \340 un autre.)EP()0 P(C'est dans cette situa)HY(tion)YH( que l'on monte un tunnel.)EP()0 P(Pour \352tre capable d'utili)HY(ser)YH( IPv6, vous devrez avoir un noyau qui le supporte. Il y a beau)HY(coup)YH( de bons docu)HY(ments)YH( qui expliquent la mani\350re de r\351ali)HY(ser)YH( cela. Mais, tout se r\351sume \340 quelques \351tapes\240: )BR()UL()0 P()-1 LI(R\351cu)HY(p\351)HY(rer)YH( une distri)HY(bu)HY(tion)YH( Linux r\351cente, avec une glibc conve)HY(nable)YH(. )EP()0 P()-1 LI(R\351cu)HY(p\351)HY(rer)YH( alors les sources \340 jour du noyau. )EP()LU()BR( Si tout cela est fait, vous pouvez alors pour)HY(suivre)YH( en compi)HY(lant)YH( un noyau suppor)HY(tant)YH( l'IPv6\240: )BR()UL()0 P()-1 LI(Aller dans )SM(/usr/src/linux)ES( et tapez\240: )EP()0 P()-1 LI()BD()SM(make menu)HY(con)HY(fig)YH()ES()ES( )EP()0 P()-1 LI(Choisir )SM(Networ)HY(king)YH( Options)ES( )EP()0 P()-1 LI(S\351lec)HY(tion)HY(ner)YH( )SM(The IPv6 proto)HY(col)YH()ES(, )SM(IPv6: enable EUI-64 token format)ES(, )SM(IPv6: disable provi)HY(der)YH( based addresses)ES( )EP()LU()BR( )EP()0 P(ASTUCE\240:Ne compi)HY(ler)YH( pas ces options en tant que module. Ceci ne marchera souvent pas bien.)EP()0 P(En d'autres termes, compi)HY(lez)YH( IPv6 direc)HY(te)HY(ment)YH( dans votre noyau. Vous pouvez alors sauve)HY(gar)HY(der)YH( votre confi)HY(gu)HY(ra)HY(tion)YH( comme d'habi)HY(tude)YH( et entre)HY(prendre)YH( la compi)HY(la)HY(tion)YH( de votre noyau.)EP()0 P(ASTUCE: Avant de faire cela, modi)HY(fier)YH( votre Make)HY(file)YH( comme suit\240: )SM(EXTRA)HY(VER)HY(SION)YH( = -x ; --> ; EXTRA)HY(VER)HY(SION)YH( = -x-IPv6)ES()EP()0 P(Il y a beau)HY(coup)YH( de bonnes docu)HY(men)HY(ta)HY(tions)YH( sur la compi)HY(la)HY(tion)YH( et l'instal)HY(la)HY(tion)YH( d'un noyau. Cepen)HY(dant)YH(, ce docu)HY(ment)YH( ne traite pas de ce sujet. Si vous rencon)HY(trez)YH( des probl\350mes \340 ce niveau, allez et recher)HY(chez)YH( dans la docu)HY(men)HY(ta)HY(tion)YH( des rensei)HY(gne)HY(ments)YH( sur la compi)HY(la)HY(tion)YH( du noyau Linux corres)HY(pon)HY(dant)YH( \340 vos propres sp\351ci)HY(fi)HY(ca)HY(tions)YH(.)EP()0 P(Le fichier )SM(/usr/src/linux/README)ES( peut consti)HY(tuer)YH( un bon d\351part. Apr\350s avoir r\351alis\351 tout ceci, et red\351)HY(marr\351)YH( avec votre nouveau noyau flam)HY(bant)YH( neuf, vous pouvez lancer la commande )BD(/sbin/ifcon)HY(fig)YH( -a)ES( et noter un nouveau p\351ri)HY(ph\351)HY(rique)YH( )SM(sit0)ES(. SIT)Ca( signi)HY(fie)YH( Tran)HY(si)HY(tion)YH( Simple d'Inter)HY(net)YH( \201)EM(Simple Inter)HY(net)YH( Tran)HY(si)HY(tion)YH()ES(\202. Vous pouvez vous auto compli)HY(men)HY(ter)YH(\240: vous avez main)HY(te)HY(nant)YH( franchi une \351tape impor)HY(tante)YH( vers IP, la prochaine g\351n\351)HY(ra)HY(tion)YH( ;-\202 )EP()0 P(Passons main)HY(te)HY(nant)YH( \340 l'\351tape suivante. Vous voulez connec)HY(ter)YH( votre h\364te ou peut-\352tre m\352me tout votre r\351seau LAN \340 d'autres r\351seaux IPv6. Cela pour)HY(rait)YH( \352tre la dorsale IPv6 \253\2406bone\240\273 qui a \351t\351 sp\351cia)HY(le)HY(ment)YH( mise en place dans ce but parti)HY(cu)HY(lier)YH(.)EP()0 P(Suppo)HY(sons)YH( que vous avez le r\351seau IPv6 suivant\240: )SM(3ffe:604:6:8::/64)ES( et que vous vouliez le connec)HY(ter)YH( \340 une dorsale IPv6 ou \340 un ami. Notez, s'il vous pla\356t, que la nota)HY(tion)YH( sous-r\351seau )SM(/64)ES( est simi)HY(laire)YH( \340 celle des adresses IPv4.)EP()0 P(Votre adresse IPv4 est )SM(145.100.24.181)ES( et le routeur 6bone a l'adresse IPv4 )SM(145.100.1.5)ES(.)EP() 4 82 PR(# ip tunnel add sixbone mode sit remote 145.100.1.5 [local 145.100.24.181 ttl 225] # ip link set sixbone up # ip addr add 3FFE:604:6:7::2/96 dev sixbone # ip route add 3ffe::0/15 dev sixbone)RP()0 P(Discu)HY(tons)YH( de ceci. Dans la premi\350re ligne, nous avons cr\351\351 un p\351ri)HY(ph\351)HY(rique)YH( appel\351 )SM(sixbone)ES(. Nous lui avons donn\351 l'attri)HY(but)YH( )SM(sit)ES( \201)SM(mode sit)ES(\202 \201qui est le tunnel IPv6 dans IPv4\202 et nous lui avons dit o\371 aller \201)SM(remote)ES(\202 et d'o\371 nous venions \201)SM(local)ES(\202. )SM(TTL)ES( est confi)HY(gur\351)YH( \340 son maximum, 255.)EP()0 P(Ensuite, nous avons rendu le p\351ri)HY(ph\351)HY(rique)YH( actif \201)SM(up)ES(\202. Apr\350s cela, nous avons ajout\351 notre propre adresse r\351seau et confi)HY(gur\351)YH( une route pour )SM(3ffe::/15)ES( \201qui est actuel)HY(le)HY(ment)YH( la tota)HY(lit\351)YH( du 6bone\202 \340 travers le tunnel. Si la machine sur laquelle vous mettez en place tout ceci est votre passe)HY(relle)YH( IPv6, ajoutez alors les lignes suivantes\240:)EP() 2 48 PR(# echo 1 >/proc/sys/net/ipv6/conf/all/forwarding # /usr/local/sbin/radvd)RP()0 P(En derni\350re instruc)HY(tion)YH(, radvd est un d\351mon d'annonce comme zebra qui permet de suppor)HY(ter)YH( les fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( d'auto)HY(con)HY(fi)HY(gu)HY(ra)HY(tion)YH( d'IPv6. Recher)HY(chez)YH( le avec votre moteur de recherche favori. Vous pouvez v\351ri)HY(fier)YH( les choses comme ceci\240:)EP() 1 24 PR(# /sbin/ip -f inet6 addr)RP()0 P(Si vous arrivez \340 avoir radvd tour)HY(nant)YH( sur votre passe)HY(relle)YH( IPv6 et que vous d\351mar)HY(rez)YH( une machine avec IPv6 sur votre r\351seau local, vous serez ravi de voir les b\351n\351)HY(fices)YH( de l'auto)HY(con)HY(fi)HY(gu)HY(ra)HY(tion)YH( IPv6\240:)EP() 7 76 PR(# /sbin/ip -f inet6 addr 1: lo: mtu 3924 qdisc noqueue inet6 ::1/128 scope host 3: eth0: mtu 1500 qdisc pfifo_fast qlen 100 inet6 3ffe:604:6:8:5054:4cff:fe01:e3d6/64 scope global dynamic valid_lft forever preferred_lft 604646sec inet6 fe80::5054:4cff:fe01:e3d6/10 scope link)RP()0 P(Vous pouvez main)HY(te)HY(nant)YH( confi)HY(gu)HY(rer)YH( votre serveur de noms pour les adresses IPv6. Le type )SM(A)ES( a un \351qui)HY(valent)YH( pour IPv6\240: )SM(AAAA)ES(. L'\351qui)HY(valent)YH( de )SM(in-addr.arpa)ES( est\240: )SM(ip6.int)ES(. Il y a beau)HY(coup)YH( d'infor)HY(ma)HY(tions)YH( dispo)HY(nibles)YH( sur ce sujet.)EP()0 P(Il y a un nombre crois)HY(sant)YH( d'appli)HY(ca)HY(tions)YH( IPv6 dispo)HY(nibles)YH(, comme le shell s\351cu)HY(ris\351)YH(, telnet, inetd, le navi)HY(ga)HY(teur)YH( Mozilla, le serveur web Apache et beau)HY(coup)YH( d'autres. Mais ceci est en dehors du sujet de ce docu)HY(ment)YH( de routage ;-\202.)EP()0 P(Du c\364t\351 Cisco, la confi)HY(gu)HY(ra)HY(tion)YH( ressem)HY(blera)YH( \340 ceci\240:)EP() 11 36 PR(! interface Tunnel1 description IPv6 tunnel no ip address no ip directed-broadcast ipv6 address 3FFE:604:6:7::1/96 tunnel source Serial0 tunnel destination 145.100.24.181 tunnel mode ipv6ip ! ipv6 route 3FFE:604:6:8::/64 Tunnel1)RP()0 P(Si vous n'avez pas un Cisco \340 votre dispo)HY(si)HY(tion)YH(, essayez un des pres)HY(ta)HY(taires)YH( de tunnel IPv6 dispo)HY(nible)YH( sur Inter)HY(net)YH(. Ils sont pr\352ts \340 confi)HY(gu)HY(rer)YH( leur Cisco avec un tunnel suppl\351)HY(men)HY(taire)YH( pour vous, le plus souvent au moyen d'une agr\351able inter)HY(face)YH( web. Cher)HY(chez)YH( )EM(ipv6 tunnel broker)ES( avec votre moteur de recherche favori.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 35 H(Chapitre\2407.\240IPSEC:)WB 202 Sn()WB 34 Sn( IP s\351cu)HY(ris\351)YH( \340 travers Inter)HY(net)YH()EH()BR()BR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 35 1 A(1. Intro)HY(duc)HY(tion)YH( sur la gestion manuelle des cl\351s)35 0 TN TL()Ec /AF f D()0 DT()0 36 1 A(2. Gestion auto)HY(ma)HY(tique)YH( des cl\351s)36 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 37 1 A(2.1. Th\351orie)37 0 TN TL()Ec /AF f D()0 DT()0 38 1 A(2.2. Exemple)38 0 TN TL()Ec /AF f D()0 DT()0 40 1 A(2.3. Gestion auto)HY(ma)HY(tique)YH( des cl\351s en utili)HY(sant)YH( les certi)HY(fi)HY(cats)YH( X.509)40 0 TN TL()Ec /AF f D()LD()0 DT()0 44 1 A(3. tunnels IPSEC)44 0 TN TL()Ec /AF f D()0 DT()0 45 1 A(4. Autre logi)HY(ciel)YH( IPSEC)45 0 TN TL()Ec /AF f D()0 DT()0 46 1 A(5. Inter)HY(op\351)HY(ra)HY(bi)HY(lit\351)YH( d'IPSEC avec d'autres syst\350mes)46 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 47 1 A(5.1. Windows)47 0 TN TL()Ec /AF f D()0 DT()0 48 1 A(5.2. Check Point VPN-1 NG)48 0 TN TL()Ec /AF f D()LD()LD()BR()0 P( A ce jour, deux versions d'IPSEC sont dispo)HY(nibles)YH( pour Linux. FreeS/WAN, qui f\373t la premi\350re impl\351)HY(men)HY(ta)HY(tion)YH( majeure, existe pour les noyaux Linux 2.2 et 2.4. Ce projet a )R9 2 A(un site offi)HY(ciel)YH()EA( et \351gale)HY(ment)YH( )R10 2 A(un site non offi)HY(ciel)YH()EA(, qui est bien main)HY(tenu)YH(. FreeS/WAN n'a jamais \351t\351 int\351gr\351 dans le noyau pour un certain nombre de raisons. Celle qui est la plus souvent mention)HY(n\351e)YH( concerne un probl\350me "poli)HY(tique)YH(" avec les am\351ri)HY(cains)YH( travaillant sur la cryp)HY(to)HY(gra)HY(phie)YH( qui freinent son expor)HY(ta)HY(bi)HY(lit\351)YH(. De plus, la mise en place de FreeS/WAN dans le noyau Linux est d\351li)HY(cate)YH(, ce qui n'en fait pas un bon candi)HY(dat)YH( pour une r\351elle int\351)HY(gra)HY(tion)YH(. )EP()0 P( De plus, )R11 2 A(des)EA( personnes )R12 2 A(se sont inqui\351)HY(t\351es)YH()EA( de la qualit\351 du code. Pour confi)HY(gu)HY(rer)YH( FreeS/WAN, de nombreuses )R13 2 A(docu)HY(men)HY(ta)HY(tions)YH()EA( sont )R14 2 A(dispo)HY(nibles)YH()EA(. )EP()0 P( Une impl\351)HY(men)HY(ta)HY(tion)YH( native d'IPSEC est pr\351sente dans le noyau \340 partir de la version Linux 2.5.47. Elle a \351t\351 \351crite par Alexey Kuznet)HY(sov)YH( et Dave Miller, qui se sont inspi)HY(r\351s)YH( des travaux du groupe USAGI IPv6. Avec cette fusion, les Cryp)HY(toAPI)YH( de James Morris deviennent \351gale)HY(ment)YH( une partie du noyau, qui fait ainsi vrai)HY(ment)YH( du cryp)HY(tage)YH(. )EP()0 P( Ce HOWTO ne docu)HY(mente)YH( que la version 2.5 d'IPSEC. FreeS/WAN est recom)HY(mand\351)YH( pour l'instant pour les utili)HY(sa)HY(teurs)YH( de Linux 2.4. Fa\356tes cepen)HY(dant)YH( atten)HY(tion)YH(, dans la mesure o\371 sa confi)HY(gu)HY(ra)HY(tion)YH( est diff\351)HY(rente)YH( de l'IPSEC natif. Il y a main)HY(te)HY(nant)YH( une )R15 2 A(mise \340 jour)EA( qui permet au code FreeS/WAN de l'espace utili)HY(sa)HY(teur)YH( de fonc)HY(tion)HY(ner)YH( avec l'IPSEC natif de Linux. )EP()0 P( A partir du noyau 2.5.49, IPSEC fonc)HY(tionne)YH( sans l'ajout de mises \340 jour suppl\351)HY(men)HY(taires)YH(. )EP()0 P( )BR()2 PT()BR( )BR()3 PT()BR( )EP()0 P( Tout d'abord, nous montre)HY(rons)YH( comment confi)HY(gu)HY(rer)YH( manuel)HY(le)HY(ment)YH( une commu)HY(ni)HY(ca)HY(tion)YH( s\351cu)HY(ri)HY(s\351e)YH( entre deux h\364tes. Une grande partie de ce proces)HY(sus)YH( peut \352tre auto)HY(ma)HY(ti)HY(s\351e)YH(, mais nous le ferons ici \340 la main afin de comprendre ce qui se passe "sous le capot". )EP()0 P( Passez \340 la section suivante si la seule gestion auto)HY(ma)HY(tique)YH( des cl\351s vous int\351)HY(resse)YH(. Soyez cepen)HY(dant)YH( conscient que la compr\351)HY(hen)HY(sion)YH( de la gestion manuelle des cl\351s est utile. )EP()2 Sl()BR()BR()BR()BR()0 2 36 H(1.\240Intro)WB 203 Sn()HY(duc)HY(tion)YH()WB 35 Sn( sur la gestion manuelle des cl\351s)EH()BR()BR()BR()0 P( IPSEC est un sujet compliqu\351. De nombreuses infor)HY(ma)HY(tions)YH( sont dispo)HY(nibles)YH( en ligne. Ce HOWTO se concen)HY(trera)YH( sur la mise en place et \340 l'expli)HY(ca)HY(tion)YH( des prin)HY(cipes)YH( de base. Tous les exemples sont bas\351s sur Racoon dont le lien est donn\351 au-dessus. )EP()0 P( )BR()4 PT()BR( )EP()0 P( IPSEC offre une version s\351cu)HY(ri)HY(s\351e)YH( de la couche IP \201Inter)HY(net)YH( Proto)HY(col)YH(\202. La s\351cu)HY(rit\351)YH( dans ce contexte prend deux formes\240: l'encryp)HY(tage)YH( et l'authen)HY(ti)HY(fi)HY(ca)HY(tion)YH(. Une vision na\357ve de la s\351cu)HY(rit\351)YH( ne propose que le cryp)HY(tage)YH(. On peut cepen)HY(dant)YH( montrer faci)HY(le)HY(ment)YH( que c'est insuf)HY(fi)HY(sant)YH(\240: il se peut que vous ayez une commu)HY(ni)HY(ca)HY(tion)YH( crypt\351e, mais vous n'avez aucune garan)HY(tie)YH( que l'h\364te distant est bien celui auquel vous pensez. )EP()0 P( IPSEC supporte 'Encap)HY(su)HY(la)HY(ted)YH( Secu)HY(rity)YH( Payload' \201Encap)HY(su)HY(la)HY(tion)YH( S\351cu)HY(ri)HY(s\351e)YH( de la Charge utile\202 \201ESP\202 pour le cryp)HY(tage)YH( et 'Authen)HY(ti)HY(ca)HY(tion)YH( Header' \201Ent\352te d'Authen)HY(ti)HY(fi)HY(ca)HY(tion)YH(\202 \201AH\202 pour authen)HY(ti)HY(fier)YH( le parte)HY(naire)YH( distant. Vous pouvez confi)HY(gu)HY(rer)YH( les deux, ou d\351cider de ne faire que l'un des deux. )EP()0 P( ESP et AH s'appuient tous les deux sur des Asso)HY(cia)HY(tions)YH( de S\351cu)HY(rit\351)YH( \201Secu)HY(rity)YH( Asso)HY(cia)HY(tions)YH( \201SA\202\202. Une Asso)HY(cia)HY(tion)YH( de S\351cu)HY(rit\351)YH( \201SA\202 consiste en une source, une desti)HY(na)HY(tion)YH( et une instruc)HY(tion)YH(. Un exemple simple d'Asso)HY(cia)HY(tion)YH( de S\351cu)HY(rit\351)YH( \201SA\202 pour l'authen)HY(ti)HY(fi)HY(ca)HY(tion)YH( peut ressem)HY(bler)YH( \340 ceci\240: ) 1 65 PR(add 10.0.0.11 10.0.0.216 ah 15700 -A hmac-md5 "1234567890123456";)RP( Ceci indique que le trafic allant de )SM(10.0.0.11)ES( vers )SM(10.0.0.216)ES( a besoin d'un En-t\352te d'Authen)HY(ti)HY(fi)HY(ca)HY(tion)YH( \201AH\202 qui peut \352tre sign\351 en utili)HY(sant)YH( HMAC-MD et le secret )SM(1234567890123456)ES(. Cette instruc)HY(tion)YH( est rep\351r\351e par l'iden)HY(ti)HY(fi)HY(ca)HY(teur)YH( SPI \201)EM(Secu)HY(rity)YH( Para)HY(me)HY(ter)YH( Index)ES(\202 )SM(15700)ES(, dont nous parle)HY(rons)YH( plus par la suite. Le point int\351)HY(res)HY(sant)YH( \340 propos des Asso)HY(cia)HY(tions)YH( de S\351cu)HY(rit\351)YH( \201SA\202 est qu'elles sont sym\351)HY(triques)YH(. Les deux cot\351s de la conver)HY(sa)HY(tion)YH( partagent exac)HY(te)HY(ment)YH( la m\352me Asso)HY(cia)HY(tion)YH( de S\351cu)HY(rit\351)YH( \201SA\202, qui n'est pas reco)HY(pi\351e)YH( sur l'h\364te distant. Notez cepen)HY(dant)YH( qu'il n'y a pas de r\350gles "d'inver)HY(sion)YH( auto)HY(ma)HY(tique)YH(". Cette Asso)HY(cia)HY(tion)YH( de S\351cu)HY(rit\351)YH( \201SA\202 d\351crit une authen)HY(ti)HY(fi)HY(ca)HY(tion)YH( possible de )SM(10.0.0.11)ES( vers )SM(10.0.0.216)ES(. Pour un trafic bidi)HY(rec)HY(tion)HY(nel)YH(, deux Asso)HY(cia)HY(tions)YH( de S\351cu)HY(rit\351)YH( \201SA\202 sont n\351ces)HY(saires)YH(. )EP()0 P( Un exemple d'Asso)HY(cia)HY(tion)YH( de S\351cu)HY(rit\351)YH( \201SA\202 pour le cryp)HY(tage)YH( ESP\240: ) 1 74 PR(add 10.0.0.11 10.0.0.216 esp 15701 -E 3des-cbc "123456789012123456789012";)RP( Ceci signi)HY(fie)YH( que le trafic allant de )SM(10.0.0.11)ES( vers )SM(10.0.0.216)ES( est chiffr\351 en utili)HY(sant)YH( 3des-cbc avec la cl\351 )SM(123456789012123456789012)ES(. L'iden)HY(ti)HY(fi)HY(ca)HY(teur)YH( SPI est )SM(15701)ES(. )EP()0 P( Jusqu'ici, nous avons vu que les Asso)HY(cia)HY(tions)YH( de S\351cu)HY(rit\351)YH( \201SA\202 d\351crivent les instruc)HY(tions)YH( possibles, mais pas la poli)HY(tique)YH( qui indique quand ces SA doivent \352tre utili)HY(s\351es)YH(. En fait, il pour)HY(rait)YH( y avoir un nombre arbi)HY(traire)YH( de SA presques iden)HY(tiques)YH( ne se diff\351)HY(ren)HY(ciant)YH( que par les iden)HY(ti)HY(fi)HY(ca)HY(teurs)YH( SPI. Entre paren)HY(th\350ses)YH(, SPI signi)HY(fie)YH( )EM(Secu)HY(rity)YH( Para)HY(me)HY(ter)YH( Index)ES(, ou Index du Para)HY(m\350tre)YH( de S\351cu)HY(rit\351)YH( en fran\347ais. Pour faire vrai)HY(ment)YH( du cryp)HY(tage)YH(, nous devons d\351crire une poli)HY(tique)YH(. Cette poli)HY(tique)YH( peut inclure des choses comme "utili)HY(ser)YH( ipsec s'il est dispo)HY(nible)YH(" ou "rejeter le trafic \340 moins que vous ayez ipsec". )EP()0 P( Une "Poli)HY(tique)YH( de S\351cu)HY(rit\351)YH(" \201Secu)HY(rity)YH( Policy \201SP\202\202 typique ressemble \340 ceci\240: ) 3 44 PR(spdadd 10.0.0.216 10.0.0.11 any -P out ipsec esp/transport//require ah/transport//require;)RP( Si cette confi)HY(gu)HY(ra)HY(tion)YH( est appliqu\351e sur l'h\364te )SM(10.0.0.216)ES(, cela signi)HY(fie)YH( que tout le trafic allant vers )SM(10.0.0.11)ES( doit \352tre encrypt\351 et encap)HY(sul\351)YH( dans un en-t\352te d'authen)HY(ti)HY(fi)HY(ca)HY(tion)YH( AH. Notez que ceci ne d\351crit pas quelle SA sera utili)HY(s\351e)YH(. Cette d\351ter)HY(mi)HY(na)HY(tion)YH( est un exer)HY(cice)YH( laiss\351 \340 la charge du noyau. )EP()0 P( En d'autres termes, une Poli)HY(tique)YH( de S\351cu)HY(rit\351)YH( sp\351ci)HY(fie)YH( CE QUE nous voulons\240; une Asso)HY(cia)HY(tion)YH( de S\351cu)HY(rit\351)YH( d\351crit COMMENT nous le voulons. )EP()0 P( Les paquets sortants sont \351tique)HY(t\351s)YH( avec le SPI SA \201'le comment'\202 que le noyau utilise pour l'encryp)HY(tage)YH( et l'authen)HY(ti)HY(fi)HY(ca)HY(tion)YH( et l'h\364te distant peut consul)HY(ter)YH( les instruc)HY(tions)YH( de v\351ri)HY(fi)HY(ca)HY(tion)YH( et de d\351cryp)HY(tage)YH( corres)HY(pon)HY(dantes)YH(. )EP()0 P( Ce qui suit est une confi)HY(gu)HY(ra)HY(tion)YH( tr\350s simple permet)HY(tant)YH( le dialogue de l'h\364te )SM(10.0.0.216)ES( vers l'h\364te )SM(10.0.0.11)ES( en utili)HY(sant)YH( l'encryp)HY(tage)YH( et l'authen)HY(ti)HY(fi)HY(ca)HY(tion)YH(. Notez que le trafic de retour de cette premi\350re version est en clair et que cette confi)HY(gu)HY(ra)HY(tion)YH( ne doit pas \352tre d\351ploy\351e. )EP()0 P( Sur l'h\364te )SM(10.0.0.216)ES(\240: ) 7 74 PR(#!/sbin/setkey -f add 10.0.0.216 10.0.0.11 ah 24500 -A hmac-md5 "1234567890123456"; add 10.0.0.216 10.0.0.11 esp 24501 -E 3des-cbc "123456789012123456789012"; spdadd 10.0.0.216 10.0.0.11 any -P out ipsec esp/transport//require ah/transport//require;)RP( )EP()0 P( Sur l'h\364te 10.0.0.11, nous donnons les m\352mes Asso)HY(cia)HY(tions)YH( de S\351cu)HY(rit\351)YH( \201SA\202. Nous ne donnons pas de Poli)HY(tique)YH( de S\351cu)HY(rit\351)YH(\240: ) 3 74 PR(#!/sbin/setkey -f add 10.0.0.216 10.0.0.11 ah 24500 -A hmac-md5 "1234567890123456"; add 10.0.0.216 10.0.0.11 esp 24501 -E 3des-cbc "123456789012123456789012";)RP( )EP()0 P( Avec la mise en place de la confi)HY(gu)HY(ra)HY(tion)YH( ci-dessus \201ces fichiers peuvent \352tre ex\351cu)HY(t\351s)YH( si 'setkey' est install\351 dans /sbin\202, la commande )BD(ping 10.0.0.11)ES( ex\351cu)HY(t\351e)YH( sur 10.0.0.216 va donner la sortie suivante avec tcpdump\240: ) 2 93 PR(22:37:52 10.0.0.216 > 10.0.0.11: AH\201spi=0x00005fb4,seq=0xa\202: ESP\201spi=0x00005fb5,seq=0xa\202 \201DF\202 22:37:52 10.0.0.11 > 10.0.0.216: icmp: echo reply)RP( Notez que le paquet de retour prove)HY(nant)YH( de 10.0.0.11 est en effet compl\350)HY(te)HY(ment)YH( visible. Le paquet ping \351mis par 10.0.0.216 ne peut \351videm)HY(ment)YH( pas \352tre lu par tcpdump, mais celui-ci montre l'Index du Para)HY(m\350tre)YH( de S\351cu)HY(rit\351)YH( \201SPI\202 de l'AH, ainsi que l'ESP, qui indique \340 10.0.0.11 comment v\351ri)HY(fier)YH( l'authen)HY(ti)HY(cit\351)YH( de notre paquet et comment le d\351cryp)HY(ter)YH(. )EP()0 P( Quelques \351l\351ments doivent \352tre mention)HY(n\351s)YH(. La confi)HY(gu)HY(ra)HY(tion)YH( ci-dessus est propo)HY(s\351e)YH( dans de nombreux exemples d'IPSEC, mais elle est tr\350s dange)HY(reuse)YH(. Le probl\350me est qu'elle contient la poli)HY(tique)YH( indiquant \340 10.0.0.216 comment traiter les paquets allant vers 10.0.0.11 et comment 10.0.0.11 doit traiter ces paquets, mais ceci n'INDIQUE pas \340 10.0.0.11 de rejeter le trafic non authen)HY(ti)HY(fi\351)YH( et non encrypt\351\240! )EP()0 P( N'importe qui peut main)HY(te)HY(nant)YH( ins\351rer des donn\351es "spoo)HY(f\351es)YH(" \201NdT : usur)HY(p\351es)YH(\202 et enti\350)HY(re)HY(ment)YH( non cryp)HY(t\351es)YH( que 10.0.0.1 accep)HY(tera)YH(. Pour rem\351)HY(dier)YH( \340 ceci, nous devons avoir sur 10.0.0.11 une Poli)HY(tique)YH( de S\351cu)HY(rit\351)YH( pour le trafic entrant\240: ) 4 43 PR(#!/sbin/setkey -f spdadd 10.0.0.216 10.0.0.11 any -P IN ipsec esp/transport//require ah/transport//require;)RP( Ceci indique \340 10.0.0.11 que tout le trafic venant de 10.0.0.216 n\351ces)HY(site)YH( d'avoir un ESP et AH valide. )EP()0 P( Main)HY(te)HY(nant)YH(, pour compl\351)HY(ter)YH( cette confi)HY(gu)HY(ra)HY(tion)YH(, nous devons \351gale)HY(ment)YH( renvoyer un trafic encrypt\351 et authen)HY(ti)HY(fi\351)YH(. La confi)HY(gu)HY(ra)HY(tion)YH( compl\350te sur 10.0.0.216 est la suivante\240:)EP() 19 74 PR(#!/sbin/setkey -f flush; spdflush; # AH add 10.0.0.11 10.0.0.216 ah 15700 -A hmac-md5 "1234567890123456"; add 10.0.0.216 10.0.0.11 ah 24500 -A hmac-md5 "1234567890123456"; # ESP add 10.0.0.11 10.0.0.216 esp 15701 -E 3des-cbc "123456789012123456789012"; add 10.0.0.216 10.0.0.11 esp 24501 -E 3des-cbc "123456789012123456789012"; spdadd 10.0.0.216 10.0.0.11 any -P out ipsec esp/transport//require ah/transport//require; spdadd 10.0.0.11 10.0.0.216 any -P in ipsec esp/transport//require ah/transport//require;)RP()0 P(Et sur 10.0.0.11\240:)EP() 20 74 PR(#!/sbin/setkey -f flush; spdflush; # AH add 10.0.0.11 10.0.0.216 ah 15700 -A hmac-md5 "1234567890123456"; add 10.0.0.216 10.0.0.11 ah 24500 -A hmac-md5 "1234567890123456"; # ESP add 10.0.0.11 10.0.0.216 esp 15701 -E 3des-cbc "123456789012123456789012"; add 10.0.0.216 10.0.0.11 esp 24501 -E 3des-cbc "123456789012123456789012"; spdadd 10.0.0.11 10.0.0.216 any -P out ipsec esp/transport//require ah/transport//require; spdadd 10.0.0.216 10.0.0.11 any -P in ipsec esp/transport//require ah/transport//require;)RP()0 P( Notez que, dans cet exemple, nous avons utilis\351 des cl\351s iden)HY(tiques)YH( pour les deux direc)HY(tions)YH( du trafic. Ceci n'est cepen)HY(dant)YH( en aucun cas exig\351. )EP()0 P( Pour exami)HY(ner)YH( la confi)HY(gu)HY(ra)HY(tion)YH( que nous venons de cr\351er, ex\351cu)HY(ter)YH( )BD(setkey -D)ES(, qui montre les SA ou )BD(setkey -DP)ES( qui montre les poli)HY(tiques)YH( confi)HY(gu)HY(r\351es)YH(. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 37 H(2.\240Gestion)WB 204 Sn()WB 36 Sn( auto)HY(ma)HY(tique)YH( des cl\351s)EH()BR()BR()BR()0 P( Dans la section pr\351c\351)HY(dente)YH(, l'encryp)HY(tage)YH( \351tait confi)HY(gur\351)YH( pour utili)HY(ser)YH( simple)HY(ment)YH( le partage de secrets. En d'autres termes, pour rester s\351cu)HY(ris\351)YH(, nous devons trans)HY(f\351)HY(rer)YH( la confi)HY(gu)HY(ra)HY(tion)YH( de notre encryp)HY(tage)YH( \340 travers un tunnel s\351cu)HY(ris\351)YH(. Si nous avons confi)HY(gur\351)YH( l'h\364te distant par telnet, n'importe quel tiers pour)HY(rait)YH( avoir pris connais)HY(sance)YH( de notre secret partag\351 et, ainsi, notre confi)HY(gu)HY(ra)HY(tion)YH( ne serait plus s\373re. )EP()0 P( De plus, puisque le secret est partag\351, ce n'est pas un secret. L'h\364te distant ne peut pas en faire grand chose, mais nous devons \352tre s\373rs d'utili)HY(ser)YH( un secret diff\351)HY(rent)YH( pour les commu)HY(ni)HY(ca)HY(tions)YH( avec tous nos parte)HY(naires)YH(. Ceci n\351ces)HY(site)YH( un grand nombre de cl\351s. Pour 10 parte)HY(naires)YH(, nous devrions avoir au moins 50 secrets diff\351)HY(rents)YH(. )EP()0 P( En plus du probl\350me des cl\351s sym\351)HY(triques)YH(, le renou)HY(vel)HY(le)HY(ment)YH( des cl\351s est \351gale)HY(ment)YH( n\351ces)HY(saire)YH(. Si un tiers \351coute suffi)HY(sam)HY(ment)YH( le trafic, il peut \352tre en posi)HY(tion)YH( de retrou)HY(ver)YH( la cl\351 par r\351tro ing\351)HY(nie)HY(rie)YH(. On peut s'en pr\351mu)HY(nir)YH( en modi)HY(fiant)YH( la cl\351 de temps en temps, mais ce proces)HY(sus)YH( a besoin d'\352tre auto)HY(ma)HY(tis\351)YH(. )EP()0 P( Un autre probl\350me est que la gestion manuelle des cl\351s d\351crite au-dessus impose de d\351finir pr\351ci)HY(s\351)HY(ment)YH( les algo)HY(rithmes)YH( et les longueurs de cl\351s utili)HY(s\351es)YH(, ce qui n\351ces)HY(site)YH( une grande coor)HY(di)HY(na)HY(tion)YH( avec l'h\364te distant. Il serait pr\351f\351)HY(rable)YH( d'avoir la capa)HY(cit\351)YH( \340 d\351crire une poli)HY(tique)YH( des cl\351s plus large comme par exemple "Nous pouvons faire du 3DES et du Blow)HY(fish)YH( avec les longueurs de cl\351s suivantes". )EP()0 P( Pour r\351soudre ces probl\350mes, IPSEC fournit l'Echange de Cl\351 sur Inter)HY(net)YH( \201Inter)HY(net)YH( Key Echange \201IKE\202\202 permet)HY(tant)YH( d'auto)HY(ma)HY(ti)HY(ser)YH( l'\351change de cl\351s g\351n\351)HY(r\351es)YH( al\351a)HY(toi)HY(re)HY(ment)YH(. Ces cl\351s sont trans)HY(mises)YH( en utili)HY(sant)YH( une tech)HY(no)HY(lo)HY(gie)YH( d'encryp)HY(tage)YH( asym\351)HY(trique)YH( n\351go)HY(ci\351e)YH(. )EP()0 P( L'impl\351)HY(men)HY(ta)HY(tion)YH( IPSEC de Linux 2.5 fonc)HY(tionne)YH( avec le d\351mon IKE "KAME racoon". Depuis le 9 novembre, la version de racoon pr\351sente la distri)HY(bu)HY(tion)YH( iptools d'Alexey peut \352tre compi)HY(l\351e)YH( en suppri)HY(mant)YH(, au pr\351a)HY(lable)YH( #include dans deux fichiers. Je fournis une )R17 2 A(version pr\351com)HY(pi)HY(l\351e)YH()EA(. )EP()0 P( )BR()5 PT()BR( )EP()2 Sl()BR()BR()BR()BR()0 3 38 H(2.1.\240Th\351orie)WB 205 Sn()WB 37 Sn()EH()BR()BR()BR()0 P( Comme expliqu\351 avant, la gestion auto)HY(ma)HY(tique)YH( des cl\351s r\351alise beau)HY(coup)YH( d'op\351ra)HY(tions)YH( pour nous. Sp\351ci)HY(fique)HY(ment)YH(, il cr\351e \340 la vol\351e les Asso)HY(cia)HY(tions)YH( de S\351cu)HY(rit\351)YH(. Il ne confi)HY(gure)YH( cepen)HY(dant)YH( pas la poli)HY(tique)YH( pour nous, ce qui est le fonc)HY(tion)HY(ne)HY(ment)YH( attendu. )EP()0 P( Donc, pour b\351n\351)HY(fi)HY(cier)YH( de IKE, confi)HY(gu)HY(rez)YH( une poli)HY(tique)YH(, mais ne four)HY(nis)HY(sez)YH( aucune Asso)HY(cia)HY(tion)YH( de S\351cu)HY(rit\351)YH(. Si le noyau d\351couvre qu'il y a une poli)HY(tique)YH( IPSEC, mais pas d'Asso)HY(cia)HY(tion)YH( de S\351cu)HY(rit\351)YH(, il va le noti)HY(fier)YH( au d\351mon IKE qui va cher)HY(cher)YH( \340 en n\351go)HY(cier)YH( une. )EP()0 P( De nouveau, rappe)HY(lons)YH( que la Poli)HY(tique)YH( de S\351cu)HY(rit\351)YH( sp\351ci)HY(fie)YH( CE QUE nous voulons tandis que l'Asso)HY(cia)HY(tion)YH( de S\351cu)HY(rit\351)YH( d\351crit COMMENT nous le voulons. L'utili)HY(sa)HY(tion)YH( de la gestion auto)HY(ma)HY(tique)YH( des cl\351s nous permet de ne sp\351ci)HY(fier)YH( que ce que nous voulons. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 39 H(2.2.\240Exemple)WB 206 Sn()WB 38 Sn()EH()BR()BR()BR()0 P( Kame racoon poss\350de un grand nombre d'options dont la plupart des valeurs par d\351faut sont corrects\240; nous n'avons donc pas besoin de les modi)HY(fier)YH(. Comme nous l'avons dit aupa)HY(ra)HY(vant)YH(, l'op\351ra)HY(teur)YH( doit d\351finir une Poli)HY(tique)YH( de S\351cu)HY(rit\351)YH(, mais pas d'Asso)HY(cia)HY(tions)YH( de S\351cu)HY(rit\351)YH(. Nous lais)HY(sons)YH( cette n\351go)HY(cia)HY(tion)YH( au d\351mon IKE. )EP()0 P( Dans cet exemple, 10.0.0.1 et 10.0.0.216 sont encore une fois sur le point d'\351tablir des commu)HY(ni)HY(ca)HY(tions)YH( s\351cu)HY(ri)HY(s\351es)YH( mais, cette fois, avec l'aide du d\351mon racoon. Par soucis de simpli)HY(fi)HY(ca)HY(tion)YH(, cette confi)HY(gu)HY(ra)HY(tion)YH( utili)HY(sera)YH( des cl\351s pr\351-parta)HY(g\351es)YH(, les redou)HY(t\351s)YH( 'secrets parta)HY(g\351s)YH('. Nous discu)HY(te)HY(rons)YH( des certi)HY(fi)HY(cats)YH( X.509 dans une section \340 part. Voir )0 40 1 A(Section\2402.3, \253\240Gestion auto)HY(ma)HY(tique)YH( des cl\351s en utili)HY(sant)YH( les certi)HY(fi)HY(cats)YH( X.509\240\273)40 0 TN TL()Ec /AF f D(. )EP()0 P( Nous allons \340 peu pr\350s rester fid\350le \340 la confi)HY(gu)HY(ra)HY(tion)YH( par d\351faut, qui est iden)HY(tique)YH( sur les deux h\364tes\240: )EP()0 P() 30 55 PR(path pre_shared_key "/usr/local/etc/racoon/psk.txt"; remote anonymous { exchange_mode aggressive,main; doi ipsec_doi; situation identity_only; my_identifier address; lifetime time 2 min; # sec,min,hour initial_contact on; proposal_check obey; # obey, strict or claim proposal { encryption_algorithm 3des; hash_algorithm sha1; authentication_method pre_shared_key; dh_group 2 ; } } sainfo anonymous { pfs_group 1; lifetime time 2 min; encryption_algorithm 3des ; authentication_algorithm hmac_sha1; compression_algorithm deflate ; })RP( )EP()0 P( Beau)HY(coup)YH( de para)HY(m\350tres)YH(. Je pense que l'on peut encore en suppri)HY(mer)YH( pour se rappro)HY(cher)YH( de la confi)HY(gu)HY(ra)HY(tion)YH( par d\351faut. Remarquons ici quelques \351l\351ments notables. Nous avons confi)HY(gur\351)YH( deux sections "anony)HY(mous)YH(", ce qui convient pour tous les h\364tes distants. Ceci va ainsi faci)HY(li)HY(ter)YH( les confi)HY(gu)HY(ra)HY(tions)YH( suppl\351)HY(men)HY(taires)YH(. Il n'est pas n\351ces)HY(saire)YH( d'avoir de sections sp\351ci)HY(fiques)YH( \340 une machine parti)HY(cu)HY(li\350re)YH(, \340 moins que vous ne le vouliez vrai)HY(ment)YH(.)EP()0 P( De plus, la confi)HY(gu)HY(ra)HY(tion)YH( pr\351cise que nous nous iden)HY(ti)HY(fions)YH( gr\342ce \340 notre adresse IP \201'my_iden)HY(ti)HY(fier)YH( address'\202 et que nous pouvons faire du 3des, sha1 et que nous utili)HY(se)HY(rons)YH( une cl\351 "pr\351-parta)HY(g\351e)YH(" se trou)HY(vant)YH( dans psk.txt. )EP()0 P( Dans le fichier psk.txt, nous avons confi)HY(gur\351)YH( deux entr\351es qui sont diff\351)HY(rentes)YH( suivant les h\364tes. Sur 10.0.0.11\240: ) 1 25 PR(10.0.0.216 password2)RP( Sur 10.0.0.216\240: ) 1 25 PR(10.0.0.11 password2)RP( Soyez s\373r que ces fichiers sont la propri\351t\351 de root, et qu'ils ont le mode 0600. Dans le cas contraire, racoon ne pourra faire confiance \340 leur contenu. Notez que ces fichiers sont sym\351)HY(triques)YH( l'un de l'autre. )EP()0 P( Nous sommes main)HY(te)HY(nant)YH( pr\352t \340 confi)HY(gu)HY(rer)YH( notre poli)HY(tique)YH( qui est assez simple. Sur l'h\364te 10.0.0.216\240: ) 9 44 PR(#!/sbin/setkey -f flush; spdflush; spdadd 10.0.0.216 10.0.0.11 any -P out ipsec esp/transport//require; spdadd 10.0.0.11 10.0.0.216 any -P in ipsec esp/transport//require;)RP( Et sur 10.0.0.11\240: ) 9 44 PR(#!/sbin/setkey -f flush; spdflush; spdadd 10.0.0.11 10.0.0.216 any -P out ipsec esp/transport//require; spdadd 10.0.0.216 10.0.0.11 any -P in ipsec esp/transport//require;)RP( Noter que ces poli)HY(tiques)YH( sont encore une fois sym\351)HY(triques)YH(. )EP()0 P( Nous sommes main)HY(te)HY(nant)YH( pr\352t \340 lancer racoon\240! Une fois lanc\351, au moment o\371 nous essayons une connexion un telnet depuis 10.0.0.11 vers 10.0.0.216, ou l'inverse, racoon aura d\351marr\351 la n\351go)HY(cia)HY(tion)YH(\240: ) 17 82 PR(12:18:44: INFO: isakmp.c:1689:isakmp_post_acquire\201\202: IPsec-SA request for 10.0.0.11 queued due to no phase1 found. 12:18:44: INFO: isakmp.c:794:isakmp_ph1begin_i\201\202: initiate new phase 1 negotiation: 10.0.0.216[500]<=>10.0.0.11[500] 12:18:44: INFO: isakmp.c:799:isakmp_ph1begin_i\201\202: begin Aggressive mode. 12:18:44: INFO: vendorid.c:128:check_vendorid\201\202: received Vendor ID: KAME/racoon 12:18:44: NOTIFY: oakley.c:2037:oakley_skeyid\201\202: couldn't find the proper pskey, try to get one by the peer's address. 12:18:44: INFO: isakmp.c:2417:log_ph1established\201\202: ISAKMP-SA established 10.0.0.216[500]-10.0.0.11[500] spi:044d25dede78a4d1:ff01e5b4804f0680 12:18:45: INFO: isakmp.c:938:isakmp_ph2begin_i\201\202: initiate new phase 2 negotiation: 10.0.0.216[0]<=>10.0.0.11[0] 12:18:45: INFO: pfkey.c:1106:pk_recvupdate\201\202: IPsec-SA established: ESP/Transport 10.0.0.11->10.0.0.216 spi=44556347\2010x2a7e03b\202 12:18:45: INFO: pfkey.c:1318:pk_recvadd\201\202: IPsec-SA established: ESP/Transport 10.0.0.216->10.0.0.11 spi=15863890\2010xf21052\202)RP()EP()0 P( L'ex\351cu)HY(tion)YH( de la commande )BD(setkey -D)ES(, qui nous montre les Asso)HY(cia)HY(tions)YH( de S\351cu)HY(rit\351)YH(, nous indique qu'elles sont en effet pr\351sentes\240: ) 22 74 PR(10.0.0.216 10.0.0.11 esp mode=transport spi=224162611\2010x0d5c7333\202 reqid=0\2010x00000000\202 E: 3des-cbc 5d421c1b d33b2a9f 4e9055e3 857db9fc 211d9c95 ebaead04 A: hmac-sha1 c5537d66 f3c5d869 bd736ae2 08d22133 27f7aa99 seq=0x00000000 replay=4 flags=0x00000000 state=mature created: Nov 11 12:28:45 2002 current: Nov 11 12:29:16 2002 diff: 31\201s\202 hard: 600\201s\202 soft: 480\201s\202 last: Nov 11 12:29:12 2002 hard: 0\201s\202 soft: 0\201s\202 current: 304\201bytes\202 hard: 0\201bytes\202 soft: 0\201bytes\202 allocated: 3 hard: 0 soft: 0 sadb_seq=1 pid=17112 refcnt=0 10.0.0.11 10.0.0.216 esp mode=transport spi=165123736\2010x09d79698\202 reqid=0\2010x00000000\202 E: 3des-cbc d7af8466 acd4f14c 872c5443 ec45a719 d4b3fde1 8d239d6a A: hmac-sha1 41ccc388 4568ac49 19e4e024 628e240c 141ffe2f seq=0x00000000 replay=4 flags=0x00000000 state=mature created: Nov 11 12:28:45 2002 current: Nov 11 12:29:16 2002 diff: 31\201s\202 hard: 600\201s\202 soft: 480\201s\202 last: hard: 0\201s\202 soft: 0\201s\202 current: 231\201bytes\202 hard: 0\201bytes\202 soft: 0\201bytes\202 allocated: 2 hard: 0 soft: 0 sadb_seq=0 pid=17112 refcnt=0)RP( Nous avons les Poli)HY(tiques)YH( de S\351cu)HY(rit\351)YH( que nous avons nous-m\352me confi)HY(gu)HY(r\351es)YH(\240: ) 14 66 PR(10.0.0.11[any] 10.0.0.216[any] tcp in ipsec esp/transport//require created:Nov 11 12:28:28 2002 lastused:Nov 11 12:29:12 2002 lifetime:0\201s\202 validtime:0\201s\202 spid=3616 seq=5 pid=17134 refcnt=3 10.0.0.216[any] 10.0.0.11[any] tcp out ipsec esp/transport//require created:Nov 11 12:28:28 2002 lastused:Nov 11 12:28:44 2002 lifetime:0\201s\202 validtime:0\201s\202 spid=3609 seq=4 pid=17134 refcnt=3)RP()EP()2 Sl()BR()BR()BR()BR()0 4 40 H(2.2.1.\240Probl\350mes)WB 207 Sn()WB 39 Sn( et d\351fauts connus)EH()BR()BR()BR()0 P( Si cela ne marche pas, v\351ri)HY(fiez)YH( que tous les fichiers de confi)HY(gu)HY(ra)HY(tion)YH( sont la propri\351t\351 de root et qu'ils ne peuvent \352tre lus que par celui-ci. Pour d\351mar)HY(rer)YH( racoon en avant-plan, utili)HY(sez)YH( '-F'. Pour le forcer \340 lire un fichier de confi)HY(gu)HY(ra)HY(tion)YH( \340 la place de celui pr\351cis\351 lors de la compi)HY(la)HY(tion)YH(, utili)HY(sez)YH( '-f'. Pour obtenir de nombreux d\351tails, ajouter l'option 'log debug' dans le fichier racoon.conf. )EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 41 H(2.3.\240Gestion)WB 208 Sn()WB 40 Sn( auto)HY(ma)HY(tique)YH( des cl\351s en utili)HY(sant)YH( les certi)HY(fi)HY(cats)YH( X.509)EH()BR()BR()BR()0 P( Comme nous l'avons dit avant, l'utili)HY(sa)HY(tion)YH( de secrets parta)HY(g\351s)YH( est compliqu\351e car ils ne peuvent pas \352tre faci)HY(le)HY(ment)YH( parta)HY(g\351s)YH( et, une fois qu'ils le sont, ils ne sont plus secrets. Heureu)HY(se)HY(ment)YH(, nous avons la tech)HY(no)HY(lo)HY(gie)YH( d'encryp)HY(tage)YH( asym)HY(m\351)HY(trique)YH( pour nous aider \340 r\351soudre ce probl\350me. )EP()0 P( Si chaque parti)HY(ci)HY(pant)YH( d'une liaison IPSEC cr\351e une cl\351 publique et priv\351e, des commu)HY(ni)HY(ca)HY(tions)YH( s\351cu)HY(ri)HY(s\351es)YH( peuvent \352tre mises en place par les deux parties en publiant leur cl\351 publique et en confi)HY(gu)HY(rant)YH( leur poli)HY(tique)YH(. )EP()0 P( Cr\351er une cl\351 est rela)HY(ti)HY(ve)HY(ment)YH( facile, bien que cela exige un peu de travail. Ce qui suit est bas\351 sur l'outil 'openssl'. )EP()2 Sl()BR()BR()BR()BR()0 4 42 H(2.3.1.\240Construire)WB 209 Sn()WB 41 Sn( un certi)HY(fi)HY(cat)YH( X.509 pour votre h\364te)EH()BR()BR()BR()0 P( OpenSSL dispose d'une impor)HY(tante)YH( infra)HY(struc)HY(ture)YH( de gestions des clefs, capable de g\351rer des clefs sign\351es ou non par une auto)HY(rit\351)YH( de certi)HY(fi)HY(ca)HY(tion)YH(. Pour l'instant, nous avons besoin de court-circui)HY(ter)YH( toute cette infra)HY(struc)HY(ture)YH( et de mettre en place une s\351cu)HY(rit\351)YH( de char)HY(la)HY(tan)YH(, et de travailler sans auto)HY(rit\351)YH( de certi)HY(fi)HY(ca)HY(tion)YH(. )EP()0 P( Nous allons tout d'abord cr\351er une requ\352te de certi)HY(fi)HY(cat)YH( \201certi)HY(fi)HY(cate)YH( request\202 pour notre h\364te, appel\351 'laptop'\240: ) 2 71 PR($ openssl req -new -nodes -newkey rsa:1024 -sha1 -keyform PEM -keyout \200 laptop.private -outform PEM -out request.pem)RP( Des ques)HY(tions)YH( nous sont pos\351es\240: ) 13 73 PR(Country Name \2012 letter code\202 [AU]:NL State or Province Name \201full name\202 [Some-State]:. Locality Name \201eg, city\202 []:Delft Organization Name \201eg, company\202 [Internet Widgits Pty Ltd]:Linux Advanced Routing & Traffic Control Organizational Unit Name \201eg, section\202 []:laptop Common Name \201eg, YOUR name\202 []:bert hubert Email Address []:ahu@ds9a.nl Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:)RP( Vous avez toute libert\351 quant aux r\351ponses. Vous pouvez ou non mettre le nom d'h\364te, en fonc)HY(tion)YH( de vos besoins de s\351cu)HY(rit\351)YH(. C'est ce que nous avons fait dans cet exemple.)EP()0 P( Nous allons main)HY(te)HY(nant)YH( "auto signer" cette requ\352te\240: ) 6 66 PR($ openssl x509 -req -in request.pem -signkey laptop.private -out \200 laptop.public Signature ok subject=/C=NL/L=Delft/O=Linux Advanced Routing & Traffic \200 Control/OU=laptop/CN=bert hubert/Email=ahu@ds9a.nl Getting Private key)RP( Le fichier "request.pem" peut main)HY(te)HY(nant)YH( \352tre \351limin\351. )EP()0 P( R\351p\351tez cette proc\351)HY(dure)YH( pour tous les h\364tes qui ont besoin d'une cl\351. Vous pouvez distri)HY(buer)YH( le fichier '.public' en toute impu)HY(nit\351)YH(, mais garder le fichier '.private' priv\351\240! )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 4 43 H(2.3.2.\240Confi)WB 210 Sn()HY(gu)HY(ra)HY(tion)YH()WB 42 Sn( et lance)HY(ment)YH()EH()BR()BR()BR()0 P( Une fois que nous avons les cl\351s publiques et priv\351es pour nos h\364tes, nous pouvons indiquer \340 racoon de les utili)HY(ser)YH(. )EP()0 P( Repre)HY(nons)YH( notre confi)HY(gu)HY(ra)HY(tion)YH( pr\351c\351)HY(dente)YH( et les deux h\364tes 10.0.0.11 \201'upstairs'\202 et 10.0.0.216 \201'laptop'\202. )EP()0 P( Dans le fichier )SM(racoon.conf)ES( pr\351sent sur 10.0.0.11, nous ajou)HY(tons)YH(\240: ) 18 67 PR(path certificate "/usr/local/etc/racoon/certs"; remote 10.0.0.216 { exchange_mode aggressive,main; my_identifier asn1dn; peers_identifier asn1dn; certificate_type x509 "upstairs.public" "upstairs.private"; peers_certfile "laptop.public"; proposal { encryption_algorithm 3des; hash_algorithm sha1; authentication_method rsasig; dh_group 2 ; } })RP( Ceci indique \340 racoon que les certi)HY(fi)HY(cats)YH( se trouvent dans )SM(/usr/local/etc/racoon/certs/)ES(. De plus, il contient des \351l\351ments sp\351ci)HY(fiques)YH( pour l'h\364te distant 10.0.0.216. )EP()0 P( La ligne 'asn1dn' indique \340 racoon que l'iden)HY(ti)HY(fi)HY(ca)HY(tion)YH( pour l'h\364te local et distant doit \352tre extraite des cl\351s publiques. Ceci corres)HY(pond)YH( \340 la ligne 'subject=/C=NL/L=Delft/O=Linux Advan)HY(ced)YH( Routing & Traffic Control/OU=laptop/CN=bert hubert/Email=ahu@ds9a.nl' donn\351 au-dessus. )EP()0 P( La ligne )BD(certi)HY(fi)HY(cate)YH(_type)ES( pr\351cise l'empla)HY(ce)HY(ment)YH( des cl\351s publiques et priv\351es locales. La d\351cla)HY(ra)HY(tion)YH( )BD(peers_cert)HY(file)YH()ES( pr\351cise \340 racoon que la cl\351 publique de l'h\364te distant se trouve dans le fichier )SM(laptop.public)ES(. )EP()0 P( La section )BD(propo)HY(sal)YH()ES( reste inchan)HY(g\351e)YH( par rapport \340 ce que nous avons vu plus t\364t, \340 l'exception de )BD(authen)HY(ti)HY(fi)HY(ca)HY(tion)YH(_method)ES( qui est main)HY(te)HY(nant)YH( )BD(rsasig)ES(, ce qui indique l'utili)HY(sa)HY(tion)YH( de cl\351 RSA publique/priv\351e pour l'authen)HY(ti)HY(fi)HY(ca)HY(tion)YH(. )EP()0 P( La confi)HY(gu)HY(ra)HY(tion)YH( ajout\351e sur 10.0.0.216 est presque iden)HY(tique)YH(, exception faite de l'habi)HY(tuelle)YH( sym\351)HY(trie)YH(\240: ) 19 63 PR(path certificate "/usr/local/etc/racoon/certs"; remote 10.0.0.11 { exchange_mode aggressive,main; my_identifier asn1dn; peers_identifier asn1dn; certificate_type x509 "laptop.public" "laptop.private"; peers_certfile "upstairs.public"; proposal { encryption_algorithm 3des; hash_algorithm sha1; authentication_method rsasig; dh_group 2 ; } })RP()EP()0 P( Main)HY(te)HY(nant)YH( que nous avons ajout\351 ces \351l\351ments sur les deux h\364tes, la seule chose qui reste \340 faire est de mettre en place les fichiers conte)HY(nant)YH( les cl\351s. La machine 'upstairs' doit avoir les fichiers )SM(upstairs.private)ES(, )SM(upstairs.public)ES(, et )SM(laptop.public)ES( plac\351s dans )SM(/usr/local/etc/racoon/certs)ES(. Soyez s\373r que le r\351per)HY(toire)YH( est la propri\351t\351 de root et qu'il poss\350de les droits 0700. Dans le cas contraire, racoon pour)HY(rait)YH( refuser de lire le contenu de ce r\351per)HY(toire)YH(. )EP()0 P( La machine 'laptop' doit avoir les fichiers )SM(upstairs.private)ES(, )SM(upstairs.public)ES(, et )SM(laptop.public)ES( plac\351s dans )SM(/usr/local/etc/racoon/certs)ES(. Autre)HY(ment)YH( dit, chaque h\364te doit avoir ses propres cl\351s publique et priv\351e et, de plus, la cl\351 publique de l'h\364te distant.)EP()0 P( V\351ri)HY(fiez)YH( que la Poli)HY(tique)YH( de S\351cu)HY(rit\351)YH( est en place \201ex\351cu)HY(tez)YH( la commande 'spdadd' vue dans )0 38 1 A(Section\2402.2, \253\240Exemple\240\273)38 0 TN TL()Ec /AF f D(\202. Lancez alors racoon et tout devrait fonc)HY(tion)HY(ner)YH(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 4 44 H(2.3.3.\240Comment)WB 211 Sn()WB 43 Sn( confi)HY(gu)HY(rer)YH( des tunnels s\351cu)HY(ri)HY(s\351s)YH()EH()BR()BR()BR()0 P( Pour confi)HY(gu)HY(rer)YH( des commu)HY(ni)HY(ca)HY(tions)YH( s\351cu)HY(ri)HY(s\351es)YH( avec un h\364te distant, nous devons \351chan)HY(ger)YH( des cl\351s publiques. Bien qu'il ne soit pas n\351ces)HY(saire)YH( que la cl\351 publique reste secr\350te, il est impor)HY(tant)YH( d'\352tre s\373r que cette cl\351 n'a pas \351t\351 modi)HY(fi\351e)YH(. En d'autres termes, vous devez \352tre certain qu'il n'y a pas de 'man in the middle'. [NdT\240: 'man in the middle' est le nom d'une attaque qui consiste \340 se placer entre l'h\364te \351met)HY(teur)YH( et l'h\364te de desti)HY(na)HY(tion)YH(] )EP()0 P( Pour faci)HY(li)HY(ter)YH( ceci, OpenSSL propose la commande 'digest'\240: ) 2 54 PR($ openssl dgst upstairs.public MD5\201upstairs.public\202= 78a3bddafb4d681c1ca8ed4d23da4ff1)RP()EP()0 P( La seule chose que nous devons faire est de v\351ri)HY(fier)YH( que notre parte)HY(naire)YH( distant voit la m\352me empreinte. Ceci peut \352tre effec)HY(tu\351)YH( en se rencon)HY(trant)YH( physique)HY(ment)YH(, ou par t\351l\351)HY(phone)YH(, en s'assu)HY(rant)YH( que le num\351ro de t\351l\351)HY(phone)YH( de l'h\364te distant n'a pas \351t\351 envoy\351 dans le m\352me cour)HY(rier)YH( \351lec)HY(tro)HY(nique)YH( que celui qui conte)HY(nait)YH( la cl\351\240! )EP()0 P( Une autre mani\350re de faire ceci est d'utili)HY(ser)YH( un tiers de confiance qui ex\351cute le service d'auto)HY(rit\351)YH( de certi)HY(fi)HY(ca)HY(tion)YH( \201)EM(Certi)HY(fi)HY(cate)YH( Autho)HY(rity)YH()ES(\202. Cette auto)HY(rit\351)YH( de certi)HY(fi)HY(ca)HY(tion)YH( \201CA\202 peut alors signer votre cl\351 ; celle que nous avons nous-m\352me cr\351\351 au-dessus. )EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 45 H(3.\240tunnels)WB 212 Sn()WB 44 Sn( IPSEC)EH()BR()BR()BR()0 P( Jusqu'ici, nous n'avons seule)HY(ment)YH( consi)HY(d\351r\351)YH( IPSEC dans le mode appel\351 'trans)HY(port)YH(' o\371 les points termi)HY(naux)YH( comprennent direc)HY(te)HY(ment)YH( IPSEC. Comme ceci n'est pas souvent le cas, il peut \352tre n\351ces)HY(saire)YH( d'avoir des routeurs qui, eux seuls, comprennent IPSEC et qui r\351alisent le travail pour les h\364tes se trou)HY(vant)YH( derri\350re eux. Ceci est appel\351 le mode tunnel. )EP()0 P( Confi)HY(gu)HY(rer)YH( ceci est tr\350s rapide. Pour tunne)HY(ler)YH( tout le trafic vers 130.161.0.0/16 \340 partir de 10.0.0.216 via 10.0.0.11, nous \351ditons ce qui suit sur 10.0.0.216\240: ) 10 51 PR(#!/sbin/setkey -f flush; spdflush; add 10.0.0.216 10.0.0.11 esp 34501 -m tunnel -E 3des-cbc "123456789012123456789012"; spdadd 10.0.0.0/24 130.161.0.0/16 any -P out ipsec esp/tunnel/10.0.0.216-10.0.0.11/require;)RP( Notez que l'option '-m tunnel' est vitale\240! Ceci confi)HY(gure)YH( tout d'abord une Asso)HY(cia)HY(tion)YH( de S\351cu)HY(rit\351)YH( ESP entre les points termi)HY(naux)YH( de notre tunnel, \340 savoir 10.0.0.216 et 10.0.0.11. )EP()0 P( Nous allons ensuite r\351el)HY(le)HY(ment)YH( confi)HY(gu)HY(rer)YH( le tunnel. On doit indiquer au noyau d'encryp)HY(ter)YH( tout le trafic de 10.0.0.0/24 vers 130.161.0.0. De plus, ce trafic doit \352tre envoy\351 vers 10.0.0.11. )EP()0 P( 10.0.0.11 a \351gale)HY(ment)YH( besoin d'\352tre confi)HY(gur\351)YH(\240: ) 10 51 PR(#!/sbin/setkey -f flush; spdflush; add 10.0.0.216 10.0.0.11 esp 34501 -m tunnel -E 3des-cbc "123456789012123456789012"; spdadd 10.0.0.0/24 130.161.0.0/16 any -P in ipsec esp/tunnel/10.0.0.216-10.0.0.11/require;)RP( Notez que ceci est exac)HY(te)HY(ment)YH( iden)HY(tique)YH(, \340 l'exception du chan)HY(ge)HY(ment)YH( de '-P out' en '-P in'. Les exemples pr\351c\351)HY(dents)YH( n'ont confi)HY(gur\351)YH( le trafic que dans un seul sens. Il est laiss\351 comme exer)HY(cice)YH( au lecteur le soin de compl\351)HY(ter)YH( l'autre moiti\351 du tunnel. )EP()0 P( Le nom de 'proxy ESP' est \351gale)HY(ment)YH( donn\351 pour cette confi)HY(gu)HY(ra)HY(tion)YH(, ce qui est un peu plus clair. )EP()0 P( )BR()6 PT()BR( )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 46 H(4.\240Autre)WB 213 Sn()WB 45 Sn( logi)HY(ciel)YH( IPSEC)EH()BR()BR()BR()0 P( Thomas Walpuski pr\351cise qu'il a \351crit une mise \340 jour pour que OpenBSD isakpmd puisse fonc)HY(tion)HY(ner)YH( avec Linux 2.5 IPSEC. De plus, la repo)HY(si)HY(tory)YH( prin)HY(ci)HY(pale)YH( CVS de isakpmd contient main)HY(te)HY(nant)YH( le code\240! Des notes sont dispo)HY(nibles)YH( )R18 2 A(sur cette page)EA(. )EP()0 P( isakpmd est diff\351)HY(rent)YH( de racoon mentionn\351 au-dessus, mais de nombreuses personnes l'appr\351)HY(cient)YH(. Il peut \352tre trouv\351 )R19 2 A(ici)EA(. D'autres \351l\351ments de lecture sur le CVS d'OpenBSD )R20 2 A(ici)EA(. Thomas a \351gale)HY(ment)YH( cr\351\351 un )R21 2 A(tarball)EA( pour ceux qui ne sont pas habi)HY(tu\351s)YH( \340 CVS ou patch. )EP()0 P( De plus, des mises \340 jour sont dispo)HY(nibles)YH( pour permettre aux outils FreeS/WAN de l'espace utili)HY(sa)HY(teur)YH( de fonc)HY(tion)HY(ner)YH( avec l'IPSEC natif de Linux 2.5. Vous pourrez les trouver )R15 2 A(ici)EA(. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 47 H(5.\240Inter)WB 214 Sn()HY(op\351)HY(ra)HY(bi)HY(lit\351)YH()WB 46 Sn( d'IPSEC avec d'autres syst\350mes)EH()BR()BR()BR()0 P( FIXME: Ecrire ceci )EP()2 Sl()BR()BR()BR()BR()0 3 48 H(5.1.\240Windows)WB 215 Sn()WB 47 Sn()EH()BR()BR()BR()0 P( Andreas Jellin)HY(ghaus)YH( rapporte\240: "win2k: cela marche. pr\351-partage de cl\351 et l'adresse ip pour l'authen)HY(ti)HY(fi)HY(ca)HY(tion)YH( \201je ne pense pas que windows supporte fdqn ou userfdqn\202. Les certi)HY(fi)HY(cats)YH( devraient \351gale)HY(ment)YH( marcher, mais cela n'a pas \351t\351 essay\351. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 49 H(5.2.\240)WB 216 Sn()WB 48 Sn( Check Point VPN-1 NG)EH()BR()BR()BR()0 P( Peter Bierin)HY(ger)YH( rapporte\240: ) 10 53 PR(Voici des r\351sultats \201seul le mode tunnel a \351t\351 test\351, auth=SHA1\202\240: DES: ok 3DES: ok AES-128: ok AES-192: non support\351 par CP VPN-1 AES-256: ok CAST* : non support\351 par le noyau Linux utilis\351 Version Test\351e\240: FP4 aka R54 aka w/AI)RP( )EP()0 P( Plus d'infor)HY(ma)HY(tions)YH( )R22 2 A(ici)EA(. )EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 50 H(Chapitre\2408.\240Routage)WB 217 Sn()WB 49 Sn( multi)HY(dis)HY(tri)HY(bu)HY(tion)YH( \201)EM(multi)HY(cast)YH()ES(\202)EH()BR()BR()BR()0 P(FIXME: Pas de r\351dac)HY(teur)YH(\240!)EP()0 P(Le Multi)HY(cast)YH(-HOWTO est \201rela)HY(ti)HY(ve)HY(ment)YH(\202 ancien. De ce fait, il peut \352tre impr\351)HY(cis)YH( ou induire en erreur \340 certains endroits.)EP()0 P(Avant que vous ne puis)HY(siez)YH( faire du routage multi)HY(dis)HY(tri)HY(bu)HY(tion)YH(, le noyau Linux a besoin d'\352tre confi)HY(gur\351)YH( pour suppor)HY(ter)YH( le type de routage multi)HY(dis)HY(tri)HY(bu)HY(tion)YH( que vous voulez faire. Ceci, \340 son tour, exige une d\351ci)HY(sion)YH( quant au choix du proto)HY(cole)YH( de routage multi)HY(dis)HY(tri)HY(bu)HY(tion)YH( que vous vous pr\351pa)HY(rez)YH( \340 utili)HY(ser)YH(. Il y a essen)HY(tiel)HY(le)HY(ment)YH( quatre types \253\240communs\240\273 de proto)HY(coles)YH(\240: DVMRP)Ca( \201la version multi)HY(dis)HY(tri)HY(bu)HY(tion)YH( du proto)HY(cole)YH( RIP)Ca( unicast\202, MOSPF)Ca( \201la m\352me chose, mais pour OSPF)Ca(\202, PIM-SM)Ca( \201)EM(Proto)HY(col)YH( Inde)HY(pen)HY(dant)YH( Multi)HY(cas)HY(ting)YH( - Sparse Mode)ES(\202 qui suppose que les utili)HY(sa)HY(teurs)YH( de n'importe quel groupe de multi)HY(dis)HY(tri)HY(bu)HY(tion)YH( sont disper)HY(s\351s)YH( plut\364t que regrou)HY(p\351s)YH(\202 et PIM-DM)Ca( \201le m\352me, mais )EM(Dense Mode)ES(\202 qui suppose qu'il y aura un regrou)HY(pe)HY(ment)YH( signi)HY(fi)HY(ca)HY(tif)YH( des utili)HY(sa)HY(teurs)YH( d'un m\352me groupe de multi)HY(dis)HY(tri)HY(bu)HY(tion)YH(.)EP()0 P(On pourra noter que ces options n'appa)HY(raissent)YH( pas dans le noyau Linux. Ceci s'explique par le fait que le proto)HY(cole)YH( lui-m\352me est g\351r\351 par une appli)HY(ca)HY(tion)YH( de routage, comme Zebra, mrouted ou pind. Cepen)HY(dant)YH(, vous devez avoir une bonne id\351e de ce que vous allez utili)HY(ser)YH(, de mani\350re \340 s\351lec)HY(tion)HY(ner)YH( les bonnes options dans le noyau.)EP()0 P(Pour tout routage multi)HY(dis)HY(tri)HY(bu)HY(tion)YH(, vous avez forc\351)HY(ment)YH( besoin de s\351lec)HY(tion)HY(ner)YH( les options )SM(multi)HY(cas)HY(ting)YH()ES( et )SM(multi)HY(cas)HY(ting)YH( routing)ES(. Ceci est suffi)HY(sant)YH( pour DVMRP)Ca( et MOSPF)Ca(. Dans le cas de PIM)Ca(, vous devez \351gale)HY(ment)YH( valider les options )SM(PIMv1)ES( ou )SM(PIMv2)ES( suivant que le r\351seau que vous connec)HY(tez)YH( utilise la version 1 ou 2 du proto)HY(cole)YH( PIM)Ca(.)EP()0 P(Une fois que tout cela a \351t\351 r\351alis\351, et que votre nouveau noyau a \351t\351 compil\351, vous verrez au d\351mar)HY(rage)YH( que IGMP)Ca( est inclus dans la liste des proto)HY(coles)YH( IP. Celui-ci est un proto)HY(cole)YH( permet)HY(tant)YH( de g\351rer les groupes multi)HY(dis)HY(tri)HY(bu)HY(tion)YH(. Au moment de la r\351dac)HY(tion)YH(, Linux ne suppor)HY(tait)YH( que les versions 1 et 2 de IGMP)Ca(, bien que la version 3 existe et ait \351t\351 docu)HY(men)HY(t\351e)YH(. Ceci ne va pas vrai)HY(ment)YH( nous affec)HY(ter)YH( dans la mesure o\371 IGMPv3)Ca( est encore trop r\351cent pour que ses fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( suppl\351)HY(men)HY(taires)YH( soient large)HY(ment)YH( utili)HY(s\351es)YH(. Puisque IGMP)Ca( s'occupe des groupes, seules les fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( pr\351sentes dans la plus simple version de IGMP)Ca( g\351rant un groupe entier seront utili)HY(s\351es)YH(. IGMPv2)Ca( sera utilis\351 dans la plupart des cas, bien que IGMPv1)Ca( puisse encore \352tre rencon)HY(tr\351)YH(.)EP()0 P(Jusque-l\340, c'est bon. Nous avons activ\351 la multi)HY(dis)HY(tri)HY(bu)HY(tion)YH(. Nous devons dire au noyau de l'utili)HY(ser)YH( concr\350)HY(te)HY(ment)YH(. Nous allons donc d\351mar)HY(rer)YH( le routage. Ceci signi)HY(fie)YH( que nous ajou)HY(tons)YH( un r\351seau virtuel de multi)HY(dis)HY(tri)HY(bu)HY(tion)YH( \340 la table du routeur\240:)EP() 1 33 PR(ip route add 224.0.0.0/4 dev eth0)RP()0 P(\201En suppo)HY(sant)YH( bien s\373r, que vous diffu)HY(sez)YH( \340 travers eth0\240! Rempla)HY(cez)YH(-le par le p\351ri)HY(ph\351)HY(rique)YH( de votre choix, si n\351ces)HY(saire)YH(.\202)EP()0 P(Main)HY(te)HY(nant)YH(, dire \340 Linux de trans)HY(mettre)YH( les paquets...)EP() 1 38 PR(echo 1 > /proc/sys/net/ipv4/ip_forward)RP()0 P(Arriv\351 ici, il se peut que vous vous deman)HY(diez)YH( si ceci va faire quelque chose. Donc, pour tester notre connexion, nous pinguons le groupe par d\351faut, )SM(224.0.0.1)ES(, pour voir si des machines sont pr\351sentes. Toutes les machines du r\351seau local avec la multi)HY(dis)HY(tri)HY(bu)HY(tion)YH( activ\351e )EM(DEVRAIENT)ES( r\351pondre, et aucune autre. Vous remarque)HY(rez)YH( qu'aucune des machines qui r\351pondent ne le fait avec l'adresse IP )SM(224.0.0.1)ES(. Quelle surprise\240! :\202 Ceci est une adresse de groupe \201une \253\240diffu)HY(sion)YH(\240\273 pour les abonn\351s\202 et tous les membres du groupe r\351pon)HY(dront)YH( avec leur propre adresse, et non celle du groupe.)EP() 1 19 PR(ping -c 2 224.0.0.1)RP()0 P(Main)HY(te)HY(nant)YH(, vous \352tes pr\352t \340 faire du vrai routage multi)HY(dis)HY(tri)HY(bu)HY(tion)YH(. Bien, en suppo)HY(sant)YH( que vous ayez deux r\351seaux \340 router l'un vers l'autre.)EP()0 P(\201A conti)HY(nuer)YH(\240!\202)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 51 H(Chapitre\2409.\240Gestion)WB 218 Sn()HY(naires)YH()WB 50 Sn( de mise en file d'attente pour l'admi)HY(nis)HY(tra)HY(tion)YH( de la bande passante)EH()BR()BR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 51 1 A(1. Expli)HY(ca)HY(tion)YH( sur les files d'attente et la gestion de la mise en file d'attente)51 0 TN TL()Ec /AF f D()0 DT()0 52 1 A(2. Gestion)HY(naires)YH( de mise en file d'attente simples, sans classes)52 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 53 1 A(2.1. )SM(pfifo_fast)ES()53 0 TN TL()Ec /AF f D()0 DT()0 55 1 A(2.2. Filtre \340 seau de jetons \201)EM(Token Bucket Filter)ES(\202)55 0 TN TL()Ec /AF f D()0 DT()0 58 1 A(2.3. Mise en file d'attente stochas)HY(tique)HY(ment)YH( \351qui)HY(table)YH( \201)EM(Stochas)HY(tic)YH( Fair)HY(ness)YH( Queueing)ES(\202)58 0 TN TL()Ec /AF f D()LD()0 DT()0 61 1 A(3. Conseils pour le choix de la file d'attente)61 0 TN TL()Ec /AF f D()0 DT()0 62 1 A(4. termi)HY(no)HY(lo)HY(gie)YH()62 0 TN TL()Ec /AF f D()0 DT()0 63 1 A(5. Gestion)HY(naires)YH( de file d'attente bas\351s sur les classes)63 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 64 1 A(5.1. Flux \340 l'int\351)HY(rieur)YH( des gestion)HY(naires)YH( bas\351s sur des classes & \340 l'int\351)HY(rieur)YH( des classes)64 0 TN TL()Ec /AF f D()0 DT()0 65 1 A(5.2. La famille des gestion)HY(naires)YH( de mise en file d'attente\240: racines, descrip)HY(teurs)YH(, descen)HY(dances)YH( et parents)65 0 TN TL()Ec /AF f D()0 DT()0 68 1 A(5.3. Le gestion)HY(naire)YH( de mise en file d'attente PRIO)68 0 TN TL()Ec /AF f D()0 DT()0 71 1 A(5.4. Le c\351l\350bre gestion)HY(naire)YH( de mise en file d'attente CBQ)71 0 TN TL()Ec /AF f D()0 DT()0 77 1 A(5.5. Seau de jetons \340 contr\364le hi\351rar)HY(chique)YH( \201)EM(Hierar)HY(chi)HY(cal)YH( Token Bucket)ES(\202)77 0 TN TL()Ec /AF f D()LD()0 DT()0 79 1 A(6. Clas)HY(si)HY(fier)YH( des paquets avec des filtres)79 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 80 1 A(6.1. Quelques exemples simples de filtrage)80 0 TN TL()Ec /AF f D()0 DT()0 81 1 A(6.2. Toutes les commandes de filtres dont vous aurez norma)HY(le)HY(ment)YH( besoin)81 0 TN TL()Ec /AF f D()LD()0 DT()0 82 1 A(7. Le p\351ri)HY(ph\351)HY(rique)YH( de file d'attente inter)HY(m\351)HY(diaire)YH( \201The Inter)HY(me)HY(diate)YH( queueing device \201IMQ\202\202)82 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 83 1 A(7.1. Confi)HY(gu)HY(ra)HY(tion)YH( simple)83 0 TN TL()Ec /AF f D()LD()LD()BR()0 P(Quand je l'ai d\351cou)HY(vert)YH(, cela m'a )EM(VRAI)HY(MENT)YH()ES( souffl\351. Linux 2.2 contient toutes les fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( pour la gestion de la bande passante, de mani\350re compa)HY(rable)YH( \340 un syst\350me d\351di\351 de haut niveau.)EP()0 P(Linux d\351passe m\352me ce que l'ATM)Ca( et le Frame peuvent fournir.)EP()0 P(Afin d'\351viter toute confu)HY(sion)YH(, voici les r\350gles utili)HY(s\351es)YH( par )BD(tc)ES( pour la sp\351ci)HY(fi)HY(ca)HY(tion)YH( de la bande passante\240: ) 5 55 PR( mbps = 1024 kbps = 1024 * 1024 bps => byte/s \201octets/s\202 mbit = 1024 kbit => kilo bit/s. mb = 1024 kb = 1024 * 1024 b => byte \201octet\202 mbit = 1024 kbit => kilo bit.)RP( En interne, les nombres sont stock\351s en bps \201octet/s\202 et b \201octet\202.)EP()0 P(Mais )BD(tc)ES( utilise l'unit\351 suivante lors de l'affi)HY(chage)YH( des d\351bits\240:)EP() 2 47 PR( 1Mbit = 1024 Kbit = 1024 * 1024 bps => octets/s)RP()2 Sl()BR()BR()BR()BR()0 2 52 H(1.\240Expli)WB 219 Sn()HY(ca)HY(tion)YH()WB 51 Sn( sur les files d'attente et la gestion de la mise en file d'attente)EH()BR()BR()BR()0 P(Avec la mise en file d'attente, nous d\351ter)HY(mi)HY(nons)YH( la mani\350re dont les donn\351es sont )EM(ENVOYEES)ES(. Il est impor)HY(tant)YH( de comprendre que nous ne pouvons mettre en forme que les donn\351es que nous trans)HY(met)HY(tons)YH(.)EP()0 P(Avec la mani\350re dont Inter)HY(net)YH( travaille, nous n'avons pas de contr\364le direct sur ce que les personnes nous envoient. C'est un peu comme votre bo\356te aux lettres \201physique\240!\202 chez vous. Il n'y a pas de fa\347on d'influen)HY(cer)YH( le nombre de lettres que vous recevez, \340 moins de contac)HY(ter)YH( tout le monde.)EP()0 P(Cepen)HY(dant)YH(, l'Inter)HY(net)YH( est prin)HY(ci)HY(pa)HY(le)HY(ment)YH( bas\351 sur TCP/IP qui poss\350de quelques fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( qui vont pouvoir nous aider. TCP/IP n'a pas d'apti)HY(tude)YH( \340 conna\356tre les perfor)HY(mances)YH( d'un r\351seau entre deux h\364tes. Il envoie donc simple)HY(ment)YH( des paquets de plus en plus rapi)HY(de)HY(ment)YH( \201\253\240)EM(slow start)ES(\240\273\202 et quand des paquets commencent \340 se perdre, il ralen)HY(tit)YH( car il n'a plus la possi)HY(bi)HY(lit\351)YH( de les envoyer. En fait, c'est un peu plus \351l\351gant que cela, mais nous en dirons plus par la suite.)EP()0 P(C'est comme si vous ne lisiez que la moiti\351 de votre cour)HY(rier)YH( en esp\351)HY(rant)YH( que vos corres)HY(pon)HY(dants)YH( arr\352)HY(te)HY(ront)YH( de vous en envoyer. \300 la diff\351)HY(rence)YH( que \347a marche sur Inter)HY(net)YH( :-\202)EP()0 P(Si vous avez un routeur et que vous souhai)HY(tez)YH( \351viter que certains h\364tes de votre r\351seau aient des vitesses de t\351l\351)HY(char)HY(ge)HY(ment)YH( trop grandes, vous aurez besoin de mettre en place de la mise en forme de trafic sur l'inter)HY(face)YH( )EM(INTERNE)ES( de votre routeur, celle qui envoie les donn\351es vers vos propres ordi)HY(na)HY(teurs)YH(.)EP()0 P(Vous devez \351gale)HY(ment)YH( \352tre s\373r que vous contr\364)HY(lez)YH( le goulot d'\351tran)HY(gle)HY(ment)YH( de la liaison. Si vous avez une carte r\351seau \340 100Mbit et un routeur avec un lien \340 256kbit, vous devez vous assurer que vous n'envoyez pas plus de donn\351es que ce que le routeur peut mani)HY(pu)HY(ler)YH(. Autre)HY(ment)YH(, ce sera le routeur qui contr\364)HY(lera)YH( le lien et qui mettra en forme la bande passante dispo)HY(nible)YH(. Nous devons pour ainsi dire \253\240\352tre le propri\351)HY(taire)YH( de la file d'attente\240\273 et \352tre le lien le plus lent de la cha\356ne. Heureu)HY(se)HY(ment)YH(, c'est faci)HY(le)HY(ment)YH( r\351ali)HY(sable)YH(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 53 H(2.\240Gestion)WB 220 Sn()HY(naires)YH()WB 52 Sn( de mise en file d'attente simples, sans classes)EH()BR()BR()BR()0 P(Comme nous l'avons d\351j\340 dit, la gestion de mise en file d'attente permet de modi)HY(fier)YH( la fa\347on dont les donn\351es sont envoy\351es. Les gestion)HY(naires)YH( de mise en file d'attente sans classes sont ceux qui, en gros, acceptent les donn\351es et qui ne font que les r\351or)HY(don)HY(ner)YH(, les retar)HY(der)YH( ou les jeter.)EP()0 P(Ils peuvent \352tre utili)HY(s\351s)YH( pour mettre en forme le trafic d'une inter)HY(face)YH( sans aucune subdi)HY(vi)HY(sion)YH(. Il est primor)HY(dial)YH( que vous compre)HY(niez)YH( cet aspect de la mise en file d'attente avant de conti)HY(nuer)YH( sur les gestion)HY(naires)YH( de mise en files d'attente bas\351s sur des classes conte)HY(nant)YH( d'autres gestion)HY(naires)YH( de mise en file d'attente.)EP()0 P(Le gestion)HY(naire)YH( le plus large)HY(ment)YH( utilis\351 est de loin )SM(pfifo_fast)ES(, qui est celui par d\351faut. Ceci explique aussi pourquoi ces fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( avan)HY(c\351es)YH( sont si robustes. Elles ne sont rien de plus \253\240qu'une autre file d'attente\240\273.)EP()0 P(Chacune de ces files d'attente a ses forces et ses faiblesses. Toutes n'ont peut-\352tre pas \351t\351 bien test\351es.)EP()2 Sl()BR()BR()BR()BR()0 3 54 H(2.1.\240)WB 221 Sn()WB 53 Sn()SM(pfifo_fast)ES()EH()BR()BR()BR()0 P(Cette file d'attente, comme son nom l'indique\240: premier entr\351, premier sorti \201)EM(First In First Out)ES(\202, signi)HY(fie)YH( que les paquets ne subissent pas de trai)HY(te)HY(ments)YH( sp\351ciaux. En fait, ce n'est pas tout \340 fait vrai. Cette file d'attente a trois \253\240bandes\240\273. A l'int\351)HY(rieur)YH( de chacune de ces bandes, des r\350gles FIFO s'appliquent. Cepen)HY(dant)YH(, tant qu'il y a un paquet en attente dans la bande 0, la bande 1 ne sera pas trait\351e. Il en va de m\352me pour la bande 1 et la bande 2.)EP()0 P(Le noyau prend en compte la valeur du champ Type de Service des paquets et prend soin d'ins\351rer dans la bande 0 les paquets ayant le bit \253\240d\351lai minimum\240\273 activ\351.)EP()0 P(Ne pas confondre ce gestion)HY(naire)YH( de mise en file d'attente sans classes avec celui bas\351 sur des classes PRIO\240! Bien qu'ils aient des compor)HY(te)HY(ments)YH( simi)HY(laires)YH(, )SM(pfifo_fast)ES( ne poss\350de pas de classes et vous ne pourrez pas y ajouter de nouveaux gestion)HY(naires)YH( avec la commande )BD(tc)ES(.)EP()2 Sl()BR()BR()BR()BR()0 4 55 H(2.1.1.\240Para)WB 222 Sn()HY(m\350tres)YH()WB 54 Sn( & usage)EH()BR()BR()BR()0 P(Vous ne pouvez pas confi)HY(gu)HY(rer)YH( le gestion)HY(naire)YH( )SM(pfifo_fast)ES(, dans la mesure o\371 c'est celui par d\351faut. Voici sa confi)HY(gu)HY(ra)HY(tion)YH( par d\351faut\240:)EP()BR()0 DL()0 DT()SM(priomap)ES()DD()0 P(D\351ter)HY(mine)YH( comment les prio)HY(ri)HY(t\351s)YH( des paquets sont reli\351es aux bandes, telles que d\351fi)HY(nies)YH( par le noyau. La rela)HY(tion)YH( est \351tablie en se basant sur l'octet TOS)Ca( du paquet, qui ressemble \340 ceci\240: )EP() 7 49 PR( 0 1 2 3 4 5 6 7 +-----+-----+-----+-----+-----+-----+-----+-----+ | | | | | PRECEDENCE | TOS | MBZ | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+)RP()0 P(Les quatre bits TOS)Ca( \201le champ TOS\202 sont d\351finis comme suit\240: )EP() 8 77 PR( Binaire D\351cimal Signification ----------------------------------------- 1000 8 Minimise le D\351lai \201Minimize delay\202 \201md\202 0100 4 Maximalise le D\351bit \201Maximize throughput\202 \201mt\202 0010 2 Maximalise la Fiabilit\351 \201Maximize reliability\202 \201mr\202 0001 1 Minimalise le Co\373t Mon\351taire \201Minimize monetary cost\202 \201mmc\202 0000 0 Service Normal)RP()0 P(Comme il y a 1 bit sur la droite de ces quatre bits, la valeur r\351elle du champ TOS)Ca( est le double de la valeur des bits TOS)Ca(. )BD()SM(tcpdump -v -v)ES()ES( fournit la valeur de tout le champ TOS)Ca(, et non pas seule)HY(ment)YH( la valeur des quatre bits. C'est la valeur que l'on peut voir dans la premi\350re colonne du tableau suivant\240: )EP() 19 72 PR( TOS Bits Signification Priorit\351 Linux Bande ------------------------------------------------------------------------ 0x0 0 Service Normal 0 Best Effort 1 0x2 1 Minimise le Co\373t Mon\351taire \201mmc\202 1 Filler 2 0x4 2 Maximalise la Fiabilit\351 \201mr\202 0 Best Effort 1 0x6 3 mmc+mr 0 Best Effort 1 0x8 4 Maximalise le D\351bit \201mt\202 2 Masse 2 0xa 5 mmc+mt 2 Masse 2 0xc 6 mr+mt 2 Masse 2 0xe 7 mmc+mr+mt 2 Masse 2 0x10 8 Minimise le D\351lai \201md\202 6 Interactive 0 0x12 9 mmc+md 6 Interactive 0 0x14 10 mr+md 6 Interactive 0 0x16 11 mmc+mr+md 6 Interactive 0 0x18 12 mt+md 4 Int. Masse 1 0x1a 13 mmc+mt+md 4 Int. Masse 1 0x1c 14 mr+mt+md 4 Int. Masse 1 0x1e 15 mmc+mr+mt+md 4 Int. Masse 1)RP()0 P([NdT\240: par flux de masse \201)EM(bulk flow)ES(\202, il faut entendre \253\240gros flot de donn\351es trans)HY(mises)YH( en continu\240\273 comme un trans)HY(fert)YH( FTP. A l'oppos\351, un flux inter)HY(ac)HY(tif)YH( \201)EM(inter)HY(ac)HY(tive)YH( flow)ES(\202, corres)HY(pond)YH( \340 celui g\351n\351r\351 par des requ\352tes SSH]. )EP()0 P(Beau)HY(coup)YH( de nombres. La seconde colonne contient la valeur corres)HY(pon)HY(dante)YH( des quatre bits TOS)Ca(, suivi de leur signi)HY(fi)HY(ca)HY(tion)YH(. Par exemple, 15 repr\351)HY(sente)YH( un paquet voulant un co\373t mon\351)HY(taire)YH( minimal, une fiabi)HY(lit\351)YH( maximum, un d\351bit maximum )EM(ET)ES( un d\351lai minimum. J'appel)HY(le)HY(rai)YH( ceci un \253\240paquet Hollan)HY(dais)YH(\240\273. )EP()0 P(La quatri\350me colonne liste la mani\350re dont le noyau Linux inter)HY(pr\350te)YH( les bits TOS)Ca(, en indiquant \340 quelle prio)HY(rit\351)YH( ils sont reli\351s. )EP()0 P(La derni\350re colonne montre la carte des prio)HY(ri)HY(t\351s)YH( par d\351faut. Sur la ligne de commande, la carte des prio)HY(ri)HY(t\351s)YH( ressemble \340 ceci\240: )EP() 1 47 PR(1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1)RP()0 P(Ceci signi)HY(fie)YH( , par exemple, que la prio)HY(rit\351)YH( 4 sera reli\351e \340 la bande num\351ro 1. La carte des prio)HY(ri)HY(t\351s)YH( vous permet \351gale)HY(ment)YH( de lister des prio)HY(ri)HY(t\351s)YH( plus grandes \201> 7\202 qui ne corres)HY(pondent)YH( pas \340 une rela)HY(tion)YH( avec le champ TOS)Ca(, mais qui sont confi)HY(gu)HY(r\351es)YH( par d'autres moyens. )EP()0 P(Le tableau suivant prove)HY(nant)YH( de la RFC 1349 \201\340 lire pour plus de d\351tails\202 indique comment les appli)HY(ca)HY(tions)YH( devraient confi)HY(gu)HY(rer)YH( leurs bits TOS)Ca( pour fonc)HY(tion)HY(ner)YH( correc)HY(te)HY(ment)YH(\240: )EP() 22 69 PR(TELNET 1000 \201minimise le d\351lai\202 FTP Contr\364le 1000 \201minimise le d\351lai\202 Donn\351es 0100 \201maximalise le d\351bit\202 TFTP 1000 \201minimise le d\351lai\202 SMTP phase de commande 1000 \201minimise le d\351lai\202 phase DATA 0100 \201maximalise le d\351bit\202 Domain Name Service requ\352te UDP 1000 \201minimise le d\351lai\202 requ\352te TCP 0000 Transfert de Zone 0100 \201maximalise le d\351bit\202 NNTP 0001 \201minimise le co\373t mon\351taire\202 ICMP Erreurs 0000 Requ\352tes 0000 \201presque\202 R\351ponses \201presque\202)RP()0 DT()SM(txqueue)HY(len)YH()ES()DD()0 P(La longueur de cette file d'attente est fournie par la confi)HY(gu)HY(ra)HY(tion)YH( de l'inter)HY(face)YH(, que vous pouvez voir et confi)HY(gu)HY(rer)YH( avec )BD(ifcon)HY(fig)YH()ES( et )BD(ip)ES(. Pour confi)HY(gu)HY(rer)YH( la longueur de la file d'attente \340 )SM(10)ES(, ex\351cu)HY(ter)YH(\240: )BD()SM(ifcon)HY(fig)YH( eth0 txqueue)HY(len)YH( 10)ES()ES( )EP()0 P(Vous ne pouvez pas confi)HY(gu)HY(rer)YH( ce para)HY(m\350tre)YH( avec )BD(tc)ES(\240! )EP()LD()BR()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 56 H(2.2.\240Filtre)WB 223 Sn()WB 55 Sn( \340 seau de jetons \201)EM(Token Bucket Filter)ES(\202)EH()BR()BR()BR()0 P(Le )EM(Token Bucket Filter)ES( \201TBF)Ca(\202 est un gestion)HY(naire)YH( de mise en file d'attente simple. Il ne fait que laisser passer les paquets entrants avec un d\351bit n'exc\351)HY(dant)YH( pas une limite fix\351e admi)HY(nis)HY(tra)HY(ti)HY(ve)HY(ment)YH(. L'envoi de courtes rafales de donn\351es avec un d\351bit d\351pas)HY(sant)YH( cette limite est cepen)HY(dant)YH( possible.)EP()0 P(TBF)Ca( est tr\350s pr\351cis, et peu gour)HY(mand)YH( du point de vue r\351seau et proces)HY(seur)YH(. Consi)HY(d\351)HY(rez)YH(-le en premier si vous voulez simple)HY(ment)YH( ralen)HY(tir)YH( une inter)HY(face)YH(\240!)EP()0 P(L'impl\351)HY(men)HY(ta)HY(tion)YH( TBF)Ca( consiste en un tampon \201seau\202, constam)HY(ment)YH( rempli par des \351l\351ments virtuels d'infor)HY(ma)HY(tion)YH( appel\351s jetons, avec un d\351bit sp\351ci)HY(fique)YH( \201d\351bit de jeton\202. Le para)HY(m\350tre)YH( le plus impor)HY(tant)YH( du tampon est sa taille, qui corres)HY(pond)YH( au nombre de jetons qu'il peut stocker.)EP()0 P(Chaque jeton entrant laisse sortir un paquet de donn\351es de la file d'attente de donn\351es et ce jeton est alors supprim\351 du seau. L'asso)HY(cia)HY(tion)YH( de cet algo)HY(rithme)YH( avec les deux flux de jetons et de donn\351es, nous conduit \340 trois sc\351na)HY(rios)YH( possibles\240:)EP()BR()UL()0 P()-1 LI(Les donn\351es arrivent dans TBF)Ca( avec un d\351bit )EM(EGAL)ES( au d\351bit des jetons entrants. Dans ce cas, chaque paquet entrant a son jeton corres)HY(pon)HY(dant)YH( et passe la file d'attente sans d\351lai. )EP()0 P()-1 LI( Les donn\351es arrivent dans TBF)Ca( avec un d\351bit )EM(PLUS PETIT)ES( que le d\351bit des jetons. Seule une partie des jetons est suppri)HY(m\351e)YH( au moment o\371 les paquets de donn\351es sortent de la file d'attente, de sorte que les jetons s'accu)HY(mulent)YH( jusqu'\340 atteindre la taille du tampon. Les jetons libres peuvent \352tre utili)HY(s\351s)YH( pour envoyer des donn\351es avec un d\351bit sup\351)HY(rieur)YH( au d\351bit des jetons stan)HY(dard)YH(, si de courtes rafales de donn\351es arrivent. )EP()0 P()-1 LI(Les donn\351es arrivent dans TBF)Ca( avec un d\351bit )EM(PLUS GRAND)ES( que le d\351bit des jetons. Ceci signi)HY(fie)YH( que le seau sera bient\364t d\351pourvu de jetons, ce qui provoque l'arr\352t de TBF)Ca( pendant un moment. Ceci s'appelle \253\240une situa)HY(tion)YH( de d\351pas)HY(se)HY(ment)YH( de limite\240\273 \201)EM(over)HY(li)HY(mit)YH( situa)HY(tion)YH()ES(\202. Si les paquets conti)HY(nuent)YH( \340 arriver, ils commen)HY(ce)HY(ront)YH( \340 \352tre \351limi)HY(n\351s)YH(. )EP()LU()BR()0 P(Le dernier sc\351na)HY(rio)YH( est tr\350s impor)HY(tant)YH(, car il auto)HY(rise)YH( la mise en forme admi)HY(nis)HY(tra)HY(tive)YH( de la bande passante dispo)HY(nible)YH( pour les donn\351es traver)HY(sant)YH( le filtre. )EP()0 P(L'accu)HY(mu)HY(la)HY(tion)YH( de jetons auto)HY(rise)YH( l'\351mis)HY(sion)YH( de courtes rafales de donn\351es sans perte en situa)HY(tion)YH( de d\351pas)HY(se)HY(ment)YH( de limite, mais toute surcharge prolon)HY(g\351e)YH( causera syst\351)HY(ma)HY(tique)HY(ment)YH( le retard des paquets, puis leur rejet.)EP()0 P(Notez que, dans l'impl\351)HY(men)HY(ta)HY(tion)YH( r\351elle, les jetons corres)HY(pondent)YH( \340 des octets, et non des paquets.)EP()2 Sl()BR()BR()BR()BR()0 4 57 H(2.2.1.\240Para)WB 224 Sn()HY(m\350tres)YH()WB 56 Sn( & usage)EH()BR()BR()BR()0 P(M\352me si vous n'aurez proba)HY(ble)HY(ment)YH( pas besoin de les changer, TBF)Ca( a des para)HY(m\350tres)YH(. D'abord, ceux toujours dispo)HY(nibles)YH( sont\240: )BR()0 DL()0 DT()SM(limit or latency)ES()DD()0 P()SM(Limit)ES( est le nombre d'octets qui peuvent \352tre mis en file d'attente en atten)HY(dant)YH( la dispo)HY(ni)HY(bi)HY(lit\351)YH( de jetons. Vous pouvez \351gale)HY(ment)YH( indiquer ceci d'une autre mani\350re en confi)HY(gu)HY(rant)YH( le para)HY(m\350tre)YH( )SM(latency)ES(, qui sp\351ci)HY(fie)YH( le temps maximal pendant lequel un paquet peut rester dans TBF)Ca(. Ce dernier para)HY(m\350tre)YH( prend en compte la taille du seau, le d\351bit, et s'il est confi)HY(gur\351)YH(, le d\351bit de cr\352te \201)SM(peakrate)ES(\202. )EP()0 DT()SM(burst/buffer/maxburst)ES()DD()0 P(Taille du seau, en octets. C'est la quan)HY(tit\351)YH( maxi)HY(male)YH(, en octets, de jetons dont on dispo)HY(sera)YH( simul)HY(ta)HY(n\351)HY(ment)YH(. En g\351n\351ral, plus les d\351bits de mise en forme sont impor)HY(tants)YH(, plus le tampon doit \352tre grand. Pour 10 Mbit/s sur plate)HY(forme)YH( Intel, vous avez besoin d'un tampon d'au moins 10 kilo-octets si vous voulez atteindre la limi)HY(ta)HY(tion)YH( confi)HY(gu)HY(r\351e)YH(\240! )EP()0 P(Si votre tampon est trop petit, les paquets pour)HY(ront)YH( \352tre rejet\351s car il arrive plus de jetons par top d'horloge que ne peut en conte)HY(nir)YH( le tampon. )EP()0 DT()SM(mpu)ES()DD()0 P(Un paquet de taille nulle n'utilise pas une bande passante nulle. Pour ether)HY(net)YH(, la taille mini)HY(male)YH( d'un paquet est de 64 octets. L'Unit\351 Mini)HY(male)YH( de Paquet \201)EM(Minimun Packet Unit)ES(\202 d\351ter)HY(mine)YH( le nombre minimal de jetons \340 utili)HY(ser)YH( pour un paquet. )EP()0 DT()SM(rate)ES()DD()0 P(Le para)HY(m\350tre)YH( de la vitesse. Voir les remarques au-dessus \340 propos des limites\240! )EP()LD()BR()EP()0 P(Si le seau contient des jetons et qu'il est auto)HY(ris\351)YH( \340 se vider, alors il le fait par d\351faut avec une vitesse infinie. Si ceci vous semble inac)HY(cep)HY(table)YH(, utili)HY(sez)YH( les para)HY(m\350tres)YH( suivants\240: )BR()0 DL()0 DT()SM(peakrate)ES()DD()0 P(Si des jetons sont dispo)HY(nibles)YH( et que des paquets arrivent, ils sont imm\351)HY(dia)HY(te)HY(ment)YH( envoy\351s par d\351faut ; et pour ainsi dire \340 \253\240la vitesse de la lumi\350re\240\273. Cela peut ne pas vous conve)HY(nir)YH(, sp\351cia)HY(le)HY(ment)YH( si vous avez un grand seau. )EP()0 P(Le d\351bit de cr\352te \201)EM(peak rate)ES(\202 peut \352tre utilis\351 pour sp\351ci)HY(fier)YH( la vitesse \340 laquelle le seau est auto)HY(ris\351)YH( \340 se vider. Si tout se passe comme \351crit dans les livres, ceci est r\351alis\351 en lib\351)HY(rant)YH( un paquet, puis en atten)HY(dant)YH( suffi)HY(sam)HY(ment)YH( long)HY(temps)YH(, pour lib\351rer le paquet suivant. Le temps d'attente est calcul\351 de mani\350re \340 obtenir un d\351bit \351gal au d\351bit de cr\352te. )EP()0 P(Cepen)HY(dant)YH(, \351tant donn\351 que la r\351so)HY(lu)HY(tion)YH( du minu)HY(teur)YH( \201)EM(timer)ES(\202 d'UNIX est de 10 ms et que les paquets ont une taille moyenne de 10 000 bits, nous sommes limit\351s \340 un d\351bit de cr\352te de 1mbit/s\240! )EP()0 DT()SM(mtu/minburst)ES()DD()0 P(Le d\351bit de cr\352te de 1Mb/s ne sert pas \340 grand chose si votre d\351bit habi)HY(tuel)YH( est sup\351)HY(rieur)YH( \340 cette valeur. Un d\351bit de cr\352te plus \351lev\351 peut \352tre atteint en \351met)HY(tant)YH( davan)HY(tage)YH( de paquets par top du minu)HY(teur)YH(, ce qui a pour effet de cr\351er un second seau. )EP()0 P(Ce second )EM(bucket)ES( ne prend par d\351faut qu'un seul paquet, et n'est donc en aucun cas un seau. )EP()0 P(Pour calcu)HY(ler)YH( le d\351bit de cr\352te maximum, multi)HY(pliez)YH( le )EM(mtu)ES( que vous avez confi)HY(gur\351)YH( par 100 \201ou plus exac)HY(te)HY(ment)YH( par HZ, qui est \351gal \340 100 sur Intel et \340 1024 sur Alpha\202. )EP()LD()BR()EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 4 58 H(2.2.2.\240Confi)WB 225 Sn()HY(gu)HY(ra)HY(tion)YH()WB 57 Sn( simple)EH()BR()BR()BR()0 P(Voici une confi)HY(gu)HY(ra)HY(tion)YH( simple, mais )EM(tr\350s)ES( utile\240:)EP() 1 69 PR(# tc qdisc add dev ppp0 root tbf rate 220kbit latency 50ms burst 1540)RP()0 P(Pourquoi est-ce utile\240? Si vous avez un p\351ri)HY(ph\351)HY(rique)YH( r\351seau avec une grande file d'attente, comme un modem DSL ou un modem c\342ble, et que le dialogue se fasse \340 travers une inter)HY(face)YH( rapide, comme une inter)HY(face)YH( ether)HY(net)YH(, vous obser)HY(ve)HY(rez)YH( que t\351l\351)HY(char)HY(ger)YH( vers l'amont \201)EM(uploa)HY(ding)YH()ES(\202 d\351grade compl\350)HY(te)HY(ment)YH( l'inter)HY(ac)HY(ti)HY(vit\351)YH(.)EP()0 P([NdT\240: )EM(uploa)HY(ding)YH()ES( d\351signe une op\351ra)HY(tion)YH( qui consiste \340 trans)HY(f\351)HY(rer)YH( des donn\351es ou des programmes stock\351s dans un ordi)HY(na)HY(teur)YH( local vers un ordi)HY(na)HY(teur)YH( distant \340 travers un r\351seau. La traduc)HY(tion)YH( offi)HY(cielle)YH( pour ce terme est \253\240t\351l\351)HY(char)HY(ge)HY(ment)YH( vers l'amont\240\273. On parle alors de voie montante. Le )EM(down)HY(loa)HY(ding)YH()ES( d\351signe l'op\351ra)HY(tion)YH( inverse \201trans)HY(fert)YH( d'un h\364te distant vers l'ordi)HY(na)HY(teur)YH( local\202 et est traduit par \253\240t\351l\351)HY(char)HY(ge)HY(ment)YH(\240\273 ou \253\240t\351l\351)HY(char)HY(ge)HY(ment)YH( vers l'aval\240\273. On parle alors de la voie descen)HY(dante)YH(.])EP()0 P(Le t\351l\351)HY(char)HY(ge)HY(ment)YH( vers l'amont va en effet remplir la file d'attente du modem. Celle-ci est proba)HY(ble)HY(ment)YH( )EM(ENORME)ES( car cela aide vrai)HY(ment)YH( \340 obtenir de bon d\351bit de t\351l\351)HY(char)HY(ge)HY(ment)YH( vers l'amont. Cepen)HY(dant)YH(, ceci n'est pas forc\351)HY(ment)YH( ce que voulez. Vous ne voulez pas forc\351)HY(ment)YH( avoir une file d'attente impor)HY(tante)YH( de mani\350re \340 garder l'inter)HY(ac)HY(ti)HY(vit\351)YH( et pouvoir encore faire des choses pendant que vous envoyez des donn\351es.)EP()0 P(La ligne de commande au-dessus ralen)HY(tit)YH( l'envoi de donn\351es \340 un d\351bit qui ne conduit pas \340 une mise en file d'attente dans le modem. La file d'attente r\351side dans le noyau Linux, o\371 nous pouvons lui imposer une taille limite.)EP()0 P(Modi)HY(fier)YH( la valeur 220kbit avec votre vitesse de lien )EM(REELLE)ES( moins un petit pour)HY(cen)HY(tage)YH(. Si vous avez un modem vrai)HY(ment)YH( rapide, augmen)HY(ter)YH( un peu le para)HY(m\350tre)YH( )SM(burst)ES(.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 59 H(2.3.\240Mise)WB 226 Sn()WB 58 Sn( en file d'attente stochas)HY(tique)HY(ment)YH( \351qui)HY(table)YH( \201)EM(Stochas)HY(tic)YH( Fair)HY(ness)YH( Queueing)ES(\202)EH()BR()BR()BR()0 P()EM(Stochas)HY(tic)YH( Fair)HY(ness)YH( Queueing)ES( \201SFQ)Ca(\202 est une impl\351)HY(men)HY(ta)HY(tion)YH( simple de la famille des algo)HY(rithmes)YH( de mise en file d'attente \351qui)HY(table)YH(. Cette impl\351)HY(men)HY(ta)HY(tion)YH( est moins pr\351cise que les autres, mais elle n\351ces)HY(site)YH( aussi moins de calculs tout en \351tant presque parfai)HY(te)HY(ment)YH( \351qui)HY(table)YH(.)EP()0 P(Le mot cl\351 dans SFQ)Ca( est conver)HY(sa)HY(tion)YH( \201ou flux\202, qui corres)HY(pond)YH( prin)HY(ci)HY(pa)HY(le)HY(ment)YH( \340 une session TCP)Ca( ou un flux UDP)Ca(. Le trafic est alors divis\351 en un grand nombre de jolies files d'attente FIFO)Ca(\240: une par conver)HY(sa)HY(tion)YH(. Le trafic est alors envoy\351 dans un tour)HY(niquet)YH(, donnant une chance \340 chaque session d'envoyer leurs donn\351es tour \340 tour.)EP()0 P(Ceci conduit \340 un compor)HY(te)HY(ment)YH( tr\350s \351qui)HY(table)YH( et emp\352che qu'une seule conver)HY(sa)HY(tion)YH( \351touffe les autres. SFQ)Ca( est appel\351 \253\240Stochas)HY(tic)YH(\240\273 car il n'alloue pas vrai)HY(ment)YH( une file d'attente par session, mais a un algo)HY(rithme)YH( qui divise le trafic \340 travers un nombre limit\351 de files d'attente en utili)HY(sant)YH( un algo)HY(rithme)YH( de hachage.)EP()0 P(A cause de ce hachage, plusieurs sessions peuvent finir dans le m\352me seau, ce qui peut r\351duire de moiti\351 les chances d'une session d'envoyer un paquet et donc r\351duire de moiti\351 la vitesse effec)HY(tive)YH( dispo)HY(nible)YH(. Pour emp\352)HY(cher)YH( que cette situa)HY(tion)YH( ne devienne impor)HY(tante)YH(, SFQ)Ca( change tr\350s souvent son algo)HY(rithme)YH( de hachage pour que deux sessions entrantes en colli)HY(sion)YH( ne le fassent que pendant un nombre r\351duit de secondes.)EP()0 P(Il est impor)HY(tant)YH( de noter que SFQ)Ca( n'est seule)HY(ment)YH( utile que dans le cas o\371 votre inter)HY(face)YH( de sortie est vrai)HY(ment)YH( satur\351e\240! Si ce n'est pas le cas, il n'y aura pas de files d'attente sur votre machine Linux et donc, pas d'effets. Plus tard, nous d\351cri)HY(rons)YH( comment combi)HY(ner)YH( SFQ)Ca( avec d'autres gestion)HY(naires)YH( de mise en files d'attente pour obtenir le meilleur des deux mondes.)EP()0 P(Confi)HY(gu)HY(rer)YH( sp\351cia)HY(le)HY(ment)YH( SFQ)Ca( sur l'inter)HY(face)YH( ether)HY(net)YH( qui est en rela)HY(tion)YH( avec votre modem c\342ble ou votre routeur DSL est vain sans d'autres mises en forme du trafic\240!)EP()2 Sl()BR()BR()BR()BR()0 4 60 H(2.3.1.\240Para)WB 227 Sn()HY(m\350tres)YH()WB 59 Sn( & usage)EH()BR()BR()BR()0 P(SFQ)Ca( est presque confi)HY(gur\351)YH( de base\240:)EP()BR()0 DL()0 DT()SM(perturb)ES()DD()0 P(Recon)HY(fi)HY(gure)YH( le hachage une fois toutes les )SM(pertub)ES( secondes. S'il n'est pas indiqu\351, le hachage se sera jamais recon)HY(fi)HY(gur\351)YH(. Ce n'est pas recom)HY(mand\351)YH(. 10 secondes est proba)HY(ble)HY(ment)YH( une bonne valeur. )EP()0 DT()SM(quantum)ES()DD()0 P(Nombre d'octets qu'un flux est auto)HY(ris\351)YH( \340 retirer de la file d'attente avant que la prochaine file d'attente ne prenne son tour. Par d\351faut, \351gal \340 la taille maximum d'un paquet \201MTU)Ca(\202. Ne le confi)HY(gu)HY(rez)YH( pas en dessous du MTU)Ca(\240! )EP()LD()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 4 61 H(2.3.2.\240Confi)WB 228 Sn()HY(gu)HY(ra)HY(tion)YH()WB 60 Sn( simple)EH()BR()BR()BR()0 P(Si vous avez un p\351ri)HY(ph\351)HY(rique)YH( qui a une vitesse iden)HY(tique)YH( \340 celle du lien et un d\351bit r\351el dispo)HY(nible)YH(, comme un modem t\351l\351)HY(pho)HY(nique)YH(, cette confi)HY(gu)HY(ra)HY(tion)YH( aidera \340 promou)HY(voir)YH( l'\351quit\351\240:)EP() 4 78 PR(# tc qdisc add dev ppp0 root sfq perturb 10 # tc -s -d qdisc ls qdisc sfq 800c: dev ppp0 quantum 1514b limit 128p flows 128/1024 perturb 10sec Sent 4812 bytes 62 pkts \201dropped 0, overlimits 0\202)RP()0 P(Le nombre )SM(800c)ES( est un descrip)HY(teur)YH( \201)EM(handle)ES(\202 auto)HY(ma)HY(tique)HY(ment)YH( assign\351 et )SM(limit)ES( signi)HY(fie)YH( que )SM(128)ES( paquets peuvent attendre dans la file d'attente. Il y a )SM(1024)ES( \253\240seaux de hachage\240\273 dispo)HY(nibles)YH( pour la comp)HY(ta)HY(bi)HY(lit\351)YH(, )SM(128)ES( pouvant \352tre actifs \340 la fois \201pas plus de paquets ne conviennent dans la file d'attente\202. Le hachage est recon)HY(fi)HY(gur\351)YH( toutes les 10 secondes.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 62 H(3.\240Conseils)WB 229 Sn()WB 61 Sn( pour le choix de la file d'attente)EH()BR()BR()BR()0 P(Pour r\351sumer, ces files d'attente simples g\350rent le trafic en r\351or)HY(don)HY(nant)YH(, en ralen)HY(tis)HY(sant)YH( ou en suppri)HY(mant)YH( les paquets.)EP()0 P(Les astuces suivantes peuvent vous aider \340 choisir la file d'attente \340 utili)HY(ser)YH(. Elles mentionnent certaines files d'attente d\351crites dans le chapitre )EM()0 111 1 A(Gestion)HY(naires)YH( de mise en file d'attente avanc\351s)111 0 TN TL()Ec /AF f D()ES(.)EP()BR()UL()0 P()-1 LI(Pour simple)HY(ment)YH( ralen)HY(tir)YH( le trafic sortant, utili)HY(sez)YH( le )EM(Token Bucket Filter)ES(. Il convient bien pour les \351normes bandes passantes, si vous para)HY(m\350)HY(trez)YH( en cons\351quence le seau. )EP()0 P()-1 LI(Si votre lien est vrai)HY(ment)YH( satur\351 et que vous voulez \352tre s\373r qu'aucune session ne va acca)HY(pa)HY(rer)YH( la bande passante vers l'ext\351)HY(rieur)YH(, utili)HY(sez)YH( le )EM(Stochas)HY(ti)HY(cal)YH( Fair)HY(ness)YH( Queueing)ES(. )EP()0 P()-1 LI(Si vous avez une grande dorsale et que vous voulez savoir ce que vous faites, consi)HY(d\351)HY(rez)YH( )EM(Random Early Drop)ES( \201voir le chapitre )EM()0 111 1 A(Gestion)HY(naires)YH( de mise en file d'attente avanc\351s)111 0 TN TL()Ec /AF f D()ES(\202. )EP()0 P()-1 LI(Pour \253\240mettre en forme\240\273 le trafic entrant qui n'est pas trans)HY(mis)YH(, utili)HY(sez)YH( la r\351gle)HY(men)HY(ta)HY(tion)YH( Ingress \201)EM(Ingress Poli)HY(cier)YH()ES(\202. La mise en forme du flux entrant est appel\351e \253\240r\351gle)HY(men)HY(ta)HY(tion)YH(\240\273 \201)EM(poli)HY(cing)YH()ES(\202 et non \253\240mise en forme\240\273 \201)EM(shaping)ES(\202. )EP()0 P()-1 LI(Si vous trans)HY(met)HY(tez)YH( le trafic, utili)HY(sez)YH( TBF)Ca( sur l'inter)HY(face)YH( vers laquelle vous trans)HY(met)HY(tez)YH( les donn\351es. Si vous voulez mettre en forme un trafic pouvant sortir par plusieurs inter)HY(faces)YH(, alors le seul facteur commun est l'inter)HY(face)YH( entrante. Dans ce cas, utili)HY(sez)YH( la r\351gle)HY(men)HY(ta)HY(tion)YH( Ingress. )EP()0 P()-1 LI(Si vous ne voulez pas mettre en forme le trafic, mais que vous vouliez voir si votre inter)HY(face)YH( est telle)HY(ment)YH( charg\351e qu'elle a d\373 mettre en file d'attente les donn\351es, utili)HY(sez)YH( la file d'attente )SM(pfifo)ES( \201pas )SM(pfifo_fast)ES(\202. Elle n'a pas de bandes internes, mais assure le comp)HY(tage)YH( de la taille de son accu)HY(mu)HY(la)HY(teur)YH(. )EP()0 P()-1 LI(Fina)HY(le)HY(ment)YH(, vous pouvez aussi faire de la \253\240mise en forme sociale\240\273. La tech)HY(no)HY(lo)HY(gie)YH( n'est pas toujours capable de r\351ali)HY(ser)YH( ce que vous voulez. Les utili)HY(sa)HY(teurs)YH( sont hostiles aux contraintes tech)HY(niques)YH(. Un mot aimable peut \351gale)HY(ment)YH( vous aider \340 avoir votre bande passante correc)HY(te)HY(ment)YH( divis\351e\240! )EP()LU()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 63 H(4.\240termi)WB 230 Sn()HY(no)HY(lo)HY(gie)YH()WB 62 Sn()EH()BR()BR()BR()0 P(Pour comprendre correc)HY(te)HY(ment)YH( des confi)HY(gu)HY(ra)HY(tions)YH( plus compliqu\351es, il est d'abord n\351ces)HY(saire)YH( d'expliquer quelques concepts. A cause de la complexit\351 et de la rela)HY(tive)YH( jeunesse du sujet, beau)HY(coup)YH( de mots diff\351)HY(rents)YH( sont utili)HY(s\351s)YH( par les personnes mais ils signi)HY(fient)YH( en fait la m\352me chose.)EP()0 P(Ce qui suit est l\342che)HY(ment)YH( inspir\351 du texte )SM(draft-ietf-diff)HY(serv)YH(-model-06.txt)ES(, )EM(An Infor)HY(mal)YH( Mana)HY(ge)HY(ment)YH( Model for Diff)HY(serv)YH( Routers)ES(. Il peut \352tre trouv\351 \340 l'adresse )R23 2 A(http://www.ietf.org/inter)HY(net)YH(-drafts/draft-ietf-diff)HY(serv)YH(-model-04.txt)EA(.)EP()0 P(Lisez-le pour les d\351fi)HY(ni)HY(tions)YH( strictes des termes utili)HY(s\351s)YH(.)EP()BR()0 DL()0 DT(Gestion)HY(naire)YH( de mise en file d'attente \201qdisc\202 \201)EM(Queueing Disci)HY(pline)YH()ES(\202)DD()0 P(Un algo)HY(rithme)YH( qui g\350re la file d'attente d'un p\351ri)HY(ph\351)HY(rique)YH(, soit pour les donn\351es entrantes \201)EM(ingress)ES(\202, soit pour les donn\351es sortantes \201)EM(egress)ES(\202. )EP()0 DT(Gestion)HY(naire)YH( de mise en file d'attente sans classes \201)EM(Class)HY(less)YH( qdisc)ES(\202)DD()0 P(Un gestion)HY(naire)YH( de mise en file d'attente qui n'a pas de subdi)HY(vi)HY(sions)YH( internes confi)HY(gu)HY(rables)YH(. )EP()0 DT(Gestion)HY(naire)YH( de mise en file d'attente bas\351 sur des classes \201)EM(Class)HY(ful)YH( qdisc)ES(\202)DD()0 P(Un gestion)HY(naire)YH( de mise en file d'attente bas\351 sur des classes contient de multiples classes. Certaines de ces classes contiennent un gestion)HY(naire)YH( de mise en file d'attente suppl\351)HY(men)HY(taire)YH(, qui peut encore \352tre bas\351 sur des classes, mais ce n'est pas obli)HY(ga)HY(toire)YH(. Si l'on s'en tient \340 la d\351fi)HY(ni)HY(tion)YH( stricte, )SM(pfifo_fast)ES( )EM(EST)ES( bas\351 sur des classes, dans la mesure o\371 il contient trois bandes, qui sont en fait des classes. Cepen)HY(dant)YH(, d'un point de vue des pers)HY(pec)HY(tives)YH( de confi)HY(gu)HY(ra)HY(tion)YH( pour l'utili)HY(sa)HY(teur)YH(, il est sans classes dans la mesure o\371 ces classes ne peuvent \352tre modi)HY(fi\351es)YH( avec l'outil )BD(tc)ES(. )EP()0 DT(Classes)DD()0 P(Un gestion)HY(naire)YH( de mise en file d'attente bas\351 sur les classes peut avoir beau)HY(coup)YH( de classes, chacune d'elles \351tant internes au gestion)HY(naire)YH(. Une classe peut \340 son tour se voir ajouter plusieurs classes. Une classe peut donc avoir comme parent soit un gestion)HY(naire)YH( de mise en file d'attente, soit une autre classe. Une classe termi)HY(nale)YH( est une classe qui ne poss\350de de classes enfants. Seul 1 gestion)HY(naire)YH( de mise en file d'attente est attach\351 \340 cette classe. Ce gestion)HY(naire)YH( est respon)HY(sable)YH( de l'envoi des donn\351es de cette classe. Quand vous cr\351ez une classe, un gestion)HY(naire)YH( de mise en file d'attente fifo est cr\351\351. Quand vous ajoutez une classe enfant, ce gestion)HY(naire)YH( est supprim\351. Le gestion)HY(naire)YH( fifo d'une classe termi)HY(nale)YH( peut \352tre remplac\351 par un autre gestion)HY(naire)YH( plus adapt\351. Vous pouvez m\352me rempla)HY(cer)YH( ce gestion)HY(naire)YH( fifo par un gestion)HY(naire)YH( de mise en file d'attente bas\351 sur des classes de sorte que vous pourrez rajou)HY(ter)YH( des classes suppl\351)HY(men)HY(taires)YH(. )EP()0 DT(Clas)HY(si)HY(fi)HY(ca)HY(teur)YH( \201)EM(Clas)HY(si)HY(fier)YH()ES(\202)DD()0 P(Chaque gestion)HY(naire)YH( de mise en file d'attente bas\351 sur des classes a besoin de d\351ter)HY(mi)HY(ner)YH( vers quelles classes il doit envoyer un paquet. Ceci est r\351alis\351 en utili)HY(sant)YH( le clas)HY(si)HY(fi)HY(ca)HY(teur)YH(. )EP()0 DT(Filtre \201)EM(Filter)ES(\202)DD()0 P(La clas)HY(si)HY(fi)HY(ca)HY(tion)YH( peut \352tre r\351ali)HY(s\351e)YH( en utili)HY(sant)YH( des filtres. Un filtre est compos\351 d'un certain nombre de condi)HY(tions)YH( qui, si elles sont toutes v\351ri)HY(fi\351es)YH(, satis)HY(fait)YH( le filtre. )EP()0 DT(Ordon)HY(nan)HY(ce)HY(ment)YH( \201)EM(Sche)HY(du)HY(ling)YH()ES(\202)DD()0 P(Un gestion)HY(naire)YH( de mise en file d'attente peut, avec l'aide d'un clas)HY(si)HY(fi)HY(ca)HY(teur)YH(, d\351cider que des paquets doivent sortir plus t\364t que d'autres. Ce proces)HY(sus)YH( est appel\351 ordon)HY(nan)HY(ce)HY(ment)YH( \201)EM(sche)HY(du)HY(ling)YH()ES(\202, et est r\351alis\351 par exemple par le gestion)HY(naire)YH( )SM(pfifo_fast)ES( mentionn\351 plus t\364t. L'ordon)HY(nan)HY(ce)HY(ment)YH( est aussi appel\351 \253\240reclas)HY(se)HY(ment)YH(\240\273 \201)EM(reor)HY(de)HY(ring)YH()ES(\202, ce qui peut pr\352ter \340 confu)HY(sion)YH(. )EP()0 DT(Mise en forme \201)EM(Shaping)ES(\202)DD()0 P(Le proces)HY(sus)YH( qui consiste \340 retar)HY(der)YH( l'\351mis)HY(sion)YH( des paquets sortants pour avoir un trafic conforme \340 un d\351bit maximum confi)HY(gur\351)YH(. La mise en forme est r\351ali)HY(s\351e)YH( sur )EM(egress)ES(. Fami)HY(li\350)HY(re)HY(ment)YH(, rejeter des paquets pour ralen)HY(tir)YH( le trafic est \351gale)HY(ment)YH( souvent appel\351 Mise en forme. )EP()0 DT(R\351gle)HY(men)HY(ta)HY(tion)YH( \201)EM(Poli)HY(cing)YH()ES(\202)DD()0 P(Retar)HY(der)YH( ou jeter des paquets dans le but d'avoir un trafic restant en dessous d'une bande passante confi)HY(gu)HY(r\351e)YH(. Dans Linux, la r\351gle)HY(men)HY(ta)HY(tion)YH( ne peut que jeter un paquet, et non le retar)HY(der)YH( dans la mesure o\371 il n'y a pas de \253\240file d'attente d'entr\351e\240\273 \201)EM(ingress queue)ES(\202. )EP()0 DT()EM(Work-Conser)HY(ving)YH()ES()DD()0 P(Un gestion)HY(naire)YH( de mise en file d'attente )EM(work-conser)HY(ving)YH()ES( d\351livre toujours un paquet s'il y en a un de dispo)HY(nible)YH(. En d'autres termes, il ne retarde jamais un paquet si l'adap)HY(ta)HY(teur)YH( r\351seau est pr\352t \340 l'envoyer \201dans le cas du gestion)HY(naire)YH( )EM(egress)ES(\202. )EP()0 DT()EM(non-Work-Conser)HY(ving)YH()ES()DD()0 P(Quelques gestion)HY(naire)YH( de mise en files d'attente, comme par exemple le )EM(Token Bucket Filter)ES(, peuvent avoir besoin de main)HY(te)HY(nir)YH( un paquet pendant un certain temps pour limiter la bande passante. Ceci signi)HY(fie)YH( qu'ils refusent parfois de lib\351rer un paquet, bien qu'ils en aient un de dispo)HY(nible)YH(. )EP()LD()BR()0 P(Main)HY(te)HY(nant)YH( que nous avons d\351fini notre termi)HY(no)HY(lo)HY(gie)YH(, voyons o\371 tous ces \351l\351ments sont situ\351s.)EP()0 P() 21 69 PR( Programmes Utilisateurs ^ | +---------------+-------------------------------------------+ | Y | | -------> Pile IP | | | | | | | Y | | | Y | | ^ | | | | / ----------> Transmission -> | | ^ / | | | |/ Y | | | | | | ^ Y /-qdisc1-\200 | | | Classificateur /--qdisc2--\200 | --->->Gestionnaire de mise de sortie ---qdisc3---- | -> | en file d'attente \201Egress\202 \200__qdisc4__/ | | d'entr\351e \201Ingress\202 \200-qdiscN_/ | | | +-----------------------------------------------------------+)RP( Merci \340 Jamal Hadi Salim pour cette repr\351)HY(sen)HY(ta)HY(tion)YH( ASCII.)EP()0 P(Le grand rectangle repr\351)HY(sente)YH( le noyau. La fl\350che la plus \340 gauche repr\351)HY(sente)YH( le trafic du r\351seau entrant dans votre machine. Celui-ci alimente alors le gestion)HY(naire)YH( de mise en file d'attente Ingress qui peut appliquer des filtres \340 un paquet, et d\351cider de le suppri)HY(mer)YH(. Ceci est appel\351 \253\240r\351gle)HY(men)HY(ta)HY(tion)YH(\240\273 \201)EM(Poli)HY(cing)YH()ES(\202.)EP()0 P(Ce proces)HY(sus)YH( a lieu tr\350s t\364t, avant d'avoir beau)HY(coup)YH( parcouru le noyau. C'est par cons\351)HY(quent)YH( un tr\350s bon endroit pour rejeter au plus t\364t du trafic, sans pour autant consom)HY(mer)YH( beau)HY(coup)YH( de ressources CPU. )EP()0 P(Si le paquet est auto)HY(ris\351)YH( \340 conti)HY(nuer)YH(, il peut \352tre destin\351 \340 une appli)HY(ca)HY(tion)YH( locale et, dans ce cas, il entre dans la couche IP pour \352tre trait\351 et d\351livr\351 \340 un programme utili)HY(sa)HY(teur)YH(. Le paquet peut \351gale)HY(ment)YH( \352tre trans)HY(mis)YH( sans entrer dans une appli)HY(ca)HY(tion)YH( et dans ce cas, \352tre destin\351 \340 )EM(egress)ES(. Les programmes utili)HY(sa)HY(teurs)YH( peuvent \351gale)HY(ment)YH( d\351li)HY(vrer)YH( des donn\351es, qui sont alors trans)HY(mises)YH( et exami)HY(n\351es)YH( par le clas)HY(si)HY(fi)HY(ca)HY(teur)YH( )EM(Egress)ES(.)EP()0 P(L\340, il est examin\351 et mis en file d'attente vers un certain nombre de gestion)HY(naire)YH( de mise en file d'attente. Par d\351faut, il n'y a qu'un seul gestion)HY(naire)YH( )EM(egress)ES( install\351, )SM(pfifo_fast)ES(, qui re\347oit tous les paquets. Ceci corres)HY(pond)YH( \340 \253\240la mise en file d'attente\240\273 \201)EM(enqueueing)ES(\202.)EP()0 P(Le paquet r\351side main)HY(te)HY(nant)YH( dans le gestion)HY(naire)YH( de mise en file d'attente, atten)HY(dant)YH( que le noyau le r\351clame pour le trans)HY(mettre)YH( \340 travers l'inter)HY(face)YH( r\351seau. Ceci corres)HY(pond)YH( au \253\240retrait de la file d'attente\240\273 \201)EM(dequeueing)ES(\202.)EP()0 P(Le sch\351ma ne montre que le cas d'un seul adap)HY(ta)HY(teur)YH( r\351seau. Les fl\350ches entrantes et sortantes du noyau ne doivent pas \352tre trop prises au pied de la lettre. Chaque adap)HY(ta)HY(teur)YH( r\351seau a un gestion)HY(naire)YH( d'entr\351e et de sortie.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 64 H(5.\240Gestion)WB 231 Sn()HY(naires)YH()WB 63 Sn( de file d'attente bas\351s sur les classes)EH()BR()BR()BR()0 P(Les gestion)HY(naires)YH( de mise en file d'attente bas\351s sur des classes sont tr\350s utiles si vous avez diff\351)HY(rentes)YH( sortes de trafic qui doivent \352tre trait\351s diff\351)HY(rem)HY(ment)YH(. L'un d'entre eux est appel\351 CBQ)Ca(, pour )EM(Class Based Queueing)ES(. Il est si souvent mentionn\351 que les personnes iden)HY(ti)HY(fient)YH( les gestion)HY(naires)YH( de mise en file d'attente bas\351s sur des classes unique)HY(ment)YH( \340 CBQ, ce qui n'est pas le cas.)EP()0 P(CBQ)Ca( est le m\351ca)HY(nisme)YH( le plus ancien, ainsi que le plus compliqu\351. Il n'aura pas forc\351)HY(ment)YH( les effets que vous recher)HY(chez)YH(. Ceci surpren)HY(dra)YH( peut-\352tre ceux qui sont sous l'emprise de \253\240l'effet Send)HY(mail)YH(\240\273, qui nous enseigne qu'une tech)HY(no)HY(lo)HY(gie)YH( complexe, non docu)HY(men)HY(t\351e)YH( est forc\351)HY(ment)YH( meilleure que toute autre.)EP()0 P(Nous \351voque)HY(rons)YH( bient\364t, plus \340 propos, CBQ et ses alter)HY(na)HY(tives)YH(.)EP()2 Sl()BR()BR()BR()BR()0 3 65 H(5.1.\240Flux)WB 232 Sn()WB 64 Sn( \340 l'int\351)HY(rieur)YH( des gestion)HY(naires)YH( bas\351s sur des classes & \340 l'int\351)HY(rieur)YH( des classes)EH()BR()BR()BR()0 P(Quand le trafic entre dans un gestion)HY(naire)YH( de mise en file d'attente bas\351 sur des classes, il doit \352tre envoy\351 vers l'une de ses classes\240; il doit \352tre \253\240clas)HY(si)HY(fi\351)YH(\240\273. Pour d\351ter)HY(mi)HY(ner)YH( que faire d'un paquet, les \351l\351ments appel\351s \253\240filtres\240\273 sont consul)HY(t\351s)YH(. Il est impor)HY(tant)YH( de savoir que les filtres sont appel\351s de l'int\351)HY(rieur)YH( d'un gestion)HY(naire)YH(, et pas autre)HY(ment)YH(\240!)EP()0 P(Les filtres atta)HY(ch\351s)YH( \340 ce gestion)HY(naire)YH( renvoient alors une d\351ci)HY(sion)YH( que le gestion)HY(naire)YH( utilise pour mettre en file d'attente le paquet vers l'une des classes. Chaque sous-classe peut essayer d'autres filtres pour voir si de nouvelles instruc)HY(tions)YH( s'appliquent. Si ce n'est pas le cas, la classe met le paquet en file d'attente dans le gestion)HY(naire)YH( de mise en file d'attente qu'elle contient.)EP()0 P(En plus de conte)HY(nir)YH( d'autres gestion)HY(naires)YH(, la plupart des gestion)HY(naires)YH( de mise en file d'attente bas\351s sur des classes r\351alisent \351gale)HY(ment)YH( de la mise en forme. Ceci est utile pour r\351ali)HY(ser)YH( \340 la fois l'ordon)HY(nan)HY(ce)HY(ment)YH( \201avec SFQ)Ca(, par exemple\202 et le contr\364le de d\351bit. Vous avez besoin de ceci dans les cas o\371 vous avez une inter)HY(face)YH( \340 haut d\351bit \201ether)HY(net)YH(, par exemple\202 connec)HY(t\351e)YH( \340 un p\351ri)HY(ph\351)HY(rique)YH( plus lent \201un modem c\342ble\202.)EP()0 P(Si vous n'utili)HY(sez)YH( que SFQ)Ca(, rien ne devait se passer, dans la mesure o\371 les paquets entrent et sortent du routeur sans d\351lai\240: l'inter)HY(face)YH( de sortie est de loin beau)HY(coup)YH( plus rapide que la vitesse r\351elle de votre liaison\240; il n'y a alors pas de files d'attente \340 r\351or)HY(don)HY(nan)HY(cer)YH(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 66 H(5.2.\240La)WB 233 Sn()WB 65 Sn( famille des gestion)HY(naires)YH( de mise en file d'attente\240: racines, descrip)HY(teurs)YH(, descen)HY(dances)YH( et parents)EH()BR()BR()BR()0 P(Chaque inter)HY(face)YH( \340 \253\240un gestion)HY(naire)YH( de mise en file d'attente racine\240\273 de sortie \201)EM(egress root qdisc)ES(\202. Par d\351faut, le gestion)HY(naire)YH( de mise en file d'attente sans classes mentionn\351 plus t\364t )SM(pfifo_fast)ES(. Chaque gestion)HY(naire)YH( et classe est rep\351r\351 par un descrip)HY(teur)YH( \201)EM(handle)ES(\202, qui pourra \352tre utilis\351 par les prochaines d\351cla)HY(ra)HY(tions)YH( de confi)HY(gu)HY(ra)HY(tion)YH( pour se r\351f\351rer \340 ce gestion)HY(naire)YH(. En plus du gestion)HY(naire)YH( de sortie, une inter)HY(face)YH( peut \351gale)HY(ment)YH( avoir un gestion)HY(naire)YH( d'entr\351e \201)EM(ingress)ES(\202, qui r\351gle)HY(mente)YH( le trafic entrant.)EP()0 P(Ces descrip)HY(teurs)YH( sont consti)HY(tu\351s)YH( de deux parties : un nombre majeur et un nombre mineur\240: :. Il est habi)HY(tuel)YH( de nommer le gestion)HY(naire)YH( racine )SM(1:)ES(, ce qui est \351qui)HY(valent)YH( \340 )SM(1:0)ES(. Le nombre mineur d'un gestion)HY(naire)YH( de mise en file d'attente est toujours 0.)EP()0 P(Les classes doivent avoir le m\352me nombre majeur que leur parent. Le nombre majeur doit \352tre unique \340 l'int\351)HY(rieur)YH( d'une confi)HY(gu)HY(ra)HY(tion)YH( egress ou ingress. Le nombre mineur doit \352tre unique \340 l'int\351)HY(rieur)YH( d'un gestion)HY(naire)YH( de mise en file d'attente et de ses classes.)EP()2 Sl()BR()BR()BR()BR()0 4 67 H(5.2.1.\240Comment)WB 234 Sn()WB 66 Sn( les filtres sont utili)HY(s\351s)YH( pour clas)HY(si)HY(fier)YH( le trafic)EH()BR()BR()BR()0 P(Pour r\351ca)HY(pi)HY(tu)HY(ler)YH(, une hi\351rar)HY(chie)YH( typique pour)HY(rait)YH( ressem)HY(bler)YH( \340 ceci\240:)EP() 14 71 PR( 1: Gestionnaire de mise en file d'attente racine | 1:1 classe enfant / | \200 / | \200 / | \200 / | \200 1:10 1:11 1:12 classes enfants | | | | 11: | classe terminale | | 10: 12: Gestionnaire de mise en file d'attente / \200 / \200 10:1 10:2 12:1 12:2 classes terminales)RP()0 P(Mais ne laissez pas cet arbre vous abuser\240! Vous ne devriez )EM(pas)ES( imagi)HY(ner)YH( le noyau \352tre au sommet de l'arbre et le r\351seau en dessous, ce qui n'est juste)HY(ment)YH( pas le cas. Les paquets sont mis et retir\351s de la file d'attente \340 la racine du gestion)HY(naire)YH(, qui est le seul \351l\351ment avec lequel le noyau dialogue.)EP()0 P(Un paquet pour)HY(rait)YH( \352tre clas)HY(si)HY(fi\351)YH( \340 travers une cha\356ne suivante\240: ) 1 24 PR(1: -> 1:1 -> 12: -> 12:2)RP()EP()0 P(Le paquet r\351side main)HY(te)HY(nant)YH( dans la file d'attente du gestion)HY(naire)YH( attach\351 \340 la classe 12:2. Dans cet exemple, un filtre a \351t\351 attach\351 \340 chaque noeud de l'arbre, chacun choi)HY(sis)HY(sant)YH( la prochaine branche \340 prendre. Cela est r\351ali)HY(sable)YH(. Cepen)HY(dant)YH(, ceci est \351gale)HY(ment)YH( possible\240: ) 1 10 PR(1: -> 12:2)RP()EP()0 P(Dans ce cas, un filtre attach\351 \340 la racine a d\351cid\351 d'envoyer le paquet direc)HY(te)HY(ment)YH( \340 )SM(12:2)ES(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 4 68 H(5.2.2.\240Comment)WB 235 Sn()WB 67 Sn( les paquets sont retir\351s de la file d'attente et envoy\351s vers le mat\351)HY(riel)YH()EH()BR()BR()BR()0 P(Quand le noyau d\351cide qu'il doit extraire des paquets pour les envoyer vers l'inter)HY(face)YH(, le gestion)HY(naire)YH( racine )SM(1:)ES( re\347oit une requ\352te )SM(dequeue)ES(, qui est trans)HY(mise)YH( \340 )SM(1:1)ES( et qui, \340 son tour, est pass\351e \340 )SM(10:)ES(, )SM(11:)ES( et )SM(12:)ES(, chacune inter)HY(ro)HY(geant)YH( leurs descen)HY(dances)YH( qui essaient de retirer les paquets de leur file d'attente. Dans ce cas, le noyau doit parcou)HY(rir)YH( l'ensemble de l'arbre, car seul )SM(12:2)ES( contient un paquet.)EP()0 P(En r\351sum\351, les classes \253\240embo\356)HY(t\351es)YH(\240\273 parlent )EM(unique)HY(ment)YH()ES( \340 leur gestion)HY(naire)YH( de mise en file d'attente parent\240; jamais \340 une inter)HY(face)YH(. Seul la file d'attente du gestion)HY(naire)YH( racine est vid\351e par le noyau\240!)EP()0 P(Ceci a pour r\351sul)HY(tat)YH( que les classes ne retirent jamais les paquets d'une file d'attente plus vite que ce que leur parent auto)HY(rise)YH(. Et c'est exac)HY(te)HY(ment)YH( ce que nous voulons\240: de cette mani\350re, nous pouvons avoir SFQ)Ca( dans une classe interne qui ne fait pas de mise en forme, mais seule)HY(ment)YH( de l'ordon)HY(nan)HY(ce)HY(ment)YH(, et avoir un gestion)HY(naire)YH( de mise en file d'attente ext\351)HY(rieur)YH( qui met en forme le trafic.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 69 H(5.3.\240Le)WB 236 Sn()WB 68 Sn( gestion)HY(naire)YH( de mise en file d'attente PRIO)EH()BR()BR()BR()0 P(Le gestion)HY(naire)YH( de mise en file d'attente ne met pas vrai)HY(ment)YH( en forme le trafic\240; il ne fait que le subdi)HY(vi)HY(ser)YH( en se basant sur la mani\350re dont vous avez confi)HY(gur\351)YH( vos filtres. Vous pouvez consi)HY(d\351)HY(rer)YH( les gestion)HY(naires)YH( PRIO)Ca( comme une sorte de super )SM(pfifo_fast)ES( dop\351, o\371 chaque bande est une classe s\351par\351e au lieu d'une simple FIFO.)EP()0 P(Quand un paquet est mis en file d'attente dans le gestion)HY(naire)YH( PRIO, une classe est choisie en fonc)HY(tion)YH( des filtres que vous avez donn\351s. Par d\351faut, trois classes sont cr\351\351es. Ces classes contiennent par d\351faut de purs gestion)HY(naires)YH( de mise en file d'attente FIFO sans struc)HY(ture)YH( interne, mais vous pouvez les rempla)HY(cer)YH( par n'importe quels gestion)HY(naires)YH( dispo)HY(nibles)YH(.)EP()0 P(Chaque fois qu'un paquet doit \352tre retir\351 d'une file d'attente, la classe )SM(:1)ES( est d'abord test\351e. Les classes plus \351lev\351es ne sont utili)HY(s\351es)YH( que si aucune des bandes plus faibles n'a pas fourni de paquets. )EP()0 P(Cette file d'attente est tr\350s utile dans le cas o\371 vous voulez donner la prio)HY(rit\351)YH( \340 certains trafics en utili)HY(sant)YH( toute la puis)HY(sance)YH( des filtres )BD(tc)ES( et en ne se limi)HY(tant)YH( pas seule)HY(ment)YH( aux options du champ TOS. Vous pouvez \351gale)HY(ment)YH( ajouter un autre gestion)HY(naire)YH( de mise en file d'attente aux trois classes pr\351d\351)HY(fi)HY(nies)YH(, tandis que )SM(pfifo_fast)ES( est limit\351 aux simples gestion)HY(naires)YH( FIFO.)EP()0 P(Puisqu'il ne met pas vrai)HY(ment)YH( en forme, on applique le m\352me aver)HY(tis)HY(se)HY(ment)YH( que pour SFQ)Ca(. Utili)HY(sez)YH( PRIO)Ca( seule)HY(ment)YH( si votre lien physique est vrai)HY(ment)YH( satur\351 ou int\351)HY(grez)YH(-le \340 l'int\351)HY(rieur)YH( d'un gestion)HY(naire)YH( de mise en file d'attente bas\351 sur des classes qui r\351alisent la mise en forme. Ce dernier cas est valable pour pratique)HY(ment)YH( tous les modems-c\342bles et les p\351ri)HY(ph\351)HY(riques)YH( DSL.)EP()0 P(En termes formels, le gestion)HY(naire)YH( de mise en file d'attente PRIO)Ca( est un ordon)HY(nan)HY(ceur)YH( )EM(Work-Conser)HY(ving)YH()ES(.)EP()2 Sl()BR()BR()BR()BR()0 4 70 H(5.3.1.\240Para)WB 237 Sn()HY(m\350tres)YH()WB 69 Sn( PRIO & usage)EH()BR()BR()BR()0 P(Les para)HY(m\350tres)YH( suivants sont recon)HY(nus)YH( par )BD(tc)ES(\240: )BR()0 DL()0 DT()SM(bands)ES()DD()0 P(Nombre de bandes \340 cr\351er. Chaque bande est en fait une classe. Si vous changez ce nombre, vous devez \351gale)HY(ment)YH( changer\240: )EP()0 DT()SM(priomap)ES()DD()0 P(Si vous ne four)HY(nis)HY(sez)YH( pas de filtres )BD(tc)ES( pour clas)HY(si)HY(fier)YH( le trafic, le gestion)HY(naire)YH( PRIO)Ca( regarde la prio)HY(rit\351)YH( )SM(TC_PRIO)ES( pour d\351cider comment mettre en file d'attente le trafic. )EP()0 P(Ceci fonc)HY(tionne)YH( comme le gestion)HY(naire)YH( de mise en file d'attente )SM(pfifo_fast)ES( mentionn\351 plus t\364t. Voir la section corres)HY(pon)HY(dante)YH( pour plus de d\351tails. )EP()LD()BR( Les bandes sont des classes et sont appe)HY(l\351es)YH( par d\351faut majeur:1 \340 majeur:3. Donc, si votre gestion)HY(naire)YH( de mise en file d'attente est appel\351 )SM(12:)ES(, )BD(tc)ES( filtre le trafic vers )SM(12:1)ES( pour lui accor)HY(der)YH( une plus grande prio)HY(rit\351)YH(.)EP()0 P(Par it\351ra)HY(tion)YH(, la bande 0 corres)HY(pond)YH( au nombre mineur 1, la bande 1 au nombre mineur 2, etc ...)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 4 71 H(5.3.2.\240Confi)WB 238 Sn()HY(gu)HY(ra)HY(tion)YH()WB 70 Sn( simple)EH()BR()BR()BR()0 P(Nous allons cr\351er cet arbre\240:)EP() 10 47 PR( racine 1: prio 1: Gestionnaire racine / | \200 / | \200 / | \200 1:1 1:2 1:3 classes | | | 10: 20: 30: gestionnaire gestionnaire sfq tbf sfq bande 0 1 2)RP()0 P(Le trafic de masse ira vers )SM(30:)ES( tandis que le trafic inter)HY(ac)HY(tif)YH( ira vers )SM(20:)ES( ou )SM(10:)ES(.)EP()0 P(Les lignes de commande\240:)EP() 6 84 PR(# tc qdisc add dev eth0 root handle 1: prio ## Ceci cr\351e *instantan\351ment* les classes 1:1, 1:2, 1:3 # tc qdisc add dev eth0 parent 1:1 handle 10: sfq # tc qdisc add dev eth0 parent 1:2 handle 20: tbf rate 20kbit buffer 1600 limit 3000 # tc qdisc add dev eth0 parent 1:3 handle 30: sfq)RP()0 P(Regar)HY(dons)YH( main)HY(te)HY(nant)YH( ce que nous avons cr\351\351\240: ) 12 63 PR(# tc -s qdisc ls dev eth0 qdisc sfq 30: quantum 1514b Sent 0 bytes 0 pkts \201dropped 0, overlimits 0\202 qdisc tbf 20: rate 20Kbit burst 1599b lat 667.6ms Sent 0 bytes 0 pkts \201dropped 0, overlimits 0\202 qdisc sfq 10: quantum 1514b Sent 132 bytes 2 pkts \201dropped 0, overlimits 0\202 qdisc prio 1: bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 Sent 174 bytes 3 pkts \201dropped 0, overlimits 0\202)RP( Comme vous pouvez le voir, la bande 0 a d\351j\340 re\347u du trafic, et un paquet a \351t\351 envoy\351 pendant l'ex\351cu)HY(tion)YH( de cette commande\240!)EP()0 P(Nous allons main)HY(te)HY(nant)YH( g\351n\351rer du trafic de masse avec un outil qui confi)HY(gure)YH( correc)HY(te)HY(ment)YH( les options TOS, et regar)HY(der)YH( de nouveau\240: ) 15 75 PR(# scp tc ahu@10.0.0.11:./ ahu@10.0.0.11's password: tc 100% |*****************************| 353 KB 00:00 # tc -s qdisc ls dev eth0 qdisc sfq 30: quantum 1514b Sent 384228 bytes 274 pkts \201dropped 0, overlimits 0\202 qdisc tbf 20: rate 20Kbit burst 1599b lat 667.6ms Sent 2640 bytes 20 pkts \201dropped 0, overlimits 0\202 qdisc sfq 10: quantum 1514b Sent 2230 bytes 31 pkts \201dropped 0, overlimits 0\202 qdisc prio 1: bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 Sent 389140 bytes 326 pkts \201dropped 0, overlimits 0\202)RP( Comme vous pouvez le voir, tout le trafic a \351t\351 envoy\351 comme pr\351vu vers le descrip)HY(teur)YH( )SM(30:)ES(, qui est la bande de plus faible prio)HY(rit\351)YH(. Main)HY(te)HY(nant)YH(, pour v\351ri)HY(fier)YH( que le trafic inter)HY(ac)HY(tif)YH( va vers les bandes de plus grande prio)HY(rit\351)YH(, nous g\351n\351)HY(rons)YH( du trafic inter)HY(ac)HY(tif)YH(\240:)EP() 12 63 PR(# tc -s qdisc ls dev eth0 qdisc sfq 30: quantum 1514b Sent 384228 bytes 274 pkts \201dropped 0, overlimits 0\202 qdisc tbf 20: rate 20Kbit burst 1599b lat 667.6ms Sent 2640 bytes 20 pkts \201dropped 0, overlimits 0\202 qdisc sfq 10: quantum 1514b Sent 14926 bytes 193 pkts \201dropped 0, overlimits 0\202 qdisc prio 1: bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 Sent 401836 bytes 488 pkts \201dropped 0, overlimits 0\202)RP()0 P(Ca a march\351. Tout le trafic suppl\351)HY(men)HY(taire)YH( a \351t\351 vers )SM(10:)ES(, qui est notre gestion)HY(naire)YH( de plus grande prio)HY(rit\351)YH(. Aucun trafic n'a \351t\351 envoy\351 vers les prio)HY(ri)HY(t\351s)YH( les plus faibles, qui avaient re\347u au pr\351a)HY(lable)YH( tout le trafic venant de notre )BD(scp)ES(.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 72 H(5.4.\240Le)WB 239 Sn()WB 71 Sn( c\351l\350bre gestion)HY(naire)YH( de mise en file d'attente CBQ)EH()BR()BR()BR()0 P(Comme dit avant, CBQ)Ca( est le gestion)HY(naire)YH( de mise en file d'attente dispo)HY(nible)YH( le plus complexe, celui qui a eu le plus de publi)HY(cit\351)YH(, qui est le moins compris et qui est proba)HY(ble)HY(ment)YH( le plus farceur lors de sa mise au point. Ce n'est pas parce que les auteurs sont mauvais ou incom)HY(p\351)HY(tents)YH(, loin de l\340, mais l'algo)HY(rithme)YH( CBQ)Ca( n'est pas remarqua)HY(ble)HY(ment)YH( pr\351cis et il ne corres)HY(pond)YH( pas vrai)HY(ment)YH( \340 la fa\347on dont Linux fonc)HY(tionne)YH(.)EP()0 P(En plus d'\352tre bas\351 sur des classes, CBQ)Ca( sert \351gale)HY(ment)YH( \340 la mise en forme de trafic et c'est sur cet aspect qu'il ne fonc)HY(tionne)YH( pas tr\350s bien. Il travaille comme ceci\240: si vous essayez de mettre en forme une connexion de 10mbit/s \340 1mbits/s, le lien doit \352tre inactif 90% du temps. Si ce n'est pas le cas, nous devons limiter le taux de sorte qu'il )EM(soit)ES( inactif 90% du temps.)EP()0 P(Ceci est assez dur \340 mesurer et c'est pour cette raison que CBQ)Ca( d\351duit le temps d'inac)HY(ti)HY(vit\351)YH( du nombre de micro)HY(se)HY(condes)YH( qui s'\351coulent entre les requ\352tes de la couche mat\351)HY(rielle)YH( pour avoir plus de donn\351es. Cette combi)HY(nai)HY(son)YH( peut \352tre utili)HY(s\351e)YH( pour \351valuer si le lien est charg\351 ou non.)EP()0 P(Ceci est plut\364t l\351ger et l'on arrive pas toujours \340 des r\351sul)HY(tats)YH( conve)HY(nables)YH(. Par exemple, qu'en est-il de la vitesse de liaison r\351elle d'une inter)HY(face)YH( qui n'est pas capable de trans)HY(mettre)YH( plei)HY(ne)HY(ment)YH( les donn\351es \340 100mbit/s, peut-\352tre \340 cause d'un mauvais pilote de p\351ri)HY(ph\351)HY(rique)YH(\240? Une carte r\351seau PCMCIA ne pourra jamais atteindre 100mbit/s \340 cause de la concep)HY(tion)YH( du bus. De nouveau, comment calcu)HY(lons)YH(-nous le temps d'inac)HY(ti)HY(vit\351)YH(\240?)EP()0 P(Cela devient m\352me pire quand on consi)HY(d\350re)YH( un p\351ri)HY(ph\351)HY(rique)YH( r\351seau "pas-vrai)HY(ment)YH(-r\351el" comme )EM(PPP Over Ether)HY(net)YH()ES( ou )EM(PPTP over TCP/IP)ES(. La largeur de bande effec)HY(tive)YH( est dans ce cas proba)HY(ble)HY(ment)YH( d\351ter)HY(mi)HY(n\351e)YH( par l'effi)HY(ca)HY(cit\351)YH( des tubes vers l'espace utili)HY(sa)HY(teur)YH(, qui est \351norme.)EP()0 P(Les personnes qui ont effec)HY(tu\351)YH( des mesures ont d\351cou)HY(vert)YH( que CBQ)Ca( n'est pas toujours tr\350s exact, et parfois m\352me, tr\350s \351loign\351 de la confi)HY(gu)HY(ra)HY(tion)YH(.)EP()0 P(Cepen)HY(dant)YH(, il marche bien dans de nombreuses circons)HY(tances)YH(. Avec la docu)HY(men)HY(ta)HY(tion)YH( fournie ici, vous devriez \352tre capable de le confi)HY(gu)HY(rer)YH( pour qu'il fonc)HY(tionne)YH( bien dans la plupart des cas.)EP()2 Sl()BR()BR()BR()BR()0 4 73 H(5.4.1.\240Mise)WB 240 Sn()WB 72 Sn( en forme CBQ en d\351tail )EH()BR()BR()BR()0 P(Comme dit pr\351c\351)HY(dem)HY(ment)YH(, CBQ)Ca( fonc)HY(tionne)YH( en s'assu)HY(rant)YH( que le lien est inactif juste assez long)HY(temps)YH( pour abais)HY(ser)YH( la bande passante r\351elle au d\351bit confi)HY(gur\351)YH(. Pour r\351ali)HY(ser)YH( cela, il calcule le temps qui devrait s'\351couler entre des paquets de taille moyennne.)EP()0 P(En cours de fonc)HY(tion)HY(ne)HY(ment)YH(, le temps d'inac)HY(ti)HY(vit\351)YH( effec)HY(tif)YH( \201)EM(the effec)HY(tive)YH( idle)HY(time)YH()ES(\202 est mesur\351 en utili)HY(sant)YH( l'algo)HY(rithme)YH( EWMA)Ca( \201)EM(Expo)HY(nen)HY(tial)YH( Weigh)HY(ted)YH( Moving Average)ES(\202, qui consi)HY(d\350re)YH( que les paquets r\351cents sont expo)HY(nen)HY(tiel)HY(le)HY(ment)YH( plus nombreux que ceux pass\351s. La charge moyenne UNIX \201)EM(UNIX loada)HY(ve)HY(rage)YH()ES(\202 est calcu)HY(l\351e)YH( de la m\352me mani\350re.)EP()0 P(Le temps d'inac)HY(ti)HY(vit\351)YH( calcul\351 est sous)HY(trait)YH( \340 celui mesur\351 par EWMA)Ca( et le nombre r\351sul)HY(tant)YH( est appel\351 )SM(avgidle)ES(. Un lien parfai)HY(te)HY(ment)YH( charg\351 a un )SM(avgidle)ES( nul\240: un paquet arrive \340 chaque inter)HY(valle)YH( calcul\351.)EP()0 P(Une liaison surchar)HY(g\351e)YH( a un )SM(avgidle)ES( n\351gatif et s'il devient trop n\351gatif, CBQ)Ca( s'arr\352te un moment et se place alors en d\351pas)HY(se)HY(ment)YH( de limite \201)EM(over)HY(li)HY(mit)YH()ES(\202.)EP()0 P(Inver)HY(se)HY(ment)YH(, un lien inuti)HY(lis\351)YH( peut accu)HY(mu)HY(ler)YH( un )SM(avgidle)ES( \351norme, qui auto)HY(ri)HY(se)HY(rait)YH( alors des bandes passantes infi)HY(nies)YH( apr\350s quelques heures d'inac)HY(ti)HY(vit\351)YH(. Pour \351viter cela, )SM(avgidle)ES( est born\351 \340 )SM(maxidle)ES(.)EP()0 P(En situa)HY(tion)YH( de d\351pas)HY(se)HY(ment)YH( de limite, CBQ)Ca( peut en th\351orie bloquer le d\351bit pour une dur\351e \351qui)HY(va)HY(lente)YH( au temps qui doit s'\351couler entre deux paquets moyens, puis laisser passer un paquet et bloquer de nouveau le d\351bit. Regar)HY(dez)YH( cepen)HY(dant)YH( le para)HY(m\350tre)YH( )SM(minburst)ES( ci-dessous.)EP()0 P(Voici les para)HY(m\350tres)YH( que vous pouvez sp\351ci)HY(fier)YH( pour confi)HY(gu)HY(rer)YH( la mise en forme\240:)EP()BR()0 DL()0 DT()SM(avpkt)ES()DD()0 P(Taille moyenne d'un paquet mesur\351e en octets. N\351ces)HY(saire)YH( pour calcu)HY(ler)YH( )SM(maxidle)ES(, qui d\351rive de )SM(maxburst)ES(, qui est sp\351ci)HY(fi\351)YH( en paquets. )EP()0 DT()SM(band)HY(width)YH()ES()DD()0 P(La bande passante physique de votre p\351ri)HY(ph\351)HY(rique)YH( n\351ces)HY(saire)YH( pour les calculs du temps de non utili)HY(sa)HY(tion)YH( \201)EM(idle time)ES(\202. )EP()0 DT()SM(cell)ES()DD()0 P(La dur\351e de trans)HY(mis)HY(sion)YH( d'un paquet n'augmente pas n\351ces)HY(sai)HY(re)HY(ment)YH( de mani\350re lin\351aire en fonc)HY(tion)YH( de sa taille. Par exemple, un paquet de 800 octets peut \352tre trans)HY(mis)YH( en exac)HY(te)HY(ment)YH( autant de temps qu'un paquet de 806 octets. Ceci d\351ter)HY(mine)YH( la granu)HY(la)HY(rit\351)YH(. Cette valeur est g\351n\351)HY(ra)HY(le)HY(ment)YH( posi)HY(tion)HY(n\351e)YH( \340 )SM(8)ES(, et doit \352tre une puis)HY(sance)YH( de deux. )EP()0 DT()SM(maxburst)ES()DD()0 P(Ce nombre de paquets est utilis\351 pour calcu)HY(ler)YH( )SM(maxidle)ES( de telle sorte que quand )SM(avgidle)ES( est \351gal \340 )SM(maxidle)ES(, le nombre de paquets moyens peut \352tre envoy\351 en rafale avant que )SM(avgidle)ES( ne retombe \340 0. Augmen)HY(tez)YH(-le pour \352tre plus tol\351)HY(rant)YH( vis \340 vis des rafales de donn\351es. Vous ne pouvez pas confi)HY(gu)HY(rer)YH( )SM(maxidle)ES( direc)HY(te)HY(ment)YH(, mais seule)HY(ment)YH( via ce para)HY(m\350tre)YH(. )EP()0 DT()SM(minburst)ES()DD()0 P(Comme nous l'avons d\351j\340 indiqu\351, CBQ)Ca( doit bloquer le d\351bit dans le cas d'un d\351pas)HY(se)HY(ment)YH( de limite. La solu)HY(tion)YH( id\351ale est de le faire pendant exac)HY(te)HY(ment)YH( le temps d'inuti)HY(li)HY(sa)HY(tion)YH( calcul\351, puis de laisser passer un paquet. Cepen)HY(dant)YH(, les noyaux UNIX ont g\351n\351)HY(ra)HY(le)HY(ment)YH( du mal \340 pr\351voir des \351v\351ne)HY(ments)YH( plus courts que 10 ms, il vaut donc mieux limiter le d\351bit pendant une p\351riode plus longue, puis envoyer )SM(minburst)ES( paquets d'un seul coup et dormir pendant une dur\351e de )SM(minburst)ES(. )EP()0 P(Le temps d'attente est appel\351 )EM(offtime)ES(. De plus grandes valeurs de )SM(minburst)ES( m\350nent \340 une mise en forme plus pr\351cise dans le long terme, mais provoquent de plus grandes rafales de donn\351es pendant des p\351riodes de quelques milli)HY(se)HY(condes)YH(. )EP()0 DT()SM(minidle)ES()DD()0 P(Si )SM(avgidle)ES( est inf\351)HY(rieur)YH( \340 0, nous sommes en d\351pas)HY(se)HY(ment)YH( de limite et nous devons attendre jusqu'\340 ce que )SM(avgidle)ES( devienne suffi)HY(sam)HY(ment)YH( impor)HY(tant)YH( pour envoyer un paquet. Pour \351viter qu'une brusque rafale de donn\351es n'emp\352che le lien de fonc)HY(tion)HY(ner)YH( pendant une dur\351e prolon)HY(g\351e)YH(, )SM(avgidle)ES( est remis \340 )SM(minidle)ES( s'il atteint une valeur trop basse. )EP()0 P(La valeur )SM(minidle)ES( est sp\351ci)HY(fi\351e)YH( en micro)HY(se)HY(condes)YH( n\351ga)HY(tives)YH(\240: 10 signi)HY(fie)YH( alors que )SM(avgidle)ES( est born\351 \340 -10\265s. )EP()0 DT()SM(mpu)ES()DD()0 P(Taille minumum d'un paquet. N\351ces)HY(saire)YH( car m\352me un paquet de taille nulle est encap)HY(sul\351)YH( par 64 octets sur ether)HY(net)YH( et il faut donc un certain temps pour le trans)HY(mettre)YH(. CBQ)Ca( doit conna\356tre ce para)HY(m\350tre)YH( pour calcu)HY(ler)YH( pr\351ci)HY(s\351)HY(ment)YH( le temps d'inuti)HY(li)HY(sa)HY(tion)YH(. )EP()0 DT()SM(rate)ES()DD()0 P(D\351bit du trafic sortant du gestion)HY(naire)YH(. Ceci est le \253\240para)HY(m\350tre)YH( de vitesse\240\273\240! )EP()LD()BR()0 P(En interne, CBQ)Ca( est fine)HY(ment)YH( opti)HY(mis\351)YH(. Par exemple, les classes qui sont connues pour ne pas avoir de donn\351es pr\351sentes dans leur file d'attente ne sont pas inter)HY(ro)HY(g\351es)YH(. Les classes en situa)HY(tion)YH( de d\351pas)HY(se)HY(ment)YH( de limite sont p\351na)HY(li)HY(s\351es)YH( par la dimi)HY(nu)HY(tion)YH( de leur prio)HY(rit\351)YH( effec)HY(tive)YH(. Tout ceci est tr\350s habile et compliqu\351.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 4 74 H(5.4.2.\240Le)WB 241 Sn()WB 73 Sn( compor)HY(te)HY(ment)YH( )EM(CBQ class)HY(ful)YH()ES()EH()BR()BR()BR()0 P(En plus de la mise en forme, en utili)HY(sant)YH( les approxi)HY(ma)HY(tions)YH( )SM(idle)HY(time)YH()ES( mention)HY(n\351es)YH( ci-dessus, CBQ)Ca( peut \351gale)HY(ment)YH( agir comme une file d'attente PRIO dans le sens o\371 les classes peuvent avoir diff\351)HY(rentes)YH( prio)HY(ri)HY(t\351s)YH(. Les prio)HY(ri)HY(t\351s)YH( de plus faible valeur seront exami)HY(n\351es)YH( avant celles de valeurs plus \351lev\351es.)EP()0 P(Chaque fois qu'un paquet est demand\351 par la couche mat\351)HY(rielle)YH( pour \352tre envoy\351 sur le r\351seau, un proces)HY(sus)YH( )EM(weigh)HY(ted)YH( round robin)ES( \201WRR)Ca(\202 d\351marre en commen\347ant par les classes de plus faibles num\351ros.)EP()0 P(Celles-ci sont regrou)HY(p\351es)YH( et inter)HY(ro)HY(g\351es)YH( si elles ont des donn\351es dispo)HY(nibles)YH(. Apr\350s qu'une classe ait \351t\351 auto)HY(ri)HY(s\351e)YH( \340 retirer de la file d'attente un nombre d'octets, la classe de prio)HY(rit\351)YH( suivante est consul)HY(t\351e)YH(.)EP()0 P(Les para)HY(m\350tres)YH( suivants contr\364lent le proces)HY(sus)YH( WRR)Ca(\240:)EP()BR()0 DL()0 DT()SM(allot)ES()DD()0 P(Quand le CBQ)Ca( racine re\347oit une demande d'envoi de paquets sur une inter)HY(face)YH(, il va essayer tous les gestion)HY(naires)YH( internes \201dans les classes\202 tour \340 tour suivant l'ordre du para)HY(m\350tre)YH( )SM(prio)HY(rity)YH()ES(. A chaque passage, une classe ne peut envoyer qu'une quan)HY(tit\351)YH( limit\351e de donn\351es. Le para)HY(m\350tre)YH( )SM(allot)ES( est l'unit\351 de base de cette quan)HY(tit\351)YH(. Voir le para)HY(m\350tre)YH( )SM(weight)ES( pour plus d'infor)HY(ma)HY(tions)YH(. )EP()0 DT()SM(prio)ES()DD()0 P(CBQ)Ca( peut \351gale)HY(ment)YH( agir comme un p\351ri)HY(ph\351)HY(rique)YH( PRIO)Ca(. Les classes internes avec les prio)HY(ri)HY(t\351s)YH( les plus \351lev\351es sont consul)HY(t\351es)YH( en premier et, aussi long)HY(temps)YH( qu'elles ont du trafic, les autres classes ne sont pas exami)HY(n\351es)YH(. )EP()0 DT()SM(weight)ES()DD()0 P(Le para)HY(m\350tre)YH( )SM(weight)ES( assiste le proces)HY(sus)YH( )EM(Weigh)HY(ted)YH( Round Robin)ES(. Chaque classe a tour \340 tour la possi)HY(bi)HY(lit\351)YH( d'envoyer ses donn\351es. Si vous avez des classes avec des bandes passantes signi)HY(fi)HY(ca)HY(ti)HY(ve)HY(ment)YH( plus impor)HY(tantes)YH(, il est logique de les auto)HY(ri)HY(ser)YH( \340 envoyer plus de donn\351es \340 chaque tour que les autres. )EP()0 P(Vous pouvez utili)HY(ser)YH( des nombres arbi)HY(traires)YH( dans la mesure o\371 CBQ)Ca( addi)HY(tionne)YH( tous les para)HY(m\350tres)YH( )SM(weight)ES( pr\351sents sous une classe et les norma)HY(lise)YH(. La r\350gle empi)HY(rique)YH( qui consiste \340 prendre )SM(rate/10)ES( semble fonc)HY(tion)HY(ner)YH( correc)HY(te)HY(ment)YH(. Le para)HY(m\350tre)YH( )SM(weight)ES( norma)HY(lis\351)YH( est multi)HY(pli\351)YH( par le para)HY(m\350tre)YH( )SM(allot)ES( pour d\351ter)HY(mi)HY(ner)YH( la quan)HY(tit\351)YH( de donn\351es \340 envoyer \340 chaque tour. )EP()LD()BR()0 P(Notez, s'il vous pla\356t, que toutes les classes \340 l'int\351)HY(rieur)YH( d'une hi\351rar)HY(chie)YH( CBQ)Ca( doivent avoir le m\352me nombre majeur\240!)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 4 75 H(5.4.3.\240Para)WB 242 Sn()HY(m\350tres)YH()WB 74 Sn( CBQ qui d\351ter)HY(minent)YH( le partage & le pr\352t du lien)EH()BR()BR()BR()0 P(En plus de pure)HY(ment)YH( limiter certains trafics, il est \351gale)HY(ment)YH( possible de sp\351ci)HY(fier)YH( quelles classes peuvent emprun)HY(ter)YH( de la bande passante aux autres classes ou, r\351ci)HY(proque)HY(ment)YH(, pr\352ter sa bande passante.)EP()BR()0 DL()0 DT()SM(isola)HY(ted)YH()ES(/ )SM(sharing)ES()DD()0 P(Une classe qui est confi)HY(gu)HY(r\351e)YH( avec )SM(isola)HY(ted)YH()ES( ne pr\352tera pas sa bande passante \340 ses classes soeurs. Utili)HY(sez)YH( ceci si vous avez sur votre lien deux agences concur)HY(rentes)YH( ou qui ne s'appr\351)HY(cient)YH( pas et qui ne veulent pas se pr\352ter gratui)HY(te)HY(ment)YH( de la bande passante.)EP()0 P(Le programme de contr\364le )BD(tc)ES( connait \351gale)HY(ment)YH( )SM(sharing)ES(, qui agit \340 l'inverse du para)HY(m\350tre)YH( )SM(isola)HY(ted)YH()ES(. )EP()0 DT()SM(bounded)ES(/ )SM(borrow)ES()DD()0 P(Une classe peut aussi \352tre born\351e \201)SM(bounded)ES(\202, ce qui signi)HY(fie)YH( qu'elle n'essaiera pas d'emprun)HY(ter)YH( de la bande passante \340 ses classes enfants. )BD(tc)ES( connait \351gale)HY(ment)YH( )SM(borrow)ES(, qui agit \340 l'inverse de )SM(bounded)ES(. )EP()LD()BR()0 P(Une situa)HY(tion)YH( typique pour)HY(rait)YH( \352tre le cas o\371 vous avez deux agences pr\351sentes sur votre lien qui sont \340 la fois )SM(isola)HY(ted)YH()ES( et )SM(bounded)ES(. Ceci signi)HY(fie)YH( qu'elles sont stric)HY(te)HY(ment)YH( limi)HY(t\351es)YH( \340 leur d\351bit et qu'elles ne pr\352te)HY(ront)YH( pas aux autres leur bande passante.)EP()0 P(A l'int\351)HY(rieur)YH( de ces classes d'agence, il pour)HY(rait)YH( y avoir d'autres classes qui sont auto)HY(ri)HY(s\351es)YH( \340 \351chan)HY(ger)YH( leur bande passante.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 4 76 H(5.4.4.\240Confi)WB 243 Sn()HY(gu)HY(ra)HY(tion)YH()WB 75 Sn( simple)EH()BR()BR()BR() 9 73 PR( 1: gestionnaire de mise en file d'attente racine | 1:1 classe enfant / \200 / \200 1:3 1:4 classes terminales | | 30: 40: gestionnares de mise en file d'attente \201sfq\202 \201sfq\202)RP()0 P(Cette confi)HY(gu)HY(ra)HY(tion)YH( limite le trafic d'un serveur web \340 5\240mbit et le trafic SMTP \340 3\240mbit. Il est souhai)HY(table)YH( qu'ils n'occupent pas plus de 6\240mbit \340 eux deux. Nous avons une carte r\351seau \340 100\240mbit et les classes peuvent s'emprun)HY(ter)YH( mutuel)HY(le)HY(ment)YH( de la bande passante. ) 5 71 PR(# tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 100Mbit \200 avpkt 1000 cell 8 # tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 100Mbit \200 rate 6Mbit weight 0.6Mbit prio 8 allot 1514 cell 8 maxburst 20 \200 avpkt 1000 bounded)RP( Cette partie installe la racine et la classe )SM(1:1)ES( habi)HY(tuelle)YH(. La classe )SM(1:1)ES( est born\351e, la bande passante totale ne pourra donc pas exc\351der 6\240mbit.)EP()0 P(Comme dit avant, CBQ)Ca( a besoin de )EM(NOMBREUX)ES( para)HY(m\350tres)YH(. Tous ces para)HY(m\350tres)YH( sont cepen)HY(dant)YH( expliqu\351s au-dessus. La confi)HY(gu)HY(ra)HY(tion)YH( HTB)Ca( corres)HY(pon)HY(dante)YH( est beau)HY(coup)YH( plus simple.)EP() 6 71 PR(# tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 100Mbit \200 rate 5Mbit weight 0.5Mbit prio 5 allot 1514 cell 8 maxburst 20 \200 avpkt 1000 # tc class add dev eth0 parent 1:1 classid 1:4 cbq bandwidth 100Mbit \200 rate 3Mbit weight 0.3Mbit prio 5 allot 1514 cell 8 maxburst 20 \200 avpkt 1000)RP()0 P(Ce sont nos deux classes. Notez comment nous avons confi)HY(gur\351)YH( la valeur du para)HY(m\350tre)YH( )SM(weight)ES( en fonc)HY(tion)YH( du para)HY(m\350tre)YH( )SM(rate)ES(. La bande passante de l'ensemble des deux classes ne pourra jamais d\351pas)HY(ser)YH( 6\240mbit. En fait, les iden)HY(ti)HY(fieurs)YH( de classe \201)SM(classid)ES(\202 doivent avoir le m\352me num\351ro majeur que le gestion)HY(naire)YH( de mise en file d'attente parent\240!)EP() 2 49 PR(# tc qdisc add dev eth0 parent 1:3 handle 30: sfq # tc qdisc add dev eth0 parent 1:4 handle 40: sfq)RP()0 P(Les deux classes ont par d\351faut un gestion)HY(naire)YH( de mise en file d'attente FIFO)Ca(. Nous les rempla\347ons par une file d'attente SFQ)Ca( de telle sorte que chaque flux de donn\351es soit trait\351 de mani\350re \351gale. ) 4 69 PR(# tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip \200 sport 80 0xffff flowid 1:3 # tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip \200 sport 25 0xffff flowid 1:4)RP( )EP()0 P(Ces commandes, direc)HY(te)HY(ment)YH( atta)HY(ch\351es)YH( \340 la racine, envoient le trafic vers le bon gestion)HY(naire)YH( de mise en file d'attente.)EP()0 P(Notez que nous utili)HY(sons)YH( )BD()SM(tc class add)ES()ES( pour )EM(CREER)ES( des classes \340 l'int\351)HY(rieur)YH( d'un gestion)HY(naire)YH( de mise en file d'attente, et que nous utili)HY(sons)YH( )BD()SM(tc qdisc add)ES()ES( pour v\351ri)HY(ta)HY(ble)HY(ment)YH( confi)HY(gu)HY(rer)YH( ces classes.)EP()0 P(Vous vous deman)HY(dez)YH( peut-\352tre ce qui arrive au trafic qui n'est clas)HY(si)HY(fi\351)YH( par aucune des deux r\350gles. Dans ce cas, les donn\351es seront trai)HY(t\351es)YH( \340 l'int\351)HY(rieur)YH( de )SM(1:0)ES(, et le d\351bit ne sera pas limit\351.)EP()0 P(Si le trafic SMTP+web tente de d\351pas)HY(ser)YH( la limite de 6\240mbit/s, la bande passante sera divis\351e selon le para)HY(m\350tre)YH( )SM(weight)ES(, donnant 5/8 du trafic au serveur web et 3/8 au serveur smtp.)EP()0 P(Avec cette confi)HY(gu)HY(ra)HY(tion)YH(, vous pouvez \351gale)HY(ment)YH( dire que le trafic du serveur web sera au minimum de 5/8 * 6 mbit = 3.75 mbit.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 4 77 H(5.4.5.\240D'autres)WB 244 Sn()WB 76 Sn( para)HY(m\350tres)YH( CBQ\240: )SM(split)ES( & )SM(defmap)ES()EH()BR()BR()BR()0 P(Comme pr\351cis\351 avant, un gestion)HY(naire)YH( de mise en file d'attente bas\351 sur des classes doit appeler des filtres pour d\351ter)HY(mi)HY(ner)YH( dans quelle classe un paquet sera mis en file d'attente.)EP()0 P(En plus d'appeler les filtres, CBQ)Ca( offre d'autres options\240: )SM(defmap)ES( & )SM(split)ES(. C'est plut\364t compliqu\351 \340 comprendre et, de plus, ce n'est pas vital. Mais, \351tant donn\351 que ceci est le seul endroit connu o\371 )SM(defmap)ES( & )SM(split)ES( sont correc)HY(te)HY(ment)YH( expliqu\351s, je vais faire de mon mieux.)EP()0 P(Etant donn\351 que nous voulons le plus souvent r\351ali)HY(ser)YH( le filtrage en ne consi)HY(d\351)HY(rant)YH( que le champ TOS)Ca(, une syntaxe sp\351ciale est fournie. Chaque fois que CBQ)Ca( doit trouver o\371 le paquet doit \352tre mis en file d'attente, il v\351rifie si le noeud est un noeud d'aiguillage \201)EM(split node)ES(\202. Si c'est le cas, un de ses sous-gestion)HY(naires)YH( a indiqu\351 son souhait de rece)HY(voir)YH( tous les paquets confi)HY(gu)HY(r\351s)YH( avec une certaine prio)HY(rit\351)YH(. Celle ci peut \352tre d\351riv\351e du champ TOS)Ca( ou des options des sockets posi)HY(tion)HY(n\351es)YH( par les appli)HY(ca)HY(tions)YH(.)EP()0 P(Les bits de prio)HY(ri)HY(t\351s)YH( des paquets subissent un ET logique avec le champ )SM(defmap)ES( pour voir si une corres)HY(pon)HY(dance)YH( existe. En d'autres termes, c'est un moyen pratique de cr\351er un filtre tr\350s rapide, qui ne sera actif que pour certaines prio)HY(ri)HY(t\351s)YH(. Un )SM(defmap)ES( de )SM(ff)ES( \201en hexa)HY(d\351)HY(ci)HY(mal)YH(\202 v\351ri)HY(fiera)YH( tout tandis qu'une valeur de )SM(0)ES( ne v\351ri)HY(fiera)YH( rien. Une confi)HY(gu)HY(ra)HY(tion)YH( simple aidera peut-\352tre \340 rendre les choses plus claires\240:)EP() 6 72 PR(# tc qdisc add dev eth1 root handle 1: cbq bandwidth 10Mbit allot 1514 \200 cell 8 avpkt 1000 mpu 64 # tc class add dev eth1 parent 1:0 classid 1:1 cbq bandwidth 10Mbit \200 rate 10Mbit allot 1514 cell 8 weight 1Mbit prio 8 maxburst 20 \200 avpkt 1000)RP()0 P(Pr\351am)HY(bule)YH( stan)HY(dard)YH( de CBQ)Ca(. Je n'ai jamais pris l'habi)HY(tude)YH( de la quan)HY(tit\351)YH( de nombres n\351ces)HY(saires)YH(\240!)EP()0 P(Le para)HY(m\350tre)YH( )SM(defmap)ES( se r\351f\350re aux bits TC_PRIO qui sont d\351finis comme suit\240:)EP() 8 49 PR(TC_PRIO.. Num Correspond \340 TOS ------------------------------------------------- BESTEFFORT 0 Maximalise la Fiabilit\351 FILLER 1 Minimalise le Co\373t BULK 2 Maximalise le D\351bit \2010x8\202 INTERACTIVE_BULK 4 INTERACTIVE 6 Minimise le D\351lai \2010x10\202 CONTROL 7)RP()0 P(Les nombres TC_PRIO.. corres)HY(pondent)YH( aux bits compt\351s \340 partir de la droite. Voir la section )SM(pfifo_fast)ES( pour plus de d\351tails sur la fa\347on dont les bits TOS)Ca( sont conver)HY(tis)YH( en prio)HY(ri)HY(t\351s)YH(.)EP()0 P(Main)HY(te)HY(nant)YH(, les classes inter)HY(ac)HY(tive)YH( et de masse\240:)EP() 7 73 PR(# tc class add dev eth1 parent 1:1 classid 1:2 cbq bandwidth 10Mbit \200 rate 1Mbit allot 1514 cell 8 weight 100Kbit prio 3 maxburst 20 \200 avpkt 1000 split 1:0 defmap c0 # tc class add dev eth1 parent 1:1 classid 1:3 cbq bandwidth 10Mbit \200 rate 8Mbit allot 1514 cell 8 weight 800Kbit prio 7 maxburst 20 \200 avpkt 1000 split 1:0 defmap 3f)RP()0 P(La gestion de mise en file d'attente d'aiguillage \201)EM(split qdisc)ES(\202 est )SM(1:0)ES( et c'est \340 ce niveau que le choix sera fait. )SM(C0)ES( corres)HY(pond)YH( au nombre binaire )SM(11000000)ES( et )SM(3F)ES( au nombre binaire )SM(00111111)ES(. Ces valeurs sont choi)HY(sies)YH( de telle sorte qu'\340 elles deux, elles v\351ri)HY(fient)YH( tous les bits. La premi\350re classe corres)HY(pond)YH( aux bits 6 & 7, ce qui est \351qui)HY(valent)YH( aux trafics \253\240inter)HY(ac)HY(tif)YH(\240\273 et de \253\240contr\364le\240\273. La seconde classe corres)HY(pond)YH( au reste.)EP()0 P(Le noeud )SM(1:0)ES( poss\350de main)HY(te)HY(nant)YH( la table suivante\240:)EP() 9 25 PR(priorit\351 envoyer \340 0 1:3 1 1:3 2 1:3 3 1:3 4 1:3 5 1:3 6 1:2 7 1:2)RP()0 P(Pour d'autres amuse)HY(ments)YH(, vous pouvez \351gale)HY(ment)YH( donner un \253\240masque de chan)HY(ge)HY(ment)YH(\240\273 qui indique exac)HY(te)HY(ment)YH( les prio)HY(ri)HY(t\351s)YH( que vous souhai)HY(tez)YH( changer. N'utili)HY(sez)YH( ceci qu'avec la commande )BD()SM(tc class change)ES()ES(. Par exemple, pour ajouter le trafic )EM(best effort)ES( \340 la classe )SM(1:2)ES(, nous devrons ex\351cu)HY(ter)YH( ceci\240:)EP() 1 55 PR(# tc class change dev eth1 classid 1:2 cbq defmap 01/01)RP()0 P(La carte des prio)HY(ri)HY(t\351s)YH( au niveau de )SM(1:0)ES( ressemble main)HY(te)HY(nant)YH( \340 ceci\240:)EP() 9 25 PR(priorit\351 envoyer \340 0 1:2 1 1:3 2 1:3 3 1:3 4 1:3 5 1:3 6 1:2 7 1:2)RP()0 P(FIXME: )BD()SM(tc class change)ES()ES( n'a pas \351t\351 test\351, mais simple)HY(ment)YH( vu dans les sources.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 78 H(5.5.\240Seau)WB 245 Sn()WB 77 Sn( de jetons \340 contr\364le hi\351rar)HY(chique)YH( \201)EM(Hierar)HY(chi)HY(cal)YH( Token Bucket)ES(\202)EH()BR()BR()BR()0 P(Martin Devera\201\202 r\351alisa \340 juste titre que CBQ)Ca( est complexe et qu'il ne semble pas opti)HY(mis\351)YH( pour de nombreuses situa)HY(tions)YH( clas)HY(siques)YH(. Son approche hi\351rar)HY(chique)YH( est bien adapt\351e dans le cas de confi)HY(gu)HY(ra)HY(tions)YH( o\371 il y a une largeur de bande passante fix\351e \340 diviser entre diff\351)HY(rents)YH( \351l\351ments. Chacun de ces \351l\351ments aura une bande passante garan)HY(tie)YH(, avec la possi)HY(bi)HY(lit\351)YH( de sp\351ci)HY(fier)YH( la quan)HY(tit\351)YH( de bande passante qui pourra \352tre emprun)HY(t\351e)YH(.)EP()0 P(HTB)Ca( travaille juste comme CBQ)Ca(, mais il n'a pas recourt \340 des calculs de temps d'inoc)HY(cu)HY(pa)HY(tion)YH( pour la mise en forme. A la place, c'est un )EM(Token Bucket Filter)ES( bas\351 sur des classes, d'o\371 son nom. Il n'a que quelques para)HY(m\350tres)YH(, qui sont bien docu)HY(men)HY(t\351s)YH( sur ce )R24 2 A(site)EA(.)EP()0 P(Au fur et \340 mesure que votre confi)HY(gu)HY(ra)HY(tion)YH( HTB)Ca( se complexi)HY(fie)YH(, votre confi)HY(gu)HY(ra)HY(tion)YH( s'adapte bien. Avec CBQ)Ca(, elle est d\351j\340 complexe m\352me dans les cas simples\240! HTB3)Ca( \201voir )R24 2 A(sa page prin)HY(ci)HY(pale)YH()EA( pour les d\351tails des versions HTB\202 fait main)HY(te)HY(nant)YH( parti des sources offi)HY(cielles)YH( du noyau \201\340 partir des versions 2.4.20-pre1 et 2.5.31 et sup\351)HY(rieures)YH(\202. Il est encore cepen)HY(dant)YH( possible que vous soyez oblig\351 de r\351cu)HY(p\351)HY(rer)YH( la version mise \340 jour de 'tc' pour HTB3. Les programmes de l'espace utili)HY(sa)HY(teur)YH( et la partie HTB du noyau doivent avoir le m\352me num\351ro majeur. Sans cela, 'tc' ne marchera pas avec HTB. )EP()0 P(Si vous avez d\351j\340 un noyau r\351cent ou si vous \352tes sur le point de mettre \340 jour votre noyau, consi)HY(d\351)HY(rez)YH( HTB)Ca( co\373te que co\373te.)EP()2 Sl()BR()BR()BR()BR()0 4 79 H(5.5.1.\240Confi)WB 246 Sn()HY(gu)HY(ra)HY(tion)YH()WB 78 Sn( simple)EH()BR()BR()BR()0 P(Fonc)HY(tion)HY(nel)HY(le)HY(ment)YH( presque iden)HY(tique)YH( \340 la confi)HY(gu)HY(ra)HY(tion)YH( simple CBQ)Ca( pr\351sen)HY(t\351e)YH( ci-dessus\240:)EP() 7 83 PR(# tc qdisc add dev eth0 root handle 1: htb default 30 # tc class add dev eth0 parent 1: classid 1:1 htb rate 6mbit burst 15k # tc class add dev eth0 parent 1:1 classid 1:10 htb rate 5mbit burst 15k # tc class add dev eth0 parent 1:1 classid 1:20 htb rate 3mbit ceil 6mbit burst 15k # tc class add dev eth0 parent 1:1 classid 1:30 htb rate 1kbit ceil 6mbit burst 15k)RP()0 P(L'auteur recom)HY(mande)YH( SFQ)Ca( sous ces classes\240:)EP() 3 61 PR(# tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10 # tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10 # tc qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 10)RP()0 P(Ajouter les filtres qui dirigent le trafic vers les bonnes classes\240:)EP() 3 64 PR(# U32="tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32" # $U32 match ip dport 80 0xffff flowid 1:10 # $U32 match ip sport 25 0xffff flowid 1:20)RP()0 P(Et, c'est tout. Pas de vilains nombres non expliqu\351s, pas de para)HY(m\350tres)YH( non docu)HY(men)HY(t\351s)YH(.)EP()0 P(HTB)Ca( semble vrai)HY(ment)YH( merveilleux. Si )SM(10:)ES( et )SM(20:)ES( ont atteint tous les deux leur bande passante garan)HY(tie)YH( et qu'il en reste \340 parta)HY(ger)YH(, ils l'empruntent avec un rapport de 5:3, comme attendu.)EP()0 P(Le trafic non clas)HY(si)HY(fi\351)YH( est ache)HY(min\351)YH( vers )SM(30:)ES(, qui a une petite bande passante, mais qui peut emprun)HY(ter)YH( tout ce qui est laiss\351 libre. Puisque nous avons choisi SFQ)Ca( en interne, on h\351rite natu)HY(rel)HY(le)HY(ment)YH( de l'\351quit\351.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 80 H(6.\240Clas)WB 247 Sn()HY(si)HY(fier)YH()WB 79 Sn( des paquets avec des filtres)EH()BR()BR()BR()0 P(Pour d\351ter)HY(mi)HY(ner)YH( quelle classe trai)HY(tera)YH( un paquet, la \253\240cha\356ne de clas)HY(si)HY(fi)HY(ca)HY(teurs)YH(\240\273 est appel\351e chaque fois qu'un choix a besoin d'\352tre fait. Cette cha\356ne est consti)HY(tu\351e)YH( de tous les filtres atta)HY(ch\351s)YH( aux gestion)HY(naires)YH( de mise en file d'attente bas\351s sur des classes qui doivent prendre une d\351ci)HY(sion)YH(.)EP()0 P(On reprend l'arbre qui n'est pas un arbre\240:)EP() 9 34 PR( racine 1: | _1:1_ / | \200 / | \200 / | \200 10: 11: 12: / \200 / \200 10:1 10:2 12:1 12:2)RP()0 P(Quand un paquet est mis en file d'attente, l'instruc)HY(tion)YH( appro)HY(pri\351e)YH( de la cha\356ne de filtre est consul)HY(t\351e)YH( \340 chaque branche. Une confi)HY(gu)HY(ra)HY(tion)YH( typique devrait avoir un filtre en )SM(1:1)ES( qui dirige le paquet vers )SM(12:)ES( et un filtre en )SM(12:)ES( qui l'envoie vers )SM(12:2)ES(.)EP()0 P(Vous pour)HY(riez)YH( \351gale)HY(ment)YH( avoir ce dernier filtre en )SM(1:1)ES(, mais vous pouvez gagner en effi)HY(ca)HY(cit\351)YH( en ayant des tests plus sp\351ci)HY(fiques)YH( plus bas dans la cha\356ne.)EP()0 P(A ce propos, vous ne pouvez pas filtrer un paquet \253\240vers le haut\240\273. Donc, avec HTB)Ca(, vous devrez atta)HY(cher)YH( tous les filtres \340 la racine\240!)EP()0 P(Encore une fois, les paquets ne sont mis en file d'attente que vers le bas\240! Quand ils sont retir\351s de la file d'attente, ils montent de nouveau, vers l'inter)HY(face)YH(. Ils ne tombent )EM(PAS)ES( vers l'extr\351)HY(mit\351)YH( de l'arbre en direc)HY(tion)YH( de l'adap)HY(ta)HY(teur)YH( r\351seau\240!)EP()2 Sl()BR()BR()BR()BR()0 3 81 H(6.1.\240Quelques)WB 248 Sn()WB 80 Sn( exemples simples de filtrage)EH()BR()BR()BR()0 P(Comme expliqu\351 dans le chapitre )EM()0 87 1 A(Filtres avanc\351s pour la clas)HY(si)HY(fi)HY(ca)HY(tion)YH( des paquets)87 0 TN TL()Ec /AF f D()ES(, vous pouvez vrai)HY(ment)YH( analy)HY(ser)YH( n'importe quoi en utili)HY(sant)YH( une syntaxe tr\350s compliqu\351e. Pour commen)HY(cer)YH(, nous allons montrer comment r\351ali)HY(ser)YH( les choses \351videntes, ce qui heureu)HY(se)HY(ment)YH( est plut\364t facile.)EP()0 P(Disons que nous avons un gestion)HY(naire)YH( de mise en file d'attente PRIO)Ca( appel\351 )SM(10:)ES( qui contient trois classes, et que nous voulons assi)HY(gner)YH( \340 la bande de plus haute prio)HY(rit\351)YH( tout le trafic allant et venant du port 22. Les filtres seraient les suivants\240:)EP() 5 66 PR(# tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match \200 ip dport 22 0xffff flowid 10:1 # tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match \200 ip sport 80 0xffff flowid 10:1 # tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2)RP()0 P(Qu'est-ce que cela signi)HY(fie)YH(\240? Cela dit\240: atta)HY(cher)YH( \340 )SM(eth0)ES(, au noeud )SM(10:)ES( un filtre )SM(u32)ES( de prio)HY(rit\351)YH( 1 qui analyse le port de desti)HY(na)HY(tion)YH( ip 22 et qui l'envoie vers la bande )SM(10:1)ES(. La m\352me chose est r\351p\351t\351e avec le port source 80. La derni\350re commande indique que si aucune corres)HY(pon)HY(dance)YH( n'est trouv\351e, alors le trafic devra aller vers la bande )SM(10:2)ES(, la plus grande prio)HY(rit\351)YH( suivante.)EP()0 P(Vous devez ajouter )SM(eth0)ES( ou n'importe laquelle de vos inter)HY(faces)YH(, car chaque inter)HY(face)YH( poss\350de un espace de nommage de ses descrip)HY(teurs)YH( qui lui est propre.)EP()0 P(Pour s\351lec)HY(tion)HY(ner)YH( une adresse IP, utili)HY(sez)YH( ceci\240:)EP() 6 61 PR(# tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 \200 match ip dst 4.3.2.1/32 flowid 10:1 # tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 \200 match ip src 1.2.3.4/32 flowid 10:1 # tc filter add dev eth0 protocol ip parent 10: prio 2 \200 flowid 10:2)RP()0 P(Ceci dirige le trafic allant vers )SM(4.3.2.1)ES( et venant de )SM(1.2.3.4)ES( vers la file d'attente de plus haute prio)HY(rit\351)YH(, tandis que le reste ira vers la prochaine plus haute prio)HY(rit\351)YH(.)EP()0 P(Vous pouvez rassem)HY(bler)YH( ces deux v\351ri)HY(fi)HY(ca)HY(tions)YH( pour r\351cu)HY(p\351)HY(rer)YH( le trafic venant de )SM(1.2.3.4)ES( avec le port source 80\240:)EP() 2 83 PR(# tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 4.3.2.1/32 match ip sport 80 0xffff flowid 10:1)RP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 82 H(6.2.\240Toutes)WB 249 Sn()WB 81 Sn( les commandes de filtres dont vous aurez norma)HY(le)HY(ment)YH( besoin)EH()BR()BR()BR()0 P(La plupart des commandes pr\351sen)HY(t\351es)YH( ici commencent avec le pr\351am)HY(bule)YH( suivant\240:)EP() 1 61 PR(# tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 ..)RP()0 P(Ils sont appel\351s filtres )SM(u32)ES( et analysent )EM(N'IMPORTE QUELLE)ES( partie d'un paquet.)EP()BR()0 DL()0 DT(Sur l'adresse source/desti)HY(na)HY(tion)YH()DD()0 P(Masque pour la source )SM(match ip src 1.2.3.0/24)ES( et masque pour la desti)HY(na)HY(tion)YH( )SM(match ip dst 4.3.2.0/24)ES(. Pour analy)HY(ser)YH( un h\364te simple, employez /32 ou omettez le masque. )EP()0 DT(Sur le port source/desti)HY(na)HY(tion)YH(, tous les proto)HY(coles)YH( IP)DD()0 P(Source: )SM(match ip sport 80 0xffff)ES( et desti)HY(na)HY(tion)YH( : )SM(match ip dport ?? 0xffff)ES( )EP()0 DT(Sur le proto)HY(cole)YH( ip \201tcp, udp, icmp, gre, ipsec\202)DD()0 P(Utili)HY(sez)YH( les nombres d\351finis dans )SM(/etc/proto)HY(cols)YH()ES(, par exemple 1 pour icmp : )SM(match ip proto)HY(col)YH( 1 0xff)ES(. )EP()0 DT(Sur fwmark)Ca()DD()0 P(Vous pouvez marquer les paquets avec ipchains ou iptables et voir cette marque pr\351ser)HY(v\351e)YH( lors du routage \340 travers les inter)HY(faces)YH(. Ceci est vrai)HY(ment)YH( utile pour mettre unique)HY(ment)YH( en forme le trafic sur )SM(eth1)ES( et venant de )SM(eth0)ES(, par exemple. La syntaxe est la suivante\240: )EP() 1 77 PR(# tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 6 fw flowid 1:1)RP()0 P(Notez que ce n'est pas une corres)HY(pon)HY(dance)YH( )SM(u32)ES(\240! )EP()0 P(Vous pouvez posi)HY(tion)HY(ner)YH( une marque comme ceci\240: )EP() 1 63 PR(# iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 6)RP()0 P(Le nombre 6 est arbi)HY(traire)YH(. )EP()0 P(Si vous ne voulez pas assi)HY(mi)HY(ler)YH( la syntaxe compl\350te de )BD(tc filter)ES(, utili)HY(sez)YH( juste )BD(iptables)ES( et appre)HY(nez)YH( seule)HY(ment)YH( la s\351lec)HY(tion)YH( bas\351e sur fwmark)Ca(. )EP()0 DT(Sur le champ TOS)Ca()DD()0 P(Pour s\351lec)HY(tion)HY(ner)YH( le trafic inter)HY(ac)HY(tif)YH(, d\351lai minimum\240: )EP() 3 61 PR(# tc filter add dev ppp0 parent 1:0 protocol ip prio 10 u32 \200 match ip tos 0x10 0xff \200 flowid 1:4)RP()0 P(Utili)HY(sez)YH( )SM(0x08)ES( )SM(0xff)ES( pour le trafic de masse. )EP()LD()BR()0 P(Pour plus de commandes de filtrage, voir le chapitre )EM()0 87 1 A(Filtres avanc\351s pour la clas)HY(si)HY(fi)HY(ca)HY(tion)YH( des paquets)87 0 TN TL()Ec /AF f D()ES(.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 83 H(7.\240Le)WB 250 Sn()WB 82 Sn( p\351ri)HY(ph\351)HY(rique)YH( de file d'attente inter)HY(m\351)HY(diaire)YH( \201The Inter)HY(me)HY(diate)YH( queueing device \201IMQ\202\202)EH()BR()BR()BR()0 P(Le p\351ri)HY(ph\351)HY(rique)YH( IMQ n'est pas un gestion)HY(naire)YH( de mise en file d'attente mais son utili)HY(sa)HY(tion)YH( est forte)HY(ment)YH( li\351e \340 ceux-ci. Au coeur de Linux, les gestion)HY(naires)YH( de mise en file d'attente sont atta)HY(ch\351s)YH( aux p\351ri)HY(ph\351)HY(riques)YH( r\351seaux et tout ce qui est mis en file d'attente dans ce p\351ri)HY(ph\351)HY(rique)YH( l'est d'abord dans le gestion)HY(naire)YH(. Avec ce concept, il existe deux limi)HY(ta)HY(tions)YH(\240:)EP()0 P(1. Seule la mise en forme du trafic sortant est possible \201un gestion)HY(naire)YH( d'entr\351e existe, mais ses possi)HY(bi)HY(li)HY(t\351s)YH( sont tr\350s limi)HY(t\351es)YH( en compa)HY(rai)HY(son)YH( des gestion)HY(naires)YH( de mise en file bas\351s sur les classes\202.)EP()0 P(2. Un gestion)HY(naire)YH( de mise en file d'attente ne voit le trafic que d'une inter)HY(face)YH(, et des limi)HY(ta)HY(tions)YH( globales ne peuvent pas \352tre mises en place. )EP()0 P(IMQ est ici pour aider \340 r\351soudre ces deux limi)HY(ta)HY(tions)YH(. En r\351sum\351, vous pouvez mettre tout ce que vous voulez dans un gestion)HY(naire)YH( de mise en file d'attente. Les paquets sp\351cia)HY(le)HY(ment)YH( marqu\351s sont inter)HY(cep)HY(t\351s)YH( par les points d'accroche netfil)HY(ter)YH( NF_IP_PRE_ROUTING et NF_IP_POST_ROUTING et sont trans)HY(f\351)HY(r\351s)YH( vers le gestion)HY(naire)YH( attach\351 au p\351ri)HY(ph\351)HY(rique)YH( imq. Une cible iptables est utili)HY(s\351e)YH( pour le marquage des paquets.)EP()0 P(Ceci vous permet de r\351ali)HY(ser)YH( de la mise en forme d'entr\351e \351tant donn\351 que vous pouvez marquer les paquets entrant par un p\351ri)HY(ph\351)HY(rique)YH( quel)HY(conque)YH( et/ou traiter les inter)HY(faces)YH( comme des classes pour confi)HY(gu)HY(rer)YH( des limites globales. Vous pouvez \351gale)HY(ment)YH( r\351ali)HY(ser)YH( de nombreuses autres choses comme simple)HY(ment)YH( mettre votre trafic http dans un gestion)HY(naire)YH(, mettre les requ\352tes de nouvelles connexions dans un gestion)HY(naire)YH(, ...)EP()2 Sl()BR()BR()BR()BR()0 3 84 H(7.1.\240Confi)WB 251 Sn()HY(gu)HY(ra)HY(tion)YH()WB 83 Sn( simple)EH()BR()BR()BR()0 P(La premi\350re chose qui devrait vous venir \340 l'esprit est d'utili)HY(ser)YH( la mise en forme du trafic entrant pour vous garan)HY(tir)YH( une grande passante. ;\202 La confi)HY(gu)HY(ra)HY(tion)YH( se fait comme avec n'importe quelle autre inter)HY(face)YH(\240: ) 12 68 PR(tc qdisc add dev imq0 root handle 1: htb default 20 tc class add dev imq0 parent 1: classid 1:1 htb rate 2mbit burst 15k tc class add dev imq0 parent 1:1 classid 1:10 htb rate 1mbit tc class add dev imq0 parent 1:1 classid 1:20 htb rate 1mbit tc qdisc add dev imq0 parent 1:10 handle 10: pfifo tc qdisc add dev imq0 parent 1:20 handle 20: sfq tc filter add dev imq0 parent 10:0 protocol ip prio 1 u32 match \200 ip dst 10.0.0.230/32 flowid 1:10)RP( Dans cet exemple, u32 est utilis\351 pour la clas)HY(si)HY(fi)HY(ca)HY(tion)YH(. Les autres clas)HY(si)HY(fi)HY(ca)HY(teurs)YH( devraient marcher tout aussi bien. Le trafic doit ensuite \352tre s\351lec)HY(tionn\351)YH( et marqu\351 pour \352tre mis en file d'attente vers imq0. ) 3 57 PR(iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 0 ip link set imq0 up)RP( )EP()0 P(Les cibles iptables IMQ sont valides dans les cha\356nes PREROU)HY(TING)YH( et POST)HY(ROU)HY(TING)YH( de la table mangle. La syntaxe est la suivante\240: ) 1 54 PR(IMQ [ --todev n ] n : num\351ro du p\351riph\351rique imq)RP( Il existe aussi une cible ip6tables.)EP()0 P(Notez que le trafic n'est pas mis en file d'attente quand la cible est activ\351e, mais apr\350s. La loca)HY(li)HY(sa)HY(tion)YH( exacte de l'entr\351e du trafic dans le p\351ri)HY(ph\351)HY(rique)YH( imq d\351pend de la direc)HY(tion)YH( de ce trafic \201entrant/sortant\202. Ces entr\351es sont les points d'accroche pr\351d\351)HY(fi)HY(nis)YH( de netfil)HY(ter)YH( et utili)HY(s\351s)YH( par iptables\240: ) 9 35 PR(enum nf_ip_hook_priorities { NF_IP_PRI_FIRST = INT_MIN, NF_IP_PRI_CONNTRACK = -200, NF_IP_PRI_MANGLE = -150, NF_IP_PRI_NAT_DST = -100, NF_IP_PRI_FILTER = 0, NF_IP_PRI_NAT_SRC = 100, NF_IP_PRI_LAST = INT_MAX, };)RP( )EP()0 P(Pour le trafic entrant, imq se d\351clare avec la prio)HY(rit\351)YH( NF_IP_PRI_MANGLE + 1, ce qui signi)HY(fie)YH( que les paquets entrent dans le p\351ri)HY(ph\351)HY(rique)YH( imq juste apr\350s la chaine PREROU)HY(TING)YH( de la table mangle.)EP()0 P(Pour le trafic sortant, imq utilise NF_IP_PRI_LAST qui honore le fait que les paquets rejet\351s par la table filter n'occu)HY(pe)HY(ront)YH( pas de bande passante.)EP()0 P(Les mises \340 jour et de plus amples infor)HY(ma)HY(tions)YH( peuvent \352tre trou)HY(v\351es)YH( sur le )R25 2 A(site imq)EA(.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 85 H(Chapitre\24010.\240\311qui)WB 252 Sn()HY(li)HY(brage)YH()WB 84 Sn( de charge sur plusieurs inter)HY(faces)YH()EH()BR()BR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 85 1 A(1. Aver)HY(tis)HY(se)HY(ment)YH()85 0 TN TL()Ec /AF f D()LD()BR()0 P(Il existe plusieurs mani\350res pour le faire. Une des plus faciles et des plus directes est TEQL)Ca( \201)EM(True \201or Trivial\202 Link Equa)HY(li)HY(zer)YH()ES(. Comme la plupart des \351l\351ments en rela)HY(tion)YH( avec la gestion de file d'attente, l'\351qui)HY(li)HY(brage)YH( de charge est bidi)HY(rec)HY(tion)HY(nel)YH(. Les deux \351qui)HY(pe)HY(ments)YH( termi)HY(naux)YH( du lien ont besoin de parti)HY(ci)HY(per)YH( pour obtenir une effi)HY(ca)HY(cit\351)YH( opti)HY(male)YH(.)EP()0 P(Imagi)HY(nez)YH( la situa)HY(tion)YH( suivante\240:)EP() 5 60 PR( +-------+ eth1 +-------+ | |==========| | 'r\351seau 1' -----| A | | B |---- 'r\351seau 2' | |==========| | +-------+ eth2 +-------+)RP()0 P()SM(A)ES( et )SM(B)ES( sont des routeurs dont nous suppo)HY(se)HY(rons)YH( qu'ils fonc)HY(tionnent)YH( avec Linux pour le moment. Si le trafic va du r\351seau 1 vers le r\351seau 2, le routeur )SM(A)ES( a besoin de distri)HY(buer)YH( les paquets sur les deux liens allant vers )SM(B)ES(. Le routeur )SM(B)ES( a besoin d'\352tre confi)HY(gur\351)YH( pour l'accep)HY(ter)YH(. On retrouve la m\352me chose dans le sens inverse, pour les paquets allant du r\351seau 2 vers le r\351seau 1. Le routeur )SM(B)ES( a besoin d'envoyer les paquets \340 la fois sur )SM(eth1)ES( et )SM(eth2)ES(.)EP()0 P(La r\351par)HY(ti)HY(tion)YH( est faite par un p\351ri)HY(ph\351)HY(rique)YH( TEQL)Ca(, comme ceci \201cela ne pouvait pas \352tre plus simple\202\240:)EP() 3 34 PR(# tc qdisc add dev eth1 root teql0 # tc qdisc add dev eth2 root teql0 # ip link set dev teql0 up)RP()0 P(N'oubliez pas la commande )BD(ip link set up)ES(\240!)EP()0 P(Ceci a besoin d'\352tre fait sur les deux h\364tes. Le p\351ri)HY(ph\351)HY(rique)YH( )SM(teql0)ES( est basique)HY(ment)YH( un distri)HY(bu)HY(teur)YH( tour)HY(niquet)YH( au-dessus de )SM(eth1)ES( et )SM(eth2)ES( pour l'envoi des paquets. Aucune donn\351e n'arrive jamais \340 travers un p\351ri)HY(ph\351)HY(rique)YH( )SM(teql)ES(, mais les donn\351es appa)HY(raissent)YH( sur )SM(eth1)ES( et )SM(eth2)ES(.)EP()0 P(Nous n'avons pour le moment que les p\351ri)HY(ph\351)HY(riques)YH( et nous avons \351gale)HY(ment)YH( besoin d'un routage correct. L'une des possi)HY(bi)HY(li)HY(t\351s)YH( pour r\351ali)HY(ser)YH( cela est d'assi)HY(gner)YH( un r\351seau )SM(/31)ES( sur chacun des liens, ainsi que sur le p\351ri)HY(ph\351)HY(rique)YH( )SM(teql0)ES(\240:)EP()0 P(FIXME: Avons nous besoin de quelque chose comme )SM(nobroad)HY(cast)YH()ES(\240? Un )SM(/31)ES( est trop petit pour conte)HY(nir)YH( une adresse r\351seau et une adresse de diffu)HY(sion)YH(. Si cela ne marche pas comme pr\351vu, essayez un )SM(/30)ES(, et ajustez les adresses IP. Vous pouvez m\352me essayer sans attri)HY(buer)YH( d'adresses \340 )SM(eth1)ES( et )SM(eth2)ES(.)EP()0 P(Sur le routeur A:)EP() 3 35 PR(# ip addr add dev eth1 10.0.0.0/31 # ip addr add dev eth2 10.0.0.2/31 # ip addr add dev teql0 10.0.0.4/31)RP()0 P(Sur le routeur B:)EP() 3 35 PR(# ip addr add dev eth1 10.0.0.1/31 # ip addr add dev eth2 10.0.0.3/31 # ip addr add dev teql0 10.0.0.5/31)RP()0 P(Le routeur )SM(A)ES( devrait main)HY(te)HY(nant)YH( \352tre capable de lancer un )BD(ping)ES( vers )SM(10.0.0.1)ES(, )SM(10.0.0.3)ES( et )SM(10.0.0.5)ES( \340 travers les deux liens physiques et le p\351ri)HY(ph\351)HY(rique)YH( \253\240\351galis\351\240\273. Le routeur )SM(B)ES( devrait main)HY(te)HY(nant)YH( \352tre capable de lancer un )BD(ping)ES( vers )SM(10.0.0.0)ES(, )SM(10.0.0.2)ES( et )SM(10.0.0.4)ES( \340 travers les liens.)EP()0 P(Si cela marche, le routeur )SM(A)ES( peut prendre )SM(10.0.0.5)ES( comme route vers le r\351seau 2 et le routeur )SM(B)ES( )SM(10.0.0.4)ES( comme route vers le r\351seau 1. Pour le cas parti)HY(cu)HY(lier)YH( o\371 le r\351seau 1 est votre r\351seau person)HY(nel)YH( et o\371 le r\351seau 2 est l'Inter)HY(net)YH(, le routeur )SM(A)ES( peut prendre )SM(10.0.0.5)ES( comme passe)HY(relle)YH( par d\351faut.)EP()2 Sl()BR()BR()BR()BR()0 2 86 H(1.\240Aver)WB 253 Sn()HY(tis)HY(se)HY(ment)YH()WB 85 Sn()EH()BR()BR()BR()0 P(Rien n'est aussi simple qu'il y para\356t. Les inter)HY(faces)YH( )SM(eth1)ES( et )SM(eth2)ES( sur les deux routeurs )SM(A)ES( et )SM(B)ES( ne doivent pas avoir la fonc)HY(tion)YH( de filtrage par chemin inverse activ\351e. Dans le cas contraire, ils rejet)HY(te)HY(ront)YH( les paquets desti)HY(n\351s)YH( \340 des adresses autres que les leurs\240:)EP() 2 49 PR(# echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter # echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter)RP()0 P(Il y a un s\351rieux probl\350me avec le r\351or)HY(don)HY(nan)HY(ce)HY(ment)YH( des paquets. Suppo)HY(sons)YH( que six paquets aient besoin d'\352tre envoy\351s de )SM(A)ES( vers )SM(B)ES(. Par exemple, )SM(eth1)ES( peut traiter les paquets 1, 3 et 5 et )SM(eth2)ES( les paquets 2, 4 et 6. Dans un monde id\351al, le routeur )SM(B)ES( devrait rece)HY(voir)YH( ces paquets dans l'ordre 1, 2, 3, 4, 5, 6. Mais il est plus probable que le noyau les recevra comme ceci\240: 2, 1, 4, 3, 6, 5. Ce probl\350me va pertur)HY(ber)YH( TCP/IP. Alors qu'il n'y a pas de probl\350mes pour les liens trans)HY(por)HY(tant)YH( diff\351)HY(rentes)YH( sessions TCP/IP, vous ne serez pas capable de regrou)HY(per)YH( plusieurs liens et obtenir par ftp un simple fichier beau)HY(coup)YH( plus rapi)HY(de)HY(ment)YH(, \340 moins que le syst\350me d'exploi)HY(ta)HY(tion)YH( envoyant ou rece)HY(vant)YH( ne soit Linux. En effet, celui-ci n'est pas faci)HY(le)HY(ment)YH( perturb\351 par de simples r\351or)HY(don)HY(nan)HY(ce)HY(ments)YH(. )EP()0 P(Cepen)HY(dant)YH(, l'\351qui)HY(li)HY(brage)YH( de charge est une bonne id\351e pour de nombreuses appli)HY(ca)HY(tions)YH(.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 87 H(Chapitre\24011.\240Netfil)WB 254 Sn()HY(ter)YH()WB 86 Sn( et iproute - marquage de paquets)EH()BR()BR()BR()0 P(Jusqu'\340 main)HY(te)HY(nant)YH(, nous avons vu comment iproute travaille, et netfil)HY(ter)YH( a \351t\351 mentionn\351 plusieurs fois. Vous ne perdrez pas votre temps \340 consul)HY(ter)YH( )R5 2 A(Rusty's Remar)HY(ka)HY(bly)YH( Unre)HY(liable)YH( Guides)EA(. Le logi)HY(ciel)YH( Netfil)HY(ter)YH( peut \352tre trouv\351 )R26 2 A(ici)EA(.)EP()0 P(Netfil)HY(ter)YH( nous permet de filtrer les paquets ou de d\351sos)HY(ser)YH( leurs en-t\352tes. Une de ses fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( parti)HY(cu)HY(li\350res)YH( est de pouvoir marquer un paquet avec un nombre, gr\342ce \340 l'option )SM(--set-mark)ES(.)EP()0 P(Comme exemple, la commande suivante marque tous les paquets desti)HY(n\351s)YH( au port 25, en l'occur)HY(rence)YH( le cour)HY(rier)YH( sortant.)EP() 2 62 PR(# iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 25 \200 -j MARK --set-mark 1)RP()0 P(Disons que nous avons plusieurs connexions, une qui est rapide \201et ch\350re au m\351ga)HY(oc)HY(tet)YH(\202 et une qui est plus lente, mais avec un tarif moins \351lev\351. Nous souhai)HY(te)HY(rions)YH( que le cour)HY(rier)YH( passe par la route la moins ch\350re.)EP()0 P(Nous avons d\351j\340 marqu\351 le paquet avec un "1" et nous allons main)HY(te)HY(nant)YH( rensei)HY(gner)YH( la base de donn\351es de la poli)HY(tique)YH( de routage pour qu'elle agisse sur ces paquets marqu\351s.)EP() 7 48 PR(# echo 201 mail.out >> /etc/iproute2/rt_tables # ip rule add fwmark 1 table mail.out # ip rule ls 0: from all lookup local 32764: from all fwmark 1 lookup mail.out 32766: from all lookup main 32767: from all lookup default)RP()0 P(Nous allons main)HY(te)HY(nant)YH( g\351n\351rer la table mail.out avec une route vers la ligne lente, mais peu co\373teuse.)EP() 1 70 PR(# /sbin/ip route add default via 195.96.98.253 dev ppp0 table mail.out)RP()0 P(Voil\340 qui est fait. Il se peut que nous voulions mettre en place des excep)HY(tions)YH(, et il existe de nombreux moyens pour le faire. Nous pouvons modi)HY(fier)YH( la confi)HY(gu)HY(ra)HY(tion)YH( de netfil)HY(ter)YH( pour exclure certains h\364tes ou nous pouvons ins\351rer une r\350gle avec une prio)HY(rit\351)YH( plus faible qui pointe sur la table prin)HY(ci)HY(pale)YH( pour nos h\364tes faisant exception.)EP()0 P(Nous pouvons aussi utili)HY(ser)YH( cette fonc)HY(tion)HY(na)HY(lit\351)YH( pour nous confor)HY(mer)YH( aux bits TOS)Ca( en marquant les paquets avec diff\351)HY(rents)YH( types de service et les nombres corres)HY(pon)HY(dants)YH(. On cr\351e ensuite les r\350gles qui agissent sur ces types de service. De cette fa\347on, on peut d\351dier une ligne RNIS)Ca( aux connexions inter)HY(ac)HY(tives)YH(.)EP()0 P(Inutile de le dire, cela marche parfai)HY(te)HY(ment)YH( sur un h\364te qui fait de la traduc)HY(tion)YH( d'adresse \201NAT)Ca(\202, autre)HY(ment)YH( dit du )EM(masque)HY(ra)HY(ding)YH()ES(.)EP()0 P(IMPOR)HY(TANT)YH(\240: Nous avons re\347u une infor)HY(ma)HY(tion)YH( selon laquelle MASQ)Ca( et SNAT)Ca( entrent en conflit avec le marquage de paquets. Rusty Russell l'explique dans )R27 2 A(ce cour)HY(rier)YH()EA(. )EP()0 P(D\351sac)HY(ti)HY(vez)YH( le filtrage de chemin inverse pour que cela fonc)HY(tionne)YH( correc)HY(te)HY(ment)YH(.)EP()0 P(Note\240: pour marquer les paquets, vous aurez besoin de valider quelques options du noyau\240:)EP() 3 76 PR(IP: advanced router \201CONFIG_IP_ADVANCED_ROUTER\202 [Y/n/?] IP: policy routing \201CONFIG_IP_MULTIPLE_TABLES\202 [Y/n/?] IP: use netfilter MARK value as routing key \201CONFIG_IP_ROUTE_FWMARK\202 [Y/n/?])RP()0 P(Voir aussi )0 133 1 A(Section\2405, \253\240Cache web trans)HY(pa)HY(rent)YH( utili)HY(sant)YH( netfil)HY(ter)YH(, iproute2, ipchains et squid\240\273)133 0 TN TL()Ec /AF f D( dans le chapitre )EM()0 128 1 A(Recettes de cuisine)128 0 TN TL()Ec /AF f D()ES(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 88 H(Chapitre\24012.\240Filtres)WB 255 Sn()WB 87 Sn( avanc\351s pour la \201re-\202clas)HY(si)HY(fi)HY(ca)HY(tion)YH( des paquets)EH()BR()BR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 88 1 A(1. Le clas)HY(si)HY(fi)HY(ca)HY(teur)YH( )SM(u32)ES()88 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 89 1 A(1.1. Le s\351lec)HY(teur)YH( U32)89 0 TN TL()Ec /AF f D()0 DT()0 90 1 A(1.2. S\351lec)HY(teurs)YH( g\351n\351)HY(raux)YH()90 0 TN TL()Ec /AF f D()0 DT()0 91 1 A(1.3. Les s\351lec)HY(teurs)YH( sp\351ci)HY(fiques)YH()91 0 TN TL()Ec /AF f D()LD()0 DT()0 92 1 A(2. Le clas)HY(si)HY(fi)HY(ca)HY(teur)YH( )SM(route)ES()92 0 TN TL()Ec /AF f D()0 DT()0 93 1 A(3. Les filtres de r\351gle)HY(men)HY(ta)HY(tion)YH( \201)EM(Poli)HY(cing)YH( filters)ES(\202)93 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 94 1 A(3.1. Tech)HY(niques)YH( de r\351gle)HY(men)HY(ta)HY(tion)YH()94 0 TN TL()Ec /AF f D()0 DT()0 97 1 A(3.2. Actions de d\351pas)HY(se)HY(ment)YH( de limite \201)EM(Over)HY(li)HY(mit)YH( actions)ES(\202)97 0 TN TL()Ec /AF f D()0 DT()0 98 1 A(3.3. Exemples)98 0 TN TL()Ec /AF f D()LD()0 DT()0 99 1 A(4. Filtres hach\351s pour un filtrage massif tr\350s rapide)99 0 TN TL()Ec /AF f D()0 DT()0 100 1 A(5. Filtrer le trafic IPv6)100 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 101 1 A(5.1. Comment se fait-il que ces filtres tc IPv6 ne fonc)HY(tionnent)YH( pas\240?)101 0 TN TL()Ec /AF f D()0 DT()0 102 1 A(5.2. Marquer les paquets IPv6 en utili)HY(sant)YH( ip6tables)102 0 TN TL()Ec /AF f D()0 DT()0 103 1 A(5.3. Utili)HY(ser)YH( le s\351lec)HY(teur)YH( u32 pour rep\351rer le paquet IPv6)103 0 TN TL()Ec /AF f D()LD()LD()BR()0 P(Comme expliqu\351 dans la section sur les gestion)HY(naires)YH( de mise en file d'attente bas\351s sur des classes, les filtres sont n\351ces)HY(saires)YH( pour clas)HY(si)HY(fier)YH( les paquets dans n'importe laquelle des sous-files d'attente. Ces filtres sont appel\351s \340 l'int\351)HY(rieur)YH( des gestion)HY(naires)YH( de mise en file d'attente bas\351s sur des classes.)EP()0 P(Voici une liste incom)HY(pl\350te)YH( des clas)HY(si)HY(fi)HY(ca)HY(teurs)YH( dispo)HY(nibles)YH(\240:)EP()BR()0 DL()0 DT()SM(fw)ES()DD()0 P(Base la d\351ci)HY(sion)YH( sur la fa\347on dont le pare-feu a marqu\351 les paquets. Ceci peut \352tre un passage facile si vous ne voulez pas apprendre la syntaxe )BD(tc)ES( li\351e aux filtres. Voir le chapitre sur les gestion)HY(naires)YH( de mise en file d'attente pour plus de d\351tails. )EP()0 DT()SM(u32)ES()DD()0 P(Base la d\351ci)HY(sion)YH( sur les champs \340 l'int\351)HY(rieur)YH( du paquet \201c'est-\340-dire l'adresse IP source, etc.\202 )EP()0 DT()SM(route)ES()DD()0 P(Base la d\351ci)HY(sion)YH( sur la route que va emprun)HY(ter)YH( le paquet. )EP()0 DT()SM(rsvp)ES(, )SM(rsvp6)ES()DD()0 P(Route les paquets en se basant sur )R28 2 A(RSVP)EA(. Seule)HY(ment)YH( utile sur les r\351seaux que vous contr\364)HY(lez)YH(. Inter)HY(net)YH( ne respecte pas RSVP. )EP()0 DT()SM(tcindex)ES()DD()0 P(Utilis\351 par le gestion)HY(naire)YH( de file d'attente )SM(DSMARK)ES(. Voir la section )0 115 1 A(DSMARK)115 0 TN TL()Ec /AF f D(. )EP()LD()BR()0 P(Notez qu'il y a g\351n\351)HY(ra)HY(le)HY(ment)YH( plusieurs mani\350res de clas)HY(si)HY(fier)YH( un paquet. Cela d\351pend du syst\350me de clas)HY(si)HY(fi)HY(ca)HY(tion)YH( que vous souhai)HY(tez)YH( utili)HY(ser)YH(.)EP()0 P(Les clas)HY(si)HY(fi)HY(ca)HY(teurs)YH( acceptent en g\351n\351ral quelques argu)HY(ments)YH( communs. Ils sont list\351s ici pour des raisons pratiques\240:)EP()BR()0 DL()0 DT()SM(proto)HY(col)YH()ES()DD()0 P(Le proto)HY(cole)YH( que ce clas)HY(si)HY(fi)HY(ca)HY(teur)YH( accep)HY(tera)YH(. G\351n\351)HY(ra)HY(le)HY(ment)YH(, on n'accep)HY(tera)YH( que le trafic IP. Exig\351. )EP()0 DT()SM(parent)ES()DD()0 P(Le descrip)HY(teur)YH( auquel ce clas)HY(si)HY(fi)HY(ca)HY(teur)YH( est attach\351. Ce descrip)HY(teur)YH( doit \352tre une classe d\351j\340 exis)HY(tante)YH(. Exig\351. )EP()0 DT()SM(prio)ES()DD()0 P(La prio)HY(rit\351)YH( de ce clas)HY(si)HY(fi)HY(ca)HY(teur)YH(. Les plus petits nombres seront test\351s en premier. )EP()0 DT()SM(handle)ES()DD()0 P(Cette r\351f\351)HY(rence)YH( a plusieurs signi)HY(fi)HY(ca)HY(tions)YH( suivant les diff\351)HY(rents)YH( filtres. )EP()LD()BR()0 P(Toutes les sections suivantes suppo)HY(se)HY(ront)YH( que vous essayez de mettre en forme le trafic allant vers )SM(HostA)ES(. Ces sections suppo)HY(se)HY(ront)YH( que la classe racine a \351t\351 confi)HY(gu)HY(r\351e)YH( sur )SM(1:)ES( et que la classe vers laquelle vous voulez envoyer le trafic s\351lec)HY(tionn\351)YH( est )SM(1:1)ES(.)EP()2 Sl()BR()BR()BR()BR()0 2 89 H(1.\240Le)WB 256 Sn()WB 88 Sn( clas)HY(si)HY(fi)HY(ca)HY(teur)YH( )SM(u32)ES()EH()BR()BR()BR()0 P(Le filtre )SM(u32)ES( est le filtre le plus avanc\351 dans l'impl\351)HY(men)HY(ta)HY(tion)YH( courante. Il est enti\350)HY(re)HY(ment)YH( bas\351 sur des tables de hachage, ce qui le rend robuste quand il y a beau)HY(coup)YH( de r\350gles de filtrage.)EP()0 P(Dans sa forme la plus simple, le filtre )SM(u32)ES( est une liste d'enre)HY(gis)HY(tre)HY(ments)YH(, chacun consis)HY(tant)YH( en deux champs\240: un s\351lec)HY(teur)YH( et une action. Les s\351lec)HY(teurs)YH(, d\351crits ci-dessous, sont compa)HY(r\351s)YH( avec le paquet IP trait\351 jusqu'\340 la premi\350re corres)HY(pon)HY(dance)YH(, et l'action asso)HY(ci\351e)YH( est r\351ali)HY(s\351e)YH(. Le type d'action le plus simple serait de diriger le paquet vers une classe CBQ)Ca( d\351finie.)EP()0 P(La ligne de commande du programme )BD(tc filter)ES(, utili)HY(s\351e)YH( pour confi)HY(gu)HY(rer)YH( le filtre, consiste en trois parties\240: la sp\351ci)HY(fi)HY(ca)HY(tion)YH( du filtre, un s\351lec)HY(teur)YH( et une action. La sp\351ci)HY(fi)HY(ca)HY(tion)YH( du filtre peut \352tre d\351finie comme\240:)EP() 3 51 PR(tc filter add dev IF [ protocol PROTO ] [ \201preference|priority\202 PRIO ] [ parent CBQ ])RP()0 P(Le champ )SM(proto)HY(col)YH()ES( d\351crit le proto)HY(cole)YH( sur lequel le filtre sera appliqu\351. Nous ne discu)HY(te)HY(rons)YH( que du cas du proto)HY(cole)YH( )SM(ip)ES(. Le champ )SM(prefe)HY(rence)YH()ES( \201)SM(prio)HY(rity)YH()ES( peut \352tre utilis\351 comme alter)HY(na)HY(tive)YH(\202 fixe la prio)HY(rit\351)YH( du filtre que l'on d\351finit. C'est impor)HY(tant)YH( dans la mesure o\371 vous pouvez avoir plusieurs filtres \201listes de r\350gles\202 avec des prio)HY(ri)HY(t\351s)YH( diff\351)HY(rentes)YH(. Chaque liste sera scrut\351e dans l'ordre d'ajout des r\350gles. Alors, la liste avec la prio)HY(rit\351)YH( la plus faible \201celle qui a le num\351ro de pr\351f\351)HY(rence)YH( le plus \351lev\351\202 sera trait\351e. Le champ )SM(parent)ES( d\351finit le sommet de l'arbre CBQ)Ca( \201par ex. )SM(1:0)ES(\202 auquel le filtre doit \352tre attach\351.)EP()0 P(Les options d\351crites s'appliquent \340 tous les filtres, pas seule)HY(ment)YH( \340 )SM(u32)ES(.)EP()2 Sl()BR()BR()BR()BR()0 3 90 H(1.1.\240Le)WB 257 Sn()WB 89 Sn( s\351lec)HY(teur)YH( U32)EH()BR()BR()BR()0 P(Le s\351lec)HY(teur)YH( U32 contient la d\351fi)HY(ni)HY(tion)YH( d'un mod\350le, qui sera compar\351 au paquet trait\351. Plus pr\351ci)HY(s\351)HY(ment)YH(, il d\351finit quels bits doivent corres)HY(pondre)YH( dans l'en-t\352te du paquet, et rien de plus, mais cette m\351thode simple est tr\350s puis)HY(sante)YH(. Jetons un oeil sur l'exemple suivant, direc)HY(te)HY(ment)YH( tir\351 d'un filtre assez complexe r\351el)HY(le)HY(ment)YH( exis)HY(tant)YH(\240:)EP() 2 98 PR(# tc filter parent 1: protocol ip pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:3 \200 match 00100000/00ff0000 at 0)RP()0 P(Pour l'instant, lais)HY(sons)YH( de c\364t\351 la premi\350re ligne ; tous ces para)HY(m\350tres)YH( d\351crivent les tables de hachage du filtre. Foca)HY(li)HY(sons)YH(-nous sur la ligne de s\351lec)HY(tion)YH( conte)HY(nant)YH( le mot-cl\351 )SM(match)ES(. Ce s\351lec)HY(teur)YH( fera corres)HY(pondre)YH( les en-t\352tes IP dont le second octet sera )SM(0x10)ES( \201)SM(0010)ES(\202. Comme nous pouvons le deviner, le nombre )SM(00ff)ES( est le masque de corres)HY(pon)HY(dance)YH(, disant au filtre quels bits il doit regar)HY(der)YH(. Ici, c'est )SM(0xff)ES(, donc l'octet corres)HY(pon)HY(dra)YH( si c'est exac)HY(te)HY(ment)YH( 0x10. Le mot-cl\351 )SM(at)ES( signi)HY(fie)YH( que la corres)HY(pon)HY(dance)YH( doit d\351mar)HY(rer)YH( au d\351ca)HY(lage)YH( sp\351ci)HY(fi\351)YH( \201en octets\202 -\240dans notre cas, c'est au d\351but du paquet. Tradui)HY(sons)YH( tout cela en langage humain\240: le paquet corres)HY(pon)HY(dra)YH( si son champ Type de Service \201TOS)Ca(\202 a le bit \253\240faible d\351lai\240\273 posi)HY(tionn\351)YH(. Analy)HY(sons)YH( une autre r\350gle\240:)EP() 2 98 PR(# tc filter parent 1: protocol ip pref 10 u32 fh 800::803 order 2051 key ht 800 bkt 0 flowid 1:3 \200 match 00000016/0000ffff at nexthdr+0)RP()0 P(L'option )SM(nexthdr)ES( d\351signe l'en-t\352te suivant encap)HY(sul\351)YH( dans le paquet IP, c'est \340 dire celui du proto)HY(cole)YH( de la couche sup\351)HY(rieure)YH(. La corres)HY(pon)HY(dance)YH( commen)HY(cera)YH( \351gale)HY(ment)YH( au d\351but du prochain en-t\352te. Elle devrait avoir lieu dans le deuxi\350me mot de 32 bits de l'en-t\352te. Dans les proto)HY(coles)YH( TCP et UDP, ce champ contient le port de desti)HY(na)HY(tion)YH( du paquet. Le nombre est donn\351 dans le format big-endian, c'est-\340-dire les bits les plus signi)HY(fi)HY(ca)HY(tifs)YH( en premier. Il faut donc lire 0x0016 comme 22 en d\351cimal, qui corres)HY(pond)YH( au service SSH dans le cas de TCP. Comme vous le devinez, cette corres)HY(pon)HY(dance)YH( est ambigu\353 sans un contexte, et nous en discu)HY(te)HY(rons)YH( plus loin.)EP()0 P(Ayant compris tout cela, nous trou)HY(ve)HY(rons)YH( le s\351lec)HY(teur)YH( suivant tr\350s facile \340 lire\240: )SM(match c0a80100/ffffff00 at 16)ES(. Ce que nous avons ici, c'est une corres)HY(pon)HY(dance)YH( de trois octets au 17\350me octet, en comp)HY(tant)YH( \340 partir du d\351but de l'en-t\352te IP. Cela corres)HY(pond)YH( aux paquets qui ont une adresse de desti)HY(na)HY(tion)YH( quel)HY(conque)YH( dans le r\351seau )SM(192.168.1/24)ES(. Apr\350s avoir analys\351 les exemples, nous pouvons r\351sumer ce que nous avons appris.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 91 H(1.2.\240S\351lec)WB 258 Sn()HY(teurs)YH()WB 90 Sn( g\351n\351)HY(raux)YH()EH()BR()BR()BR()0 P(Les s\351lec)HY(teurs)YH( g\351n\351)HY(raux)YH( d\351fi)HY(nissent)YH( le mod\350le, le masque et le d\351ca)HY(lage)YH( qui seront compa)HY(r\351s)YH( au contenu du paquet. En utili)HY(sant)YH( les s\351lec)HY(teurs)YH( g\351n\351)HY(raux)YH(, vous pouvez recher)HY(cher)YH( des corres)HY(pon)HY(dances)YH( sur n'importe quel bit de l'en-t\352te IP \201ou des couches sup\351)HY(rieures)YH(\202. Ils sont quand m\352me plus diffi)HY(ciles)YH( \340 \351crire et \340 lire que les s\351lec)HY(teurs)YH( sp\351ci)HY(fiques)YH( d\351crits ci-dessus. La syntaxe g\351n\351)HY(rale)YH( des s\351lec)HY(teurs)YH( est\240:)EP() 1 67 PR(match [ u32 | u16 | u8 ] PATTERN MASK [ at OFFSET | nexthdr+OFFSET])RP()0 P(Un des mots-cl\351s )SM(u32)ES(, )SM(u16)ES( ou )SM(u8)ES( doit sp\351ci)HY(fier)YH( la longueur du mod\350le en bits. )SM(PATTERN)ES( et )SM(MASK)ES( se rappor)HY(te)HY(ront)YH( \340 la longueur d\351finie par ce mot-cl\351. Le para)HY(m\350tre)YH( )SM(OFFSET)ES( est le d\351ca)HY(lage)YH(, en octets, pour le d\351mar)HY(rage)YH( de la recherche de corres)HY(pon)HY(dance)YH(. Si le mot-clef )SM(nexthdr+)ES( est pr\351sent, le d\351ca)HY(lage)YH( sera relatif \340 l'en-t\352te de la couche r\351seau sup\351)HY(rieure)YH(.)EP()0 P(Quelques exemples\240:)EP() 3 50 PR(# tc filter add dev ppp14 parent 1:0 prio 10 u32 \200 match u8 64 0xff at 8 \200 flowid 1:4)RP()0 P(Un paquet corres)HY(pon)HY(dra)YH( \340 cette r\350gle si sa \253\240dur\351e de vie\240\273 \201TTL)Ca(\202 est de 64. TTL)Ca( est le champ d\351mar)HY(rant)YH( juste apr\350s le 8\350me octet de l'en-t\352te IP.)EP()0 P(Corres)HY(pond)YH( \340 tous les paquets TCP ayant le bit ACK activ\351\240:)EP()0 P() 4 50 PR(# tc filter add dev ppp14 parent 1:0 prio 10 u32 \200 match ip protocol 6 0xff \200 match u8 0x10 0xff at nexthdr+13 \200 flowid 1:3)RP()EP()0 P(Utili)HY(sez)YH( ceci pour d\351ter)HY(mi)HY(ner)YH( la pr\351sence du bit ACK)Ca( sur les paquets d'une longueur inf\351)HY(rieure)YH( \340 64 octets\240:)EP() 11 62 PR(## V\351rifie la pr\351sence d'un ACK, ## protocol IP 6, ## longueur de l'en-t\352te IP 0x5\201mots de 32 bits\202, ## longueur total IP 0x34 \201ACK + 12 octets d'options TCP\202 ## TCP ack actif \201bit 5, offset 33\202 # tc filter add dev ppp14 parent 1:0 protocol ip prio 10 u32 \200 match ip protocol 6 0xff \200 match u8 0x05 0x0f at 0 \200 match u16 0x0000 0xffc0 at 2 \200 match u8 0x10 0xff at 33 \200 flowid 1:3)RP()0 P(Seuls les paquets TCP sans charge utile et avec le bit ACK)Ca( posi)HY(tionn\351)YH( v\351ri)HY(fie)HY(ront)YH( cette r\350gle. Ici, nous pouvons voir un exemple d'utili)HY(sa)HY(tion)YH( de deux s\351lec)HY(teurs)YH(, le r\351sul)HY(tat)YH( final \351tant un ET logique de leur r\351sul)HY(tat)YH(. Si nous jetons un coup d'oeil sur un sch\351ma de l'en-t\352te TCP, nous pouvons voir que le bit ACK)Ca( est le second bit \201)SM(0x10)ES(\202 du 14\350me octet de l'en-t\352te TCP \201)SM(at nexthdr+13)ES(\202. Comme second s\351lec)HY(teur)YH(, si nous voulons nous compliquer la vie, nous pouvons \351crire )SM(match u8 0x06 0xff at 9)ES( \340 la place du s\351lec)HY(teur)YH( sp\351ci)HY(fique)YH( )SM(proto)HY(col)YH( tcp)ES(, puisque 6 est le num\351ro du proto)HY(cole)YH( TCP, sp\351ci)HY(fi\351)YH( au 10\350me octet de l'en-t\352te IP. D'un autre c\364t\351, dans cet exemple, nous ne pour)HY(rons)YH( pas utili)HY(ser)YH( de s\351lec)HY(teur)YH( sp\351ci)HY(fique)YH( pour la premi\350re corres)HY(pon)HY(dance)YH(, simple)HY(ment)YH( parce qu'il n'y a pas de s\351lec)HY(teur)YH( sp\351ci)HY(fique)YH( pour d\351si)HY(gner)YH( les bits TCP ACK.)EP()0 P(Le filtre ci dessous est une version modi)HY(fi\351e)YH( du filtre pr\351sent\351 au-dessus. La diff\351)HY(rence)YH( est qu'il ne v\351rifie pas la longueur de l'en-t\352te ip. Pourquoi\240? Car le filtre au-dessus ne marche que sur les syst\350mes 32 bits.)EP()0 P( ) 5 60 PR(tc filter add dev ppp14 parent 1:0 protocol ip prio 10 u32 \200 match ip protocol 6 0xff \200 match u8 0x10 0xff at nexthdr+13 \200 match u16 0x0000 0xffc0 at 2 \200 flowid 1:3)RP( )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 92 H(1.3.\240Les)WB 259 Sn()WB 91 Sn( s\351lec)HY(teurs)YH( sp\351ci)HY(fiques)YH()EH()BR()BR()BR()0 P(La table suivante contient la liste de tous les s\351lec)HY(teurs)YH( sp\351ci)HY(fiques)YH( que les auteurs de cette section ont trouv\351s dans le code source du programme )BD(tc)ES(. Ils rendent simple)HY(ment)YH( la vie plus facile en accrois)HY(sant)YH( la lisi)HY(bi)HY(lit\351)YH( de la confi)HY(gu)HY(ra)HY(tion)YH( du filtre.)EP()0 P(FIXME: empla)HY(ce)HY(ment)YH( de la table -\240la table est dans un fichier s\351par\351 "selec)HY(tor)YH(.html")EP()0 P(FIXME: C'est encore en Polo)HY(nais)YH(\240:-\201 )EP()0 P(FIXME: doit \352tre "sgmlis\351")EP()0 P(Quelques exemples\240:)EP() 3 49 PR(# tc filter add dev ppp0 parent 1:0 prio 10 u32 \200 match ip tos 0x10 0xff \200 flowid 1:4)RP()0 P(FIXME: tcp dport match ne fonc)HY(tionne)YH( pas comme d\351crit ci-dessous\240:)EP()0 P(La r\350gle ci-dessus corres)HY(pon)HY(dra)YH( \340 des paquets qui ont le champ TOS \351gal \340 )SM(0x10)ES(. Le champ TOS commence au deuxi\350me octet du paquet et occupe 1 octet, ce qui nous permet d'\351crire un s\351lec)HY(teur)YH( g\351n\351ral \351qui)HY(valent)YH(\240: )SM(match u8 0x10 0xff at 1)ES(. Cela nous donne une indi)HY(ca)HY(tion)YH( sur l'impl\351)HY(men)HY(ta)HY(tion)YH( du filtre )SM(u32)ES(. Les r\350gles sp\351ci)HY(fiques)YH( sont toujours traduites en r\350gles g\351n\351)HY(rales)YH(, et c'est sous cette forme qu'elles sont stock\351es en m\351moire par le noyau. Cela am\350ne \340 une autre conclu)HY(sion)YH(\240: les s\351lec)HY(teurs)YH( )SM(tcp)ES( et )SM(udp)ES( sont exac)HY(te)HY(ment)YH( les m\352mes et c'est la raison pour laquelle vous ne pouvez pas utili)HY(ser)YH( un simple s\351lec)HY(teur)YH( )SM(match tcp dport 53 0xffff)ES( pour d\351si)HY(gner)YH( un paquet TCP envoy\351 sur un port donn\351. Ce s\351lec)HY(teur)YH( d\351signe aussi les paquets UDP envoy\351s sur ce port. Vous devez \351gale)HY(ment)YH( sp\351ci)HY(fier)YH( le proto)HY(cole)YH( avec la r\350gle suivante\240: )EP() 4 49 PR(# tc filter add dev ppp0 parent 1:0 prio 10 u32 \200 match tcp dport 53 0xffff \200 match ip protocol 0x6 0xff \200 flowid 1:2)RP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 93 H(2.\240Le)WB 260 Sn()WB 92 Sn( clas)HY(si)HY(fi)HY(ca)HY(teur)YH( )SM(route)ES()EH()BR()BR()BR()0 P(Ce clas)HY(si)HY(fi)HY(ca)HY(teur)YH( filtre en se basant sur les infor)HY(ma)HY(tions)YH( des tables de routage. Quand un paquet passant \340 travers les classes et en atteint une qui est marqu\351e avec le filtre )SM(route)ES(, il divise le paquet en se basant sur l'infor)HY(ma)HY(tion)YH( de la table de routage.)EP() 1 62 PR(# tc filter add dev eth1 parent 1:0 protocol ip prio 100 route)RP()0 P(Ici, nous ajou)HY(tons)YH( un clas)HY(si)HY(fi)HY(ca)HY(teur)YH( )SM(route)ES( sur le noeud parent )SM(1:0)ES(, avec la prio)HY(rit\351)YH( )SM(100)ES(. Quand un paquet atteint ce noeud \201ce qui arrive imm\351)HY(dia)HY(te)HY(ment)YH(, puisqu'il est racine\202, il consulte la table de routage et si une entr\351e de la table corres)HY(pond)YH(, il envoie le paquet vers la classe donn\351e et lui donne une prio)HY(rit\351)YH( de )SM(100)ES(. Ensuite, vous ajoutez l'entr\351e de routage appro)HY(pri\351e)YH( pour fina)HY(le)HY(ment)YH( activer les choses.)EP()0 P(L'astuce ici est de d\351finir )SM(realm)ES( en se basant soit sur la desti)HY(na)HY(tion)YH(, soit sur la source. Voici la fa\347on de proc\351)HY(der)YH(\240:)EP() 1 68 PR(# ip route add Host/Network via Gateway dev Device realm RealmNumber)RP()0 P(Par exemple, nous pouvons d\351finir notre r\351seau de desti)HY(na)HY(tion)YH( )SM(192.168.10.0)ES( avec le nombre )SM(realm)ES( \351gal \340 )SM(10)ES(\240:)EP() 1 65 PR(# ip route add 192.168.10.0/24 via 192.168.10.1 dev eth1 realm 10)RP()0 P(Quand on ajoute des filtres )SM(route)ES(, on peut utili)HY(ser)YH( les nombres )SM(realm)ES( pour repr\351)HY(sen)HY(ter)YH( les r\351seaux ou les h\364tes et sp\351ci)HY(fier)YH( quelle est la corres)HY(pon)HY(dance)YH( entre les routes et les filtres.)EP() 2 58 PR(# tc filter add dev eth1 parent 1:0 protocol ip prio 100 \200 route to 10 classid 1:10)RP()0 P(La r\350gle ci-dessus indique que les paquets allant vers le r\351seau )SM(192.168.10.0)ES( corres)HY(pondent)YH( \340 la classe )SM(1:10)ES(.)EP()0 P(Le filtre )SM(route)ES( peut aussi \352tre utilis\351 avec les routes sources. Par exemple, il y a un sous-r\351seau attach\351 \340 notre routeur Linux sur )SM(eth2)ES(.)EP() 3 58 PR(# ip route add 192.168.2.0/24 dev eth2 realm 2 # tc filter add dev eth1 parent 1:0 protocol ip prio 100 \200 route from 2 classid 1:2)RP()0 P(Ici, le filtre sp\351ci)HY(fie)YH( que les paquets venant du r\351seau )SM(192.168.2.0)ES( \201)SM(realm 2)ES(\202 corres)HY(pon)HY(dront)YH( \340 la classe )SM(1:2)ES(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 94 H(3.\240Les)WB 261 Sn()WB 93 Sn( filtres de r\351gle)HY(men)HY(ta)HY(tion)YH( \201)EM(Poli)HY(cing)YH( filters)ES(\202)EH()BR()BR()BR()0 P(Pour r\351ali)HY(ser)YH( des confi)HY(gu)HY(ra)HY(tions)YH( encore plus compliqu\351es, vous pouvez avoir des filtres qui analysent le trafic \340 hauteur d'une certaine bande passante. Vous pouvez confi)HY(gu)HY(rer)YH( un filtre pour qu'il cesse compl\350)HY(te)HY(ment)YH( l'analyse de tout le trafic au-dessus d'un certain d\351bit ou pour qu'il n'analyse pas la bande passante d\351pas)HY(sant)YH( un certain d\351bit.)EP()0 P(Ainsi, si vous d\351cidez de r\351gle)HY(men)HY(ter)YH( \340 4mbit/s, mais qu'un trafic de 5mbit/s est pr\351sent, vous pouvez cesser d'analy)HY(ser)YH( l'ensemble des 5mbit/s ou seule)HY(ment)YH( cesser d'analy)HY(ser)YH( le 1 mbit/s suppl\351)HY(men)HY(taire)YH( et envoyer 4 mbit/s \340 la classe corres)HY(pon)HY(dante)YH(.)EP()0 P(Si la bande passante d\351passe le d\351bit confi)HY(gur\351)YH(, vous pouvez rejeter un paquet, le reclas)HY(si)HY(fier)YH( ou voir si un autre filtre y corres)HY(pond)YH(.)EP()2 Sl()BR()BR()BR()BR()0 3 95 H(3.1.\240Tech)WB 262 Sn()HY(niques)YH()WB 94 Sn( de r\351gle)HY(men)HY(ta)HY(tion)YH()EH()BR()BR()BR()0 P(Il y a essen)HY(tiel)HY(le)HY(ment)YH( deux fa\347ons de r\351gle)HY(men)HY(ter)YH(. Si vous avez compil\351 le noyau avec )SM(Esti)HY(ma)HY(tors)YH()ES(, celui-ci peut mesurer plus ou moins pour chaque filtre le trafic qui est pass\351. Ces esti)HY(ma)HY(tions)YH( ne sont pas co\373teuses en temps CPU, \351tant donn\351 qu'il ne compte que 25 fois par seconde le nombre de donn\351es qui sont pass\351es, et qu'il calcule le d\351bit \340 partir de l\340.)EP()0 P(L'autre mani\350re utilise encore le )EM(Token Bucket Filter)ES( qui r\351side \340 l'int\351)HY(rieur)YH( du filtre cette fois. Le TBF)Ca( analyse seule)HY(ment)YH( le trafic )EM(A HAUTEUR)ES( de la bande passante que vous avez confi)HY(gu)HY(r\351e)YH(. Si cette bande passante est d\351pas)HY(s\351e)YH(, seul l'exc\350s est trait\351 par l'action de d\351pas)HY(se)HY(ment)YH( de limite confi)HY(gu)HY(r\351e)YH(.)EP()2 Sl()BR()BR()BR()BR()0 4 96 H(3.1.1.\240Avec)WB 263 Sn()WB 95 Sn( l'esti)HY(ma)HY(teur)YH( du noyau)EH()BR()BR()BR()0 P(Ceci est tr\350s simple et il n'y a qu'un seul para)HY(m\350tre)YH(\240: )SM(avrate)ES(. Soit le flux demeure sous )SM(avrate)ES( et le filtre clas)HY(si)HY(fie)YH( le trafic vers la classe appro)HY(pri\351e)YH(, soit votre d\351bit le d\351passe et l'action indiqu\351e par d\351faut, la \253\240reclas)HY(si)HY(fi)HY(ca)HY(tion)YH(\240\273, est r\351ali)HY(s\351e)YH( dans ce cas.)EP()0 P(Le noyau utilise l'algo)HY(rithme)YH( EWMA)Ca( pour votre bande passante, ce qui la rend moins sensible aux courtes rafales de donn\351es.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 4 97 H(3.1.2.\240Avec)WB 264 Sn()WB 96 Sn( le )EM(Token Bucket Filter)ES()EH()BR()BR()BR()0 P(Utili)HY(sez)YH( les para)HY(m\350tres)YH( suivants\240:)EP()BR()UL()0 P()-1 LI()SM(buffer)ES(/)SM(maxburst)ES( )EP()0 P()-1 LI()SM(mtu)ES(/)SM(minburst)ES( )EP()0 P()-1 LI()SM(mpu)ES( )EP()0 P()-1 LI()SM(rate)ES( )EP()LU()BR()0 P(Ceux-ci se comportent la plupart du temps de mani\350re iden)HY(tique)YH( \340 ceux d\351crits dans la section )EM()0 55 1 A(Filtre \340 seau de jetons)55 0 TN TL()Ec /AF f D()ES(. Notez cepen)HY(dant)YH( que si vous confi)HY(gu)HY(rez)YH( le )SM(mtu)ES( du filtre de r\351gle)HY(men)HY(ta)HY(tion)YH( TBF)Ca( trop bas, aucun paquet ne passera et le gestion)HY(naire)YH( de mise en file d'attente de sortie TBF)Ca( ne fera que les ralen)HY(tir)YH(.)EP()0 P(Une autre diff\351)HY(rence)YH( est que la r\351gle)HY(men)HY(ta)HY(tion)YH( ne peut que laisser passer ou jeter un paquet. Il ne peut pas le retenir dans le but de le retar)HY(der)YH(.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 98 H(3.2.\240Actions)WB 265 Sn()WB 97 Sn( de d\351pas)HY(se)HY(ment)YH( de limite \201)EM(Over)HY(li)HY(mit)YH( actions)ES(\202)EH()BR()BR()BR()0 P(Si votre filtre d\351cide qu'un d\351pas)HY(se)HY(ment)YH( de limite est atteint, il peut mettre en oeuvre des \253\240actions\240\273. Actuel)HY(le)HY(ment)YH(, trois actions sont dispo)HY(nibles)YH(\240:)EP()BR()0 DL()0 DT()SM(conti)HY(nue)YH()ES()DD()0 P(Provoque l'arr\352t de l'analyse du filtre, bien que d'autres filtres aient la possi)HY(bi)HY(lit\351)YH( de le faire. )EP()0 DT()SM(drop)ES()DD()0 P(Ceci est une option tr\350s f\351roce qui supprime simple)HY(ment)YH( le trafic exc\351)HY(dant)YH( un certain d\351bit. Elle est souvent employ\351e dans le )EM(Ingress policer)ES( et a des utili)HY(sa)HY(tions)YH( limi)HY(t\351es)YH(. Par exemple, si vous avez un serveur de noms qui s'\351croule s'il traite plus de 5mbit/s de paquets, alors, vous pourrez dans ce cas utili)HY(ser)YH( un filtre d'entr\351e pour \352tre s\373r qu'il ne trai)HY(tera)YH( jamais plus de 5mbit/s. )EP()0 DT()SM(Pass/OK)ES()DD()0 P(Trans)HY(mettre)YH( le trafic. Peut \352tre utilis\351 pour mettre hors service un filtre compliqu\351, tout en le lais)HY(sant)YH( en place. )EP()0 DT()SM(reclas)HY(sify)YH()ES()DD()0 P(Permet le plus souvent une reclas)HY(si)HY(fi)HY(ca)HY(tion)YH( vers )EM(Best Effort)ES(. Ceci est l'action par d\351faut. )EP()LD()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 99 H(3.3.\240Exemples)WB 266 Sn()WB 98 Sn()EH()BR()BR()BR()0 P(Le seul vrai exemple connu est mentionn\351 dans la section )EM()0 130 1 A(Prot\351)HY(ger)YH( votre machine des inon)HY(da)HY(tions)YH( SYN)130 0 TN TL()Ec /AF f D()ES(.)EP()0 P(FIXME: Si vous avez d\351j\340 utilis\351 ceci, parta)HY(gez)YH( s'il vous pla\356t votre exp\351)HY(rience)YH( avec nous.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 100 H(4.\240Filtres)WB 267 Sn()WB 99 Sn( hach\351s pour un filtrage massif tr\350s rapide)EH()BR()BR()BR()0 P(Si vous avez besoin de milliers de r\350gles, par exemple, dans le cas o\371 vous avez beau)HY(coup)YH( de clients ou d'ordi)HY(na)HY(teurs)YH(, tous avec des sp\351ci)HY(fi)HY(ca)HY(tions)YH( QoS)Ca( diff\351)HY(rentes)YH(, vous pourrez consta)HY(ter)YH( que le noyau passe beau)HY(coup)YH( de temps \340 analy)HY(ser)YH( toutes ces r\350gles.)EP()0 P(Par d\351faut, tous les filtres r\351sident dans une grande cha\356ne qui est analy)HY(s\351e)YH( par ordre d\351crois)HY(sant)YH( des prio)HY(ri)HY(t\351s)YH(. Si vous avez 1000 r\350gles, 1000 contr\364les peuvent \352tre n\351ces)HY(saires)YH( pour d\351ter)HY(mi)HY(ner)YH( ce qu'il faut faire d'un paquet.)EP()0 P(La v\351ri)HY(fi)HY(ca)HY(tion)YH( irait plus vite s'il y avait 256 cha\356nes avec chacune quatre r\350gles et si vous pouviez r\351par)HY(tir)YH( les paquets sur ces 256 cha\356nes, afin que la bonne r\350gle soit pr\351sente.)EP()0 P(Ceci est rendu possible par le hachage. Imagi)HY(nons)YH( que vous ayez sur votre r\351seau 1024 clients avec des modems c\342ble, avec des adresses IP allant de )SM(1.2.0.0)ES( \340 )SM(1.2.3.255)ES(, et que chacun doit avoir un clas)HY(se)HY(ment)YH( parti)HY(cu)HY(lier)YH(, par exemple \253\240pauvre\240\273, \253\240moyen\240\273 et \253\240bour)HY(rage)YH(\240\273. Cela vous ferait alors 1024 r\350gles, dans le genre\240:)EP() 9 71 PR(# tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \200 1.2.0.0 classid 1:1 # tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \200 1.2.0.1 classid 1:1 ... # tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \200 1.2.3.254 classid 1:3 # tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \200 1.2.3.255 classid 1:2)RP()0 P(Pour aller plus vite, nous pouvons utili)HY(ser)YH( la derni\350re partie de l'adresse IP comme \253\240cl\351 de hachage\240\273. Nous obte)HY(nons)YH( alors 256 tables, la premi\350re ressem)HY(blant)YH( \340 ceci\240:)EP() 8 71 PR(# tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \200 1.2.0.0 classid 1:1 # tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \200 1.2.1.0 classid 1:1 # tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \200 1.2.2.0 classid 1:3 # tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \200 1.2.3.0 classid 1:2)RP()0 P(La suivante commence comme ceci\240:)EP() 3 71 PR(# tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \200 1.2.0.1 classid 1:1 ...)RP()0 P(De cette mani\350re, seules quatre recherches au plus sont n\351ces)HY(saires)YH( et deux en moyenne.)EP()0 P(La confi)HY(gu)HY(ra)HY(tion)YH( est plut\364t compliqu\351e, mais elle en vaut vrai)HY(ment)YH( la peine du fait des nombreuses r\350gles. Nous cr\351ons d'abord un filtre racine, puis une table avec 256 entr\351es\240:)EP() 2 68 PR(# tc filter add dev eth1 parent 1:0 prio 5 protocol ip u32 # tc filter add dev eth1 parent 1:0 prio 5 handle 2: u32 divisor 256)RP()0 P(Nous ajou)HY(tons)YH( main)HY(te)HY(nant)YH( des r\350gles dans la table pr\351c\351)HY(dem)HY(ment)YH( cr\351\351e\240:)EP() 8 69 PR(# tc filter add dev eth1 protocol ip parent 1:0 prio 5 u32 ht 2:7b: \200 match ip src 1.2.0.123 flowid 1:1 # tc filter add dev eth1 protocol ip parent 1:0 prio 5 u32 ht 2:7b: \200 match ip src 1.2.1.123 flowid 1:2 # tc filter add dev eth1 protocol ip parent 1:0 prio 5 u32 ht 2:7b: \200 match ip src 1.2.3.123 flowid 1:3 # tc filter add dev eth1 protocol ip parent 1:0 prio 5 u32 ht 2:7b: \200 match ip src 1.2.4.123 flowid 1:2)RP()0 P(Ceci est l'entr\351e 123, qui contient les corres)HY(pon)HY(dances)YH( pour )SM(1.2.0.13)ES(, )SM(1.2.1.123)ES(, )SM(1.2.2.123)ES( et )SM(1.2.3.123)ES( qui les envoient respec)HY(ti)HY(ve)HY(ment)YH( vers )SM(1:1)ES(, )SM(1:2)ES(, )SM(1:3)ES( et )SM(1:2)ES(. Notez que nous devons sp\351ci)HY(fier)YH( notre seau de hachage en hexa)HY(d\351)HY(ci)HY(mal)YH(, )SM(0x7b)ES( pour )SM(123)ES(.)EP()0 P(Nous cr\351ons ensuite un \253\240filtre de hachage\240\273qui dirige le trafic vers la bonne entr\351e de la table de hachage\240:)EP() 4 69 PR(# tc filter add dev eth1 protocol ip parent 1:0 prio 5 u32 ht 800:: \200 match ip src 1.2.0.0/16 \200 hashkey mask 0x000000ff at 12 \200 link 2:)RP()0 P(Ok, certains nombres doivent \352tre expliqu\351s. La table de hachage par d\351faut est appel\351e )SM(800::)ES( et tous les filtres d\351marrent de l\340. Nous s\351lec)HY(tion)HY(nons)YH( alors l'adresse source qui est en posi)HY(tion)YH( 12, 13, 14 et 15 dans l'en-t\352te IP, et indiquons que seule la derni\350re partie nous int\351)HY(resse)YH(. Ceci est envoy\351 vers la table de hachage )SM(2:)ES( qui a \351t\351 cr\351\351e plus t\364t.)EP()0 P(C'est plut\364t compliqu\351, mais cela marche en pratique et les perfor)HY(mances)YH( seront \351pous)HY(tou)HY(flantes)YH(. Notez que cet exemple pour)HY(rait)YH( \352tre am\351lior\351 pour que chaque cha\356ne contienne un filtre, ce qui repr\351)HY(sen)HY(te)HY(rait)YH( le cas id\351al\240!)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 101 H(5.\240Filtrer)WB 268 Sn()WB 100 Sn( le trafic IPv6)EH()BR()BR()BR()2 Sl()BR()BR()BR()BR()0 3 102 H(5.1.\240Comment)WB 269 Sn()WB 101 Sn( se fait-il que ces filtres tc IPv6 ne fonc)HY(tionnent)YH( pas\240?)EH()BR()BR()BR()0 P( La base de donn\351es des poli)HY(tiques)YH( de routage \201RPDB\202 a remplac\351 le routage IPv4 et la struc)HY(ture)YH( d'adres)HY(sage)YH( \340 l'int\351)HY(rieur)YH( du noyau Linux, ce qui a permis les merveilleuses fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( d\351crites dans ce HOWTO. Malheu)HY(reu)HY(se)HY(ment)YH(, la pile IPv6 \340 l'int\351)HY(rieur)YH( de Linux a \351t\351 impl\351)HY(men)HY(t\351e)YH( en dehors de cette struc)HY(ture)YH( prin)HY(ci)HY(pale)YH(. Bien qu'ils partagent des fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH(, la struc)HY(ture)YH( RPDB de base ne parti)HY(cipe)YH( pas dans ou avec les struc)HY(tures)YH( d'adres)HY(sage)YH( et de routage de IPv6.)EP()0 P(Ceci va s\373re)HY(ment)YH( changer, nous devons juste attendre un peu plus long)HY(temps)YH(.)EP()0 P(FIXME\240: Des id\351es sur des personnes travaillant sur ce sujet\240? Plani)HY(fi)HY(ca)HY(tions)YH(\240?)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 103 H(5.2.\240Marquer)WB 270 Sn()WB 102 Sn( les paquets IPv6 en utili)HY(sant)YH( ip6tables)EH()BR()BR()BR()0 P( ip6tables est capable de marquer un paquet et de lui assi)HY(gner)YH( un num\351ro\240: )EP() 1 68 PR( # ip6tables -A PREROUTING -i eth0 -t mangle -p tcp -j MARK --mark 1)RP()0 P( Ceci ne va cepen)HY(dant)YH( pas nous aider dans la mesure o\371 le paquet ne passera pas par la struc)HY(ture)YH( RPDB. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 104 H(5.3.\240Utili)WB 271 Sn()HY(ser)YH()WB 103 Sn( le s\351lec)HY(teur)YH( u32 pour rep\351rer le paquet IPv6)EH()BR()BR()BR()0 P( IPv6 est norma)HY(le)HY(ment)YH( encap)HY(sul\351)YH( dans un tunnel SIT et trans)HY(port\351)YH( \340 travers les r\351seaux IPv4. Voir la section sur le tunnel IPv6 pour de plus amples infor)HY(ma)HY(tions)YH( quant \340 la confi)HY(gu)HY(ra)HY(tion)YH( d'un tel tunnel. Ceci nous permet de filtrer les paquets IPv4 en consi)HY(d\351)HY(rant)YH( les paquets IPv6 comme la charge utile. )EP()0 P(Le filtre suivant rep\350re tous les paquets IPv6 encap)HY(su)HY(l\351s)YH( dans des paquets IPv4\240: )EP() 2 62 PR(# tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \200 match ip protocol 41 0xff flowid 42:42)RP()0 P(Conti)HY(nuons)YH(. Suppo)HY(sons)YH( que les paquets IPv6 soient envoy\351s gr\342ce \340 des paquets IPv4 et que ces paquets n'ont pas d'options. On pour)HY(rait)YH( utili)HY(ser)YH( le filtre suivant pour rep\351rer ICMPv6 dans IPv6 dans IPv4 n'ayant aucune option. 0x3a \20158\202 est le type du champ en-t\352te suivant pour ICMPv6. )EP() 5 62 PR(# tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \200 match ip protocol 41 0xff \200 match u8 0x05 0x0f at 0 \200 match u8 0x3a 0xff at 26 \200 flowid 42:42)RP()0 P(Rep\351rer l'adresse de desti)HY(na)HY(tion)YH( IPv6 n\351ces)HY(site)YH( un peu plus de travail. Le filtre suivant rep\350re l'adresse de desti)HY(na)HY(tion)YH( 3ffe:202c:ffff:32:230:4fff:fe08:358d:)EP() 20 62 PR(# tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \200 match ip protocol 41 0xff \200 match u8 0x05 0x0f at 0 \200 match u8 0x3f 0xff at 44 \200 match u8 0xfe 0xff at 45 \200 match u8 0x20 0xff at 46 \200 match u8 0x2c 0xff at 47 \200 match u8 0xff 0xff at 48 \200 match u8 0xff 0xff at 49 \200 match u8 0x00 0xff at 50 \200 match u8 0x32 0xff at 51 \200 match u8 0x02 0xff at 52 \200 match u8 0x30 0xff at 53 \200 match u8 0x4f 0xff at 54 \200 match u8 0xff 0xff at 55 \200 match u8 0xfe 0xff at 56 \200 match u8 0x08 0xff at 57 \200 match u8 0x35 0xff at 58 \200 match u8 0x8d 0xff at 59 \200 flowid 10:13)RP()0 P(La m\352me tech)HY(nique)YH( peut \352tre utili)HY(s\351e)YH( pour rep\351rer les r\351seaux. Par exemple 2001::)EP() 6 62 PR(# tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \200 match ip protocol 41 0xff \200 match u8 0x05 0x0f at 0 \200 match u8 0x20 0xff at 28 \200 match u8 0x01 0xff at 29 \200 flowid 10:13)RP()2 Sl()BR()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 105 H(Chapitre\24013.\240Para)WB 272 Sn()HY(m\350tres)YH()WB 104 Sn( r\351seau du noyau)EH()BR()BR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 105 1 A(1. Filtrage de Chemin Inverse \201)EM(Reverse Path Filte)HY(ring)YH()ES(\202)105 0 TN TL()Ec /AF f D()0 DT()0 106 1 A(2. Confi)HY(gu)HY(ra)HY(tions)YH( obscures)106 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 107 1 A(2.1. ipv4 g\351n\351)HY(rique)YH()107 0 TN TL()Ec /AF f D()0 DT()0 108 1 A(2.2. Confi)HY(gu)HY(ra)HY(tion)YH( des p\351ri)HY(ph\351)HY(riques)YH()108 0 TN TL()Ec /AF f D()0 DT()0 109 1 A(2.3. Poli)HY(tique)YH( de voisi)HY(nage)YH()109 0 TN TL()Ec /AF f D()0 DT()0 110 1 A(2.4. Confi)HY(gu)HY(ra)HY(tion)YH( du routage)110 0 TN TL()Ec /AF f D()LD()LD()BR()0 P(Le noyau utilise de nombreux para)HY(m\350tres)YH( qui peuvent \352tre ajust\351s en diff\351)HY(rentes)YH( circons)HY(tances)YH(. Bien que, comme d'habi)HY(tude)YH(, les para)HY(m\350tres)YH( par d\351faut conviennent \340 99% des instal)HY(la)HY(tions)YH(, nous ne pour)HY(rions)YH( pas appeler ce docu)HY(ment)YH( \253\240HOWTO avanc\351\240\273 sans en dire un mot.)EP()0 P(Les \351l\351ments int\351)HY(res)HY(sants)YH( sont dans )SM(/proc/sys/net)ES(, jetez-y un oeil. Tout ne sera pas docu)HY(ment\351)YH( ici au d\351part, mais nous y travaillons.)EP()0 P(En atten)HY(dant)YH(, vous pouvez jeter un oeil dans les sources du noyau Linux et lire le fichier )SM(Docu)HY(men)HY(ta)HY(tion)YH(/file)HY(sys)HY(tems)YH(/proc.txt)ES(. La plupart des fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( y sont expliqu\351es.)EP()2 Sl()BR()BR()BR()BR()0 2 106 H(1.\240Filtrage)WB 273 Sn()WB 105 Sn( de Chemin Inverse \201)EM(Reverse Path Filte)HY(ring)YH()ES(\202)EH()BR()BR()BR()0 P(Par d\351faut, les routeurs routent tout, m\352me les paquets qui visi)HY(ble)HY(ment)YH( n'appar)HY(tiennent)YH( pas \340 votre r\351seau. Un exemple courant est l'espace des adresses IP priv\351es s'\351chap)HY(pant)YH( sur Inter)HY(net)YH(. Si vous avez une inter)HY(face)YH( avec une route pour )SM(195.96.96.0/24)ES( dessus, vous ne vous atten)HY(drez)YH( pas \340 voir arriver des paquets venant de )SM(212.64.94.1)ES(. )EP()0 P(Beau)HY(coup)YH( d'utili)HY(sa)HY(teurs)YH( veulent d\351sac)HY(ti)HY(ver)YH( cette fonc)HY(tion)HY(na)HY(lit\351)YH(. Les d\351ve)HY(lop)HY(peurs)YH( du noyau ont permis de le faire faci)HY(le)HY(ment)YH(. Il y a des fichiers dans )SM(/proc)ES( o\371 vous pouvez ordon)HY(ner)YH( au noyau de le faire pour vous. La m\351thode est appel\351e \253\240Filtrage par Chemin Inverse\240\273 \201)EM(Reverse Path Filte)HY(ring)YH()ES(\202. Pour faire simple, si la r\351ponse \340 ce paquet ne sort pas par l'inter)HY(face)YH( par laquelle il est entr\351, alors c'est un paquet \253\240bogu\351\240\273 et il sera ignor\351.)EP()0 P(Les instruc)HY(tions)YH( suivantes vont activer cela pour toutes les inter)HY(faces)YH( courantes et futures.)EP() 3 51 PR(# for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do > echo 2 > $i > done)RP()0 P(En repre)HY(nant)YH( l'exemple du d\351but, si un paquet arri)HY(vant)YH( sur le routeur Linux par )SM(eth1)ES( pr\351tend venir du r\351seau Bureau+FAI, il sera \351limin\351. De m\352me, si un paquet arri)HY(vant)YH( du r\351seau Bureau pr\351tend \352tre de quelque part \340 l'ext\351)HY(rieur)YH( du pare-feu, il sera \351gale)HY(ment)YH( \351limin\351.)EP()0 P(Ce qui est pr\351sent\351 ci-dessus est le filtrage de chemin inverse complet. Le para)HY(m\351)HY(trage)YH( par d\351faut filtre seule)HY(ment)YH( sur les adresses IP des r\351seaux direc)HY(te)HY(ment)YH( connec)HY(t\351s)YH(. Ce para)HY(m\351)HY(trage)YH( par d\351faut est utilis\351 parce que le filtrage complet \351choue dans le cas d'un routage asym\351)HY(trique)YH( \201o\371 il y a des paquets arri)HY(vant)YH( par un chemin et ressor)HY(tant)YH( par un autre, comme dans le cas du trafic satel)HY(lite)YH( ou si vous avez des routes dyna)HY(miques)YH( \201bgp, ospf, rip\202 dans votre r\351seau. Les donn\351es descendent vers la para)HY(bole)YH( satel)HY(lite)YH( et les r\351ponses repartent par des lignes terrestres normales\202.)EP()0 P(Si cette exception s'applique dans votre cas \201vous devriez \352tre au courant\202, vous pouvez simple)HY(ment)YH( d\351sac)HY(ti)HY(ver)YH( le )SM(rp_filter)ES( sur l'inter)HY(face)YH( d'arriv\351e des donn\351es satel)HY(lite)YH(. Si vous voulez voir si des paquets sont \351limi)HY(n\351s)YH(, le fichier )SM(log_martians)ES( du m\352me r\351per)HY(toire)YH( indiquera au noyau de les enre)HY(gis)HY(trer)YH( dans votre syslog.)EP() 1 62 PR(# echo 1 >/proc/sys/net/ipv4/conf//log_martians)RP()0 P(FIXME: Est-ce que la confi)HY(gu)HY(ra)HY(tion)YH( des fichiers dans .../conf/{default,all} suffit\240? - martijn)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 107 H(2.\240Confi)WB 274 Sn()HY(gu)HY(ra)HY(tions)YH()WB 106 Sn( obscures)EH()BR()BR()BR()0 P(Bon, il y a beau)HY(coup)YH( de para)HY(m\350tres)YH( qui peuvent \352tre modi)HY(fi\351s)YH(. Nous essayons de tous les lister. Voir aussi une docu)HY(men)HY(ta)HY(tion)YH( partielle dans )SM(Docu)HY(men)HY(ta)HY(tion)YH(/ip-sysctl.txt)ES(.)EP()0 P(Certaines de ces confi)HY(gu)HY(ra)HY(tions)YH( ont des valeurs par d\351faut diff\351)HY(rentes)YH( suivant que vous r\351pon)HY(dez)YH( )SM(Yes)ES( ou )SM(No)ES( \340 la ques)HY(tion)YH( )SM(Confi)HY(gure)YH( as router and not host)ES( lors de la compi)HY(la)HY(tion)YH( du noyau.)EP()0 P(Oskar Andreas)HY(son)YH( a une page sur ces options et il appa)HY(ra\356t)YH( qu'elle soit meilleure que la notre. De ce fait, allez \351gale)HY(ment)YH( voir )R29 2 A(http://ipsysctl-tuto)HY(rial)YH(.frozen)HY(tux)YH(.net/)EA(.)EP()2 Sl()BR()BR()BR()BR()0 3 108 H(2.1.\240ipv4)WB 275 Sn()WB 107 Sn( g\351n\351)HY(rique)YH()EH()BR()BR()BR()0 P(En remarque g\351n\351)HY(rale)YH(, les fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( de limi)HY(ta)HY(tion)YH( de d\351bit ne fonc)HY(tionnent)YH( pas sur l'inter)HY(face)YH( )SM(loop)HY(back)YH()ES(. N'essayez donc pas de les tester loca)HY(le)HY(ment)YH(. Les limites sont expri)HY(m\351es)YH( en \253\240tic-tac\240\273 \201)EM(jiffies)ES(\202 et elles utilisent obli)HY(ga)HY(toi)HY(re)HY(ment)YH( le )EM(Token Bucket Filter)ES( mentionn\351 plus t\364t.)EP()0 P([NdT\240: le terme )EM(jiffies)ES( d\351signe un mouve)HY(ment)YH( r\351gu)HY(lier)YH(, faisant r\351f\351)HY(rence)YH( au \253\240tic-tac\240\273 d'une horloge. Dans le noyau lui-m\352me, une variable globale nomm\351e )SM(jiffies)ES( est incr\351)HY(men)HY(t\351e)YH( \340 chaque inter)HY(rup)HY(tion)YH( d'horloge])EP()0 P(Le noyau a une horloge interne qui tourne \340 )SM(HZ)ES( impul)HY(sions)YH( \201ou )EM(jiffies)ES(\202 par seconde. Sur Intel, )SM(HZ)ES( est la plupart du temps \351gale \340 )SM(100)ES(. Donc, confi)HY(gu)HY(rer)YH( un fichier )SM(*_rate)ES( \340, disons 50, auto)HY(rise)YH( 2 paquets par seconde. Le )EM(Token Bucket Filter)ES( est \351gale)HY(ment)YH( confi)HY(gur\351)YH( pour auto)HY(ri)HY(ser)YH( une rafale de donn\351es de 6 paquets au plus, si suffi)HY(sam)HY(ment)YH( de jetons ont \351t\351 gagn\351s.)EP()0 P(Plusieurs \351l\351ments de la liste suivante proviennent du fichier )SM(/usr/src/linux/Docu)HY(men)HY(ta)HY(tion)YH(/networ)HY(king)YH(/ip-sysctl.txt)ES(, \351crit par Alexey Kuznet)HY(sov)YH( )SM(<)0 2 A(kuznet@ms2.inr.ac.ru)EA(>)ES( et Andi Kleen )SM(<)0 2 A(ak@muc.de)EA(>)ES(.)EP()BR()0 DL()0 DT()SM(/proc/sys/net/ipv4/icmp_destun)HY(reach)YH(_rate)ES( )DD()0 P(Si le noyau d\351cide qu'il ne peut pas d\351li)HY(vrer)YH( un paquet, il le rejet)HY(tera)YH( et enverra \340 la source du paquet un ICMP noti)HY(fiant)YH( ce rejet. )EP()0 DT()SM(/proc/sys/net/ipv4/icmp_echo_ignore_all)ES( )DD()0 P(N'agit en aucun cas comme \351cho pour les paquets. Ne confi)HY(gu)HY(rez)YH( pas ceci par d\351faut. Cepen)HY(dant)YH(, si vous \352tes utilis\351 comme relais dans une attaque de D\351ni de Services, cela peut \352tre utile. )EP()0 DT()SM(/proc/sys/net/ipv4/icmp_echo_ignore_broad)HY(casts)YH()ES( [Utile])DD()0 P(Si vous pinguez l'adresse de diffu)HY(sion)YH( d'un r\351seau, tous les h\364tes sont sens\351s r\351pondre. Cela permet de coquettes attaques de d\351ni de service. Mettez cette valeur \340 1 pour ignorer ces messages de diffu)HY(sion)YH(. )EP()0 DT()SM(/proc/sys/net/ipv4/icmp_echo)HY(re)HY(ply)YH(_rate)ES( )DD()0 P(Le d\351bit auquel les r\351ponses echo sont envoy\351es aux desti)HY(na)HY(taires)YH(. )EP()0 DT()SM(/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses)ES( )DD()0 P(Confi)HY(gu)HY(rer)YH( ceci pour ignorer les erreurs ICMP d'h\364tes du r\351seau r\351agis)HY(sant)YH( mal aux trames envoy\351es vers ce qu'ils per\347oivent comme l'adresse de diffu)HY(sion)YH(. )EP()0 DT()SM(/proc/sys/net/ipv4/icmp_param)HY(prob)YH(_rate)ES( )DD()0 P(Un message ICMP rela)HY(ti)HY(ve)HY(ment)YH( peu connu, qui est envoy\351 en r\351ponse \340 des paquets qui ont des en-t\352tes IP ou TCP erron\351s. Avec ce fichier, vous pouvez contr\364)HY(ler)YH( le d\351bit auquel il est envoy\351. )EP()0 DT()SM(/proc/sys/net/ipv4/icmp_timeex)HY(ceed)YH(_rate)ES( )DD()0 P(Voici la c\351l\350bre cause des \253\240\351toiles Solaris\240\273 dans trace)HY(route)YH(. Limite le nombre de messages ICMP Time Excee)HY(ded)YH( envoy\351s. )EP()0 DT()SM(/proc/sys/net/ipv4/igmp_max_member)HY(ships)YH()ES( )DD()0 P(Nombre maximal de sockets igmp \201multi)HY(dis)HY(tri)HY(bu)HY(tion)YH(\202 en \351coute sur l'h\364te. FIXME: Est-ce vrai ? )EP()0 DT()SM(/proc/sys/net/ipv4/inet_peer_gc_maxtime)ES( )DD()0 P(FIXME\240: Ajouter une petite expli)HY(ca)HY(tion)YH( sur le stockage des parte)HY(naires)YH( inter)HY(net)YH( \201inet peer\202\240? Inter)HY(valle)YH( de temps minimum entre deux passages du ramasse-miettes. Cet inter)HY(valle)YH( est pris en compte lors d'une faible \201voire inexis)HY(tante)YH(\202 utili)HY(sa)HY(tion)YH( du )EM(pool)ES(. Mesur\351 en )EM(jiffies)ES(. [NdT\240: Le )EM(pool)ES( d\351signe ici la liste des adresses IP des parte)HY(naires)YH( inter)HY(net)YH(.] )EP()0 DT()SM(/proc/sys/net/ipv4/inet_peer_gc_mintime)ES( )DD()0 P(Inter)HY(valle)YH( de temps minimum entre deux passages du ramasse-miettes. Cet inter)HY(valle)YH( est pris en compte lors d'une utili)HY(sa)HY(tion)YH( inten)HY(sive)YH( du )EM(pool)ES(. Mesur\351 en )EM(jiffies)ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/inet_peer_maxttl)ES( )DD()0 P(Dur\351e de conser)HY(va)HY(tion)YH( maxi)HY(male)YH( des enre)HY(gis)HY(tre)HY(ments)YH(. Les entr\351es non utili)HY(s\351es)YH( expi)HY(re)HY(ront)YH( au bout de cet inter)HY(valle)YH( de temps \201c'est-\340-dire quand le nombre d'entr\351es dans le )EM(pool)ES( est tr\350s petit\202. Mesur\351 en )EM(jiffies)ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/inet_peer_minttl)ES( )DD()0 P(Dur\351e de conser)HY(va)HY(tion)YH( mini)HY(male)YH( des enre)HY(gis)HY(tre)HY(ments)YH(. Devrait \352tre suffi)HY(sante)YH( pour prendre en compte le temps de vie des frag)HY(ments)YH( sur l'h\364te qui doit r\351as)HY(sem)HY(bler)YH( les paquets. Cette dur\351e mini)HY(male)YH( est garan)HY(tie)YH( si le nombre d'\351l\351ments dans le )EM(pool)ES( est inf\351)HY(rieur)YH( au seuil fix\351 par )SM(inet_peer_thre)HY(shold)YH()ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/inet_peer_thre)HY(shold)YH()ES( )DD()0 P(Taille approxi)HY(ma)HY(tive)YH( de l'espace de stockage des parte)HY(naires)YH( inter)HY(net)YH(. A partir de ce seuil, les entr\351es sont effa)HY(c\351es)YH(. Ce seuil d\351ter)HY(mine)YH( la dur\351e de vie des entr\351es, ainsi que les inter)HY(valles)YH( de temps entre deux d\351clen)HY(che)HY(ments)YH( du ramasse-miettes. Plus il y a d'entr\351es, plus le temps de vie est faible et plus l'inter)HY(valle)YH( du ramasse-miettes est faible. )EP()0 DT()SM(/proc/sys/net/ipv4/ip_auto)HY(con)HY(fig)YH()ES( )DD()0 P(Ce fichier contient la valeur 1 si l'h\364te a re\347u sa confi)HY(gu)HY(ra)HY(tion)YH( IP par RARP)Ca(, BOOTP)Ca(, DHCP)Ca( ou un m\351ca)HY(nisme)YH( simi)HY(laire)YH(. Autre)HY(ment)YH(, il contient la valeur z\351ro. )EP()0 DT()SM(/proc/sys/net/ipv4/ip_default_ttl)ES( )DD()0 P(Dur\351e de vie \201TTL)Ca(\202 des paquets. Fixer \340 la valeur s\373re de 64. Augmen)HY(tez)YH(-la si vous avez un r\351seau immense, mais pas \253\240pour s'amuser\240\273\240: les boucles sans fin d'un mauvais routage sont plus dange)HY(reuses)YH( si le TTL)Ca( est \351lev\351. Vous pouvez m\352me envi)HY(sa)HY(ger)YH( de dimi)HY(nuer)YH( la valeur dans certaines circons)HY(tances)YH(. )EP()0 DT()SM(/proc/sys/net/ipv4/ip_dynaddr)ES( )DD()0 P(Vous aurez besoin de posi)HY(tion)HY(ner)YH( cela si vous utili)HY(sez)YH( la connexion \340 la demande avec une adresse d'inter)HY(face)YH( dyna)HY(mique)YH(. Une fois que votre inter)HY(face)YH( a \351t\351 confi)HY(gu)HY(r\351e)YH(, toutes les sockets TCP locaux qui n'ont pas eu de paquets de r\351ponse seront retrai)HY(t\351es)YH( pour avoir la bonne adresse. Cela r\351sout le probl\350me pos\351 par une connexion d\351fec)HY(tueuse)YH( ayant confi)HY(gur\351)YH( une inter)HY(face)YH(, suivie par une deuxi\350me tenta)HY(tive)YH( r\351ussie \201avec une adresse IP diff\351)HY(rente)YH(\202. )EP()0 DT()SM(/proc/sys/net/ipv4/ip_forward)ES( )DD()0 P(Le noyau doit-il essayer de trans)HY(mettre)YH( les paquets\240? D\351sac)HY(tiv\351)YH( par d\351faut. )EP()0 DT()SM(/proc/sys/net/ipv4/ip_local_port_range)ES( )DD()0 P(Inter)HY(valle)YH( des ports locaux pour les connexions sortantes. En fait, assez petit par d\351faut, 1024 \340 4999. )EP()0 DT()SM(/proc/sys/net/ipv4/ip_no_pmtu_disc)ES( )DD()0 P(Confi)HY(gu)HY(rez)YH( ceci si vous voulez d\351sac)HY(ti)HY(ver)YH( la d\351cou)HY(verte)YH( du MTU de chemin, une tech)HY(nique)YH( pour d\351ter)HY(mi)HY(ner)YH( le plus grand MTU possible sur votre chemin. Voir aussi la section sur la d\351cou)HY(verte)YH( du MTU de chemin dans le chapitre )EM()0 128 1 A(Recettes de cuisine)128 0 TN TL()Ec /AF f D()ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/ipfrag_high_thresh)ES( )DD()0 P(M\351moire maximum utili)HY(s\351e)YH( pour r\351as)HY(sem)HY(bler)YH( les frag)HY(ments)YH( IP. Quand )SM(ipfrag_high_thresh)ES( octets de m\351moire sont allou\351s pour cela, le gestion)HY(naire)YH( de frag)HY(ments)YH( rejet)HY(tera)YH( les paquets jusqu'\340 ce que )SM(ipfrag_low_thresh)ES( soit atteint. )EP()0 DT()SM(/proc/sys/net/ipv4/ip_nonlo)HY(cal)YH(_bind)ES( )DD()0 P(Confi)HY(gu)HY(rez)YH( ceci si vous voulez que vos appli)HY(ca)HY(tions)YH( soient capables de se lier \340 une adresse qui n'appar)HY(tient)YH( pas \340 une inter)HY(face)YH( de votre syst\350me. Ceci peut \352tre utile quand votre machine est sur un lien non-perma)HY(nent)YH( \201ou m\352me perma)HY(nent)YH(\202. Vos services sont donc capables de d\351mar)HY(rer)YH( et de se lier \340 une adresse sp\351ci)HY(fique)YH( quand votre lien est inactif. )EP()0 DT()SM(/proc/sys/net/ipv4/ipfrag_low_thresh)ES( )DD()0 P(M\351moire mini)HY(male)YH( utili)HY(s\351e)YH( pour r\351as)HY(sem)HY(bler)YH( les frag)HY(ments)YH( IP. )EP()0 DT()SM(/proc/sys/net/ipv4/ipfrag_time)ES( )DD()0 P(Temps en secondes du main)HY(tien)YH( d'un frag)HY(ment)YH( IP en m\351moire. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_abort_on_over)HY(flow)YH()ES( )DD()0 P(Une option bool\351enne contr\364)HY(lant)YH( le compor)HY(te)HY(ment)YH( dans le cas de nombreuses connexions entrantes. Quand celle-ci est activ\351e, le noyau envoie rapi)HY(de)HY(ment)YH( des paquets RST quand un service est surcharg\351. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_fin_timeout)ES( )DD()0 P(Temps de main)HY(tien)YH( de l'\351tat )SM(FIN-WAIT-2)ES( pour un socket dans le cas o\371 il a \351t\351 ferm\351 de notre c\364t\351. Le parte)HY(naire)YH( peut \352tre d\351fec)HY(tueux)YH( et ne jamais avoir ferm\351 son c\364t\351 ou m\352me mourir de mani\350re inat)HY(ten)HY(due)YH(. La valeur par d\351faut est de 60 secondes. La valeur usuelle utili)HY(s\351e)YH( dans le noyau 2.2 \351tait de 180 secondes. Vous pouvez la remettre, mais rappe)HY(lez)YH( vous que si votre machine a un serveur WEB surcharg\351, vous risquez de d\351pas)HY(ser)YH( la m\351moire avec des kilo)HY(tonnes)YH( de sockets morts. Les sockets )SM(FIN-WAIT2)ES( sont moins dange)HY(reux)YH( que les sockets )SM(FIN-WAIT1)ES( parce qu'ils consomment au maximum 1,5K de m\351moire, mais ils ont tendance \340 vivre plus long)HY(temps)YH(. Cf )SM(tcp_max_orphans)ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_keepa)HY(live)YH(_time)ES( )DD()0 P(Dur\351e entre l'envoi de deux messages )EM(keepa)HY(live)YH()ES( quand l'option )EM(keepa)HY(live)YH()ES( est activ\351e. Par d\351faut\240: 2 heures. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_keepa)HY(live)YH(_intvl)ES( )DD()0 P(A quelle fr\351quence les sondes sont retrans)HY(mises)YH( lorsqu'il n'y a pas eu acquit)HY(te)HY(ment)YH( de sonde. Par d\351faut\240: 75 secondes. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_keepa)HY(live)YH(_probes)ES( )DD()0 P(Combien de sondes TCP )EM(keepa)HY(live)YH()ES( seront envoy\351es avant de d\351cider que la connexion est bris\351e. Par d\351faut\240: 9. En multi)HY(pliant)YH( par )SM(tcp_keepa)HY(live)YH(_intvl)ES(, cela donne le temps pendant lequel un lien peut \352tre actif sans donner de r\351ponses apr\350s l'envoi d'un )EM(keepa)HY(live)YH()ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_max_orphans)ES( )DD()0 P(Nombre maximum de sockets TCP qui ne sont pas reli\351s \340 un descrip)HY(teur)YH( de fichier utili)HY(sa)HY(teur)YH(, g\351r\351 par le syst\350me. Si ce nombre est d\351pass\351, les connexions orphe)HY(lines)YH( sont imm\351)HY(dia)HY(te)HY(ment)YH( r\351ini)HY(tia)HY(li)HY(s\351es)YH( et un aver)HY(tis)HY(se)HY(ment)YH( est envoy\351. Cette limite existe seule)HY(ment)YH( pour pr\351ve)HY(nir)YH( des attaques de d\351ni de services simples. Vous ne devez pas compter sur ceci ou dimi)HY(nuer)YH( cette limite arti)HY(fi)HY(ciel)HY(le)HY(ment)YH(, mais plut\364t l'augmen)HY(ter)YH( \201proba)HY(ble)HY(ment)YH( apr\350s avoir augment\351 la m\351moire\202 si les condi)HY(tions)YH( du r\351seau r\351clament plus que cette valeur par d\351faut et r\351gler vos services r\351seau pour qu'ils d\351truisent sans tarder ce type d'\351tat. Laissez-moi vous rappe)HY(ler)YH( encore que chaque orphe)HY(lin)YH( consomme jusqu'\340 environ 64K de m\351moire non )EM(swap)HY(pable)YH()ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_orphan_retries)ES( )DD()0 P(Combien d'essais avant de d\351truire une connexion TCP, ferm\351e par notre c\364t\351. La valeur par d\351faut de 7 corres)HY(pond)YH( \340 un temps d'environ 50s \340 16 min suivant le RTO)Ca(. Si votre machine supporte un serveur Web, vous pouvez envi)HY(sa)HY(ger)YH( de baisser cette valeur, dans la mesure o\371 de tels sockets peuvent consom)HY(mer)YH( des ressources signi)HY(fi)HY(ca)HY(tives)YH(. Cf )SM(tcp_max_orphans)ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_max_syn_backlog)ES( )DD()0 P(Nombre maximum de requ\352tes d'une connexion m\351mo)HY(ri)HY(s\351e)YH(, qui n'avait pas encore re\347u d'accus\351 de r\351cep)HY(tion)YH( du client connect\351. La valeur par d\351faut est de 1024 pour des syst\350mes avec plus de 128 Mo de m\351moire et 128 pour des machines avec moins de m\351moire. Si un serveur souffre de surcharge, essayez d'augmen)HY(ter)YH( ce nombre. Atten)HY(tion)YH( ! Si vous posi)HY(tion)HY(nez)YH( une valeur sup\351)HY(rieure)YH( \340 1024, il serait pr\351f\351)HY(rable)YH( de changer )SM(TCP_SYNQ_HSIZE)ES( dans le fichier )SM(include/net/tcp.h)ES( pour garder )SM(TCP_SYNQ_HSIZE*16 <= tcp_max_syn_backlog)ES( et de recom)HY(pi)HY(ler)YH( de noyau. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_max_tw_buckets)ES( )DD()0 P(Nombre maximum de sockets )SM(time)HY(wait)YH()ES( g\351r\351es par le syst\350me simul)HY(ta)HY(n\351)HY(ment)YH(. Si ce nombre est d\351pass\351, le socket )SM(time)HY(wait)YH()ES( est imm\351)HY(dia)HY(te)HY(ment)YH( d\351truit et un message d'aver)HY(tis)HY(se)HY(ment)YH( est envoy\351. Cette limite n'existe que pour pr\351ve)HY(nir)YH( des attaques de d\351ni de services simples. Vous ne devez pas dimi)HY(nuer)YH( cette limite arti)HY(fi)HY(ciel)HY(le)HY(ment)YH(, mais plut\364t l'augmen)HY(ter)YH( \201proba)HY(ble)HY(ment)YH( apr\350s avoir augment\351 la m\351moire\202 si les condi)HY(tions)YH( du r\351seau r\351clament plus que cette valeur par d\351faut. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_retrans_collapse)ES( )DD()0 P(Compa)HY(ti)HY(bi)HY(lit\351)YH( bug \340 bug avec certaines impri)HY(mantes)YH( d\351fec)HY(tueuses)YH(. Tenta)HY(tive)YH( d'envoi de plus gros paquets lors de la retrans)HY(mis)HY(sion)YH( pour contour)HY(ner)YH( le bug de certaines piles TCP. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_retries1)ES( )DD()0 P(Combien d'essais avant de d\351cider que quelque chose est erron\351 et qu'il est n\351ces)HY(saire)YH( d'infor)HY(mer)YH( de cette suspi)HY(cion)YH( la couche r\351seau. La valeur mini)HY(male)YH( du RFC)Ca( est de 3. C'est la valeur par d\351faut ; elle corres)HY(pond)YH( \340 un temps d'environ 3 sec \340 8 min suivant le RTO)Ca(. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_retries2)ES( )DD()0 P(Combien d'essais avant de d\351truire une connexion TCP active. Le )R30 2 A(RFC 1122)EA( pr\351cise que la limite ne devrait pas d\351pas)HY(ser)YH( 100 secondes. C'est un nombre trop petit. La valeur par d\351faut de 15 corres)HY(pond)YH( \340 un temps de environ 13 \340 30 minutes suivant le RTO)Ca(. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_rfc1337)ES( )DD()0 P(Ce bool\351en active un recti)HY(fi)HY(ca)HY(tif)YH( pour \253\240l'assas)HY(si)HY(nat)YH( hasar)HY(deux)YH( des time-wait dans tcp\240\273, d\351crit dans le RFC 1337. S'il est activ\351, le noyau rejette les paquets RST pour les sockets \340 l'\351tat de )SM(time-wait)ES(. Par d\351faut\240: 0 )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_sack)ES( )DD()0 P(Utilise un ACK s\351lec)HY(tif)YH( qui peut \352tre utilis\351 pour signi)HY(fier)YH( que des paquets sp\351ci)HY(fiques)YH( sont manquant. Faci)HY(lite)YH( ainsi une r\351cu)HY(p\351)HY(ra)HY(tion)YH( rapide. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_stdurg)ES( )DD()0 P(Utilise l'inter)HY(pr\351)HY(ta)HY(tion)YH( du RFC )EM(Host Requi)HY(re)HY(ments)YH()ES( du champ TCP poin)HY(teur)YH( urgent. La plupart des h\364tes utilisent la vieille inter)HY(pr\351)HY(ta)HY(tion)YH( BSD. Donc, si vous activez cette option, il se peut que Linux ne commu)HY(nique)YH( plus correc)HY(te)HY(ment)YH( avec eux. Par d\351faut\240: FALSE \201FAUX\202 )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_syn_retries)ES( )DD()0 P(Nombre de paquets SYN que le noyau enverra avant de tenter l'\351tablis)HY(se)HY(ment)YH( d'une nouvelle connexion. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_synack_retries)ES( )DD()0 P(Pour ouvrir l'autre c\364t\351 de la connexion, le noyau envoie un SYN avec un ACK super)HY(pos\351)YH( \201)EM(piggy)HY(back)YH()ES(\202, pour accuser r\351cep)HY(tion)YH( du SYN pr\351c\351)HY(dem)HY(ment)YH( envoy\351. C'est la deuxi\350me partie de la poign\351e de main \340 trois voies \201)EM(three)HY(way)YH( hand)HY(shake)YH()ES(\202. Cette confi)HY(gu)HY(ra)HY(tion)YH( d\351ter)HY(mine)YH( le nombre de paquets SYN+ACK \340 envoyer avant que le noyau n'aban)HY(donne)YH( la connexion. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_times)HY(tamps)YH()ES( )DD()0 P(Les estam)HY(pillages)YH( horaires sont utili)HY(s\351s)YH(, entre autres, pour se prot\351)HY(ger)YH( du rebou)HY(clage)YH( des num\351ros de s\351quence. On peut conce)HY(voir)YH( qu'un lien \340 1 gigabit puisse de nouveau rencon)HY(trer)YH( un num\351ro de s\351quence pr\351c\351)HY(dent)YH( avec une valeur hors-ligne parcequ'il \351tait d'une g\351n\351)HY(ra)HY(tion)YH( pr\351c\351)HY(dente)YH(. L'estam)HY(pillage)YH( horaire permet de recon)HY(na\356tre)YH( cet \253\240ancien paquet\240\273. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_tw_recycle)ES( )DD()0 P(Mise en place du recy)HY(clage)YH( rapide des sockets )SM(TIME-WAIT)ES(. La valeur par d\351faut est 1. Celle-ci ne devrait pas \352tre chang\351e sans le conseil/demande d'experts tech)HY(niques)YH(. )EP()0 DT()SM(/proc/sys/net/ipv4/tcp_window_scaling)ES( )DD()0 P(TCP/IP auto)HY(rise)YH( norma)HY(le)HY(ment)YH( des fen\352tres jusqu'\340 une taille de 65535 octets. Pour des r\351seaux vrai)HY(ment)YH( rapides, cela peut ne pas \352tre assez. Les options )SM(windows scaling)ES( auto)HY(risent)YH( des fen\352tres jusqu'au giga)HY(oc)HY(tet)YH(, ce qui est adapt\351 pour les produits \340 grande bande passante. )EP()LD()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 109 H(2.2.\240Confi)WB 276 Sn()HY(gu)HY(ra)HY(tion)YH()WB 108 Sn( des p\351ri)HY(ph\351)HY(riques)YH()EH()BR()BR()BR()0 P()SM(DEV)ES( peut d\351si)HY(gner)YH( soit une inter)HY(face)YH( r\351elle, soit )SM(all)ES(, soit )SM(default)ES(. )SM(Default)ES( change \351gale)HY(ment)YH( les para)HY(m\350tres)YH( des inter)HY(faces)YH( qui seront cr\351\351es par la suite.)EP()BR()0 DL()0 DT()SM(/proc/sys/net/ipv4/conf/DEV/accept_redi)HY(rects)YH()ES( )DD()0 P(Si un routeur d\351cide que vous l'utili)HY(sez)YH( \340 tort \201c'est-\340-dire qu'il a besoin de r\351-envoyer votre paquet sur la m\352me inter)HY(face)YH(\202, il vous enverra un message )SM(ICMP Redi)HY(rect)YH()ES(. Cela pr\351sente cepen)HY(dant)YH( un petit risque pour la s\351cu)HY(rit\351)YH(, et vous pouvez le d\351sac)HY(ti)HY(ver)YH( ou utili)HY(ser)YH( les redi)HY(rec)HY(tions)YH( s\351cu)HY(ri)HY(s\351es)YH(. )EP()0 DT()SM(/proc/sys/net/ipv4/conf/DEV/accept_source_route)ES( )DD()0 P(Plus vrai)HY(ment)YH( utilis\351. On l'utili)HY(sait)YH( pour \352tre capable de donner \340 un paquet une liste d'adresses IP \340 visiter. Linux peut \352tre confi)HY(gur\351)YH( pour satis)HY(faire)YH( cette option IP. )EP()0 DT()SM(/proc/sys/net/ipv4/conf/DEV/bootp_relay)ES( )DD()0 P(Accepte les paquets avec une adresse source 0.b.c.d et des adresses desti)HY(na)HY(tions)YH( qui ne corres)HY(pondent)YH( ni \340 cet h\364te, ni au r\351seau local. On suppose qu'un d\351mon de relais BOOTP)Ca( inter)HY(cep)HY(tera)YH( et trans)HY(met)HY(tra)YH( de tels paquets. )EP()0 P(La valeur par d\351faut est 0, puisque cette fonc)HY(tion)HY(na)HY(lit\351)YH( n'est pas encore impl\351)HY(men)HY(t\351e)YH( \201noyau 2.2.12\202. )EP()0 DT()SM(/proc/sys/net/ipv4/conf/DEV/forwar)HY(ding)YH()ES( )DD()0 P(Active ou d\351sac)HY(tive)YH( la trans)HY(mis)HY(sion)YH( IP sur cette inter)HY(face)YH(. )EP()0 DT()SM(/proc/sys/net/ipv4/conf/DEV/log_martians)ES( )DD()0 P(Voir la section sur le )EM()0 105 1 A(Filtrage de Chemin Inverse)105 0 TN TL()Ec /AF f D()ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/conf/DEV/mc_forwar)HY(ding)YH()ES( )DD()0 P(Si vous faites de la trans)HY(mis)HY(sion)YH( multi)HY(dis)HY(tri)HY(bu)HY(tion)YH( \201)EM(multi)HY(cast)YH()ES(\202 sur cette inter)HY(face)YH(. )EP()0 DT()SM(/proc/sys/net/ipv4/conf/DEV/proxy_arp)ES( )DD()0 P(Si vous confi)HY(gu)HY(rez)YH( ceci \340 1, cet inter)HY(face)YH( r\351pon)HY(dra)YH( aux requ\352tes ARP pour les adresses que le noyau doit router. Peut \352tre tr\350s utile si vous mettez en place des \253\240pseudo ponts ip\240\273. Prenez bien garde d'avoir des masques de sous-r\351seau corrects avant d'activer cette option. Faites \351gale)HY(ment)YH( atten)HY(tion)YH( que le rp_filter agisse aussi sur le requ\352tes ARP\240! )EP()0 DT()SM(/proc/sys/net/ipv4/conf/DEV/rp_filter)ES( )DD()0 P(Voir la section sur le )EM()0 105 1 A(Filtrage de Chemin Inverse)105 0 TN TL()Ec /AF f D()ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/conf/DEV/secure_redi)HY(rects)YH()ES( )DD()0 P(Accepte les messages de redi)HY(rec)HY(tion)YH( ICMP seule)HY(ment)YH( pour les passe)HY(relles)YH( indiqu\351es dans la liste des passe)HY(relles)YH( par d\351faut. Activ\351 par d\351faut. )EP()0 DT()SM(/proc/sys/net/ipv4/conf/DEV/send_redi)HY(rects)YH()ES( )DD()0 P(Active la possi)HY(bi)HY(lit\351)YH( d'envoyer les messages de redi)HY(rec)HY(tions)YH( mention)HY(n\351es)YH( ci-dessus. )EP()0 DT()SM(/proc/sys/net/ipv4/conf/DEV/shared_media)ES( )DD()0 P(Si cela n'est pas activ\351, le noyau ne consi)HY(d\350re)YH( pas que diff\351)HY(rents)YH( sous-r\351seaux peuvent commu)HY(niquer)YH( direc)HY(te)HY(ment)YH( sur cette inter)HY(face)YH(. La confi)HY(gu)HY(ra)HY(tion)YH( par d\351faut est )SM(Yes)ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/conf/DEV/tag)ES( )DD()0 P(FIXME: \340 remplir )EP()LD()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 110 H(2.3.\240Poli)WB 277 Sn()HY(tique)YH()WB 109 Sn( de voisi)HY(nage)YH()EH()BR()BR()BR()0 P()SM(DEV)ES( peut d\351si)HY(gner)YH( soit une inter)HY(face)YH( r\351elle, soit )SM(all)ES(, soit )SM(default)ES(. )SM(Default)ES( change \351gale)HY(ment)YH( les para)HY(m\350tres)YH( des inter)HY(faces)YH( qui seront cr\351\351es par la suite.)EP()BR()0 DL()0 DT()SM(/proc/sys/net/ipv4/neigh/DEV/anycast_delay)ES( )DD()0 P(Valeur maximum du d\351lai al\351a)HY(toire)YH( de r\351ponse exprim\351 en )EM(jiffies)ES( \2011/100 sec\202 aux messages de solli)HY(ci)HY(ta)HY(tion)YH( des voisins. N'est pas encore impl\351)HY(ment\351)YH( \201Linux ne poss\350de pas encore le support )EM(anycast)ES(\202. )EP()0 DT()SM(/proc/sys/net/ipv4/neigh/DEV/app_solicit)ES( )DD()0 P(D\351ter)HY(mine)YH( le nombre de requ\352tes \340 envoyer au d\351mon ARP de l'espace utili)HY(sa)HY(teur)YH(. Utili)HY(sez)YH( 0 pour d\351sac)HY(ti)HY(ver)YH(. )EP()0 DT()SM(/proc/sys/net/ipv4/neigh/DEV/base_reachable_time)ES( )DD()0 P(Une valeur de base utili)HY(s\351e)YH( pour le calcul du temps al\351a)HY(toire)YH( d'acc\350s comme sp\351ci)HY(fi\351)YH( dans le RFC2461. )EP()0 DT()SM(/proc/sys/net/ipv4/neigh/DEV/delay_first_probe_time)ES( )DD()0 P(D\351lai avant de tester pour la premi\350re fois si le voisin peut \352tre atteint. \201voir )SM(gc_stale_time)ES(\202 )EP()0 DT()SM(/proc/sys/net/ipv4/neigh/DEV/gc_stale_time)ES( )DD()0 P(D\351ter)HY(mine)YH( la fr\351quence \340 laquelle on doit v\351ri)HY(fier)YH( les vieilles entr\351es ARP. Si une entr\351e est obso)HY(l\350te)YH(, elle devra de nouveau \352tre r\351solue \201ce qui est utile quand une adresse IP a \351t\351 attri)HY(bu\351e)YH( \340 une autre machine\202. Si )SM(ucast_solicit)ES( est sup\351)HY(rieur)YH( \340 0, alors on essaie d'abord d'envoyer un paquet ARP direc)HY(te)HY(ment)YH( \340 l'h\364te connu. Si cela \351choue, et que )SM(mcast_solicit)ES( est sup\351)HY(rieur)YH( \340 0, alors une requ\352te ARP est multi)HY(dif)HY(fu)HY(s\351e)YH(. )EP()0 DT()SM(/proc/sys/net/ipv4/neigh/DEV/lock)HY(time)YH()ES( )DD()0 P(Une entr\351e ARP n'est rempla)HY(c\351e)YH( par une nouvelle que si l'ancienne est au moins pr\351sente depuis )SM(lock)HY(time)YH()ES(. Cela \351vite trop d'\351cri)HY(ture)YH( dans le cache. )EP()0 DT()SM(/proc/sys/net/ipv4/neigh/DEV/mcast_solicit)ES( )DD()0 P(Nombre maximum d'essais cons\351)HY(cu)HY(tifs)YH( pour une solli)HY(ci)HY(ta)HY(tion)YH( )EM(multi)HY(cast)YH()ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/neigh/DEV/proxy_delay)ES( )DD()0 P(Temps maximum \201le temps r\351el est al\351a)HY(toire)YH( et compris entre 0 et )SM(proxy)HY(time)YH()ES(\202 avant de r\351pondre \340 une requ\352te ARP pour laquelle nous avons une entr\351e de proxy ARP. Peut \352tre utilis\351 dans certains cas pour se pr\351mu)HY(nir)YH( des inon)HY(da)HY(tions)YH( r\351seaux. )EP()0 DT()SM(/proc/sys/net/ipv4/neigh/DEV/proxy_qlen)ES( )DD()0 P(Longueur maxi)HY(male)YH( de la file d'attente du tempo)HY(ri)HY(sa)HY(teur)YH( de cache arp en attente \201Voir )SM(proxy_delay)ES(\202. )EP()0 DT()SM(/proc/sys/net/ipv4/neigh/DEV/retrans_time)ES( )DD()0 P(Le temps, exprim\351 en )EM(jiffies)ES( \2011/100 sec\202, entre deux requ\352tes ARP. Utilis\351 pour la r\351so)HY(lu)HY(tion)YH( d'adresses et pour d\351ter)HY(mi)HY(ner)YH( si un voisin est inac)HY(ces)HY(sible)YH(. )EP()0 DT()SM(/proc/sys/net/ipv4/neigh/DEV/ucast_solicit)ES( )DD()0 P(Nombre maximum de requ\352tes ARP unicast. )EP()0 DT()SM(/proc/sys/net/ipv4/neigh/DEV/unres_qlen)ES( )DD()0 P(Longueur maximum de la file d'attente pour la requ\352te ARP en cours\240: le nombre de paquets qui sont accep)HY(t\351s)YH( des autres couches pendant la r\351so)HY(lu)HY(tion)YH( ARP d'une adresse. )EP()0 DT(Inter)HY(net)YH( QoS: Archi)HY(tec)HY(tures)YH( and Mecha)HY(nisms)YH( for Quality of Service, Zheng Wang, ISBN 1-55860-608-4)DD()0 P(Livre trai)HY(tant)YH( des sujets li\351s \340 la qualit\351 de service. Bien pour comprendre les concepts de base. )EP()LD()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 111 H(2.4.\240Confi)WB 278 Sn()HY(gu)HY(ra)HY(tion)YH()WB 110 Sn( du routage)EH()BR()BR()BR()BR()0 DL()0 DT()SM(/proc/sys/net/ipv4/route/error_burst)ES( )DD()0 P(Ces para)HY(m\350tres)YH( sont utili)HY(s\351s)YH( pour limiter le nombre de messages d'aver)HY(tis)HY(se)HY(ment)YH( \351crits dans le journal du noyau par le code de routage. Plus le para)HY(m\350tre)YH( )SM(error_burst)ES( est grand, moins il y aura de messages. )SM(Error_burst)ES( contr\364le le moment o\371 les messages seront suppri)HY(m\351s)YH(. Les confi)HY(gu)HY(ra)HY(tions)YH( par d\351faut se limitent \340 un message d'aver)HY(tis)HY(se)HY(ment)YH( toutes les cinq secondes. )EP()0 DT()SM(/proc/sys/net/ipv4/route/error_cost)ES( )DD()0 P(Ces para)HY(m\350tres)YH( sont utili)HY(s\351s)YH( pour limiter le nombre de messages d'aver)HY(tis)HY(se)HY(ment)YH( \351crits dans le journal du noyau par le code de routage. Plus le para)HY(m\350tre)YH( )SM(error_cost)ES( est grand, moins il y aura de messages. )SM(error_burst)ES( contr\364le le moment o\371 les messages seront jet\351s. Les confi)HY(gu)HY(ra)HY(tions)YH( par d\351faut se limitent \340 un message d'aver)HY(tis)HY(se)HY(ment)YH( toutes les cinq secondes. )EP()0 DT()SM(/proc/sys/net/ipv4/route/flush)ES( )DD()0 P(L'\351cri)HY(ture)YH( dans ce fichier provoque la vidange du cache du routage. )EP()0 DT()SM(/proc/sys/net/ipv4/route/gc_elas)HY(ti)HY(city)YH()ES( )DD()0 P(Valeurs qui contr\364lent la fr\351quence et le compor)HY(te)HY(ment)YH( de l'algo)HY(rithme)YH( )EM(garbage collec)HY(tion)YH()ES( du cache de routage. Ceci peut \352tre impor)HY(tant)YH( en cas de d\351faut. Au moins )SM(gc_timeout)ES( secondes s'\351cou)HY(le)HY(ront)YH( avant que le noyau ne passe \340 une autre route si la pr\351c\351)HY(dente)YH( n'est plus op\351ra)HY(tion)HY(nelle)YH(. Confi)HY(gur\351)YH( par d\351faut \340 300. Dimi)HY(nuez)YH( cette valeur si vous voulez passer plus rapi)HY(de)HY(ment)YH( ce type de probl\350me. )EP()0 P(Voir aussi )R31 2 A( ce message)EA( par Ard van Breemen. )EP()0 DT()SM(/proc/sys/net/ipv4/route/gc_inter)HY(val)YH()ES( )DD()0 P(Voir )SM(/proc/sys/net/ipv4/route/gc_elas)HY(ti)HY(city)YH()ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/route/gc_min_inter)HY(val)YH()ES( )DD()0 P(Voir )SM(/proc/sys/net/ipv4/route/gc_elas)HY(ti)HY(city)YH()ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/route/gc_thresh)ES( )DD()0 P(Voir )SM(/proc/sys/net/ipv4/route/gc_elas)HY(ti)HY(city)YH()ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/route/gc_timeout)ES( )DD()0 P(Voir )SM(/proc/sys/net/ipv4/route/gc_elas)HY(ti)HY(city)YH()ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/route/max_delay)ES( )DD()0 P(D\351lai d'attente pour la vidange du cache du routage. )EP()0 DT()SM(/proc/sys/net/ipv4/route/max_size)ES( )DD()0 P(Taille maximum du cache de routage. Les vieilles entr\351es seront purg\351es quand le cache aura atteint cette taille. )EP()0 DT()SM(/proc/sys/net/ipv4/route/min_adv_mss)ES( )DD()0 P(FIXME: \340 remplir )EP()0 DT()SM(/proc/sys/net/ipv4/route/min_delay)ES( )DD()0 P(D\351lai d'attente pour vider le cache de routage. )EP()0 DT()SM(/proc/sys/net/ipv4/route/min_pmtu)ES( )DD()0 P(FIXME: \340 remplir )EP()0 DT()SM(/proc/sys/net/ipv4/route/mtu_expires)ES( )DD()0 P(FIXME: \340 remplir )EP()0 DT()SM(/proc/sys/net/ipv4/route/redi)HY(rect)YH(_load)ES( )DD()0 P(Facteurs qui d\351ter)HY(minent)YH( si plus de redi)HY(rec)HY(tions)YH( ICMP doivent \352tre envoy\351es \340 un h\364te sp\351ci)HY(fique)YH(. Aucune redi)HY(rec)HY(tion)YH( ne sera envoy\351e une fois que la limite de charge \201)EM(load limit)ES(\202 ou que le nombre maximum de redi)HY(rec)HY(tions)YH( aura \351t\351 atteint. )EP()0 DT()SM(/proc/sys/net/ipv4/route/redi)HY(rect)YH(_number)ES( )DD()0 P(Voir )SM(/proc/sys/net/ipv4/route/redi)HY(rect)YH(_load)ES(. )EP()0 DT()SM(/proc/sys/net/ipv4/route/redi)HY(rect)YH(_silence)ES( )DD()0 P(Tempo)HY(ri)HY(sa)HY(tion)YH( pour les redi)HY(rec)HY(tions)YH(. Au dela de cette p\351riode, les redi)HY(rec)HY(tions)YH( seront de nouveau envoy\351es, m\352me si elles ont \351t\351 stop)HY(p\351es)YH( parce que la charge ou le nombre limite a \351t\351 atteint. )EP()LD()BR()2 Sl()BR()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 112 H(Chapitre\24014.\240Gestion)WB 279 Sn()HY(naires)YH()WB 111 Sn( de mise en file d'attente avanc\351s & moins communs)EH()BR()BR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 112 1 A(1. )SM(bfifo)ES(/)SM(pfifo)ES()112 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 113 1 A(1.1. Para)HY(m\350tres)YH( & usage)113 0 TN TL()Ec /AF f D()LD()0 DT()0 114 1 A(2. Algo)HY(rithme)YH( Clark-Shenker-Zhang \201CSZ\202)114 0 TN TL()Ec /AF f D()0 DT()0 115 1 A(3. )SM(DSMARK)ES()115 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 116 1 A(3.1. Intro)HY(duc)HY(tion)YH()116 0 TN TL()Ec /AF f D()0 DT()0 117 1 A(3.2. A quoi )SM(DSMARK)ES( est-il reli\351\240?)117 0 TN TL()Ec /AF f D()0 DT()0 118 1 A(3.3. Guide des services diff\351)HY(ren)HY(ci\351s)YH()118 0 TN TL()Ec /AF f D()0 DT()0 119 1 A(3.4. Travailler avec )SM(DSMARK)ES()119 0 TN TL()Ec /AF f D()0 DT()0 120 1 A(3.5. Comment )SM(SCH_DSMARK)ES( travaille.)120 0 TN TL()Ec /AF f D()0 DT()0 121 1 A(3.6. Le filtre TC_INDEX)121 0 TN TL()Ec /AF f D()LD()0 DT()0 122 1 A(4. Gestion)HY(naire)YH( de mise en file d'attente d'entr\351e \201)EM(Ingress qdisc)ES(\202)122 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 123 1 A(4.1. Para)HY(m\350tres)YH( & usage)123 0 TN TL()Ec /AF f D()LD()0 DT()0 124 1 A(5. )EM(Random Early Detec)HY(tion)YH()ES( \201RED\202)124 0 TN TL()Ec /AF f D()0 DT()0 125 1 A(6. Generic Random Early Detec)HY(tion)YH()125 0 TN TL()Ec /AF f D()0 DT()0 126 1 A(7. Emula)HY(tion)YH( VC/ATM)126 0 TN TL()Ec /AF f D()0 DT()0 127 1 A(8. Weigh)HY(ted)YH( Round Robin \201WRR\202)127 0 TN TL()Ec /AF f D()LD()BR()0 P(Si vous consta)HY(tez)YH( que vous avez des besoins qui ne sont pas g\351r\351s par les files d'attente cit\351es pr\351c\351)HY(dem)HY(ment)YH(, le noyau contient quelques autres files d'attente plus sp\351cia)HY(li)HY(s\351es)YH( mention)HY(n\351es)YH( ici.)EP()2 Sl()BR()BR()BR()BR()0 2 113 H(1.\240)WB 280 Sn()WB 112 Sn()SM(bfifo)ES(/)SM(pfifo)ES()EH()BR()BR()BR()0 P(Ces files d'attente sans classes sont plus simples que )SM(pfifo_fast)ES( dans la mesure o\371 elles n'ont pas de bandes internes, tout le trafic \351tant vrai)HY(ment)YH( \351qui)HY(valent)YH(. Elles ont cepen)HY(dant)YH( l'avan)HY(tage)YH( impor)HY(tant)YH( de r\351ali)HY(ser)YH( des statis)HY(tiques)YH(. Donc, m\352me si vous n'avez pas besoin de mise en forme ou de donner une prio)HY(rit\351)YH(, vous pouvez employer ce gestion)HY(naire)YH( pour d\351ter)HY(mi)HY(ner)YH( l'arri\351r\351 \201)EM(backlog)ES(\202 de votre inter)HY(face)YH(.)EP()0 P()SM(pfifo)ES( mesure en paquets et )SM(bfifo)ES( en octets.)EP()2 Sl()BR()BR()BR()BR()0 3 114 H(1.1.\240Para)WB 281 Sn()HY(m\350tres)YH()WB 113 Sn( & usage)EH()BR()BR()BR()BR()0 DL()0 DT()SM(limit)ES()DD()0 P(Sp\351ci)HY(fie)YH( la taille de la file d'attente. Mesur\351e en octets pour )SM(bfifo)ES( et en paquets pour )SM(pfifo)ES(. Par d\351faut, corres)HY(pond)YH( \340 des paquets de taille \351gale au para)HY(m\350tre)YH( )SM(txqueue)HY(len)YH()ES( de l'inter)HY(face)YH( \201voir le chapitre )0 53 1 A(pfifo_fast)53 0 TN TL()Ec /AF f D(\202 ou )SM(txqueue)HY(len)YH(*mtu)ES( octets pour )SM(bfifo)ES(. )EP()LD()BR()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 115 H(2.\240Algo)WB 282 Sn()HY(rithme)YH()WB 114 Sn( Clark-Shenker-Zhang \201CSZ\202)EH()BR()BR()BR()0 P(Ceci est si th\351o)HY(rique)YH( que m\352me Alexey \201l'auteur prin)HY(ci)HY(pal)YH( de CBQ\202 pr\351tend ne pas le comprendre. De son propre avis\240:)EP()BR()BQ()0 P(David D. Clark, Scott Shenker and Lixia Zhang )EM(Suppor)HY(ting)YH( Real-Time Appli)HY(ca)HY(tions)YH( in an Inte)HY(gra)HY(ted)YH( Services Packet Network: Archi)HY(tec)HY(ture)YH( and Mecha)HY(nism)YH()ES(.)EP()0 P(Comme je le comprends, l'id\351e prin)HY(ci)HY(pale)YH( est de cr\351er des flux WFQ)Ca( pour chaque service garanti et d'allouer le reste de la bande passante au flux factice, appel\351 )SM(flow-0)ES(. Le Flux-0 inclut le trafic de service pr\351dic)HY(tif)YH( et le trafic )EM(best-effort)ES(. Il est trait\351 par un ordon)HY(nan)HY(ceur)YH( de prio)HY(rit\351)YH( qui alloue la bande passante de plus grande prio)HY(rit\351)YH( aux services pr\351dic)HY(tifs)YH(, et le reste aux paquets )EM(best-effort)ES(.)EP()0 P(Notez que dans CSZ)Ca(, les flux ne sont )EM(PAS)ES( limit\351s \340 leur bande passante. On suppose que le flux a pass\351 le contr\364le d'admis)HY(sion)YH( \340 la fron)HY(ti\350re)YH( du r\351seau QoS)Ca( et qu'il n'a pas besoin de mises en forme suppl\351)HY(men)HY(taires)YH(. N'importe quelles autres tenta)HY(tives)YH( pour am\351lio)HY(rer)YH( le flux ou pour le mettre en forme gr\342ce \340 un seau de jetons lors d'\351tapes inter)HY(m\351)HY(diaires)YH( intro)HY(dui)HY(ront)YH( des retards non d\351sir\351s et augmen)HY(te)HY(ront)YH( la gigue.)EP()0 P(A l'heure actuelle, CSZ)Ca( est le seul ordon)HY(nan)HY(ceur)YH( qui fournit un v\351ri)HY(table)YH( service garanti. Les autres impl\351)HY(men)HY(ta)HY(tions)YH( \201incluant CBQ)Ca(\202 n'assurent pas un d\351lai garanti et rendent la gigue al\351a)HY(toire)YH(.)EP()0 P(Ne semble pas actuel)HY(le)HY(ment)YH( un bon candi)HY(dat)YH( \340 utili)HY(ser)YH(, \340 moins que vous n'ayez lu et compris l'article mentionn\351.)EP()QB()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 116 H(3.\240)WB 283 Sn()WB 115 Sn()SM(DSMARK)ES()EH()BR()BR()BR()BR()0 P()BD(R\351sum\351)ES()EP()0 P( Esteve Camps )BR()0 P( )SM(<)0 2 A(marvin@grn.es)EA(>)ES( )SM(<)0 2 A(esteve@hades.udg.es)EA(>)ES( )EP()BR( Ce texte est un extrait de ma th\350se sur le )EM(support QoS dans Linux)ES(, Septembre 2000. )EP()BR()0 P(Docu)HY(ments)YH( sources\240:)EP()BR()UL()0 P()-1 LI()R32 2 A( Draft-almes)HY(ber)HY(ger)YH(-wajhak-diff)HY(serv)YH(-linux-01.txt)EA(. )EP()0 P()-1 LI(Exemples de la distri)HY(bu)HY(tion)YH( iproute2. )EP()0 P()-1 LI()R33 2 A( White Paper-QoS proto)HY(cols)YH( and archi)HY(tec)HY(tures)YH()EA( et )R34 2 A( Foires Aux Ques)HY(tions)YH( IP QoS)EA(, les deux par )EM(Quality of Service Forum)ES(. )EP()LU()BR()2 Sl()BR()BR()BR()BR()0 3 117 H(3.1.\240Intro)WB 284 Sn()HY(duc)HY(tion)YH()WB 116 Sn()EH()BR()BR()BR()0 P(Avant tout, il serait pr\351f\351)HY(rable)YH( de lire les RFC \351crits sur ce sujet \201RFC2474, RFC2475, RFC2597 et RFC2598\202 sur le )R35 2 A( site web du groupe de travail Diff)HY(Serv)YH( IETF)EA( et sur le )R36 2 A( site web de Werner Almes)HY(ber)HY(ger)YH()EA( \201Il a \351crit le code permet)HY(tant)YH( le support des Services Diff\351)HY(ren)HY(ci\351s)YH( sous Linux\202.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 118 H(3.2.\240A)WB 285 Sn()WB 117 Sn( quoi )SM(DSMARK)ES( est-il reli\351\240?)EH()BR()BR()BR()0 P()SM(DSMARK)ES( est un gestion)HY(naire)YH( de mise en file d'attente qui offre les fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( dont ont besoin les services diff\351)HY(ren)HY(ci\351s)YH( \201)EM(Diffe)HY(ren)HY(tia)HY(ted)YH( Services)ES(\202 \201\351gale)HY(ment)YH( appel\351s Diff)HY(Serv)YH( ou tout simple)HY(ment)YH( DS\202. )EM(Diff)HY(Serv)YH()ES( est l'une des deux archi)HY(tec)HY(tures)YH( actuelles de la Qualit\351 de Services \201QoS : )EM(Quality of Services)ES(\202 \201l'autre est appel\351e )EM(services int\351)HY(gr\351s)YH()ES( \201)EM(Inte)HY(gra)HY(ted)YH( Services)ES(\202. Elle se base sur la valeur du champ DS contenu dans l'en-t\352te IP du paquet.)EP()0 P(Une des premi\350res solu)HY(tions)YH( dans IP pour offrir des niveaux de qualit\351 de services \351tait le champ )EM(Type de Service)ES( \201octet TOS\202 de l'en-t\352te IP. En modi)HY(fiant)YH( la valeur de ce champ, nous pouvions choisir un niveau \351lev\351/faible du d\351bit, du d\351lai ou de la fiabi)HY(lit\351)YH(. Cepen)HY(dant)YH(, cela ne four)HY(nis)HY(sait)YH( pas une flexi)HY(bi)HY(lit\351)YH( suffi)HY(sante)YH( pour les besoins de nouveaux services \201comme les appli)HY(ca)HY(tions)YH( temps r\351el, les appli)HY(ca)HY(tions)YH( inter)HY(ac)HY(tives)YH( et autres\202. Par la suite, de nouvelles archi)HY(tec)HY(tures)YH( sont appa)HY(rues)YH(. L'une d'elle a \351t\351 )EM(Diff)HY(Serv)YH()ES( qui a gard\351 les bits TOS)Ca( et les a renom)HY(m\351s)YH( champ DS)Ca(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 119 H(3.3.\240Guide)WB 286 Sn()WB 118 Sn( des services diff\351)HY(ren)HY(ci\351s)YH()EH()BR()BR()BR()0 P(Les services diff\351)HY(ren)HY(ci\351s)YH( sont orien)HY(t\351s)YH( groupes. Cela signi)HY(fie)YH( que nous ne savons rien des flux \201ce sera le but des services int\351)HY(gr\351s)YH( \201)EM(inte)HY(gra)HY(ted)YH( Services)ES(\202\202. Nous connais)HY(sons)YH( par contre les agr\351)HY(ga)HY(tions)YH( de flux et nous adop)HY(te)HY(rons)YH( des compor)HY(te)HY(ments)YH( diff\351)HY(rents)YH( suivant l'agr\351)HY(ga)HY(tion)YH( \340 laquelle appar)HY(tient)YH( le paquet.)EP()0 P(Quand un paquet arrive \340 un noeud fron)HY(ta)HY(lier)YH( \201noeud d'entr\351e du domaine Diff)HY(Serv)YH()Ca(\202 et entre dans un domaine Diff)HY(Serv)YH()Ca(, nous devrons avoir une poli)HY(tique)YH(, une mise en forme et/ou un marquage de ces paquets \201le marquage fait r\351f\351)HY(rence)YH( \340 la mise en place d'une valeur dans le champ DS. Comme on le ferait pour des vaches :-\202\202. Ce sera cette marque/valeur que les noeuds internes de votre domaine Diff)HY(Serv)YH()Ca( regar)HY(de)HY(rons)YH( pour d\351ter)HY(mi)HY(ner)YH( quel compor)HY(te)HY(ment)YH( ou niveau de qualit\351 de service appliquer.)EP()0 P(Comme vous pouvez le d\351duire, les Services Diff\351)HY(ren)HY(ci\351s)YH( impliquent un domaine sur lequel toutes les r\350gles DS)Ca( devront \352tre appliqu\351es. Vous pouvez raison)HY(ner)YH( de la fa\347on suivante\240: \253\240Je clas)HY(si)HY(fie)HY(rai)YH( tous les paquets entrant dans mon domaine. Une fois qu'ils seront entr\351s dans mon domaine, ils seront soumis aux r\350gles que ma clas)HY(si)HY(fi)HY(ca)HY(tion)YH( impose et chaque noeud travers\351 appliquera son niveau de qualit\351 de service\240\273.)EP()0 P(En fait, vous pouvez appliquer vos propres poli)HY(tiques)YH( dans vos domaines locaux, mais des )EM(auto)HY(ri)HY(sa)HY(tions)YH( au niveau service)ES( devront \352tre consi)HY(d\351)HY(r\351es)YH( lors de la connexion \340 d'autres domaines DS.)EP()0 P(En ce moment, vous vous posez peut-\352tre beau)HY(coup)YH( de ques)HY(tions)YH(. Diff)HY(Serv)YH()Ca( est plus vaste que ce que j'ai expliqu\351. En fait, vous pouvez comprendre que je ne peux pas r\351sumer plus de trois RFC en 50 lignes :-\202.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 120 H(3.4.\240Travailler)WB 287 Sn()WB 119 Sn( avec )SM(DSMARK)ES()EH()BR()BR()BR()0 P(Comme le sp\351ci)HY(fie)YH( la biblio)HY(gra)HY(phie)YH( concer)HY(nant)YH( Diff)HY(Serv)YH()Ca(, nous diff\351)HY(ren)HY(cions)YH( les noeuds fron)HY(ta)HY(liers)YH( et les noeuds int\351)HY(rieurs)YH(. Ce sont deux \351l\351ments impor)HY(tants)YH( dans le chemin qu'emprunte le trafic. Les deux r\351alisent une clas)HY(si)HY(fi)HY(ca)HY(tion)YH( quand un paquet arrive. Le r\351sul)HY(tat)YH( peut \352tre utilis\351 \340 diff\351)HY(rents)YH( endroits lors du proces)HY(sus)YH( DS)Ca( avant que le paquet ne soit lib\351r\351 vers le r\351seau. Cela est possible car le nouveau code Diff)HY(Serv)YH()Ca( fournit une struc)HY(ture)YH( appel\351e )SM(sk_buff)ES(, incluant un nouveau champ appel\351 )SM(skb->tcindex)ES(. Ce champ m\351mo)HY(ri)HY(sera)YH( le r\351sul)HY(tat)YH( de la clas)HY(si)HY(fi)HY(ca)HY(tion)YH( initiale et pourra \352tre utilis\351 \340 plusieurs reprises dans le trai)HY(te)HY(ment)YH( DS)Ca(.)EP()0 P(La valeur )SM(skb->tc_index)ES( sera initia)HY(le)HY(ment)YH( confi)HY(gu)HY(r\351e)YH( par le gestion)HY(naire)YH( de mise en file d'attente )SM(DSMARK)ES(. Cette valeur sera extraite du champ DS)Ca( de l'en-t\352te IP de tous les paquets re\347us. En outre, le clas)HY(si)HY(fi)HY(ca)HY(teur)YH( )SM(cls_tcindex)ES( lira tout ou une partie de la valeur )SM(skb->tcindex)ES( et l'utili)HY(sera)YH( pour s\351lec)HY(tion)HY(ner)YH( les classes.)EP()0 P(Mais, avant tout, regar)HY(dons)YH( la commande )BD(qdisc DSMARK)ES( et ses para)HY(m\350tres)YH(\240:)EP() 1 75 PR(... dsmark indices INDICES [ default_index DEFAULT_INDEX ] [ set_tc_index ])RP()0 P(Que signi)HY(fient)YH( ces para)HY(m\350tres)YH(\240?)EP()BR()UL()0 P()-1 LI()SM(indices)ES(\240: taille de la table des couples \201masque,valeur\202. La valeur maximum est )SM(2^n)ES(, o\371 )SM(n>=0)ES(. )EP()0 P()-1 LI()SM(default_index)ES(\240: index d'entr\351e par d\351faut de la table si aucune corres)HY(pon)HY(dance)YH( n'est trouv\351e. )EP()0 P()-1 LI()SM(set_tc_index)ES(\240: indique au gestion)HY(naire)YH( )SM(DSMARK)ES( de r\351cu)HY(p\351)HY(rer)YH( le champs DS)Ca( et de l'enre)HY(gis)HY(trer)YH( dans )SM(skb->tc_index)ES(. )EP()LU()BR()0 P(Regar)HY(dons)YH( )SM(DSMARK)ES( proc\351)HY(der)YH(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 121 H(3.5.\240Comment)WB 288 Sn()WB 120 Sn( )SM(SCH_DSMARK)ES( travaille.)EH()BR()BR()BR()0 P(Ce gestion)HY(naire)YH( de mise en file d'attente r\351ali)HY(sera)YH( les \351tapes suivantes\240:)EP()BR()UL()0 P()-1 LI(Si vous avez d\351clar\351 l'option )SM(set_tc_index)ES( dans la commande )BD(qdisc)ES(, le champ DS)Ca( est r\351cu)HY(p\351r\351)YH( et m\351mo)HY(ris\351)YH( dans la variable )SM(skb->tc_index)ES(. )EP()0 P()-1 LI(Le clas)HY(si)HY(fi)HY(ca)HY(teur)YH( est invoqu\351. Celui-ci sera ex\351cut\351 et retour)HY(nera)YH( un iden)HY(ti)HY(fi)HY(ca)HY(teur)YH( de classe \201)EM(class ID)ES(\202 qui sera enre)HY(gis)HY(tr\351)YH( dans la variable )SM(skb->tc_index)ES(. Si aucun filtre corres)HY(pon)HY(dant)YH( n'est trouv\351, nous consi)HY(d\351)HY(rons)YH( l'option )SM(default_index)ES( comme \351tant l'iden)HY(ti)HY(fi)HY(ca)HY(teur)YH( de classe \340 enre)HY(gis)HY(trer)YH(. Si, ni )SM(set_tc_index)ES(, ni )SM(default_index)ES( n'ont \351t\351 d\351cla)HY(r\351s)YH(, alors les r\351sul)HY(tats)YH( peuvent \352tre non pr\351dic)HY(tifs)YH(. )EP()0 P()-1 LI( Apr\350s avoir \351t\351 envoy\351 dans le gestion)HY(naire)YH( de file d'attente interne, o\371 le r\351sul)HY(tat)YH( du filtre peut \352tre r\351uti)HY(lis\351)YH(, l'iden)HY(ti)HY(fi)HY(ca)HY(teur)YH( de classe retourn\351 par le gestion)HY(naire)YH( est stock\351 dans la variable )SM(skb->tc_index)ES(. Cette valeur sera utili)HY(s\351e)YH( plus tard pour indexer la table masque-valeur. Le r\351sul)HY(tat)YH( de l'op\351ra)HY(tion)YH( suivante sera assign\351 au paquet\240: )EP() 1 58 PR( Nouveau_champ_DS = \201 Ancien_champ_DS & masque \202 | valeur)RP()0 P()-1 LI( La nouvelle valeur r\351sul)HY(tera)YH( donc d'un ET logique entre les valeurs du champ_DS et du masque, suivi d'un OU logique avec le para)HY(m\350tre)YH( valeur. Regar)HY(dez)YH( la figure suivante pour comprendre tout ce proces)HY(sus)YH(\240: )EP()LU()BR() 21 89 PR( skb->ihp->tos - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > | | ^ | -- Si vous d\351clarez set_tc_index, nous configurons | | <-----Peut changer | la valeur DS dans la variable skb->tc_index | |O le champ DS | A| |R +-|-+ +------+ +---+-+ File d'attente-+ +---N|-----|----+ | | | |filtre|--->| | |--> . . . -->| | | D| | | | | |----->| tc |--->| | | interne | |---->| v | | | | | |index |--->| | | +---------------+ | ---->\201masque,valeur\202| -->| O | +------+ +-|-+--------------^----+ / | \201. , .\202 | | | | ^ | | | | \201. , .\202 | | | +----------|---------|----------------|-------|--+ \201. , .\202 | | | sch_dsmark | | | | | +-|------------|---------|----------------|-------|------------------+ | | | <- tc_index -> | | | |\201lecture\202| peut changer | | <--------------Index de la table | | | | | des couples v | v v | \201masque,valeur\202 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -> skb->tc_index)RP()0 P(Comment faire le marquage\240? Il suffit de modi)HY(fier)YH( le masque et la valeur asso)HY(ci\351s)YH( \340 la classe que vous voulez marquer. Regar)HY(dez)YH( la ligne de code suivante\240: ) 1 63 PR(tc class change dev eth0 classid 1:1 dsmark mask 0x3 value 0xb8)RP( Cela modifie le couple \201masque,valeur\202 dans la table de hachage, et re-marque les paquets appar)HY(te)HY(nant)YH( \340 la classe 1:1. Vous devez "changer" ces valeurs en raison des valeurs par d\351faut que le couple \201masque, valeur\202 obtient initia)HY(le)HY(ment)YH( \201voir le tableau ci-dessous\202.)EP()0 P(Nous allons main)HY(te)HY(nant)YH( expliquer comment le filtre TC_INDEX travaille, et comment il s'int\350gre dans tout cela. En outre, le filtre TC_INDEX peut \352tre utilis\351 dans des confi)HY(gu)HY(ra)HY(tions)YH( autres que celles incluant les services DS.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 122 H(3.6.\240Le)WB 289 Sn()WB 121 Sn( filtre TC_INDEX)EH()BR()BR()BR()0 P(Voici la commande de base pour d\351cla)HY(rer)YH( un filtre TC_INDEX\240: ) 3 55 PR(... tcindex [ hash SIZE ] [ mask MASK ] [ shift SHIFT ] [ pass_on | fall_through ] [ classid CLASSID ] [ police POLICE_SPEC ])RP( Ensuite, nous montrons l'exemple utilis\351 pour expliquer le mode op\351ra)HY(toire)YH( de TC_INDEX. Soyez atten)HY(tif)YH( aux mots en gras\240: tc qdisc add dev eth0 handle 1:0 root dsmark indices 64 )EM(set_tc_index)ES( tc filter add dev eth0 parent 1:0 proto)HY(col)YH( ip prio 1 tcindex )EM(mask 0xfc shift 2)ES( tc qdisc add dev eth0 parent 1:0 handle 2:0 cbq band)HY(width)YH( 10Mbit cell 8 avpkt 1000 mpu 64 # Classe du trafic EF tc class add dev eth0 parent 2:0 classid 2:1 cbq band)HY(width)YH( 10Mbit rate 1500Kbit avpkt 1000 prio 1 bounded isola)HY(ted)YH( allot 1514 weight 1 maxburst 10 # Gestion)HY(naire)YH( de file d'attente fifo pour le trafic EF tc qdisc add dev eth0 parent 2:1 pfifo limit 5 tc filter add dev eth0 parent 2:0 proto)HY(col)YH( ip prio 1 )EM(handle 0x2e)ES( tcindex )EM(classid 2:1 pass_on)ES( \201Ce code n'est pas complet. Ce n'est qu'un extrait de l'exemple EFCBQ inclus dans la distri)HY(bu)HY(tion)YH( iproute2\202.)EP()0 P(Avant tout, suppo)HY(sons)YH( que nous rece)HY(vons)YH( un paquet marqu\351 comme EF. Si vous lisez le RFC2598, vous verrez que DSCP recom)HY(mande)YH( une valeur de 101110 pour le trafic EF. Cela signi)HY(fie)YH( que le champ DS sera \351gal \340 10111000 \201rappe)HY(lez)YH(- vous que les bits les moins signi)HY(fi)HY(ca)HY(tifs)YH( de l'octet TOS ne sont pas utili)HY(s\351s)YH( dans DS\202 ou 0xb8 en nota)HY(tion)YH( hexa)HY(d\351)HY(ci)HY(male)YH(.)EP()0 P( ) 16 81 PR( FILTRE TC INDEX +---+ +-------+ +---+-+ +------+ +-+ +-------+ | | | | | | | |FILTRE| +-+ +-+ | | | | | |----->| MASK | -> | | | -> |HANDLE|->| | | | -> | | -> | | | | . | =0xfc | | | | |0x2E | | +----+ | | | | | | | . | | | | | +------+ +--------+ | | | | | | . | | | | | | | | | -->| | . | SHIFT | | | | | | | |--> | | . | =2 | | | +----------------------------+ | | | | | | | | | CBQ 2:0 | | | | | +-------+ +---+--------------------------------+ | | | | | | | +-------------------------------------------------------------+ | | DSMARK 1:0 | +-------------------------------------------------------------------------+)RP( )EP()0 P(Le paquet arrive alors avec la valeur du champ DS confi)HY(gu)HY(r\351e)YH( \340 0xb8. Comme je l'ai expliqu\351 aupa)HY(ra)HY(vant)YH(, le gestion)HY(naire)YH( de mise en file d'attente dsmark, iden)HY(ti)HY(fi\351)YH( par 1:0 dans cet exemple, r\351cu)HY(p\350re)YH( le champ DS et l'enre)HY(gistre)YH( dans la variable skb->tc_index. L'\351tape suivante consis)HY(tera)YH( \340 asso)HY(cier)YH( un filtre \340 ce gestion)HY(naire)YH( de mise en file d'attente \201la seconde ligne dans cet exemple\202. Les op\351ra)HY(tions)YH( suivantes seront r\351ali)HY(s\351es)YH(\240: ) 2 30 PR(Valeur1 = skb->tc_index & MASK Cl\351 = Valeur1 >> SHIFT)RP( )EP()0 P(Dans cet exemple, MASK=0xFC et SHIFT=2. ) 2 53 PR(Valeur1 = 10111000 & 11111100 = 10111000 Cl\351 = 10111000 >> 2 = 00101110 -> 0x2E en hexad\351cimal)RP( )EP()0 P(La valeur retour)HY(n\351e)YH( corres)HY(pon)HY(dra)YH( \340 un iden)HY(ti)HY(fi)HY(ca)HY(teur)YH( de filtre du gestion)HY(naire)YH( de file d'attente interne \201dans l'exemple, iden)HY(ti)HY(fier)YH( par 2:0\202. Si un filtre avec cet iden)HY(ti)HY(fi)HY(ca)HY(teur)YH( \201id\202 existe, les condi)HY(tions)YH( de contr\364le et de perfor)HY(mance)YH( seront v\351ri)HY(fi\351es)YH( \201au cas o\371 le filtre inclu)HY(rait)YH( ceci\202 et l'iden)HY(ti)HY(fi)HY(ca)HY(teur)YH( de classe sera retourn\351 \201dans notre exemple, classid 2:1\202 et stock\351 dans la variable skb->tc_index.)EP()0 P(Si aucun filtre avec cet iden)HY(ti)HY(fi)HY(ca)HY(teur)YH( n'est trouv\351, le r\351sul)HY(tat)YH( d\351pen)HY(dra)YH( de la d\351cla)HY(ra)HY(tion)YH( de l'option fall_through. Si tel est le cas, la valeur Cl\351 est retour)HY(n\351e)YH( comme iden)HY(ti)HY(fi)HY(ca)HY(teur)YH( de classe. Si cela n'est pas le cas, une erreur est retour)HY(n\351e)YH( et le trai)HY(te)HY(ment)YH( conti)HY(nue)YH( avec les filtres restant. Faites atten)HY(tion)YH( si vous utili)HY(sez)YH( l'option fall_through ; ceci ne peut \352tre fait que si une rela)HY(tion)YH( existe entre les valeurs de la variable skb->tc_index et les iden)HY(ti)HY(fi)HY(ca)HY(teurs)YH( de classe.)EP()0 P(Les derniers para)HY(m\350tres)YH( \340 commen)HY(ter)YH( sont hash et pass_on. Le premier est reli\351 \340 la taille de la table de hachage. Pass_on sera utilis\351 pour indiquer d'essayer le filtre suivant dans le cas o\371 aucun iden)HY(ti)HY(fi)HY(ca)HY(teur)YH( de classe \351gal au r\351sul)HY(tat)YH( du filtre ne serait trouv\351. L'action par d\351faut est fall_through \201regar)HY(der)YH( la table suivante\202.)EP()0 P(Fina)HY(le)HY(ment)YH(, regar)HY(dons)YH( quelles sont les valeurs possibles pour la confi)HY(gu)HY(ra)HY(tion)YH( de tous ces para)HY(m\350tres)YH( TCINDEX\240: ) 8 69 PR(Nom TC Valeur D\351faut ----------------------------------------------------------------- Hash 1...0x10000 D\351pendant de l'impl\351mentation Mask 0...0xffff 0xffff Shift 0...15 0 Fall through / Pass_on Flag Fall_through Classid Major:minor Rien Police ..... Rien)RP( )EP()0 P(Ce type de filtre est tr\350s puis)HY(sant)YH(. Il est n\351ces)HY(saire)YH( d'explo)HY(rer)YH( toutes les possi)HY(bi)HY(li)HY(t\351s)YH(. En outre, ce filtre n'est pas seule)HY(ment)YH( utilis\351 dans les confi)HY(gu)HY(ra)HY(tions)YH( Diff)HY(Serv)YH(. Vous pouvez l'utili)HY(ser)YH( comme n'importe quel autre filtre.)EP()0 P(Je vous recom)HY(mande)YH( de regar)HY(der)YH( les exemples Diff)HY(Serv)YH( inclus dans la distri)HY(bu)HY(tion)YH( iproute2. Je vous promets que j'essaie)HY(rai)YH( de compl\351)HY(ter)YH( ce texte d\350s que possible. Tout ce que j'ai expliqu\351 est le r\351sul)HY(tat)YH( de nombreux tests. Merci de me dire si je me suis tromp\351 quelque part.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 123 H(4.\240Gestion)WB 290 Sn()HY(naire)YH()WB 122 Sn( de mise en file d'attente d'entr\351e \201)EM(Ingress qdisc)ES(\202)EH()BR()BR()BR()0 P(Tous les gestion)HY(naires)YH( de mise en file d'attente dont nous avons discut\351 jusqu'ici sont des gestion)HY(naires)YH( de sortie. Chaque inter)HY(face)YH( peut \351gale)HY(ment)YH( avoir un gestion)HY(naire)YH( de mise en file d'attente d'entr\351e qui n'est pas utilis\351 pour envoyer les paquets \340 l'ext\351)HY(rieur)YH( du p\351ri)HY(ph\351)HY(rique)YH( r\351seau. Au lieu de cela, il vous auto)HY(rise)YH( \340 appliquer des filtres tc aux paquets entrants par l'inter)HY(face)YH(, ind\351)HY(pen)HY(dam)HY(ment)YH( de s'ils ont une desti)HY(na)HY(tion)YH( locale ou s'ils sont desti)HY(n\351s)YH( \340 \352tre trans)HY(mis)YH(.)EP()0 P(Etant donn\351 que les filtres tc contiennent une impl\351)HY(men)HY(ta)HY(tion)YH( compl\350te du Filtre \340 Seau de Jetons, et qu'ils sont \351gale)HY(ment)YH( capables de s'appuyer sur l'esti)HY(ma)HY(tion)YH( du flux fourni par le noyau, il y a beau)HY(coup)YH( de fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( dispo)HY(nibles)YH(. Ceci vous permet de r\351gle)HY(men)HY(ter)YH( le trafic entrant de fa\347on effi)HY(cace)YH(, avant m\352me qu'il n'entre dans la pile IP.)EP()2 Sl()BR()BR()BR()BR()0 3 124 H(4.1.\240Para)WB 291 Sn()HY(m\350tres)YH()WB 123 Sn( & usage)EH()BR()BR()BR()0 P(Le gestion)HY(naire)YH( de mise en file d'attente d'entr\351e ne n\351ces)HY(site)YH( pas de para)HY(m\350tres)YH(. Il diff\350re des autres gestion)HY(naires)YH( dans le fait qu'il n'occupe pas la racine du p\351ri)HY(ph\351)HY(rique)YH(. Atta)HY(chez)YH(-le comme ceci\240: ) 1 31 PR(# tc qdisc add dev eth0 ingress)RP( Ceci vous auto)HY(rise)YH( \340 avoir d'autres gestion)HY(naires)YH( de sortie sur votre p\351ri)HY(ph\351)HY(rique)YH( en plus du gestion)HY(naire)YH( d'entr\351e.)EP()0 P(Pour un exemple invent\351 sur la fa\347on dont le gestion)HY(naire)YH( d'entr\351e peut \352tre utilis\351, voir le chapitre Recettes de cuisine.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 125 H(5.\240)WB 292 Sn()WB 124 Sn()EM(Random Early Detec)HY(tion)YH()ES( \201RED\202)EH()BR()BR()BR()0 P(Ce chapitre est con\347u comme une intro)HY(duc)HY(tion)YH( au routage de dorsales \201back)HY(bones)YH(\202. Ces liai)HY(sons)YH( impliquent souvent des bandes passantes sup\351)HY(rieures)YH( \340 100 m\351ga)HY(bits)YH(/s, ce qui n\351ces)HY(site)YH( une approche diff\351)HY(rente)YH( de celle de votre modem ADSL \340 la maison.)EP()0 P(Le compor)HY(te)HY(ment)YH( normal des files d'attente de routeurs est appel\351 "tail-drop" \201NdT\240: \351limine le reste\202. Le "tail-drop" consiste \340 mettre en file d'attente un certain volume de trafic et \340 \351limi)HY(ner)YH( tout ce qui d\351borde. Ce n'est pas du tout \351qui)HY(table)YH( et cela conduit \340 des retrans)HY(mis)HY(sions)YH( de synchro)HY(ni)HY(sa)HY(tion)YH(. Quand une retrans)HY(mis)HY(sion)YH( de synchro)HY(ni)HY(sa)HY(tion)YH( a lieu, la brusque rafale de rejet d'un routeur qui a atteint sa limite entra\356)HY(nera)YH( une rafale de retrans)HY(mis)HY(sions)YH( retar)HY(d\351e)YH( qui inon)HY(dera)YH( \340 nouveau le routeur conges)HY(tionn\351)YH(.)EP()0 P(Dans le but d'en finir avec les conges)HY(tions)YH( occa)HY(sion)HY(nelles)YH( des liens, les routeurs de dorsales int\350grent souvent des files d'attente de grande taille. Malheu)HY(reu)HY(se)HY(ment)YH(, bien que ces files d'attente offrent un bon d\351bit, elles peuvent augmen)HY(ter)YH( sensi)HY(ble)HY(ment)YH( les temps de latence et entra\356)HY(ner)YH( un compor)HY(te)HY(ment)YH( tr\350s saccad\351 des connexions TCP pendant la conges)HY(tion)YH(.)EP()0 P(Ces probl\350mes avec le "tail-drop" deviennent de plus en plus pr\351oc)HY(cu)HY(pants)YH( avec l'augmen)HY(ta)HY(tion)YH( de l'utili)HY(sa)HY(tion)YH( d'appli)HY(ca)HY(tions)YH( hostiles au r\351seau. Le noyau Linux nous offre la tech)HY(nique)YH( RED, abr\351)HY(via)HY(tion)YH( de Random Early Detect ou d\351tec)HY(tion)YH( pr\351coce directe.)EP()0 P(RED n'est pas la solu)HY(tion)YH( miracle \340 tous ces probl\350mes. Les appli)HY(ca)HY(tions)YH( qui n'int\350grent pas correc)HY(te)HY(ment)YH( la tech)HY(nique)YH( de "l'expo)HY(nen)HY(tial)YH( backoff" obtiennent toujours une part trop grande de bande passante. Cepen)HY(dant)YH(, avec la tech)HY(nique)YH( RED elles ne provoquent pas trop de d\351g\342ts sur le d\351bit et les temps de latence des autres connexions.)EP()0 P(RED \351limine statis)HY(tique)HY(ment)YH( des paquets du flux avant qu'il n'atteigne sa limite "dure" \201hard\202. Sur une dorsale conges)HY(tion)HY(n\351e)YH(, cela entra\356ne un ralen)HY(tis)HY(se)HY(ment)YH( en douceur de la liaison et \351vite les retrans)HY(mis)HY(sions)YH( de synchro)HY(ni)HY(sa)HY(tion)YH(. La tech)HY(nique)YH( RED aide aussi TCP \340 trouver une vitesse "\351qui)HY(table)YH(" plus rapi)HY(de)HY(ment)YH(\240: en permet)HY(tant)YH( d'\351limi)HY(ner)YH( des paquets plus t\364t, il conserve une file d'attente plus courte et des temps de latence mieux contr\364)HY(l\351s)YH(. La proba)HY(bi)HY(lit\351)YH( qu'un paquet soit \351limin\351 d'une connexion parti)HY(cu)HY(li\350re)YH( est propor)HY(tion)HY(nelle)YH( \340 la bande passante utili)HY(s\351e)YH( par cette connexion plut\364t qu'au nombre de paquets qu'elle envoie.)EP()0 P(La tech)HY(nique)YH( RED est une bonne gestion de file d'attente pour les dorsales, o\371 vous ne pouvez pas vous permettre le co\373t d'une m\351mo)HY(ri)HY(sa)HY(tion)YH( d'\351tat par session qui est n\351ces)HY(saire)YH( pour une mise en file d'attente vrai)HY(ment)YH( \351qui)HY(table)YH(.)EP()0 P(Pour utili)HY(ser)YH( RED, vous devez r\351gler trois para)HY(m\350tres)YH(\240: Min, Max et burst. Min est la taille minimum de la file d'attente en octets avant que les rejets n'aient lieu, Max est le maximum "doux" \201soft\202 en dessous duquel l'algo)HY(rithme)YH( s'effor)HY(cera)YH( de rester, et burst est le nombre maximum de paquets envoy\351s "en rafale".)EP()0 P(Vous devriez confi)HY(gu)HY(rer)YH( Min en calcu)HY(lant)YH( le plus grand temps de latence accep)HY(table)YH( pour la mise en file d'attente, multi)HY(pli\351)YH( par votre bande passante. Par exemple, sur mon lien ISDN \340 64 Kbits/s, je voudrais avoir un temps de latence de base de mise en file d'attente de 200 ms. Je confi)HY(gure)YH( donc Min \340 1600 octets \201= 0,2 x 64000 / 8\202. Imposer une valeur Min trop petite va d\351gra)HY(der)YH( le d\351bit et une valeur Min trop grande va d\351gra)HY(der)YH( le temps de latence. Sur une liaison lente, choisir un coef)HY(fi)HY(cient)YH( Min petit ne peut pas rempla)HY(cer)YH( une r\351duc)HY(tion)YH( du MTU pour am\351lio)HY(rer)YH( les temps de r\351ponse.)EP()0 P(Vous devriez confi)HY(gu)HY(rer)YH( Max \340 au moins deux fois Min pour \351viter les synchro)HY(ni)HY(sa)HY(tions)YH(. Sur des liens lents avec de petites valeurs de Min, il peut \352tre prudent d'avoir Max quatre fois plus grand que Min ou plus.)EP()0 P(Burst contr\364le la r\351ponse de l'algo)HY(rithme)YH( RED aux rafales. Burst doit \352tre choisi plus grand que min/avpkt \201paquet moyen\202. Exp\351)HY(ri)HY(men)HY(ta)HY(le)HY(ment)YH(, j'ai trouv\351 que \201min+min+max\202/\2013*avpkt\202 marche bien.)EP()0 P(De plus, vous devez confi)HY(gu)HY(rer)YH( limit et avpkt. Limit est une valeur de s\351cu)HY(rit\351)YH(\240: s'il y a plus de Limit octets dans la file, RED reprend la tech)HY(nique)YH( "tail-drop". Je choisis une valeur typique \351gale \340 8 fois Max. Avpkt devrait \352tre fix\351 \340 la taille moyenne d'un paquet. 1000 fonc)HY(tionne)YH( correc)HY(te)HY(ment)YH( sur des liai)HY(sons)YH( Inter)HY(net)YH( haut d\351bit ayant un MTU de 1500 octets.)EP()0 P(Lire )R37 2 A(l'article sur la file d'attente RED)EA( par Sally Floyd et Van Jacob)HY(son)YH( pour les infor)HY(ma)HY(tions)YH( tech)HY(niques)YH(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 126 H(6.\240Generic)WB 293 Sn()WB 125 Sn( Random Early Detec)HY(tion)YH()EH()BR()BR()BR()0 P(Il n'y a pas grand chose de connu sur GRED. Il ressemble \340 GRED avec plusieurs files d'attente internes, celles-ci \351tant choi)HY(sies)YH( en se basant sur le champ tcindex de Diff)HY(serv)YH(. Selon une diapo)HY(si)HY(tive)YH( trouv\351e )R38 2 A(ici)EA(, il poss\350de les capa)HY(ci)HY(t\351s)YH( )EM(Distri)HY(bu)HY(ted)YH( Weigh)HY(ted)YH( RED)ES( de Cisco, ainsi que les capa)HY(ci)HY(t\351s)YH( RIO de Clark.)EP()0 P(Chaque file d'attente virtuelle peut avoir ses propres "Drop Para)HY(me)HY(ters)YH(".)EP()0 P(FIXME: Deman)HY(dez)YH( \340 Jamal or Werner de nous en dire plus)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 127 H(7.\240Emula)WB 294 Sn()HY(tion)YH()WB 126 Sn( VC/ATM)EH()BR()BR()BR()0 P(Ceci est l'effort prin)HY(ci)HY(pal)YH( de Werner Almes)HY(ber)HY(ger)YH( pour vous auto)HY(ri)HY(ser)YH( \340 construire des circuits virtuels au-dessus des sockets TCP/IP. Le circuit virtuel est un concept venant de la th\351orie des r\351seaux ATM.)EP()0 P(Pour plus d'infor)HY(ma)HY(tions)YH(, voir la )R39 2 A(page ATM sur Linux)EA(. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 128 H(8.\240Weigh)WB 295 Sn()HY(ted)YH()WB 127 Sn( Round Robin \201WRR\202)EH()BR()BR()BR()0 P(Ce gestion)HY(naire)YH( de mise en file d'attente n'est pas inclus dans les noyaux stan)HY(dards)YH(, mais peut \352tre t\351l\351)HY(char)HY(g\351e)YH( \340 partir de )R40 2 A(ce lien)EA(. Ce gestion)HY(naire)YH( de mise en file d'attente n'a \351t\351 test\351 qu'avec les noyaux 2.2, mais marchera proba)HY(ble)HY(ment)YH( \351gale)HY(ment)YH( avec les noyaux 2.4/2.5.)EP()0 P(La file d'attente WRR partage la bande passante entre ses classes en utili)HY(sant)YH( la tech)HY(nique)YH( du tour)HY(niquet)YH( pond\351r\351. Ceci est simi)HY(laire)YH( \340 la file d'attente CBQ qui contient des classes sur lesquelles l'on peut asso)HY(cier)YH( arbi)HY(trai)HY(re)HY(ment)YH( des files d'attente. Toutes les classes qui ont suffi)HY(sam)HY(ment)YH( de demandes obtien)HY(dront)YH( la bande passante propor)HY(tion)HY(nel)HY(le)HY(ment)YH( au poids associ\351 des classes. Les poids peuvent \352tre confi)HY(gu)HY(r\351s)YH( manuel)HY(le)HY(ment)YH( en utili)HY(sant)YH( le programme )SM(tc)ES(. Ils peuvent \351gale)HY(ment)YH( \352tre confi)HY(gu)HY(r\351s)YH( pour d\351cro\356tre auto)HY(ma)HY(tique)HY(ment)YH( pour les classes trans)HY(f\351)HY(rant)YH( moins de donn\351es.)EP()0 P(La file d'attente a un clas)HY(si)HY(fi)HY(ca)HY(teur)YH( int\351gr\351 qui assigne les paquets venant ou allant vers diff\351)HY(rentes)YH( machines \340 diff\351)HY(rentes)YH( classes. On peut utili)HY(ser)YH( soit l'adresse MAC soit l'adresse IP de l'adresse source ou de desti)HY(na)HY(tion)YH(. L'adresse MAC ne peut cepen)HY(dant)YH( \352tre utili)HY(s\351e)YH( que quand la boite Linux est un pont ether)HY(net)YH(. Les classes sont auto)HY(ma)HY(tique)HY(ment)YH( assi)HY(gn\351es)YH( aux machines en fonc)HY(tion)YH( des paquets vus.)EP()0 P(Ce gestion)HY(naire)YH( de mise en file d'attente peut \352tre tr\350s utile au site comme les r\351si)HY(dences)YH( \351tudiantes o\371 des indi)HY(vi)HY(dus)YH( sans liens parti)HY(cu)HY(liers)YH( partagent une connexion Inter)HY(net)YH(. Un ensemble de scripts pour confi)HY(gu)HY(rer)YH( un tel cas de figure pour ce genre de site est propos\351 dans la distri)HY(bu)HY(tion)YH( WRR.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 129 H(Chapitre\24015.\240Recettes)WB 296 Sn()WB 128 Sn( de cuisine)EH()BR()BR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 129 1 A(1. Faire tourner plusieurs sites avec diff\351)HY(rentes)YH( SLA \201auto)HY(ri)HY(sa)HY(tions)YH(\202)129 0 TN TL()Ec /AF f D()0 DT()0 130 1 A(2. Prot\351)HY(ger)YH( votre machine des inon)HY(da)HY(tions)YH( SYN)130 0 TN TL()Ec /AF f D()0 DT()0 131 1 A(3. Limiter le d\351bit ICMP pour emp\352)HY(cher)YH( les d\351nis de service)131 0 TN TL()Ec /AF f D()0 DT()0 132 1 A(4. Donner la prio)HY(rit\351)YH( au trafic inter)HY(ac)HY(tif)YH()132 0 TN TL()Ec /AF f D()0 DT()0 133 1 A(5. Cache web trans)HY(pa)HY(rent)YH( utili)HY(sant)YH( netfil)HY(ter)YH(, iproute2, ipchains et squid)133 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 134 1 A(5.1. Sch\351ma du trafic apr\350s l'impl\351)HY(men)HY(ta)HY(tion)YH()134 0 TN TL()Ec /AF f D()LD()0 DT()0 135 1 A(6. Circon)HY(ve)HY(nir)YH( aux probl\350mes de la d\351cou)HY(verte)YH( du MTU de chemin en confi)HY(gu)HY(rant)YH( un MTU par routes)135 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 136 1 A(6.1. Solu)HY(tion)YH()136 0 TN TL()Ec /AF f D()LD()0 DT()0 137 1 A(7. Circon)HY(ve)HY(nir)YH( aux probl\350mes de la d\351cou)HY(verte)YH( du MTU de chemin en impo)HY(sant)YH( le MSS \201pour les utili)HY(sa)HY(teurs)YH( de l'ADSL, du c\342ble, de PPPoE & PPtP\202)137 0 TN TL()Ec /AF f D()0 DT()0 138 1 A(8. Le Condi)HY(tion)HY(neur)YH( de Trafic Ultime\240: Faible temps de latence, T\351l\351)HY(char)HY(ge)HY(ment)YH( vers l'amont et l'aval rapide)138 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 139 1 A(8.1. Pourquoi cela ne marche t-il pas bien par d\351faut\240?)139 0 TN TL()Ec /AF f D()0 DT()0 140 1 A(8.2. Le script \201CBQ\202)140 0 TN TL()Ec /AF f D()0 DT()0 141 1 A(8.3. Le script \201HTB\202)141 0 TN TL()Ec /AF f D()LD()0 DT()0 142 1 A(9. Limi)HY(ta)HY(tion)YH( du d\351bit pour un h\364te ou un masque de sous-r\351seau)142 0 TN TL()Ec /AF f D()0 DT()0 143 1 A(10. Exemple d'une solu)HY(tion)YH( de traduc)HY(tion)YH( d'adresse avec de la QoS)143 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 144 1 A(10.1. Commen\347ons l'opti)HY(mi)HY(sa)HY(tion)YH( de cette rare bande passante)144 0 TN TL()Ec /AF f D()0 DT()0 145 1 A(10.2. Clas)HY(si)HY(fi)HY(ca)HY(tion)YH( des paquets)145 0 TN TL()Ec /AF f D()0 DT()0 146 1 A(10.3. Am\351lio)HY(rer)YH( notre confi)HY(gu)HY(ra)HY(tion)YH()146 0 TN TL()Ec /AF f D()0 DT()0 147 1 A(10.4. Rendre tout ceci actif au d\351mar)HY(rage)YH()147 0 TN TL()Ec /AF f D()LD()LD()BR()0 P(Cette section contient des \253\240recettes de cuisine\240\273 qui peuvent vous aider \340 r\351soudre vos probl\350mes. Un livre de cuisine ne remplace cepen)HY(dant)YH( pas une r\351elle compr\351)HY(hen)HY(sion)YH(, essayez donc d'assi)HY(mi)HY(ler)YH( ce qui suit.)EP()2 Sl()BR()BR()BR()BR()0 2 130 H(1.\240Faire)WB 297 Sn()WB 129 Sn( tourner plusieurs sites avec diff\351)HY(rentes)YH( SLA \201auto)HY(ri)HY(sa)HY(tions)YH(\202)EH()BR()BR()BR()0 P( Vous pouvez faire cela de plusieurs mani\350res. Apache poss\350de un module qui permet de le suppor)HY(ter)YH(, mais nous montre)HY(rons)YH( comment Linux peut le faire pour d'autres services. Les commandes ont \351t\351 reprises d'une pr\351sen)HY(ta)HY(tion)YH( de Jamal Hadi, dont la r\351f\351)HY(rence)YH( est fournie ci-dessous.)EP()0 P(Disons que nous avons deux clients avec\240: http, ftp et du strea)HY(ming)YH( audio. Nous voulons leur vendre une largeur de bande passante limit\351e. Nous le ferons sur le serveur lui-m\352me.)EP()0 P(Le client )SM(A)ES( doit dispo)HY(ser)YH( d'au moins 2 m\351ga)HY(bits)YH(, et le client )SM(B)ES( a pay\351 pour 5 m\351ga)HY(bits)YH(. Nous s\351pa)HY(rons)YH( nos clients en cr\351ant deux adresses IP virtuelles sur notre serveur.)EP() 2 39 PR(# ip address add 188.177.166.1 dev eth0 # ip address add 188.177.166.2 dev eth0)RP()0 P(C'est \340 vous d'asso)HY(cier)YH( les diff\351)HY(rents)YH( serveurs \340 la bonne adresse IP. Tous les d\351mons courants supportent cela.)EP()0 P(Nous pouvons tout d'abord atta)HY(cher)YH( une mise en file d'attente CBQ \340 )SM(eth0)ES(\240:)EP() 2 79 PR(# tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit cell 8 avpkt 1000 \200 mpu 64)RP()0 P(Nous cr\351ons ensuite les classes pour nos clients\240:)EP() 4 74 PR(# tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate \200 2MBit avpkt 1000 prio 5 bounded isolated allot 1514 weight 1 maxburst 21 # tc class add dev eth0 parent 1:0 classid 1:2 cbq bandwidth 10Mbit rate \200 5Mbit avpkt 1000 prio 5 bounded isolated allot 1514 weight 1 maxburst 21)RP()0 P(Nous ajou)HY(tons)YH( les filtres pour nos deux classes\240:)EP() 9 78 PR(##FIXME: Pourquoi cette ligne, que fait-elle ? Qu'est-ce qu'un diviseur ? ##FIXME: Un diviseur est li\351 \340 une table de hachage et au nombre de seaux -ahu # tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 1: u32 divisor 1 # tc filter add dev eth0 parent 1:0 prio 5 u32 match ip src 188.177.166.1 flowid 1:1 # tc filter add dev eth0 parent 1:0 prio 5 u32 match ip src 188.177.166.2 flowid 1:2)RP()0 P(Et voil\340 qui est fait.)EP()0 P(FIXME: Pourquoi pas un filtre token bucket\240? Y a t-il un retour par d\351faut \340 )SM(pfifo_fast)ES( quelque part\240?)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 131 H(2.\240Prot\351)WB 298 Sn()HY(ger)YH()WB 130 Sn( votre machine des inon)HY(da)HY(tions)YH( SYN)EH()BR()BR()BR()0 P(D'apr\350s la docu)HY(men)HY(ta)HY(tion)YH( iproute d'Alexey adapt\351e \340 netfil)HY(ter)YH(. Si vous utili)HY(sez)YH( ceci, prenez garde d'ajuster les nombres avec des valeurs raison)HY(nables)YH( pour votre syst\350me.)EP()0 P(Si vous voulez prot\351)HY(ger)YH( tout un r\351seau, oubliez ce script, qui est plus adapt\351 \340 un h\364te seul.)EP()0 P(Il appa)HY(ra\356t)YH( que la toute derni\350re version de l'outil iproute2 est n\351ces)HY(saire)YH( pour que ceci fonc)HY(tionne)YH( avec le noyau 2.4.0.)EP() 46 75 PR(#! /bin/sh -x # # script simple utilisant les capacit\351s de Ingress. # Ce script montre comment on peut limiter le flux entrant des SYN. # Utile pour la protection des TCP-SYN. Vous pouvez utiliser IPchains # pour b\351n\351ficier de puissantes fonctionnalit\351s sur les SYN. # # chemins vers les divers utilitaires # \300 changer en fonction des v\364tres # TC=/sbin/tc IP=/sbin/ip IPTABLES=/sbin/iptables INDEV=eth2 # # marque tous les paquets SYN entrant \340 travers $INDEV avec la valeur 1 ############################################################ $iptables -A PREROUTING -i $INDEV -t mangle -p tcp --syn \200 -j MARK --set-mark 1 ############################################################ # # installe la file d'attente ingress sur l'interface associ\351e ############################################################ $TC qdisc add dev $INDEV handle ffff: ingress ############################################################ # # Les paquets SYN ont une taille de 40 octets \201320 bits\202, donc trois SYN # ont une taille de 960 bits \201approximativement 1Kbit\202 ; nous limitons donc # les SYNs entrants \340 3 par seconde \201pas vraiment utile, mais sert \340 # montrer ce point -JHS ############################################################ )WR( $TC filter add dev $INDEV parent ffff: protocol ip prio 50 handle 1 fw \200 police rate 1kbit burst 40 mtu 9k drop flowid :1 ############################################################ # echo "---- qdisc parameters Ingress ----------" $TC qdisc ls dev $INDEV echo "---- Class parameters Ingress ----------" $TC class ls dev $INDEV echo "---- filter parameters Ingress ----------" $TC filter ls dev $INDEV parent ffff: #supprime la file d'attente ingress #$TC qdisc del $INDEV ingress)RP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 132 H(3.\240Limiter)WB 299 Sn()WB 131 Sn( le d\351bit ICMP pour emp\352)HY(cher)YH( les d\351nis de service)EH()BR()BR()BR()0 P(R\351cem)HY(ment)YH(, les attaques distri)HY(bu\351es)YH( de d\351ni de service sont deve)HY(nues)YH( une nuisance impor)HY(tante)YH( sur Inter)HY(net)YH(. En filtrant propre)HY(ment)YH( et en limi)HY(tant)YH( le d\351bit de votre r\351seau, vous pouvez \340 la fois \351viter de devenir victime ou source de ces attaques.)EP()0 P(Vous devriez filtrer vos r\351seaux de telle sorte que vous n'auto)HY(ri)HY(siez)YH( pas les paquets avec une adresse IP source non locale \340 quitter votre r\351seau. Cela emp\352che les utili)HY(sa)HY(teurs)YH( d'envoyer de mani\350re anonyme des cochon)HY(ne)HY(ries)YH( sur Inter)HY(net)YH(.)EP()0 P( )EP()0 P(La limi)HY(ta)HY(tion)YH( de d\351bit peut faire encore mieux, comme vu plus haut. Pour vous rafra\356)HY(chir)YH( la m\351moire, revoici notre diagramme ASCII\240:)EP()0 P( ) 2 74 PR([Internet] ------ [routeur Linux] --- [Bureau+FAI] eth1 eth0)RP( )EP()0 P(Nous allons d'abord confi)HY(gu)HY(rer)YH( les parties pr\351-requises\240:)EP()0 P( ) 3 76 PR(# tc qdisc add dev eth0 root handle 10: cbq bandwidth 10Mbit avpkt 1000 # tc class add dev eth0 parent 10:0 classid 10:1 cbq bandwidth 10Mbit rate \200 10Mbit allot 1514 prio 5 maxburst 20 avpkt 1000)RP( )EP()0 P(Si vous avez des inter)HY(faces)YH( de 100 Mbits ou plus, ajustez ces nombres. Main)HY(te)HY(nant)YH(, vous devez d\351ter)HY(mi)HY(ner)YH( combien de trafic ICMP vous voulez auto)HY(ri)HY(ser)YH(. Vous pouvez r\351ali)HY(ser)YH( des mesures avec tcpdump, en \351cri)HY(vant)YH( les r\351sul)HY(tats)YH( dans un fichier pendant un moment, et regar)HY(der)YH( combien de paquets ICMP passent par votre r\351seau. Ne pas oublier d'augmen)HY(ter)YH( la longueur du "snap)HY(shot)YH(". Si la mesure n'est pas possible, vous pouvez consa)HY(crer)YH( par exemple 5% de votre bande passante dispo)HY(nible)YH(. Confi)HY(gu)HY(rons)YH( notre classe\240: ) 3 78 PR(# tc class add dev eth0 parent 10:1 classid 10:100 cbq bandwidth 10Mbit rate \200 100Kbit allot 1514 weight 800Kbit prio 5 maxburst 20 avpkt 250 \200 bounded)RP( )EP()0 P(Cela limite le d\351bit \340 100 Kbits sur la classe. Main)HY(te)HY(nant)YH(, nous avons besoin d'un filtre pour assi)HY(gner)YH( le trafic ICMP \340 cette classe\240: ) 2 70 PR(# tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip protocol 1 0xFF flowid 10:100)RP( )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 133 H(4.\240Donner)WB 300 Sn()WB 132 Sn( la prio)HY(rit\351)YH( au trafic inter)HY(ac)HY(tif)YH()EH()BR()BR()BR()0 P(Si beau)HY(coup)YH( de donn\351es arrivent \340 votre lien ou en partent, et que vous essayez de faire de la main)HY(te)HY(nance)YH( via telnet ou ssh, cela peut poser probl\350me\240: d'autres paquets bloquent vos frappes clavier. Cela ne serait-il pas mieux si vos paquets inter)HY(ac)HY(tifs)YH( pouvaient se faufi)HY(ler)YH( dans le trafic de masse\240? Linux peut faire cela pour vous.)EP()0 P(Comme pr\351c\351)HY(dem)HY(ment)YH(, nous avons besoin de mani)HY(pu)HY(ler)YH( le trafic dans les deux sens. Evidem)HY(ment)YH(, cela marche mieux s'il y a des machines Linux aux deux extr\351)HY(mi)HY(t\351s)YH( du lien, bien que d'autres UNIX soient capables de faire la m\352me chose. Consul)HY(tez)YH( votre gourou local Solaris/BSD pour cela.)EP()0 P(Le gestion)HY(naire)YH( stan)HY(dard)YH( pfifo_fast a trois "bandes" diff\351)HY(rentes)YH(. Le trafic de la bande 0 est trans)HY(mis)YH( en premier, le trafic des bandes 1 et 2 \351tant trait\351 apr\350s. Il est vital que votre trafic inter)HY(ac)HY(tif)YH( soit dans la bande 0\240! Ce qui suit est adapt\351 du \201bient\364t obso)HY(l\350te)YH(\202 Ipchains-HOWTO\240:)EP()0 P(Il y a quatre bits rare)HY(ment)YH( utili)HY(s\351s)YH( dans l'en-t\352te IP, appel\351s bits de Type de Service \201TOS\202. Ils affectent la mani\350re dont les paquets sont trait\351s. Les quatre bits sont "D\351lai Minimum", "D\351bit Maximum", "Fiabi)HY(lit\351)YH( Maximum" et "Co\373t Minimum". Seul un de ces bits peut \352tre posi)HY(tionn\351)YH(. Rob van Nieuw)HY(kerk)YH(, l'auteur du code TOS-mangling dans ipchains, le confi)HY(gure)YH( comme suit\240:)EP() 6 67 PR(Le "D\351lai Minimum" est particuli\350rement important pour moi. Je le positionne \340 1 pour les paquets interactifs sur mon routeur \201Linux\202 qui envoie le trafic vers l'ext\351rieur. Je suis derri\350re un modem \340 33,6\240Kbps. Linux r\351partit les paquets dans trois files d'attente. De cette mani\350re, j'obtiens des performances acceptables pour le trafic interactif tout en t\351l\351chargeant en m\352me temps.)RP()0 P(L'utili)HY(sa)HY(tion)YH( la plus commune est de confi)HY(gu)HY(rer)YH( les connexions telnet et ftp \340 "D\351lai Minimum" et les donn\351es FTP \340 "D\351bit Maximum". Cela serait fait comme suit, sur mon routeur\240:)EP() 6 60 PR(# iptables -A PREROUTING -t mangle -p tcp --sport telnet \200 -j TOS --set-tos Minimize-Delay # iptables -A PREROUTING -t mangle -p tcp --sport ftp \200 -j TOS --set-tos Minimize-Delay # iptables -A PREROUTING -t mangle -p tcp --sport ftp-data \200 -j TOS --set-tos Maximize-Throughput)RP()0 P(En fait, cela ne marche que pour les donn\351es venant d'un telnet ext\351)HY(rieur)YH( vers votre ordi)HY(na)HY(teur)YH( local. Dans l'autre sens, \347a se fait tout seul\240: telnet, ssh, et consorts confi)HY(gurent)YH( le champ TOS auto)HY(ma)HY(tique)HY(ment)YH( pour les paquets sortants.)EP()0 P(Si vous avez un client inca)HY(pable)YH( de le faire, vous pouvez toujours le faire avec netfil)HY(ter)YH(. Sur votre machine locale\240:)EP() 6 56 PR(# iptables -A OUTPUT -t mangle -p tcp --dport telnet \200 -j TOS --set-tos Minimize-Delay # iptables -A OUTPUT -t mangle -p tcp --dport ftp \200 -j TOS --set-tos Minimize-Delay # iptables -A OUTPUT -t mangle -p tcp --dport ftp-data \200 -j TOS --set-tos Maximize-Throughput)RP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 134 H(5.\240Cache)WB 301 Sn()WB 133 Sn( web trans)HY(pa)HY(rent)YH( utili)HY(sant)YH( netfil)HY(ter)YH(, iproute2, ipchains et squid)EH()BR()BR()BR()0 P(Cette section a \351t\351 envoy\351e par le lecteur Ram Narula de "Inter)HY(net)YH( for Educa)HY(tion)YH(" \201Inter)HY(net)YH( pour l'\351duca)HY(tion)YH(\202 \201Thai)HY(lande)YH(\202.)EP()0 P(La tech)HY(nique)YH( habi)HY(tuelle)YH( pour r\351ali)HY(ser)YH( ceci dans Linux est proba)HY(ble)HY(ment)YH( l'utili)HY(sa)HY(tion)YH( d'ipchains APRES s'\352tre assur\351 que le trafic sortant du port 80 \201web\202 est rout\351 \340 travers le serveur faisant fonc)HY(tion)HY(ner)YH( squid.)EP()0 P(Il y a 3 m\351thodes communes pour \352tre s\373r que le trafic sortant du port 80 est rout\351 vers le serveur faisant fonc)HY(tion)HY(ner)YH( squid et une quatri\350me est intro)HY(duite)YH( ici.)EP()0 P()BR()0 DL()0 DT(La passe)HY(relle)YH( le fait.)DD()0 P(Si vous pouvez dire \340 votre passe)HY(relle)YH( que les paquets sortants \340 desti)HY(na)HY(tion)YH( du port 80 doivent \352tre envoy\351s vers l'adresse IP du serveur squid.)EP()0 P(MAIS)EP()0 P(Ceci am\350ne)HY(rait)YH( une charge suppl\351)HY(men)HY(taire)YH( sur le routeur et des routeurs commer)HY(ciaux)YH( peuvent m\352me ne pas suppor)HY(ter)YH( ceci.)EP()0 DT(Utili)HY(ser)YH( un commu)HY(ta)HY(teur)YH( Couche 4.)DD()0 P(Les commu)HY(ta)HY(teurs)YH( Couche 4 peuvent mani)HY(pu)HY(ler)YH( ceci sans aucun probl\350me.)EP()0 P(MAIS)EP()0 P(Le co\373t pour un tel \351qui)HY(pe)HY(ment)YH( est en g\351n\351ral tr\350s \351lev\351. Typique)HY(ment)YH(, un commu)HY(ta)HY(teur)YH( couche 4 co\373te norma)HY(le)HY(ment)YH( plus cher qu'un serveur clas)HY(sique)YH( + un bon serveur linux.)EP()0 DT(Utili)HY(ser)YH( le serveur cache comme passe)HY(relle)YH( r\351seau)DD()0 P(Vous pouvez forcer TOUT le trafic \340 travers le serveur cache)EP()0 P(MAIS)EP()0 P(Ceci est plut\364t risqu\351 dans la mesure o\371 Squid utilise beau)HY(coup)YH( de ressources CPU, ce qui peut conduire \340 une baisse des perfor)HY(mances)YH( de tout le r\351seau. Le serveur peut \351gale)HY(ment)YH( ne plus fonc)HY(tion)HY(ner)YH( et personne sur le r\351seau ne pourra acc\351der \340 Inter)HY(net)YH( si cela a lieu.)EP()0 DT(Routeur Linux+NetFil)HY(ter)YH(.)DD()0 P(En utili)HY(sant)YH( Netfil)HY(ter)YH(, une autre tech)HY(nique)YH( peut \352tre impl\351)HY(men)HY(t\351e)YH(. Celle-ci consiste \340 utili)HY(ser)YH( Netfil)HY(ter)YH( pour "marquer" les paquets \340 desti)HY(na)HY(tion)YH( du port 80 et \340 utili)HY(ser)YH( iproute2 pour router les paquets "marqu\351s" vers le serveur Squid.)EP()LD()BR( ) 24 50 PR(|----------------| | Impl\351mentation | |----------------| Adresses utilis\351es 10.0.0.1 naret \201serveur NetFilter\202 10.0.0.2 silom \201serveur Squid\202 10.0.0.3 donmuang \201routeur connect\351 \340 Internet\202 10.0.0.4 kaosarn \201un autre serveur sur le r\351seau\202 10.0.0.5 RAS 10.0.0.0/24 r\351seau principal 10.0.0.0/19 r\351seau total |----------------| |Sch\351ma du r\351seau| |----------------| Internet | donmuang | ------------hub/commutateur---------- | | | | naret silom kaosarn RAS etc.)RP( Premi\350)HY(re)HY(ment)YH(, faire en sorte que tout le trafic passe par naret en \351tant s\373r que c'est la passe)HY(relle)YH( par d\351faut, \340 l'exception de silom. La passe)HY(relle)YH( par d\351faut de silom doit \352tre donmuang \20110.0.0.3\202 ou ceci cr\351e)HY(rait)YH( une boucle du trafic web.)EP()0 P(\201Tous les serveurs sur mon r\351seau avaient 10.0.0.1 comme passe)HY(relle)YH( par d\351faut qui \351tait l'ancienne adresse du routeur donmuang. Cela m'a conduit \340 attri)HY(buer)YH( 10.0.0.3 comme adresse IP \340 donmuang et \340 donner 10.0.0.1 comme adresse IP \340 naret.\202)EP()0 P( ) 3 29 PR(Silom ----- -configurer squid et ipchains)RP( )EP()0 P(Pour la confi)HY(gu)HY(ra)HY(tion)YH( du serveur Squid sur silom, soyez s\373r que celui-ci supporte le cache/proxy trans)HY(pa)HY(rent)YH( \201trans)HY(pa)HY(rent)YH( caching/proxying\202. Le port par d\351faut pour squid est en g\351n\351ral 3128. Tout le trafic pour le port 80 doit donc \352tre redi)HY(rig\351)YH( loca)HY(le)HY(ment)YH( vers le port 3128. Ceci peut \352tre fait en utili)HY(sant)YH( ipchains comme suit\240:)EP()0 P( ) 3 74 PR(silom# ipchains -N allow1 silom# ipchains -A allow1 -p TCP -s 10.0.0.0/19 -d 0/0 80 -j REDIRECT 3128 silom# ipchains -I input -j allow1)RP( )EP()0 P(Ou, avec netfil)HY(ter)YH(: ) 1 89 PR(silom# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128)RP( )EP()0 P(\201note: vous pouvez avoir \351gale)HY(ment)YH( d'autres entr\351es\202)EP()0 P(Pour plus d'infor)HY(ma)HY(tions)YH( sur la confi)HY(gu)HY(ra)HY(tion)YH( du serveur Squid, se r\351f\351rer \340 la page FAQ Squid sur )R41 2 A(http://squid.nlanr.net)EA(\202.)EP()0 P(Soyez s\373r que l"ip forwar)HY(ding)YH(" est actif sur votre serveur et que la passe)HY(relle)YH( par d\351faut pour ce serveur est donmuand \201PAS naret\202.)EP()0 P( ) 4 51 PR(Naret ----- - configurer squid et ipchains - d\351sactiver les messages icmp REDIRECT \201si besoin\202)RP( )EP()0 P( )BR()4 OL()0 P()-1 LI("Marquer" les paquets \340 desti)HY(na)HY(tion)YH( du port 80 avec la valeur 2 ) 2 68 PR( naret# iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 \200 -j MARK --set-mark 2)RP( )EP()0 P()-1 LI(Confi)HY(gu)HY(rer)YH( iproute2 de sorte qu'il route les paquets avec la marque 2 vers silom ) 4 63 PR(naret# echo 202 www.out >> /etc/iproute2/rt_tables naret# ip rule add fwmark 2 table www.out naret# ip route add default via 10.0.0.2 dev eth0 table www.out naret# ip route flush cache)RP()EP()0 P(Si donmuang et naret sont sur le m\352me r\351seau, naret ne doit pas envoyer de messages icmp REDI)HY(RECT)YH(. Ceux-ci doivent \352tre d\351sac)HY(ti)HY(v\351s)YH( par\240: ) 3 62 PR(naret# echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects naret# echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects naret# echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects)RP( )EP()LO()BR( )EP()0 P(La confi)HY(gu)HY(ra)HY(tion)YH( est termi)HY(n\351e)YH(, v\351ri)HY(fions)YH(-la.)EP()0 P( ) 31 84 PR(Sur naret: naret# iptables -t mangle -L Chain PREROUTING \201policy ACCEPT\202 target prot opt source destination MARK tcp -- anywhere anywhere tcp dpt:www MARK set 0x2 Chain OUTPUT \201policy ACCEPT\202 target prot opt source destination naret# ip rule ls 0: from all lookup local 32765: from all fwmark 2 lookup www.out 32766: from all lookup main 32767: from all lookup default naret# ip route list table www.out default via 203.114.224.8 dev eth0 naret# ip route 10.0.0.1 dev eth0 scope link 10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.1 127.0.0.0/8 dev lo scope link default via 10.0.0.3 dev eth0 \201soyez s\373r que silom appartiens \340 l'une des lignes ci-dessus. Dans ce cas, c'est la ligne avec 10.0.0.0/24\202 |------| |-FAIT-| |------|)WR( )RP( )EP()2 Sl()BR()BR()BR()BR()0 3 135 H(5.1.\240Sch\351ma)WB 302 Sn()WB 134 Sn( du trafic apr\350s l'impl\351)HY(men)HY(ta)HY(tion)YH()EH()BR()BR()BR() 17 55 PR(|---------------------------------------| |Sch\351ma du trafic apr\350s l'impl\351mentation| |---------------------------------------| INTERNET /\200 || \200/ -----------------routeur donmuang--------------------- /\200 /\200 || || || || || \200/ || naret silom || *trafic \340 destination du port 80=====>\201cache\202 || /\200 || || || \200/ \200/ \200\200===================================kaosarn, RAS, etc.)RP()0 P(Noter que le r\351seau est asym\351)HY(trique)YH( car il y a un saut suppl\351)HY(men)HY(taire)YH( sur le chemin sortant.)EP() 10 74 PR(Voici le cheminement d'un paquet traversant le r\351seau de kaosarn allant et venant d'Internet. Pour le trafic web/http\240: requ\352te http kaosarn->naret->silom->donmuang->Internet r\351ponse http de Internet->donmuang->silom->kaosarn Pour les requ\352tes non web/http \201par ex. telnet\202\240: donn\351es sortantes kaosarn->naret->donmuang->Internet donn\351es entrantes d'Internet->donmuang->kaosarn)RP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 136 H(6.\240Circon)WB 303 Sn()HY(ve)HY(nir)YH()WB 135 Sn( aux probl\350mes de la d\351cou)HY(verte)YH( du MTU de chemin en confi)HY(gu)HY(rant)YH( un MTU par routes)EH()BR()BR()BR()0 P(Pour envoyer de grande quan)HY(tit\351)YH( de donn\351es, Inter)HY(net)YH( fonc)HY(tionne)YH( g\351n\351)HY(ra)HY(le)HY(ment)YH( mieux quand de grands paquets sont utili)HY(s\351s)YH(. Chaque paquet implique une d\351ci)HY(sion)YH( de routage. Le trans)HY(fert)YH( d'un fichier de 1Mo peut entra\356)HY(ner)YH( soit l'envoi de 700 paquets, en maxi)HY(mi)HY(sant)YH( la taille des paquets, soit de 4000 paquets en utili)HY(sant)YH( la plus petite taille possible.)EP()0 P(Cepen)HY(dant)YH(, tous les \351l\351ments d'Inter)HY(net)YH( ne supportent pas une capa)HY(cit\351)YH( utile \201payload\202 de 1460 octets par paquet. Il est de plus n\351ces)HY(saire)YH( d'essayer de trouver le plus grand paquet qui "convien)HY(dra)YH(" le mieux, dans le but d'opti)HY(mi)HY(ser)YH( la connexion.)EP()0 P(Ce proces)HY(sus)YH( est appel\351 "D\351cou)HY(verte)YH( du MTU de chemin", o\371 MTU signi)HY(fie)YH( 'Maximum Trans)HY(fert)YH( Unit' \201Unit\351 de trans)HY(fert)YH( maximum\202.)EP()0 P(Quand un routeur rencontre un paquet qui est trop gros pour \352tre envoy\351 en un seul morceau, ET que celui-ci a \351t\351 marqu\351 avec le bit "Don't Frag)HY(ment)YH(", il retourne un message ICMP indiquant qu'il a \351t\351 oblig\351 de rejeter le paquet. L'h\364te \351met)HY(teur)YH( prend acte de cette indi)HY(ca)HY(tion)YH( en envoyant des paquets plus petits et, par it\351ra)HY(tion)YH(, peut trouver la taille optimum du paquet pour une connexion \340 travers un chemin parti)HY(cu)HY(lier)YH(.)EP()0 P(Ceci fonc)HY(tion)HY(nait)YH( correc)HY(te)HY(ment)YH( jusqu'\340 ce que Inter)HY(net)YH( soit d\351cou)HY(vert)YH( par des vandales qui s'efforcent de pertur)HY(ber)YH( les commu)HY(ni)HY(ca)HY(tions)YH(. Ceci a conduit les admi)HY(nis)HY(tra)HY(teurs)YH( \340, soit bloquer, soit mettre en forme le trafic ICMP lors d'essais malen)HY(con)HY(treux)YH( dans le but d'am\351lio)HY(rer)YH( la s\351cu)HY(rit\351)YH( ou la robus)HY(tesse)YH( de leurs services Inter)HY(net)YH(.)EP()0 P(La cons\351quence, main)HY(te)HY(nant)YH(, est que la d\351cou)HY(verte)YH( du MTU de chemin fonc)HY(tionne)YH( de moins en moins bien, et \351choue pour certaines routes, condui)HY(sant)YH( \340 d'\351tranges sessions TCP/IP qui tombent peu de temps apr\350s.)EP()0 P(Bien que je n'aie pas de preuves de ceci, deux sites avec qui j'avais l'habi)HY(tude)YH( d'avoir des probl\350mes faisaient fonc)HY(tion)HY(ner)YH( \340 la fois Alteon et Acedi)HY(rec)HY(tors)YH( avant les syst\350mes affec)HY(t\351s)YH(. Peut-\352tre quelqu'un avec plus de connais)HY(sances)YH( peut fournir des indices quant \340 la raison de ce qui se passe.)EP()2 Sl()BR()BR()BR()BR()0 3 137 H(6.1.\240Solu)WB 304 Sn()HY(tion)YH()WB 136 Sn()EH()BR()BR()BR()0 P(Quand vous rencon)HY(trez)YH( des sites qui pr\351sentent ce probl\350me, vous pouvez d\351sac)HY(ti)HY(ver)YH( la d\351cou)HY(verte)YH( du MTU de chemin en le confi)HY(gu)HY(rant)YH( manuel)HY(le)HY(ment)YH(. Koos van den Hout a \340 peu pr\350s \351crit\240:)EP()BR()BQ()0 P(Le probl\350me suivant\240: j'ai confi)HY(gur\351)YH( le mtu et mru de ma ligne d\351di\351e fonc)HY(tion)HY(nant)YH( avec ppp \340 296 dans la mesure o\371 le d\351bit est de seule)HY(ment)YH( 33k6 et que je ne peux pas influen)HY(cer)YH( la file d'attente de l'autre c\364t\351. A 296, la r\351ponse \340 l'appui d'une touche inter)HY(vient)YH( dans un d\351lai raison)HY(nable)YH(.)EP()0 P(Et, de mon c\364t\351, j'ai un routeur avec traduc)HY(tion)YH( d'adresse \201masquage\202 fonc)HY(tion)HY(nant)YH( \201bien s\373r\202 sous Linux.)EP()0 P(R\351cem)HY(ment)YH(, j'ai s\351par\351 le serveur du routeur de sorte que la plupart des appli)HY(ca)HY(tions)YH( fonc)HY(tionnent)YH( sur une machine diff\351)HY(rente)YH( de celle qui r\351alise le routage.)EP()0 P(J'ai alors eu des probl\350mes en me connec)HY(tant)YH( sur l'irc. Grosse panique\240! Je vous assure que certains essais trou)HY(vaient)YH( que j'\351tais connect\351 \340 l'irc, me montrant m\352me comme connect\351 sur l'irc mais je ne rece)HY(vais)YH( pas le "motd" \201message of the day, message du jour\202 de l'irc. J'ai v\351rifi\351 ce qui pouvait \352tre erron\351 et ai not\351 que j'avais d\351j\340 eu des soucis li\351s au MTU en contac)HY(tant)YH( certains sites web. Je n'avais aucun souci pour les atteindre quand le MTU \351tait \340 1500, le probl\350me n'appa)HY(rais)HY(sant)YH( que lorsque le MTU \351tait confi)HY(gur\351)YH( \340 296. Puisque les serveurs irc bloquent tout le trafic dont il n'ont pas besoin pour leurs op\351ra)HY(tions)YH( imm\351)HY(diates)YH(, ils bloquent aussi l'icmp.)EP()0 P(J'ai manoeu)HY(vr\351)YH( pour convaincre les respon)HY(sables)YH( d'un serveur web que ceci \351tait la cause d'un probl\350me, mais les respon)HY(sables)YH( du serveur irc n'avaient pas l'inten)HY(tion)YH( de r\351parer ceci.)EP()0 P(Donc, je devais \352tre s\373r que le trafic masqu\351 sortant partait avec le mtu faible du lien externe. Mais, je voulais que le trafic ether)HY(net)YH( local ait le MTU normal \201pour des choses comme le trafic nfs\202.)EP()0 P(Solu)HY(tion)YH(\240: ) 1 41 PR(ip route add default via 10.0.0.1 mtu 296)RP( )EP()0 P(\20110.0.0.1 \351tant ma passe)HY(relle)YH( par d\351faut, l'adresse interne de mon routeur masquant\202)EP()QB()BR()0 P(En g\351n\351ral, il est possible d'outre)HY(pas)HY(ser)YH( la d\351cou)HY(verte)YH( du MTU de chemin en confi)HY(gu)HY(rant)YH( des routes sp\351ci)HY(fiques)YH(. Par exemple, si seuls certains r\351seaux posent probl\350mes, ceci devrait aider\240:)EP() 1 49 PR(ip route add 195.96.96.0/24 via 10.0.0.1 mtu 1000)RP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 138 H(7.\240Circon)WB 305 Sn()HY(ve)HY(nir)YH()WB 137 Sn( aux probl\350mes de la d\351cou)HY(verte)YH( du MTU de chemin en impo)HY(sant)YH( le MSS \201pour les utili)HY(sa)HY(teurs)YH( de l'ADSL, du c\342ble, de PPPoE & PPtP\202)EH()BR()BR()BR()0 P(Comme expliqu\351 au-dessus, la d\351cou)HY(verte)YH( du MTU de chemin ne marche pas aussi bien que cela devrait \352tre. Si vous savez qu'un saut de votre r\351seau a un MTU limit\351 \201<1500\202, vous ne pouvez pas compter sur la d\351cou)HY(verte)YH( du MTU de chemin pour le d\351cou)HY(vrir)YH(.)EP()0 P(Outre le MTU, il y a encore un autre moyen de confi)HY(gu)HY(rer)YH( la taille maximum du paquet, par ce qui est appel\351 le MSS \201Maximum Segment Size, Taille Maximum du Segment\202. C'est un champ dans les options TCP du paquet SYN.)EP()0 P(Les noyaux Linux r\351cents, et quelques pilotes de p\351ri)HY(ph\351)HY(rique)YH( PPPoE \201notam)HY(ment)YH(, l'excellent Roaring Penguin\202 impl\351)HY(mentent)YH( la possi)HY(bi)HY(lit\351)YH( de 'fixer le MSS'.)EP()0 P(Le bon c\364t\351 de tout ceci est que, en posi)HY(tion)HY(nant)YH( la valeur MSS, vous d\356tes \340 l'h\364te distant de mani\350re \351qui)HY(voque)YH( "n'essaie pas de m'envoyer des paquets plus grands que cette valeur". Aucun trafic ICMP n'est n\351ces)HY(saire)YH( pour faire fonc)HY(tion)HY(ner)YH( cela.)EP()0 P(Malheu)HY(reu)HY(se)HY(ment)YH(, c'est de la bidouille \351vidente -- \347a d\351truit la propri\351t\351 \253bout-en-bout\273 de la connexion en modi)HY(fiant)YH( les paquets. Ayant dit cela, nous utili)HY(sons)YH( cette astuce dans beau)HY(coup)YH( d'endroit et cela fonc)HY(tionne)YH( comme un charme.)EP()0 P(Pour que tout ceci fonc)HY(tionne)YH(, vous aurez besoin au moins de iptables-1.2.1a et de Linux 2.4.3 ou plus. La ligne de commande basique est\240: ) 1 83 PR(# iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu)RP( )EP()0 P(Ceci calcule le MSS appro)HY(pri\351)YH( pour votre lien. Si vous vous sentez coura)HY(geux)YH( ou que vous pensez \352tre le mieux plac\351 pour juger, vous pouvez aussi faire quelque chose comme ceci\240:)EP()0 P( ) 1 76 PR(# iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 128)RP( )EP()0 P(Ceci confi)HY(gure)YH( le MSS du paquet SYN \340 128. Utili)HY(sez)YH( ceci si vous avez de la voix sur IP \201VoIP\202 avec de tous petits paquets, et de grands paquets http qui provoquent des coupures dans vos commu)HY(ni)HY(ca)HY(tions)YH( vocales.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 139 H(8.\240Le)WB 306 Sn()WB 138 Sn( Condi)HY(tion)HY(neur)YH( de Trafic Ultime\240: Faible temps de latence, T\351l\351)HY(char)HY(ge)HY(ment)YH( vers l'amont et l'aval rapide)EH()BR()BR()BR()0 P(Note\240: ce script a r\351cem)HY(ment)YH( \351t\351 mis \340 niveau et il ne marchait avant qu'avec les clients Linux de votre r\351seau\240! Vous devriez donc le mettre \340 jour si vous avez des machines Windows ou des Macs dans votre r\351seau qui n'\351taient pas capables de t\351l\351)HY(char)HY(ger)YH( plus rapi)HY(de)HY(ment)YH( pendant que d'autres \351taient en train de t\351l\351)HY(char)HY(ger)YH( vers l'amont.)EP()0 P(J'ai essay\351 de cr\351er le Saint Graal\240: )BR()0 DL()0 DT(Main)HY(te)HY(nir)YH( \340 tout moment un faible temps de latence pour le trafic inter)HY(ac)HY(tif)YH()DD()0 P(Ceci signi)HY(fie)YH( que la r\351cu)HY(p\351)HY(ra)HY(tion)YH( ou la trans)HY(mis)HY(sion)YH( de fichiers ne doivent pas pertur)HY(ber)YH( SSH ou m\352me telnet. Ceci est la chose la plus impor)HY(tante)YH(, car m\352me un temps de latence de 200ms est impor)HY(tant)YH( pour pouvoir travailler confor)HY(ta)HY(ble)HY(ment)YH(.)EP()0 DT(Auto)HY(ri)HY(ser)YH( le 'surf' \340 des vitesses raison)HY(nables)YH( pendant que l'on t\351l\351)HY(charge)YH( vers l'amont ou vers l'aval)DD()0 P(M\352me si http est un trafic de masse, les autres trafics ne doivent pas trop le noyer.)EP()0 DT(Etre s\373r que le t\351l\351)HY(char)HY(ge)HY(ment)YH( vers l'amont ne va pas faire du tort aux t\351l\351)HY(char)HY(ge)HY(ments)YH( vers l'aval et aux autres \351l\351ments autour)DD()0 P(Le prin)HY(ci)HY(pal)YH( ph\351no)HY(m\350ne)YH( observ\351 est la forte r\351duc)HY(tion)YH( de la vitesse de t\351l\351)HY(char)HY(ge)HY(ment)YH( vers l'aval quand il y a du trafic montant.)EP()LD()BR( Il s'av\350re que tout ceci est possible, au prix d'une minus)HY(cule)YH( r\351duc)HY(tion)YH( de la bande passante. La pr\351sence de grandes files d'attente sur les dispo)HY(si)HY(tifs)YH( d'acc\350s domes)HY(tiques)YH(, comme le c\342ble ou les modems DSL, explique pourquoi les t\351l\351)HY(char)HY(ge)HY(ments)YH( vers l'amont, vers l'aval et ssh se p\351na)HY(lisent)YH( mutuel)HY(le)HY(ment)YH(.)EP()0 P(La prochaine partie explique en profon)HY(deur)YH( ce qui provoque les retards, et comment nous pouvons les corri)HY(ger)YH(. Vous pouvez sans danger la passer et aller direc)HY(te)HY(ment)YH( au script si vous vous fichez de la fa\347on dont la magie op\350re.)EP()2 Sl()BR()BR()BR()BR()0 3 140 H(8.1.\240Pourquoi)WB 307 Sn()WB 139 Sn( cela ne marche t-il pas bien par d\351faut\240?)EH()BR()BR()BR()0 P(Les FAI savent que leurs perfor)HY(mances)YH( ne sont seule)HY(ment)YH( jug\351es que sur la vitesse \340 laquelle les personnes peuvent t\351l\351)HY(char)HY(ger)YH( vers l'aval. En plus de la bande passante dispo)HY(nible)YH(, la vitesse de t\351l\351)HY(char)HY(ge)HY(ment)YH( est lour)HY(de)HY(ment)YH( influen)HY(c\351e)YH( par la perte des paquets, qui g\352ne s\351rieu)HY(se)HY(ment)YH( les perfor)HY(mances)YH( de TCP/IP. Les grandes files d'attente peuvent aider \340 pr\351ve)HY(nir)YH( la perte des paquets, et augmen)HY(ter)YH( les t\351l\351)HY(char)HY(ge)HY(ments)YH(. Les FAI confi)HY(gurent)YH( donc de grandes files d'attente.)EP()0 P(Ces grandes files d'attente endom)HY(magent)YH( cepen)HY(dant)YH( l'inter)HY(ac)HY(ti)HY(vit\351)YH(. Une frappe doit d'abord parcou)HY(rir)YH( la file d'attente du flux montant, ce qui peut prendre plusieurs secondes, et aller jusqu'\340 l'h\364te distant. Elle est alors trait\351e, condui)HY(sant)YH( \340 un paquet de retour qui doit traver)HY(ser)YH( la file d'attente du flux descen)HY(dant)YH(, loca)HY(li)HY(s\351e)YH( chez votre FAI, avant qu'elle n'appa)HY(raisse)YH( sur l'\351cran.)EP()0 P(Cet HOWTO nous enseigne plusieurs mani\350res de modi)HY(fier)YH( et traiter la file d'attente mais, malheu)HY(reu)HY(se)HY(ment)YH(, toutes les files d'attente ne nous sont pas acces)HY(sibles)YH(. Les files d'attente du FAI sont sans limites et la file d'attente du flux montant r\351side proba)HY(ble)HY(ment)YH( dans votre modem c\342ble ou votre p\351ri)HY(ph\351)HY(rique)YH( DSL. Il se peut que vous soyez capable ou non de le confi)HY(gu)HY(rer)YH(. La plupart du temps, ce ne sera pas le cas.)EP()0 P(Et apr\350s\240? Etant donn\351 que nous ne pouvons pas contr\364)HY(ler)YH( ces files d'attente, elles doivent dispa)HY(ra\356tre)YH( et \352tre trans)HY(f\351)HY(r\351es)YH( sur notre routeur Linux. Heureu)HY(se)HY(ment)YH(, ceci est possible.)EP()0 P()BR()0 DL()0 DT(Limiter la vitesse de t\351l\351)HY(char)HY(ge)HY(ment)YH( vers l'amont \201upload\202)DD()0 P(En limi)HY(tant)YH( notre vitesse de t\351l\351)HY(char)HY(ge)HY(ment)YH( vers l'amont \340 une vitesse l\351g\350)HY(re)HY(ment)YH( plus faible que la vitesse r\351elle dispo)HY(nible)YH(, il n'y a pas de files d'attente mises en place dans notre modem. La file d'attente est main)HY(te)HY(nant)YH( trans)HY(f\351)HY(r\351e)YH( vers Linux.)EP()0 DT(Limiter la vitesse de t\351l\351)HY(char)HY(ge)HY(ment)YH( vers l'aval \201down)HY(load)YH(\202)DD()0 P(Ceci est l\351g\350)HY(re)HY(ment)YH( plus rus\351 dans la mesure o\371 nous ne pouvons pas vrai)HY(ment)YH( influen)HY(cer)YH( la vitesse \340 laquelle Inter)HY(net)YH( nous envoie les donn\351es. Nous pouvons cepen)HY(dant)YH( rejeter les paquets qui arrivent trop vite, ce qui provoque le ralen)HY(tis)HY(se)HY(ment)YH( de TCP/IP jusqu'au d\351bit d\351sir\351. Comme nous ne voulons pas suppri)HY(mer)YH( inuti)HY(le)HY(ment)YH( du trafic, nous confi)HY(gu)HY(rons)YH( une vitesse de rafale \201'burst'\202 plus grande.)EP()LD()BR()EP()0 P(Main)HY(te)HY(nant)YH( que nous avons fait ceci, nous avons \351limin\351 tota)HY(le)HY(ment)YH( la file d'attente du flux descen)HY(dant)YH( \201sauf pour de courtes rafales de donn\351es\202, et obtenu la possi)HY(bi)HY(lit\351)YH( de g\351rer la file d'attente du flux montant avec toute la puis)HY(sance)YH( Linux.)EP()0 P(Il nous reste \340 nous assurer que le trafic inter)HY(ac)HY(tif)YH( se retrouve au d\351but de la file d'attente du flux montant. Pour \352tre s\373r que le flux montant ne va pas p\351na)HY(li)HY(ser)YH( le flux descen)HY(dant)YH(, nous d\351pla\347ons \351gale)HY(ment)YH( les paquets ACK au d\351but de la file d'attente. C'est ce qui provoque norma)HY(le)HY(ment)YH( un \351norme ralen)HY(tis)HY(se)HY(ment)YH( quand du trafic de masse est g\351n\351r\351 dans les deux sens. Les paquets ACK du trafic descen)HY(dant)YH( rentrent en concur)HY(rence)YH( avec le trafic montant et sont donc ralen)HY(tis)YH(.)EP()0 P(Si nous avons fait tout ceci, nous obte)HY(nons)YH( les mesures suivantes en utili)HY(sant)YH( l'excel)HY(lente)YH( connexion ADSL de xs4all, en Hollande\240:)EP()0 P( ) 19 93 PR(Temps de latence de base\240: round-trip min/avg/max = 14.4/17.1/21.7 ms Sans le conditionneur de trafic, lors d'un t\351l\351chargement vers l'aval\240: round-trip min/avg/max = 560.9/573.6/586.4 ms Sans le conditionneur de trafic, lors d'un t\351l\351chargement vers l'amont\240: round-trip min/avg/max = 2041.4/2332.1/2427.6 ms Avec le conditionneur, lors d'un t\351l\351chargement vers l'amont \340 220kbit/s\240: round-trip min/avg/max = 15.7/51.8/79.9 ms Avec le conditionneur, lors d'un t\351l\351chargement vers l'aval \340 850kbit/s\240: round-trip min/avg/max = 20.4/46.9/74.0 ms Lors d'un t\351l\351chargement vers l'amont, les t\351l\351chargements vers l'aval s'effectuent \340 environ 80 % de la vitesse maximale disponible et 90% pour les t\351l\351chargements vers l'amont. Le temps de latence augmente alors jusqu'\340 850 ms\240; je n'ai pas encore d\351termin\351 la raison de ce ph\351nom\350ne.)RP( )EP()0 P(Ce que vous pouvez attendre de ce script d\351pend large)HY(ment)YH( de votre vitesse de lien r\351elle. Quand vous t\351l\351)HY(char)HY(gez)YH( vers l'amont \340 pleine vitesse, il y aura toujours un paquet devant votre frappe de clavier. Ceci est la limite basse de votre temps de latence. Pour la calcu)HY(ler)YH(, divisez votre MTU par la vitesse du flux montant. Les valeurs clas)HY(siques)YH( seront un peu plus \351lev\351es que \347a. Dimi)HY(nuez)YH( votre MTU pour un meilleur effet\240!)EP()0 P(Voici deux versions de ce script, une avec l'excellent HTB de Devik, et l'autre avec CBQ qui est pr\351sent dans chaque noyau Linux, contrai)HY(re)HY(ment)YH( \340 HTB. Les deux ont \351t\351 test\351s et marchent correc)HY(te)HY(ment)YH(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 141 H(8.2.\240Le)WB 308 Sn()WB 140 Sn( script \201CBQ\202)EH()BR()BR()BR()0 P(Marche avec tous les noyaux. A l'int\351)HY(rieur)YH( du gestion)HY(naire)YH( de mise en file d'attente CBQ, nous pla\347ons deux SFQ pour \352tre s\373r que de multiples flux de masse ne vont pas mutuel)HY(le)HY(ment)YH( se p\351na)HY(li)HY(ser)YH(.)EP()0 P(Le trafic descen)HY(dant)YH( est r\351gle)HY(ment\351)YH( en utili)HY(sant)YH( un filtre tc conte)HY(nant)YH( un Token Bucket Filter.)EP()0 P(Vous pour)HY(riez)YH( am\351lio)HY(rer)YH( ce script en ajou)HY(tant)YH( 'bounded' aux lignes qui d\351marrent avec 'tc class add .. classid 1:20'. Si vous avez diminu\351 votre MTU, dimi)HY(nuez)YH( aussi les nombres allot & avpkt\240!)EP()0 P( ) 88 78 PR(#!/bin/bash # La configuration ultime pour votre connexion Internet domestique # # Configurez les valeurs suivantes avec des valeurs l\351g\350rement inf\351rieures que # vos vitesses de flux montant et descendant. Exprim\351 en kilobits. DOWNLINK=800 UPLINK=220 DEV=ppp0 # Nettoie les gestionnaires de sortie et d'entr\351s, cache les erreurs tc qdisc del dev $DEV root 2> /dev/null > /dev/null tc qdisc del dev $DEV ingress 2> /dev/null > /dev/null ###### Flux montant \201uplink\202 # installe CBQ \340 la racine tc qdisc add dev $DEV root handle 1: cbq avpkt 1000 bandwidth 10mbit # Le trafic est mis en forme \340 une vitesse de $UPLINK. Ceci \351vite # d'\351normes files d'attente dans votre modem DSL qui p\351nalisent le temps de # latence. # Classe principale tc class add dev $DEV parent 1: classid 1:1 cbq rate ${UPLINK}kbit \200 allot 1500 prio 5 bounded isolated # classe de priorit\351 sup\351rieure 1:10: tc class add dev $DEV parent 1:1 classid 1:10 cbq rate ${UPLINK}kbit \200)WR( allot 1600 prio 1 avpkt 1000 # la classe par d\351faut et pour le trafic de masse 1:20. Re\347oit l\351g\350rement # moins que le trafic et a une priorit\351 plus faible\240: # bulk and default class 1:20 - gets slightly less traffic, # and a lower priority: tc class add dev $DEV parent 1:1 classid 1:20 cbq rate $[9*$UPLINK/10]kbit \200 allot 1600 prio 2 avpkt 1000 # Les deux sont g\351r\351es par SFQ\240: tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10 tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10 # D\351marrage des filtres # le bit D\351lai Minimum du champ TOS \201ssh, PAS scp\202 est dirig\351 vers # 1:10\240: tc filter add dev $DEV parent 1:0 protocol ip prio 10 u32 \200 match ip tos 0x10 0xff flowid 1:10 # ICMP \201ip protocol 1\202 est dirig\351 vers la classe interactive 1:10 de telle # sorte que nous pouvons r\351aliser des mesures et impressionner nos # amis\240: tc filter add dev $DEV parent 1:0 protocol ip prio 11 u32 \200 match ip protocol 1 0xff flowid 1:10 # Pour acc\351l\351rer les t\351l\351chargements vers l'aval lors de la pr\351sence d'un # flux montant, les paquets ACK sont plac\351s dans la classe # interactive\240: tc filter add dev $DEV parent 1: protocol ip prio 12 u32 \200)WR( match ip protocol 6 0xff \200 match u8 0x05 0x0f at 0 \200 match u16 0x0000 0xffc0 at 2 \200 match u8 0x10 0xff at 33 \200 flowid 1:10 # Le reste est consid\351r\351 'non-interactif' cad 'de masse' et fini dans 1:20 tc filter add dev $DEV parent 1: protocol ip prio 13 u32 \200 match ip dst 0.0.0.0/0 flowid 1:20 ########## Flux descendant \201downlink\202 ############# # Ralentir le flux descendant \340 une valeur l\351g\350rement plus faible que votre # vitesse r\351elle de mani\350re \340 \351viter la mise en file d'attente chez notre # FAI. Faites des tests pour voir la vitesse maximum \340 laquelle vous pouvez # le configurer. Les FAI ont tendance \340 avoir *d'\351normes* files d'attente # pour s'assurer de la rapidit\351 des gros t\351l\351chargements. # # attache la r\351glementation d'entr\351e \201ingress policer\202\240: tc qdisc add dev $DEV handle ffff: ingress # Filtre *tout* \2010.0.0.0/0\202, rejette tout ce qui arrive trop # rapidement\240: tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \200 0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1)RP( Si vous voulez que ce script soit ex\351cut\351 par ppp \340 la connexion, copiez-le dans /etc/ppp/ip-up.d.)EP()0 P(Si les deux derni\350res lignes conduisent \340 une erreur, mettez \340 jour l'outil tc avec la derni\350re version\240!)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 142 H(8.3.\240Le)WB 309 Sn()WB 141 Sn( script \201HTB\202)EH()BR()BR()BR()0 P(Le script suivant nous permet d'atteindre tous nos buts en utili)HY(sant)YH( la merveilleuse file d'attente HTB. Voir le chapitre corres)HY(pon)HY(dant)YH(. Cela vaut la peine de mettre \340 jour votre noyau\240! ) 82 78 PR(#!/bin/bash # La configuration ultime pour votre connexion Internet domestique # # Configurez les valeurs suivantes avec des valeurs l\351g\350rement inf\351rieures que # vos vitesses de flux montant et descendant. Exprim\351 en kilobits. DOWNLINK=800 UPLINK=220 DEV=ppp0 #Nettoie les gestionnaires de sortie et d'entr\351s, cache les erreurs tc qdisc del dev $DEV root 2> /dev/null > /dev/null tc qdisc del dev $DEV ingress 2> /dev/null > /dev/null ###### Flux montant \201uplink\202 # installe HTB \340 la racine, le trafic ira par d\351faut vers 1:20\240: tc qdisc add dev $DEV root handle 1: htb default 20 # Le trafic est mis en forme \340 une vitesse de $UPLINK. Ceci \351vite # d'\351normes files d'attente dans votre modem DSL qui p\351nalisent le temps de # latence. tc class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit burst 6k # la classe de haute priorit\351 1:10\240: tc class add dev $DEV parent 1:1 classid 1:10 htb rate ${UPLINK}kbit \200 burst 6k prio 1 )WR( # bulk & default class 1:20 - gets slightly less traffic, # and a lower priority: tc class add dev $DEV parent 1:1 classid 1:20 htb rate $[9*$UPLINK/10]kbit \200 burst 6k prio 2 # Les deux sont g\351r\351es par SFQ\240: tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10 tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10 # le bit D\351lai Minimum du champ TOS \201ssh, PAS scp\202 est dirig\351 vers # 1:10\240: tc filter add dev $DEV parent 1:0 protocol ip prio 10 u32 \200 match ip tos 0x10 0xff flowid 1:10 # ICMP \201ip protocol 1\202 est dirig\351 vers la classe interactive 1:10 de telle # sorte que nous pouvons r\351aliser des mesures et impressionner nos # amis\240: tc filter add dev $DEV parent 1:0 protocol ip prio 10 u32 \200 match ip protocol 1 0xff flowid 1:10 # Pour acc\351l\351rer les t\351l\351chargements vers l'aval lors de la pr\351sence d'un # flux montant, les paquets ACK sont plac\351s dans la classe # interactive\240: tc filter add dev $DEV parent 1: protocol ip prio 10 u32 \200 match ip protocol 6 0xff \200 match u8 0x05 0x0f at 0 \200 match u16 0x0000 0xffc0 at 2 \200 match u8 0x10 0xff at 33 \200)WR( flowid 1:10 # Le reste est consid\351r\351 'non-interactif' cad 'de masse' et fini dans 1:20 ########## Flux descendant \201downlink\202 ############# # Ralentir le flux descendant \340 une valeur l\351g\350rement plus faible que votre # vitesse r\351lle de mani\350re \340 \351viter la mise en file d'attente chez notre # FAI. Faites des tests pour voir la vitesse maximum \340 laquelle vous pouvez # le configurer. Les FAI ont tendance \340 avoir *d'\351normes* files d'attente # pour s'assurer de la rapidit\351 des gros t\351l\351chargements. # # attache la r\351glementation d'entr\351e \201ingress policer\202\240: tc qdisc add dev $DEV handle ffff: ingress # Filtre *tout* \2010.0.0.0/0\202, rejette tout ce qui arrive trop # rapidement\240: tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \200 0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1)RP( Si vous voulez que ce script soit ex\351cut\351 par ppp \340 la connexion, copiez-le dans /etc/ppp/ip-up.d.)EP()0 P(Si les deux derni\350res lignes conduisent \340 une erreur, mettez \340 jour l'outil tc avec la derni\350re version\240!)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 143 H(9.\240Limi)WB 310 Sn()HY(ta)HY(tion)YH()WB 142 Sn( du d\351bit pour un h\364te ou un masque de sous-r\351seau)EH()BR()BR()BR()0 P( Bien que ceci soit d\351crit en d\351tail ailleurs et dans nos pages de manuel, cette ques)HY(tion)YH( est souvent pos\351e. Heureu)HY(se)HY(ment)YH(, il y a une r\351ponse simple qui ne n\351ces)HY(site)YH( pas la compr\351)HY(hen)HY(sion)YH( compl\350te du contr\364le de trafic. )EP()0 P( Ce script de trois lignes met en place la limi)HY(ta)HY(tion)YH( du d\351bit\240: )EP() 7 68 PR(tc qdisc add dev $DEV root handle 1: cbq avpkt 1000 bandwidth 10mbit tc class add dev $DEV parent 1: classid 1:1 cbq rate 512kbit \200 allot 1500 prio 5 bounded isolated tc filter add dev $DEV parent 1: protocol ip prio 16 u32 \200 match ip dst 195.96.96.97 flowid 1:1)RP()0 P( La premi\350re ligne installe un gestion)HY(naire)YH( de mise en file d'attente bas\351 sur des classes sur votre inter)HY(face)YH(, et indique au noyau que, pour ses calculs, il peut la consi)HY(d\351)HY(rer)YH( comme une inter)HY(face)YH( \340 10 Mbits/s. Cepen)HY(dant)YH(, il n'y aura pas de grands dommages si vous indiquez une valeur erron\351e. Donner la vraie valeur permet)HY(tra)YH( d'avoir des choses plus pr\351cises. )EP()0 P( La seconde ligne cr\351e une classe de 512kbit/s avec des valeurs par d\351faut raison)HY(nables)YH(. Pour les d\351tails, voir les pages de manuel cbq et )0 50 1 A(Chapitre\2409, )I(Gestion)HY(naires)YH( de mise en file d'attente pour l'admi)HY(nis)HY(tra)HY(tion)YH( de la bande passante)ES()50 0 TN TL()Ec /AF f D(. )EP()0 P( La derni\350re ligne indique quel trafic devra passer par la classe r\351ali)HY(sant)YH( la mise en forme. Le trafic qui n'est s\351lec)HY(tionn\351)YH( par cette r\350gle n'est PAS mis en forme. Pour avoir des s\351lec)HY(tions)YH( plus compliqu\351es \201sous-r\351seaux, ports sources ou de desti)HY(na)HY(tions)YH(\202, voir )0 81 1 A(Section\2406.2, \253\240Toutes les commandes de filtres dont vous aurez norma)HY(le)HY(ment)YH( besoin\240\273)81 0 TN TL()Ec /AF f D(. )EP()0 P( Si vous avez chang\351 quelque chose et que vous vouliez rechar)HY(ger)YH( le script, ex\351cu)HY(tez)YH( la commande )BD(tc qdisc del dev $DEV root)ES( pour suppri)HY(mer)YH( votre confi)HY(gu)HY(ra)HY(tion)YH( actuelle. )EP()0 P( Le script peut \352tre am\351lior\351 en ajou)HY(tant)YH( une derni\350re ligne option)HY(nelle)YH( )BD(tc qdisc add dev $DEV parent 1:1 sfq perturb 10)ES(. Voir )0 58 1 A(Section\2402.3, \253\240Mise en file d'attente stochas)HY(tique)HY(ment)YH( \351qui)HY(table)YH( \201)EM(Stochas)HY(tic)YH( Fair)HY(ness)YH( Queueing)ES(\202\240\273)58 0 TN TL()Ec /AF f D( pour savoir ce que cela fait. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 144 H(10.\240Exemple)WB 311 Sn()WB 143 Sn( d'une solu)HY(tion)YH( de traduc)HY(tion)YH( d'adresse avec de la QoS)EH()BR()BR()BR()0 P( Je m'appelle Pedro Larroy )BR()0 P()SM(<)0 2 A(piotr%member.fsf.org)EA(>)ES()EP()BR(. Je d\351cris ici une confi)HY(gu)HY(ra)HY(tion)YH( dans le cas o\371 de nombreux utili)HY(sa)HY(teurs)YH( seraient connec)HY(t\351s)YH( \340 Inter)HY(net)YH( \340 travers un routeur Linux qui poss\350de une adresse publique et qui r\351alise de la traduc)HY(tion)YH( d'adresse \201NAT\202. J'utilise cette confi)HY(gu)HY(ra)HY(tion)YH( QoS pour fournir l'acc\350s \340 198 utili)HY(sa)HY(teurs)YH( dans une cit\351 univer)HY(si)HY(taire)YH( dans laquelle je vis et o\371 j'admi)HY(nistre)YH( le r\351seau. Les utili)HY(sa)HY(teurs)YH( sont de gros consom)HY(ma)HY(teurs)YH( de programmes "peer to peer" et un contr\364le de trafic correct est n\351ces)HY(saire)YH(. J'esp\350re que ceci servira d'exemples pratiques \340 tous les lecteurs int\351)HY(res)HY(s\351s)YH( par le lartc. )EP()0 P( Dans un premier temps, la confi)HY(gu)HY(ra)HY(tion)YH( sera r\351ali)HY(s\351e)YH( pas \340 pas et, \340 la fin, j'explique)HY(rai)YH( comment rendre ce proces)HY(sus)YH( auto)HY(ma)HY(tique)YH( au d\351mar)HY(rage)YH(. Le r\351seau utilis\351 pour cet exemple est un r\351seau local connect\351 \340 Inter)HY(net)YH( \340 travers un routeur Linux ayant une adresse publique. L'ajout d'un ensemble de r\350gles iptables permet)HY(trait)YH( faci)HY(le)HY(ment)YH( l'exten)HY(sion)YH( \340 plusieurs adresses IP publiques. Les \351l\351ments suivants sont n\351ces)HY(saires)YH(\240: )BR()0 DL()0 DT(Linux 2.4.18 ou une version du noyau sup\351)HY(rieure)YH( instal)HY(l\351e)YH()DD()0 P( Si vous utili)HY(sez)YH( le noyau 2.4.18, vous devrez appliquer la mise \340 jour HTB. )EP()0 DT(iproute)DD()0 P( Soyez \351gale)HY(ment)YH( s\373r que le binaire "tc" est compa)HY(tible)YH( avec HTB. Un binaire pr\351 compil\351 est distri)HY(bu\351)YH( avec HTB. )EP()0 DT(iptables)DD()0 P( )EP()LD()BR( )EP()2 Sl()BR()BR()BR()BR()0 3 145 H(10.1.\240Commen\347ons)WB 312 Sn()WB 144 Sn( l'opti)HY(mi)HY(sa)HY(tion)YH( de cette rare bande passante)EH()BR()BR()BR()0 P( Tout d'abord, nous allons confi)HY(gu)HY(rer)YH( des gestion)HY(naires)YH( de mise en file d'attente dans lesquels nous allons clas)HY(si)HY(fier)YH( le trafic. Nous cr\351ons un gestion)HY(naire)YH( htb compos\351 de 6 classes avec des prio)HY(ri)HY(t\351s)YH( crois)HY(santes)YH(. Nous avons alors des classes qui obtien)HY(dront)YH( le d\351bit allou\351 et qui pour)HY(ront)YH(, de plus, utili)HY(ser)YH( la bande passante dont les autres classes n'ont pas besoin. Rappe)HY(lons)YH( que les classes de plus hautes prio)HY(ri)HY(t\351s)YH( \201corres)HY(pon)HY(dant)YH( aux nombres prio les plus faibles\202 obtien)HY(dront)YH( en premier l'exc\350s de bande passante. Notre liaison ADSL \340 un flux descen)HY(dant)YH( de 2Mbits/s et un flux montant de 300 kbits/s. J'utilise un d\351bit de seuil \201ceil rate\202 de 240 kbits/s car, au-del\340 de cette limite, les probl\350mes de latence commence \340 prendre de l'ampleur. Ceci est d\373 au remplis)HY(sage)YH( d'un tampon plac\351 quelque part entre nous et les h\364tes distants. )EP()0 P( Ajuster la variable CEIL \340 75% de votre bande passante montante maximum et ajuster le nom de l'inter)HY(face)YH( \201eth0 dans la suite\202 \340 celle qui a l'adresse publique Inter)HY(net)YH(. Ex\351cu)HY(tez)YH( ce qui suit dans un shell root\240: ) 13 85 PR(CEIL=240 tc qdisc add dev eth0 root handle 1: htb default 15 tc class add dev eth0 parent 1: classid 1:1 htb rate ${CEIL}kbit ceil ${CEIL}kbit tc class add dev eth0 parent 1:1 classid 1:10 htb rate 80kbit ceil 80kbit prio 0 tc class add dev eth0 parent 1:1 classid 1:11 htb rate 80kbit ceil ${CEIL}kbit prio 1 tc class add dev eth0 parent 1:1 classid 1:12 htb rate 20kbit ceil ${CEIL}kbit prio 2 tc class add dev eth0 parent 1:1 classid 1:13 htb rate 20kbit ceil ${CEIL}kbit prio 2 tc class add dev eth0 parent 1:1 classid 1:14 htb rate 10kbit ceil ${CEIL}kbit prio 3 tc class add dev eth0 parent 1:1 classid 1:15 htb rate 30kbit ceil ${CEIL}kbit prio 3 tc qdisc add dev eth0 parent 1:12 handle 120: sfq perturb 10 tc qdisc add dev eth0 parent 1:13 handle 130: sfq perturb 10 tc qdisc add dev eth0 parent 1:14 handle 140: sfq perturb 10 tc qdisc add dev eth0 parent 1:15 handle 150: sfq perturb 10)RP( Nous avons juste cr\351\351 une arbo)HY(res)HY(cence)YH( htb avec un seul niveau de profon)HY(deur)YH(. Quelque chose comme ceci\240: ) 12 65 PR(+-----------+ | racine 1: | +-----------+ | +---------------------------------------+ | classe 1:1 | +---------------------------------------+ | | | | | | +----+ +----+ +----+ +----+ +----+ +----+ |1:10| |1:11| |1:12| |1:13| |1:14| |1:15| +----+ +----+ +----+ +----+ +----+ +----+ )RP( )BR()0 DL()0 DT(classid 1:10 htb rate 80kbit ceil 80kbit prio 0)DD()0 P( Ceci est la classe de prio)HY(rit\351)YH( la plus \351lev\351e. Les paquets de cette classe auront le plus faible d\351lai et obtien)HY(dront)YH( en premier l'exc\350s de bande passante. C'est donc une bonne id\351e de limiter le d\351bit de seuil de cette classe. Nous enver)HY(rons)YH( dans cette classe les paquets qui ont un avan)HY(tage)YH( \340 avoir un faible d\351lai, tel que le trafic inter)HY(ac)HY(tif)YH(\240: )EM(ssh, telnet, dns, quake3, irc, et les paquets avec le bit SYN activ\351)ES(. )EP()0 DT(classid 1:11 htb rate 80kbit ceil ${CEIL}kbit prio 1)DD()0 P( Nous avons ici la premi\350re classe dans laquelle nous commen\347ons \340 mettre du trafic de masse. Dans mon exemple, j'ai le trafic prove)HY(nant)YH( de mon serveur web local et les requ\352tes pour les pages web\240: respec)HY(ti)HY(ve)HY(ment)YH( le port source 80 et le port desti)HY(na)HY(tion)YH( 80. )EP()0 DT(classid 1:12 htb rate 20kbit ceil ${CEIL}kbit prio 2)DD()0 P( Dans cette classe, je mettrai le trafic confi)HY(gur\351)YH( avec le champ TOS "D\351bit Maximum" activ\351, ainsi que le reste du trafic prove)HY(nant)YH( des )EM(proces)HY(sus)YH( locaux)ES( de mon routeur vers Inter)HY(net)YH(. Les classes suivantes ne rece)HY(vront)YH( donc que du trafic rout\351 par cette machine. )EP()0 DT(classid 1:13 htb rate 20kbit ceil ${CEIL}kbit prio 2)DD()0 P( Cette classe est pour le trafic des autres machines \253NAT\351es\273 \201NdT\240: b\351n\351)HY(fi)HY(ciant)YH( du service de traduc)HY(tion)YH( d'adresse\202 qui ont besoin d'une prio)HY(rit\351)YH( plus grande dans leur trafic de masse. )EP()0 DT(classid 1:14 htb rate 10kbit ceil ${CEIL}kbit prio 3)DD()0 P( Le trafic mail \201SMTP, pop3,...\202 et les paquets confi)HY(gu)HY(r\351s)YH( avec le champ TOS "Co\373t Minimum" seront envoy\351s dans cette classe. )EP()0 DT(classid 1:15 htb rate 30kbit ceil ${CEIL}kbit prio 3)DD()0 P( Fina)HY(le)HY(ment)YH(, nous avons ici le trafic de masse des machines "NAT\351es" se trou)HY(vant)YH( derri\350re le routeur. Les paquets li\351s \340 kazaa, edonkey et autres iront ici pour ne pas inter)HY(f\351)HY(rer)YH( avec les autres services. )EP()LD()BR( )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 146 H(10.2.\240Clas)WB 313 Sn()HY(si)HY(fi)HY(ca)HY(tion)YH()WB 145 Sn( des paquets)EH()BR()BR()BR()0 P( Nous avons confi)HY(gur\351)YH( le gestion)HY(naire)YH( de mise en file d'attente, mais aucune clas)HY(si)HY(fi)HY(ca)HY(tion)YH( de paquets n'a encore \351t\351 faite. Pour l'instant, tous les paquets sortants passent par la classe 1:15 \201car, nous avons utilis\351\240: tc qdisc add dev eth0 root handle 1: htb )EM(default 15)ES(\202. Nous devons donc main)HY(te)HY(nant)YH( indiquer o\371 doivent aller les paquets. Ceci est la partie la plus impor)HY(tante)YH(. )EP()0 P( Nous allons main)HY(te)HY(nant)YH( confi)HY(gu)HY(rer)YH( les filtres de tel sorte que nous puis)HY(sions)YH( clas)HY(si)HY(fier)YH( les paquets avec iptables. Je pr\351f\350re vrai)HY(ment)YH( le faire avec iptables car celui-ci est tr\350s souple et que nous avons un comp)HY(teur)YH( de paquets pour chaque r\350gle. De plus, avec la cible RETURN, les paquets n'ont pas besoin de traver)HY(ser)YH( toutes les r\350gles. Nous ex\351cu)HY(tons)YH( les commandes suivantes\240: ) 6 77 PR(tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10 tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11 tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:12 tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:13 tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14 tc filter add dev eth0 parent 1:0 protocol ip prio 6 handle 6 fw classid 1:15)RP( Nous indiquons simple)HY(ment)YH( au noyau que les paquets qui ont une valeur FWMARK sp\351ci)HY(fique)YH( \201handle x fw\202 vont dans la classe sp\351ci)HY(fi\351e)YH( \201classid x:x\202. Voyons main)HY(te)HY(nant)YH( comment marquer les paquets avec iptables. )EP()0 P( Tout d'abord, nous devons comprendre comment les paquets traversent les filtres avec iptables\240: ) 7 89 PR( +------------+ +---------+ +-------------+ Paquets-| PREROUTING |--- D\351cision----| FORWARD |-------+-------| POSTROUTING |- Paquets entrant +------------+ de routage +-\255-------+ | +-------------+ sortants | | +-------+ +--------+ | INPUT |-- Processus locaux-| OUTPUT | +-------+ +--------+)RP( Je suppose que toutes vos tables ont leur poli)HY(tique)YH( par d\351faut confi)HY(gu)HY(r\351e)YH( \340 ACCEPT \201-P ACCEPT\202, ce qui devrait \352tre le cas si vous n'avez pas encore touch\351 \340 iptables. Notre r\351seau priv\351 est une classe B avec l'adresse 172.17.0.0/16 et notre adresse publique est 212.170.21.172. )EP()0 P( Nous indiquons au noyau de faire de la traduc)HY(tion)YH( d'adresse )EM(NAT)ES(; les clients du r\351seau priv\351 peuvent alors commen)HY(cer)YH( \340 dialo)HY(guer)YH( avec l'ext\351)HY(rieur)YH(. ) 3 123 PR( echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -s 172.17.0.0/255.255.0.0 -o eth0 -j SNAT --to-source 212.170.21.172 )RP( V\351ri)HY(fions)YH( main)HY(te)HY(nant)YH( que les paquets tran)HY(sitent)YH( bien \340 travers 1:15\240: ) 2 49 PR( tc -s class show dev eth0 )RP( )EP()0 P( Vous pouvez commen)HY(cer)YH( \340 marquer les paquets en ajou)HY(tant)YH( les r\350gles dans la cha\356ne PREROU)HY(TING)YH( de la table mangle. ) 2 63 PR(iptables -t mangle -A PREROUTING -p icmp -j MARK --set-mark 0x1 iptables -t mangle -A PREROUTING -p icmp -j RETURN)RP( Vous devriez main)HY(te)HY(nant)YH( \352tre capable de voir l'\351volu)HY(tion)YH( du comp)HY(teur)YH( de paquets quand vous pinguez des sites sur Inter)HY(net)YH( depuis les machines du r\351seau priv\351. V\351ri)HY(fiez)YH( que le comp)HY(teur)YH( de paquets augmente dans 1:10\240: ) 1 25 PR(tc -s class show dev eth0)RP( Nous avons mis -j RETURN de mani\350re \340 ce que les paquets ne traversent pas toutes les r\350gles. Les paquets icmp ne scru)HY(te)HY(ront)YH( pas les autres r\350gles d\351fi)HY(nies)YH( sous RETURN. Gardez ceci \340 l'esprit. Nous commen\347ons main)HY(te)HY(nant)YH( \340 ajouter d'autres r\350gles pour g\351rer les champs TOS\240: ) 6 88 PR(iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 0x1 iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j RETURN iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j MARK --set-mark 0x5 iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j RETURN iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j MARK --set-mark 0x6 iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j RETURN)RP( Donnons la prio)HY(rit\351)YH( aux paquets SSH\240: ) 2 80 PR(iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j MARK --set-mark 0x1 iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j RETURN)RP( Une bonne id\351e est de donner la prio)HY(rit\351)YH( aux paquets initiant une connexion tcp, \340 savoir ceux qui ont le bit SYN activ\351\240: ) 2 97 PR(iptables -t mangle -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x1 iptables -t mangle -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN)RP( Et ainsi de suite. Apr\350s la mise en place des r\350gles dans la cha\356ne PREROU)HY(TING)YH( de la table "mangle", nous termi)HY(nons)YH( par\240: ) 1 55 PR(iptables -t mangle -A PREROUTING -j MARK --set-mark 0x6)RP( Ainsi, le trafic non marqu\351 est dirig\351 vers 1:15. En fait, cette derni\350re \351tape n'est pas n\351ces)HY(saire)YH( puisque la classe par d\351faut est 1:15. Un marquage est quand m\352me r\351alis\351 de mani\350re \340 avoir une coh\351)HY(rence)YH( pour l'ensemble de la confi)HY(gu)HY(ra)HY(tion)YH(. De plus, il est utile d'avoir une comp)HY(ta)HY(bi)HY(lit\351)YH( pour cette r\350gle. )EP()0 P( C'est une bonne id\351e de faire de m\352me avec la cha\356ne OUTPUT. R\351p\351tez ces commandes avec -A OUTPUT \340 la place de PREROU)HY(TING)YH( \201s/PREROU)HY(TING)YH(/OUTPUT/\202. Le trafic g\351n\351r\351 loca)HY(le)HY(ment)YH( \201sur le routeur Linux\202 sera alors \351gale)HY(ment)YH( clas)HY(si)HY(fi\351)YH(. Je termine la cha\356ne OUTPUT par -j MARK --set-mark 0x3 de tel sorte que le trafic local ait une prio)HY(rit\351)YH( plus grande. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 147 H(10.3.\240Am\351lio)WB 314 Sn()HY(rer)YH()WB 146 Sn( notre confi)HY(gu)HY(ra)HY(tion)YH()EH()BR()BR()BR()0 P( Toute notre confi)HY(gu)HY(ra)HY(tion)YH( est main)HY(te)HY(nant)YH( op\351ra)HY(tion)HY(nelle)YH(. Prenez du temps pour regar)HY(der)YH( les graphes et obser)HY(ver)YH( o\371 votre bande passante est la plus utili)HY(s\351e)YH( et cela corres)HY(pond)YH( \340 vos souhaits. J'ai fait ceci pendant de nombreuses heures, ce qui m'a permis d'avoir une connexion Inter)HY(net)YH( fonc)HY(tion)HY(nant)YH( tr\350s bien. Autre)HY(ment)YH(, vous serez confront\351 en perma)HY(nence)YH( \340 des "timeout" et des allo)HY(ca)HY(tions)YH( de bande passante presque nulles pour les nouvelles connexions tcp. )EP()0 P( Si vous rep\351rez des classes qui sont pleines la plupart du temps, ce peut \352tre une bonne id\351e de leur atta)HY(cher)YH( un autre gestion)HY(naire)YH( de mise en file d'attente de mani\350re \340 ce que le partage de la bande passante soit plus \351qui)HY(table)YH(\240: ) 3 60 PR(tc qdisc add dev eth0 parent 1:13 handle 130: sfq perturb 10 tc qdisc add dev eth0 parent 1:14 handle 140: sfq perturb 10 tc qdisc add dev eth0 parent 1:15 handle 150: sfq perturb 10)RP( )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 148 H(10.4.\240Rendre)WB 315 Sn()WB 147 Sn( tout ceci actif au d\351mar)HY(rage)YH()EH()BR()BR()BR()0 P( Il est certain que ceci peut \352tre fait de diff\351)HY(rentes)YH( fa\347ons. Dans mon cas, j'ai un shell script )SM(/etc/init.d/packet)HY(fil)HY(ter)YH()ES( qui accepte les argu)HY(ments)YH( [start | stop | stop-tables | start-tables | reload-tables]. Celui-ci confi)HY(gure)YH( les gestion)HY(naires)YH( de mise en file d'attente et charge les modules du noyau n\351ces)HY(saires)YH( et se comporte donc comme une d\351mon. Le m\352me script charge les r\350gles iptables \340 partir de )SM(/etc/network/iptables-rules)ES(. Je vais l'embel)HY(lir)YH( un peu et le rendrait dispo)HY(nible)YH( sur ma page web )R42 2 A(ici)EA( )EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 149 H(Chapitre\24016.\240Construire)WB 316 Sn()WB 148 Sn( des ponts et des pseudo ponts avec du Proxy ARP)EH()BR()BR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 149 1 A(1. Etat des ponts et iptables)149 0 TN TL()Ec /AF f D()0 DT()0 150 1 A(2. Pont et mise en forme)150 0 TN TL()Ec /AF f D()0 DT()0 151 1 A(3. Pseudo-pont avec du Proxy-ARP)151 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 152 1 A(3.1. ARP & Proxy-ARP)152 0 TN TL()Ec /AF f D()0 DT()0 153 1 A(3.2. Impl\351)HY(men)HY(tez)YH(-le)153 0 TN TL()Ec /AF f D()LD()LD()BR()0 P(Les ponts sont des p\351ri)HY(ph\351)HY(riques)YH( qui peuvent \352tre instal)HY(l\351s)YH( dans un r\351seau sans aucune recon)HY(fi)HY(gu)HY(ra)HY(tion)YH(. Un commu)HY(ta)HY(teur)YH( r\351seau est basique)HY(ment)YH( un pont multi-ports. Un pont est souvent un commu)HY(ta)HY(teur)YH( avec 2 ports. Cepen)HY(dant)YH(, Linux supporte tr\350s bien plusieurs inter)HY(faces)YH( dans un pont, le condui)HY(sant)YH( \340 fonc)HY(tion)HY(ner)YH( comme un vrai commu)HY(ta)HY(teur)YH(.)EP()0 P(Les ponts sont souvent d\351ploy\351s quand on est confront\351 \340 un r\351seau d\351faillant qui a besoin d'\352tre r\351par\351 sans aucune modi)HY(fi)HY(ca)HY(tion)YH(. Dans la mesure o\371 un pont est un \351qui)HY(pe)HY(ment)YH( de niveau 2, la couche sous la couche IP, les routeurs et serveurs ne sont pas conscients de son exis)HY(tence)YH(. Ceci signi)HY(fie)YH( que vous pouvez bloquer ou modi)HY(fier)YH( certains paquets de mani\350re trans)HY(pa)HY(rente)YH( ou mettre en forme le trafic.)EP()0 P(Un autre \351l\351ment positif est qu'un pont peut souvent \352tre remplac\351 par un c\342ble crois\351 ou un hub quand il tombe en panne.)EP()0 P(L'aspect n\351gatif est que la mise en place d'un pont peut engen)HY(drer)YH( beau)HY(coup)YH( de confu)HY(sion)YH(, \340 moins qu'il ne soit tr\350s bien confi)HY(gur\351)YH(. Le pont n'appa)HY(ra\356t)YH( pas dans les trace)HY(route)YH(, mais pour)HY(tant)YH( des paquets dispa)HY(raissent)YH( sans raison ou sont chang\351s en allant d'un point A \340 un point B \201'ce r\351seau est HANTE\240!\202. Vous devriez \351gale)HY(ment)YH( vous deman)HY(der)YH( si une orga)HY(ni)HY(sa)HY(tion)YH( qui "ne veut rien changer" fait le bon choix.)EP()0 P(Le )EM(pont Linux 2.4/2.5)ES( est docu)HY(ment\351)YH( sur )R43 2 A(cette page)EA(.)EP()2 Sl()BR()BR()BR()BR()0 2 150 H(1.\240Etat)WB 317 Sn()WB 149 Sn( des ponts et iptables)EH()BR()BR()BR()0 P(Au moment de Linux 2.4.20, le pont et iptables ne se "voient" pas l'un l'autre sans une aide. Si vous "pontez" les paquets de eth0 \340 eth1, ils ne "passent" pas par iptables. Ceci signi)HY(fie)YH( que vous ne pouvez pas faire de filtrage, de traduc)HY(tion)YH( d'adresse \201NAT\202, de d\351sos)HY(sage)YH( ou quoique ce soit d'autres. Ceci a \351t\351 corrig\351 dans les versions 2.5.45 et sup\351)HY(rieures)YH(.)EP()0 P(Vous devriez \351gale)HY(ment)YH( regar)HY(der)YH( 'ebtables', qui est encore un autre projet. Il vous permet)HY(tra)YH( de faire des choses vrai)HY(ment)YH( terribles comme MACNAT et 'brou)HY(ting)YH('. C'est vrai)HY(ment)YH( effroyable.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 151 H(2.\240Pont)WB 318 Sn()WB 150 Sn( et mise en forme)EH()BR()BR()BR()0 P(Ca marche comme dans les r\351clames. Soyez s\373r du c\364t\351 attri)HY(bu\351)YH( \340 chaque inter)HY(face)YH(. Autre)HY(ment)YH(, il se peut que vous mettiez en forme le trafic sortant au niveau de votre inter)HY(face)YH( interne, ce qui ne marchera pas. Utili)HY(sez)YH( tcpdump si n\351ces)HY(saire)YH(.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 152 H(3.\240Pseudo-pont)WB 319 Sn()WB 151 Sn( avec du Proxy-ARP)EH()BR()BR()BR()0 P(Si vous voulez juste impl\351)HY(men)HY(ter)YH( un pseudo pont, allez jusqu'\340 la section "Impl\351)HY(men)HY(tez)YH(-le". Cepen)HY(dant)YH(, il est sage de lire un peu la fa\347on dont il fonc)HY(tionne)YH( en pratique.)EP()0 P(Un pseudo pont travaille de mani\350re un peu diff\351)HY(rente)YH(. Par d\351faut, un pont trans)HY(met)YH( les paquets sans les alt\351rer d'une inter)HY(face)YH( \340 une autre. Il ne regarde que l'adresse mat\351)HY(rielle)YH( des paquets pour d\351ter)HY(mi)HY(ner)YH( o\371 ils doivent aller. Ceci signi)HY(fie)YH( que vous pouvez "pontez" un trafic que Linux ne comprend pas, aussi long)HY(temps)YH( qu'il y a une adresse mat\351)HY(rielle)YH(.)EP()0 P(Un "pseudo pont" travaille diff\351)HY(rem)HY(ment)YH( et ressemble plus \340 un routeur cach\351 qu'\340 un pont. Mais, comme un pont, il a un impact faible sur l'archi)HY(tec)HY(ture)YH( du r\351seau.)EP()0 P(Le fait qu'il ne soit pas un pont pr\351sente l'avan)HY(tage)YH( que les paquets traversent r\351el)HY(le)HY(ment)YH( le noyau, et peuvent \352tre filtr\351s, modi)HY(fi\351s)YH(, redi)HY(ri)HY(g\351s)YH( ou rerou)HY(t\351s)YH(.)EP()0 P(Un pont r\351el peut \351gale)HY(ment)YH( r\351ali)HY(ser)YH( ces tours de force, mais il a besoin d'un code sp\351cial, comme le Ether)HY(net)YH( Frame Diver)HY(ter)YH( ou la mise \340 jour mention)HY(n\351e)YH( au-dessus.)EP()0 P(Un autre avan)HY(tage)YH( d'un pseudo pont est qu'il ne trans)HY(met)YH( pas les paquets qu'il ne comprend pas, nettoyant ainsi votre r\351seau de beau)HY(coup)YH( de cochon)HY(ne)HY(ries)YH(. Dans le cas o\371 vous auriez besoin de ces cochon)HY(ne)HY(ries)YH( \201comme les paquets SAP ou Netbeui\202, utili)HY(sez)YH( un vrai pont.)EP()2 Sl()BR()BR()BR()BR()0 3 153 H(3.1.\240ARP)WB 320 Sn()WB 152 Sn( & Proxy-ARP)EH()BR()BR()BR()0 P(Quand un h\364te veut dialo)HY(guer)YH( avec un autre h\364te sur le m\352me segment physique, il envoie un paquet du Proto)HY(cole)YH( de R\351so)HY(lu)HY(tion)YH( d'Adresse \201ARP\202 qui, en simpli)HY(fiant)YH( quelque peu, est lu comme ceci\240: "Qui a 10.0.0.1, le dire \340 10.0.0.7". En r\351ponse \340 ceci, 10.0.0.1 renvoie un petit paquet "ici".)EP()0 P(10.0.0.7 envoie alors des paquets \340 l'adresse mat\351)HY(rielle)YH( mention)HY(n\351e)YH( dans le paquet "ici". Il met dans un cache cette adresse mat\351)HY(rielle)YH( pour un temps rela)HY(ti)HY(ve)HY(ment)YH( long et, apr\350s l'expi)HY(ra)HY(tion)YH( du cache, repose sa ques)HY(tion)YH(.)EP()0 P(Quand on construit un pseudo pont, on confi)HY(gure)YH( le pont pour qu'il r\351ponde \340 ces paquets ARP, les h\364tes du r\351seau envoyant alors leurs paquets au pont. Le pont traite alors ces paquets et les envoie \340 l'inter)HY(face)YH( adapt\351e.)EP()0 P(Donc, en r\351sum\351, quand un h\364te d'un c\364t\351 du pont demande l'adresse mat\351)HY(rielle)YH( d'un h\364te se situant de l'autre c\364t\351, le pont r\351pond avec un paquet qui dit "trans)HY(mets)YH( le moi".)EP()0 P(De cette fa\347on, tout le trafic de donn\351es est trans)HY(mis)YH( \340 la bonne place et il traverse toujours le pont.)EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 154 H(3.2.\240Impl\351)WB 321 Sn()HY(men)HY(tez)YH(-le)WB 153 Sn()EH()BR()BR()BR()0 P(Les versions anciennes du noyau linux permet)HY(tait)YH( de faire du proxy ARP unique)HY(ment)YH( \340 une granu)HY(la)HY(rit\351)YH( sous r\351seaux. Ainsi, pour confi)HY(gu)HY(rer)YH( un pseudo pont, il fallait sp\351ci)HY(fier)YH( les bonnes routes vers les deux c\364t\351s du pont, et \351gale)HY(ment)YH( cr\351er les r\350gles proxy-ARP corres)HY(pon)HY(dantes)YH(. C'\351tait p\351nible, d\351j\340 par la quan)HY(tit\351)YH( de texte qu'il fallait taper, puis parce qu'il \351tait facile de se tromper et cr\351er des confi)HY(gu)HY(ra)HY(tions)YH( erro)HY(n\351es)YH(, o\371 le pont r\351pon)HY(dait)YH( \340 des requ\352tes pour des r\351seaux qu'il ne savait pas router.)EP()0 P(Avec Linux 2.4 \201et peut-\352tre bien le 2.2\202, cette possi)HY(bi)HY(lit\351)YH( a \351t\351 retir\351e et a \351t\351 rempla)HY(c\351e)YH( par une option dans le r\351per)HY(toire)YH( /proc, appel\351e "proxy-arp". La proc\351)HY(dure)YH( pour construire un pseudo pont est main)HY(te)HY(nant)YH(\240: )BR()4 OL()0 P()-1 LI(Assi)HY(gner)YH( une adresse \340 chaque inter)HY(face)YH(, la "gauche" et la "droite")EP()0 P()-1 LI(Cr\351er des routes pour que votre machine connaisse quels h\364tes r\351sident \340 gauche et quels h\364tes r\351sident \340 droite)EP()0 P()-1 LI(Activer le proxy-ARP sur chaque inter)HY(face)YH( echo 1 > /proc/sys/net/ipv4/conf/ethL/proxy_arp echo 1 > /proc/sys/net/ipv4/conf/ethR/proxy_arp o\371 L et R d\351si)HY(gnent)YH( les num\351ros de l'inter)HY(face)YH( du c\364t\351 gauche \201Left\202 et de celle du c\364t\351 droit \201Right\202)EP()LO()BR( )EP()0 P(N'oubliez pas \351gale)HY(ment)YH( d'activer l'option ip_forwar)HY(ding)YH(\240! Quand on conver)HY(tit)YH( un vrai pont, il se peut que vous trou)HY(viez)YH( cette option d\351sac)HY(ti)HY(v\351e)YH( dans la mesure o\371 il n'y en a pas besoin pour un pont.)EP()0 P(Une autre chose que vous devriez consi)HY(d\351)HY(rer)YH( lors de la conver)HY(sion)YH( est que vous aurez besoin d'effacer le cache arp des ordi)HY(na)HY(teurs)YH( du r\351seau. Le cache arp peut conte)HY(nir)YH( d'anciennes adresses mat\351)HY(rielles)YH( du pont qui ne sont plus correctes.)EP()0 P(Sur un Cisco, ceci est r\351alis\351 en utili)HY(sant)YH( la commande 'clear arp-cache' et, sous linux, en utili)HY(sant)YH( 'arp -d ip.adresse'. Vous pouvez aussi attendre l'expi)HY(ra)HY(tion)YH( manuelle du cache, ce qui peut \352tre plut\364t long.)EP()0 P(Il se peut que vous d\351cou)HY(vriez)YH( \351gale)HY(ment)YH( que votre r\351seau \351tait mal confi)HY(gur\351)YH( si vous avez/aviez l'habi)HY(tude)YH( de sp\351ci)HY(fier)YH( les routes sans les masques de sous-r\351seau. Dans le pass\351, certaines versions de )BD(route)ES( pouvaient correc)HY(te)HY(ment)YH( deviner le masque ou, au contraire, se tromper sans pour autant vous le noti)HY(fier)YH(. Quand vous faites du routage chirur)HY(gi)HY(cal)YH( comme d\351crit plus haut, il est *vital* que vous v\351ri)HY(fiez)YH( vos masques de sous-r\351seau.)EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 155 H(Chapitre\24017.\240Routage)WB 322 Sn()WB 154 Sn( Dyna)HY(mique)YH( - OSPF et BGP)EH()BR()BR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 155 1 A(1. Confi)HY(gu)HY(rer)YH( OSPF avec Zebra)155 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 156 1 A(1.1. Pr\351requis)156 0 TN TL()Ec /AF f D()0 DT()0 157 1 A(1.2. Confi)HY(gu)HY(rer)YH( Zebra)157 0 TN TL()Ec /AF f D()0 DT()0 158 1 A(1.3. Ex\351cu)HY(ter)YH( Zebra)158 0 TN TL()Ec /AF f D()LD()0 DT()0 159 1 A(2. Confi)HY(gu)HY(rer)YH( BGP4 avec Zebra)159 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 160 1 A(2.1. sch\351ma r\351seau \201Exemple\202)160 0 TN TL()Ec /AF f D()0 DT()0 161 1 A(2.2. Confi)HY(gu)HY(ra)HY(tion)YH( \201Exemple\202)161 0 TN TL()Ec /AF f D()0 DT()0 162 1 A(2.3. V\351ri)HY(fi)HY(ca)HY(tion)YH( de la confi)HY(gu)HY(ra)HY(tion)YH()162 0 TN TL()Ec /AF f D()LD()LD()BR()0 P(Si votre r\351seau commence \340 devenir vrai)HY(ment)YH( gros ou si vous commen)HY(cez)YH( \340 consi)HY(d\351)HY(rer)YH( Inter)HY(net)YH( comme votre propre r\351seau, vous avez besoin d'outils qui routent dyna)HY(mique)HY(ment)YH( vos donn\351es. Les sites sont souvent reli\351s entre eux par de multiples liens, et de nouveaux liens surgissent en perma)HY(nence)YH(.)EP()0 P(L'Inter)HY(net)YH( utilise la plupart du temps les stan)HY(dards)YH( OSPF \201RFC 2328\202 et BGP4 \201RFC 1771\202. Linux supporte les deux, par le biais de )SM(gated)ES( et )SM(zebra)ES(.)EP()0 P(Ce sujet est pour le moment hors du propos de ce docu)HY(ment)YH(, mais laissez-nous vous diriger vers des travaux de r\351f\351)HY(rence)YH(\240:)EP()0 P(Vue d'ensemble\240:)EP()0 P(Cisco Systems )R44 2 A(Cisco Systems Desi)HY(gning)YH( large-scale IP Inter)HY(net)HY(works)YH()EA()EP()0 P(Pour OSPF\240:)EP()0 P(Moy, John T. "OSPF. The anatomy of an Inter)HY(net)YH( routing proto)HY(col)YH(" Addison Wesley. Reading, MA. 1998.)EP()0 P(Halabi a aussi \351crit un tr\350s bon guide sur la concep)HY(tion)YH( du routage OSPF, mais il semble avoir \351t\351 effac\351 du site Web de Cisco. )EP()0 P(Pour BGP\240:)EP()0 P(Halabi, Bassam "Inter)HY(net)YH( routing archi)HY(tec)HY(tures)YH(" Cisco Press \201New Riders Publi)HY(shing)YH(\202. India)HY(na)HY(po)HY(lis)YH(, IN. 1997.)EP()0 P(Il existe aussi)EP()0 P(Cisco Systems)EP()0 P()R45 2 A(Using the Border Gateway Proto)HY(col)YH( for Inter)HY(do)HY(main)YH( Routing)EA()EP()0 P(Bien que les exemples soient sp\351ci)HY(fiques)YH( \340 Cisco, ils sont remarqua)HY(ble)HY(ment)YH( semblables au langage de confi)HY(gu)HY(ra)HY(tion)YH( de Zebra\240:-\202 )EP()2 Sl()BR()BR()BR()BR()0 2 156 H(1.\240Confi)WB 323 Sn()HY(gu)HY(rer)YH()WB 155 Sn( OSPF avec Zebra)EH()BR()BR()BR()0 3 157 H(Pedro)WB 324 Sn( Larroy Tovar)EH()BR()BR()0 P( )SM(<)0 2 A(piotr%member.fsf.org)EA(>)ES( )EP()BR()BR()BR()BR()BR()BR()0 P( )0 2 A(Contac)HY(tez)YH(-moi)EA( si les infor)HY(ma)HY(tions)YH( qui suivent ne sont pas exactes ou si vous avez des sugges)HY(tions)YH(. )R46 2 A(Zebra)EA( est un formi)HY(dable)YH( logi)HY(ciel)YH( de routage dyna)HY(mique)YH( \351crit par Kuni)HY(hiro)YH( Ishi)HY(guro)YH(, Toshiaki Takada et Yasu)HY(hiro)YH( Ohara. Confi)HY(gu)HY(rer)YH( OSPF avec zebra est simple et rapide mais, en pratique, il y a de nombreux para)HY(m\350tres)YH( dans le cas o\371 vous auriez des besoins sp\351ci)HY(fiques)YH(. OSPF est l'abr\351)HY(via)HY(tion)YH( de Open Shor)HY(test)YH( Path First et quelques une de ses fonc)HY(tion)HY(na)HY(li)HY(t\351s)YH( sont\240: )BR()0 DL()0 DT(hi\351rar)HY(chique)YH()DD()0 P( Les r\351seaux sont regrou)HY(p\351s)YH( par )EM(zones)ES( \201)EM(areas)ES(\202, qui sont inter)HY(con)HY(nec)HY(t\351es)YH( par une )EM(zone \351pine dorsale)ES( qui sera appel\351e )EM(zone 0)ES(. Tout le trafic passe par la zone 0 et tous les routeurs de cette zone ont les infor)HY(ma)HY(tions)YH( de routage de toutes les autres zones. )EP()0 DT(conver)HY(gence)YH( rapide)DD()0 P( Les routes sont propa)HY(g\351es)YH( tr\350s rapi)HY(de)HY(ment)YH(, compar\351 \340 RIP par exemple. )EP()0 DT(\351cono)HY(mie)YH( de bande passante)DD()0 P( Utilise la multi-distri)HY(bu)HY(tion)YH( \340 la place de la diffu)HY(sion)YH(, ce qui \351vite de submer)HY(ger)YH( les autres h\364tes avec des infor)HY(ma)HY(tions)YH( de routage sans int\351r\352t pour eux. La multi-distri)HY(bu)HY(tion)YH( r\351duit ainsi le d\351bit sur le r\351seau. De m\352me, )EM(les routeurs internes)ES( \201ceux dont toutes les inter)HY(faces)YH( sont situ\351es dans la m\352me zone\202 n'obtiennent pas d'infor)HY(ma)HY(tions)YH( sur les autres zones. Les routeurs avec des inter)HY(faces)YH( dans plus d'une zone sont appel\351s )EM(Area Border Routers)ES(. Ils poss\350dent les infor)HY(ma)HY(tions)YH( de topo)HY(lo)HY(gie)YH( sur les zones auxquelles ils sont connec)HY(t\351s)YH(. )EP()0 DT(Utili)HY(sa)HY(tion)YH( inten)HY(sive)YH( de CPU)DD()0 P( OSPF est bas\351 sur l'algo)HY(rithme)YH( de Dijks)HY(tra)YH( )R47 2 A(Shor)HY(test)YH( Path First)EA(, qui est co\373teux en temps de calcul compar\351 aux autres algo)HY(rithmes)YH( de routage. Ce n'est pas forc\351)HY(ment)YH( mauvais, dans la mesure o\371 le plus court chemin est calcul\351 unique)HY(ment)YH( pour chaque zone. Donc, pour les r\351seaux de petite \340 moyenne taille, ce ne sera pas un probl\350me ; vous ne vous en rendrez pas compte. )EP()0 DT(Infor)HY(ma)HY(tion)YH( d'\351tat de lien)DD()0 P( OSPF prend en compte les carac)HY(t\351)HY(ris)HY(tiques)YH( sp\351ci)HY(fiques)YH( des r\351seaux et inter)HY(faces)YH(, telles que la bande passante, les d\351fauts de liens et le co\373t mon\351)HY(taire)YH(. )EP()0 DT(Proto)HY(cole)YH( ouvert et logi)HY(ciel)YH( sous license GPL)DD()0 P( OSPF est un proto)HY(cole)YH( ouvert et Zebra est un logi)HY(ciel)YH( sous license GPL, ce qui repr\351)HY(sente)YH( un avan)HY(tage)YH( \351vident par rapport aux proto)HY(coles)YH( et logi)HY(ciels)YH( propri\351)HY(taires)YH(. )EP()LD()BR( )EP()2 Sl()BR()BR()BR()BR()0 3 158 H(1.1.\240Pr\351requis)WB 325 Sn()WB 156 Sn()EH()BR()BR()BR()0 P( )BR()0 DL()0 DT(Noyau Linux\240:)DD()0 P( Compil\351 avec CONFIG_NETLINK_DEV and CONFIG_IP_MULTI)HY(CAST)YH( \201Je ne sais pas si d'autres \351l\351ments sont \351gale)HY(ment)YH( n\351ces)HY(saires)YH(\202. )EP()0 DT(Iproute)DD()0 P( )EP()0 DT(Zebra)DD()0 P( R\351cu)HY(p\351)HY(rez)YH(-le avec votre gestion)HY(naire)YH( de paquet favori ou \340 partir de )R46 2 A(http://www.zebra.org)EA(. )EP()LD()BR( )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 159 H(1.2.\240Confi)WB 326 Sn()HY(gu)HY(rer)YH()WB 157 Sn( Zebra)EH()BR()BR()BR()0 P( Prenons le r\351seau suivant comme exemple\240: ) 22 113 PR( ---------------------------------------------------- | 192.168.0.0/24 | | | | Zone 0 100BaseTX Commut\351 | | Epine dorsale Ethernet | ---------------------------------------------------- | | | | | | | | |eth1 |eth1 |eth0 | |100BaseTX |100BaseTX |100BaseTX |100BaseTX |.1 |.2 |.253 | --------- ------------ ----------- ---------------- |R Omega| |R Atlantis| |R Legolas| |R Frodo | --------- ------------ ----------- ---------------- |eth0 |eth0 | | | | | | | | |2MbDSL/ATM |100BaseTX |10BaseT |10BaseT |10BaseT ------------ ------------------------------------ ------------------------------- | Internet | | 172.17.0.0/16 Zone 1 | | 192.168.1.0/24 wlan Zone 2 | ------------ | R\351seau etudiant \201dortoir\202 | | Sans fil de Barcelone | ------------------------------------ ------------------------------- )RP( Ne soyez pas effray\351 par ce diagramme, Zebra r\351alise la plus grande partie du travail auto)HY(ma)HY(tique)HY(ment)YH( ; ce qui ne deman)HY(dera)YH( aucun travail de saisie des routes avec Zebra. Il serait p\351nible de main)HY(te)HY(nir)YH( toutes ces routes \340 la main au quoti)HY(dien)YH(. La chose la plus impor)HY(tante)YH( \340 ma\356tri)HY(ser)YH( clai)HY(re)HY(ment)YH(, c'est la topo)HY(lo)HY(gie)YH( du r\351seau. Faites parti)HY(cu)HY(li\350)HY(re)HY(ment)YH( atten)HY(tion)YH( \340 la zone 0, puisque c'est la plus impor)HY(tante)YH(. Dans un premier temps, confi)HY(gu)HY(rez)YH( Zebra en \351ditant zebra.conf et en l'adap)HY(tant)YH( \340 vos besoins\240: ) 17 33 PR(hostname omega password xxx enable password xxx ! ! Interface's description. ! !interface lo ! description test of desc. ! interface eth1 multicast ! ! Static default route ! ip route 0.0.0.0/0 212.170.21.129 ! log file /var/log/zebra/zebra.log)RP( Debian n\351ces)HY(site)YH( \351gale)HY(ment)YH( l'\351dition de )SM(/etc/zebra/daemons)ES( pour qu'ils soient lanc\351s au d\351mar)HY(rage)YH(\240: ) 3 33 PR( zebra=yes ospfd=yes )RP( Nous devons main)HY(te)HY(nant)YH( editer ospfd.conf si vous utili)HY(sez)YH( encore IPV4 ou ospf6d.conf si vous travaillez avec IPV6. Mon fichier ospfd.conf ressemble \340 ceci\240: ) 11 57 PR( hostname omega password xxx enable password xxx ! router ospf network 192.168.0.0/24 area 0 network 172.17.0.0/16 area 1 ! ! log stdout log file /var/log/zebra/ospfd.log )RP( Ceci indique \340 ospf la topo)HY(lo)HY(gie)YH( de notre r\351seau. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 160 H(1.3.\240Ex\351cu)WB 327 Sn()HY(ter)YH()WB 158 Sn( Zebra)EH()BR()BR()BR()0 P( Nous devons main)HY(te)HY(nant)YH( d\351mar)HY(rer)YH( Zebra soit \340 la main en tapant "zebra -d", soit avec un script comme "/etc/init.d/zebra start". En regar)HY(dant)YH( atten)HY(ti)HY(ve)HY(ment)YH( les logs de ospdfd, on peut voir les \351l\351ments suivants\240: ) 15 84 PR(2002/12/13 22:46:24 OSPF: interface 192.168.0.1 join AllSPFRouters Multicast group. 2002/12/13 22:46:34 OSPF: SMUX_CLOSE with reason: 5 2002/12/13 22:46:44 OSPF: SMUX_CLOSE with reason: 5 2002/12/13 22:46:54 OSPF: SMUX_CLOSE with reason: 5 2002/12/13 22:47:04 OSPF: SMUX_CLOSE with reason: 5 2002/12/13 22:47:04 OSPF: DR-Election[1st]: Backup 192.168.0.1 2002/12/13 22:47:04 OSPF: DR-Election[1st]: DR 192.168.0.1 2002/12/13 22:47:04 OSPF: DR-Election[2nd]: Backup 0.0.0.0 2002/12/13 22:47:04 OSPF: DR-Election[2nd]: DR 192.168.0.1 2002/12/13 22:47:04 OSPF: interface 192.168.0.1 join AllDRouters Multicast group. 2002/12/13 22:47:06 OSPF: DR-Election[1st]: Backup 192.168.0.2 2002/12/13 22:47:06 OSPF: DR-Election[1st]: DR 192.168.0.1 2002/12/13 22:47:06 OSPF: Packet[DD]: Negotiation done \201Slave\202. 2002/12/13 22:47:06 OSPF: nsm_change_status\201\202: scheduling new router-LSA origination 2002/12/13 22:47:11 OSPF: ospf_intra_add_router: Start)RP( Ignorez le message SMUX_CLOSE pour l'instant dans la mesure o\371 il concerne SNMP. Nous pouvons voir que 192.168.0.1 est )EM(routeur d\351sign\351)ES( \201)EM(Desi)HY(gna)HY(ted)YH( Router)ES(\202 et que 192.168.0.2 est le )EM(le routeur d\351sign\351 de sauve)HY(garde)YH()ES( \201)EM(Backup Desi)HY(gna)HY(ted)YH( Router)ES(\202. )EP()0 P( Nous pouvons \351gale)HY(ment)YH( inter)HY(agir)YH( avec zebra et ospfd en ex\351cu)HY(tant)YH(\240: ) 2 24 PR()SM($ )ES(telnet localhost zebra )SM($ )ES(telnet localhost ospfd)RP( Voyons comment les routes se sont propa)HY(g\351es)YH( en se connec)HY(tant)YH( \340 zebra\240: ) 28 94 PR( root@atlantis:~# telnet localhost zebra Trying 127.0.0.1... Connected to atlantis. Escape character is '^]'. Hello, this is zebra \201version 0.92a\202. Copyright 1996-2001 Kunihiro Ishiguro. User Access Verification Password: atlantis> show ip route Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, B - BGP, > - selected route, * - FIB route K>* 0.0.0.0/0 via 192.168.0.1, eth1 C>* 127.0.0.0/8 is directly connected, lo O 172.17.0.0/16 [110/10] is directly connected, eth0, 06:21:53 C>* 172.17.0.0/16 is directly connected, eth0 O 192.168.0.0/24 [110/10] is directly connected, eth1, 06:21:53 C>* 192.168.0.0/24 is directly connected, eth1 atlantis> show ip ospf border-routers ============ OSPF router routing table ============= R 192.168.0.253 [10] area: \2010.0.0.0\202, ABR via 192.168.0.253, eth1 [10] area: \2010.0.0.1\202, ABR via 172.17.0.2, eth0 )RP( ou direc)HY(te)HY(ment)YH( avec iproute\240: ) 7 96 PR( root@omega:~# ip route 212.170.21.128/26 dev eth0 proto kernel scope link src 212.170.21.172 192.168.0.0/24 dev eth1 proto kernel scope link src 192.168.0.1 172.17.0.0/16 via 192.168.0.2 dev eth1 proto zebra metric 20 default via 212.170.21.129 dev eth0 proto zebra root@omega:~# )RP( Nous pouvons voir les routes Zebra, qui n'\351taient pas pr\351sentes aupa)HY(ra)HY(vant)YH(. Il est vrai)HY(ment)YH( agr\351able de voir appa)HY(ra\356tre)YH( les routes quelques secondes apr\350s le lance)HY(ment)YH( de zebra et ospfd. Vous pouvez v\351ri)HY(fier)YH( la connec)HY(ti)HY(vit\351)YH( avec les autres h\364tes en utili)HY(sant)YH( ping. Les routes zebra sont auto)HY(ma)HY(tiques)YH(. Vous pouvez ajouter un autre routeur au r\351seau, confi)HY(gu)HY(rez)YH( Zebra et voil\340\240! )EP()0 P( Astuce\240: vous pouvez utili)HY(ser)YH(\240: ) 2 51 PR( tcpdump -i eth1 ip[9] == 89 )RP( pour analy)HY(ser)YH( les paquets OSPF. Le num\351ro du proto)HY(cole)YH( OSPF est 89 et le champ du proto)HY(cole)YH( est le 9i\350me octet de l'en-t\352te ip. )EP()0 P( OSPF poss\350de de nombreux para)HY(m\350tres)YH(, sp\351cia)HY(le)HY(ment)YH( pour les grands r\351seaux. Dans de prochains d\351ve)HY(lop)HY(pe)HY(ments)YH( du HOWTO, nous montre)HY(rons)YH( des m\351thodes de r\351glages fins d'OSPF. )EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 161 H(2.\240Confi)WB 328 Sn()HY(gu)HY(rer)YH()WB 159 Sn( BGP4 avec Zebra)EH()BR()BR()BR()0 P(Le Border Gateway Proto)HY(col)YH( Version 4 \201BGP4\202 est un proto)HY(cole)YH( de routage dyna)HY(mique)YH( d\351crit dans la RFC 1771. Il permet la distri)HY(bu)HY(tion)YH( des infor)HY(ma)HY(tions)YH( de connec)HY(ti)HY(vit\351)YH(, c'est \340 dire les tables de routage, vers d'autres noeuds BGP4 actifs. Il peut \352tre utilis\351 comme un EGP ou un IGP. Dans le mode EGP, chaque noeud doit avoir son propre num\351ro de syst\350me auto)HY(nome)YH( \201)EM( utono)HY(mous)YH( System \201AS\202)ES(\202. BGP4 supporte ????????? et l'aggr\351)HY(ga)HY(tion)YH( de routes \201r\351unir plusieurs routes en une seule\202. > The Border Gateway Proto)HY(col)YH( Version 4 \201BGP4\202 is a dynamic routing > proto)HY(col)YH( descri)HY(bed)YH( in RFC 1771. It allows the distri)HY(bu)HY(tion)YH( of > reacha)HY(bi)HY(lity)YH( infor)HY(ma)HY(tion)YH(, i.e. routing tables, to other BGP4 > enabled nodes. It can either be used as EGP or IGP, in EGP mode > each node must have its own Auto)HY(no)HY(mous)YH( System \201AS\202 number. > BGP4 supports Class)HY(less)YH( Inter Domain Routing \201CIDR\202 and route > aggre)HY(ga)HY(tion)YH( \201merge multiple routes into one\202. )EP()2 Sl()BR()BR()BR()BR()0 3 162 H(2.1.\240sch\351ma)WB 329 Sn()WB 160 Sn( r\351seau \201Exemple\202)EH()BR()BR()BR()0 P( Le sch\351ma r\351seau suivant est utilis\351 pour les exemples \340 suivre. AS 1 et 50 ont plusieurs voisins mais nous avons seule)HY(ment)YH( besoin de confi)HY(gu)HY(rer)YH( 1 et 50 comme nos voisins. Les noeuds commu)HY(niquent)YH( entre eux par des tunnels dans cet exemple, mais ce n'est pas une obli)HY(ga)HY(tion)YH(. )EP()0 P( Note\240: les num\351ros AS utili)HY(s\351s)YH( dans cet exemple sont r\351ser)HY(v\351s)YH(. Veuillez obtenir vos propres num\351ros AS du RIPE si vous instal)HY(lez)YH( des liens offi)HY(ciels)YH(. )EP() 12 52 PR( -------------------- | 192.168.23.12/24 | | AS: 23 | -------------------- / \200 / \200 / \200 ------------------ ------------------ | 192.168.1.1/24 |-------| 10.10.1.1/16 | | AS: 1 | | AS: 50 | ------------------ ------------------)RP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 163 H(2.2.\240Confi)WB 330 Sn()HY(gu)HY(ra)HY(tion)YH()WB 161 Sn( \201Exemple\202)EH()BR()BR()BR()0 P( La confi)HY(gu)HY(ra)HY(tion)YH( suivante est \351crite pour le noeud 192.168.23.12/24 et elle sera facile \340 adapter pour les autres noeuds. )EP()0 P( Elle commence par des \351l\351ments g\351n\351)HY(raux)YH( comme le nom de l'h\364te, les mots de passe et les options de debug\240: )EP() 18 52 PR( ! hostname hostname anakin ! login password password xxx ! enable password \201super user mode\202 enable password xxx ! path to logfile log file /var/log/zebra/bgpd.log ! debugging: be verbose \201can be removed afterwards\202 debug bgp events debug bgp filters debug bgp fsm debug bgp keepalives debug bgp updates)RP()0 P( La liste de contr\364le d'acc\350s \201)EM(Access list)ES(\202 est utili)HY(s\351e)YH( pour limiter la redis)HY(tri)HY(bu)HY(tion)YH( aux r\351seaux priv\351s \201RFC 1918\202. )EP() 5 45 PR( ! RFC 1918 networks access-list local_nets permit 192.168.0.0/16 access-list local_nets permit 172.16.0.0/12 access-list local_nets permit 10.0.0.0/8 access-list local_nets deny any)RP()0 P(L'etape suivante consiste \340 confi)HY(gu)HY(rer)YH( chaque AS\240:)EP() 14 70 PR( ! Own AS number router bgp 23 ! IP address of the router bgp router-id 192.168.23.12 ! announce our own network to other neighbors network 192.168.23.0/24 ! advertise all connected routes \201= directly attached interfaces\202 redistribute connected ! advertise kernel routes \201= manually inserted routes\202 redistribute kernel)RP()0 P( Chaque section 'router bgp' contient une liste de voisins auquels le routeur est connect\351\240: )EP() 4 55 PR( neighbor 192.168.1.1 remote-as 1 neighbor 192.168.1.1 distribute-list local_nets in neighbor 10.10.1.1 remote-as 50 neighbor 10.10.1.1 distribute-list local_nets in)RP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 164 H(2.3.\240V\351ri)WB 331 Sn()HY(fi)HY(ca)HY(tion)YH()WB 162 Sn( de la confi)HY(gu)HY(ra)HY(tion)YH()EH()BR()BR()BR()0 P( Note\240: vtysh est un multi)HY(plexeur)YH( qui connecte toutes les inter)HY(faces)YH( utili)HY(sa)HY(teur)YH( de zebra ensemble. )EP() 17 81 PR( anakin# sh ip bgp summary BGP router identifier 192.168.23.12, local AS number 23 2 BGP AS-PATH entries 0 BGP community entries Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd 10.10.0.1 4 50 35 40 0 0 0 00:28:40 1 192.168.1.1 4 1 27574 27644 0 0 0 03:26:04 14 Total number of neighbors 2 anakin# anakin# sh ip bgp neighbors 10.10.0.1 BGP neighbor is 10.10.0.1, remote AS 50, local AS 23, external link BGP version 4, remote router ID 10.10.0.1 BGP state = Established, up for 00:29:01 .... anakin#)RP()0 P( Voyons quelles routes nous avons obte)HY(nues)YH( de nos voisins\240: )EP() 13 71 PR( anakin# sh ip ro bgp Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, B - BGP, > - selected route, * - FIB route B>* 172.16.0.0/14 [20/0] via 192.168.1.1, tun0, 2d10h19m B>* 172.30.0.0/16 [20/0] via 192.168.1.1, tun0, 10:09:24 B>* 192.168.5.10/32 [20/0] via 192.168.1.1, tun0, 2d10h27m B>* 192.168.5.26/32 [20/0] via 192.168.1.1, tun0, 10:09:24 B>* 192.168.5.36/32 [20/0] via 192.168.1.1, tun0, 2d10h19m B>* 192.168.17.0/24 [20/0] via 192.168.1.1, tun0, 3d05h07m B>* 192.168.17.1/32 [20/0] via 192.168.1.1, tun0, 3d05h07m B>* 192.168.32.0/24 [20/0] via 192.168.1.1, tun0, 2d10h27m anakin#)RP()2 Sl()BR()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 165 H(Chapitre\24018.\240Autres)WB 332 Sn()WB 163 Sn( possi)HY(bi)HY(li)HY(t\351s)YH()EH()BR()BR()BR()0 P(Ce chapitre est une liste des projets ayant une rela)HY(tion)YH( avec le routage avanc\351 et la mise en forme du trafic sous Linux. Certains de ces liens m\351ri)HY(te)HY(raient)YH( des chapitres sp\351ci)HY(fiques)YH(, d'autres sont tr\350s bien docu)HY(men)HY(t\351s)YH(, et n'ont pas besoin de HOWTO en plus.)EP()0 P()BR()0 DL()0 DT(Impl\351)HY(men)HY(ta)HY(tion)YH( VLAN 802.1Q pour Linux )R48 2 A(\201site\202)EA()DD()0 P(VLAN est une fa\347on tr\350s sympa de diviser vos r\351seaux d'une mani\350re plus virtuelle que physique. De bonnes infor)HY(ma)HY(tions)YH( sur les VLAN pour)HY(ront)YH( \352tre trou)HY(v\351es)YH( )R49 2 A(ici)EA(. Avec cette impl\351)HY(men)HY(ta)HY(tion)YH(, votre boite Linux pourra dialo)HY(guer)YH( VLAN avec des machines comme les Cisco Cata)HY(lyst)YH(, 3Com: {Core)HY(buil)HY(der)YH(, Netbuil)HY(der)YH( II, Super)HY(Stack)YH( II switch 630}, Extreme Ntwks Summit 48, Foundry: {Serve)HY(rI)HY(ronXL)YH(, FastI)HY(ron)YH(}.)EP()0 DT(Impl\351)HY(men)HY(ta)HY(tion)YH( alter)HY(na)HY(tive)YH( VLAN 802.1Q pour Linux)R50 2 A(\201site\202)EA()DD()0 P(Une impl\351)HY(men)HY(ta)HY(tion)YH( alter)HY(na)HY(tive)YH( de VLAN pour Linux. Ce projet a d\351marr\351 suite au d\351sac)HY(cord)YH( avec l'archi)HY(tec)HY(ture)YH( et le style de codage du projet VLAN '\351tabli', avec comme r\351sul)HY(tat)YH( une struc)HY(ture)YH( de l'ensemble plus clair. Mise \340 jour\240: a \351t\351 inclus dans le noyau 2.4.14 \201peut-\352tre dans le 2.4.13\202.)EP()0 P(Un bon HOWTO \340 propos des VLAN peut \352tre trouv\351 )R51 2 A(ici)EA(.)EP()0 P(Mise \340 jour\240: a \351t\351 inclue dans le noyau \340 partir de la version 2.4.14 \201peut-\352tre 13\202.)EP()0 DT(Serveur Linux Virtuel \201Linux Virtual Server \202)R52 2 A(\201site\202)EA()DD()0 P(Ces personnes sont tr\350s talen)HY(tueuses)YH(. Le Serveur Virtuel Linux est un serveur \340 haute dispo)HY(ni)HY(bi)HY(lit\351)YH(, haute)HY(ment)YH( \351volu)HY(tif)YH(, construit autour d'une grappe \201cluster\202 de serveurs, avec un \351qui)HY(li)HY(breur)YH( de charge tour)HY(nant)YH( sur le syst\350me d'exploi)HY(ta)HY(tion)YH( Linux. L'archi)HY(tec)HY(ture)YH( du cluster est trans)HY(pa)HY(rente)YH( pour les utili)HY(sa)HY(teurs)YH( finaux, qui ne voient qu'un simple serveur virtuel.)EP()0 P(En r\351sum\351, que vous ayez besoin d'\351qui)HY(li)HY(brer)YH( votre charge ou de contr\364)HY(ler)YH( votre trafic, LVS aura une mani\350re de le faire. Certaines de leurs tech)HY(niques)YH( sont posi)HY(ti)HY(ve)HY(ment)YH( diabo)HY(liques)YH(\240!. Par exemple, ils permettent \340 plusieurs machines d'avoir une m\352me adresse IP, mais en d\351sac)HY(ti)HY(vant)YH( l'ARP dessus. Seule la machine LVS qui a, elle, l'ARP actif, d\351cide de l'h\364te qui mani)HY(pu)HY(lera)YH( le paquet entrant. Celui-ci est envoy\351 avec la bonne adresse MAC au serveur choisi. Le trafic sortant passe direc)HY(te)HY(ment)YH( par le routeur, et non par la machine LVS, qui, par cons\351)HY(quent)YH( n'a pas besoin de voir vos 5Gbit/s de donn\351es allant sur Inter)HY(net)YH(. Cette machine LVS ne peut alors pas \352tre un goulot d'\351tran)HY(gle)HY(ment)YH(.)EP()0 P(L'impl\351)HY(men)HY(ta)HY(tion)YH( de LVS n\351ces)HY(site)YH( une mise \340 jour pour les noyaux 2.0 et 2.2, alors qu'un module Netfil)HY(ter)YH( est dispo)HY(nible)YH( dans le 2.4. Il n'y a donc pas besoin de mise \340 jour pour cette version du noyau. Le support 2.4 est encore en d\351ve)HY(lop)HY(pe)HY(ment)YH(. Battez-vous donc avec et envoyez vos commen)HY(taires)YH( ou vos mises \340 jour.)EP()0 DT(CBQ.init )R53 2 A(\201site\202)EA()DD()0 P(Confi)HY(gu)HY(rer)YH( CBQ peut \352tre un peu inti)HY(mi)HY(dant)YH(, sp\351cia)HY(le)HY(ment)YH( si votre seul souhait est de mettre en forme le trafic d'ordi)HY(na)HY(teurs)YH( plac\351s derri\350re un routeur. CBQ.init peut vous aider \340 confi)HY(gu)HY(rer)YH( Linux \340 l'aide d'une syntaxe simpli)HY(fi\351e)YH(.)EP()0 P(Par exemple, si vous voulez que tous les ordi)HY(na)HY(teurs)YH( de votre r\351seau 192.168.1.0/24 \201sur eth1 10\240Mbits\202 aient leur vitesse de t\351l\351)HY(char)HY(ge)HY(ment)YH( limit\351e \340 28\240Kbits, remplis)HY(sez)YH( le fichier de confi)HY(gu)HY(ra)HY(tion)YH( de CBQ.init avec ce qui suit\240:)EP()0 P( ) 5 24 PR(DEVICE=eth1,10Mbit,1Mbit RATE=28Kbit WEIGHT=2Kbit PRIO=5 RULE=192.168.1.0/24)RP( )EP()0 P(Utili)HY(ser)YH( simple)HY(ment)YH( ce programme si le 'comment et pourquoi' ne vous int\351)HY(resse)YH( pas. Nous utili)HY(sons)YH( CBQ.init en produc)HY(tion)YH( et il marche tr\350s bien. On peut m\352me faire des choses plus avan)HY(c\351es)YH(, comme la mise en forme d\351pen)HY(dant)YH( du temps. La docu)HY(men)HY(ta)HY(tion)YH( est direc)HY(te)HY(ment)YH( int\351)HY(gr\351e)YH( dans le script, ce qui explique l'absence d'un fichier README.)EP()0 DT(Scripts faciles de mise en forme Chronox)R54 2 A(\201site\202)EA()DD()0 P(Stephan Mueller \201smuel)HY(ler)YH(@chronox.de\202 a \351crit deux scripts utiles, "limit.conn" et "shaper". Le premier vous permet de ma\356tri)HY(ser)YH( une session de t\351l\351)HY(char)HY(ge)HY(ment)YH(, comme ceci\240:)EP()0 P( ) 1 47 PR(# limit.conn -s SERVERIP -p SERVERPORT -l LIMIT)RP( )EP()0 P(Il fonc)HY(tionne)YH( avec Linux 2.2 et 2.4.)EP()0 P(Le second script est plus compliqu\351 et peut \352tre utilis\351 pour mettre en place des files d'attente diff\351)HY(rentes)YH( bas\351es sur les r\350gles iptables. Celles-ci sont utili)HY(s\351es)YH( pour marquer les paquets qui sont alors mis en forme.)EP()0 DT(Impl\351)HY(men)HY(ta)HY(tion)YH( du Proto)HY(cole)YH( Redon)HY(dant)YH( Routeur Virtuel )R55 2 A(\201site\202)EA()DD()0 P(Ceci est pure)HY(ment)YH( pour la redon)HY(dance)YH(. Deux machines avec leurs propres adresses IP et MAC cr\351ent une troi)HY(si\350me)YH( adresse IP et MAC virtuelle. Bien que destin\351 \340 l'origine unique)HY(ment)YH( aux routeurs, qui ont besoin d'adresses MAC constantes, cela marche \351gale)HY(ment)YH( pour les autres serveurs. )EP()0 P(La beaut\351 de cette approche est l'incroyable faci)HY(lit\351)YH( de la confi)HY(gu)HY(ra)HY(tion)YH(. Pas de compi)HY(la)HY(tion)YH( de noyau ou de n\351ces)HY(sit\351)YH( de mise \340 jour, tout se passe dans l'espace utili)HY(sa)HY(teur)YH(.)EP()0 P(Lancer simple)HY(ment)YH( ceci sur toutes les machines parti)HY(ci)HY(pant)YH( au service\240: ) 1 31 PR(# vrrpd -i eth0 -v 50 10.0.0.22)RP( )EP()0 P(Et vous voil\340 op\351ra)HY(tion)HY(nel)YH(\240! 10.0.0.22 est main)HY(te)HY(nant)YH( g\351r\351 par l'un de vos serveurs, proba)HY(ble)HY(ment)YH( le premier \340 avoir lanc\351 le d\351mon vrrp. D\351con)HY(nec)HY(tez)YH( main)HY(te)HY(nant)YH( cet ordi)HY(na)HY(teur)YH( du r\351seau et tr\350s rapi)HY(de)HY(ment)YH(, l'adresse 10.0.0.22 et l'adresse MAC seront g\351r\351es par l'un des autres ordi)HY(na)HY(teurs)YH(.)EP()0 P(J'ai essay\351 ceci et il a \351t\351 actif et op\351ra)HY(tion)HY(nel)YH( en 1 minute. Pour une raison \351trange, ma passe)HY(relle)YH( par d\351faut a \351t\351 suppri)HY(m\351e)YH(. Cepen)HY(dant)YH(, l'option -n permet de pr\351ve)HY(nir)YH( cela.)EP()0 P(Voici une d\351faillance en "direct"\240:)EP()0 P( ) 5 56 PR(64 bytes from 10.0.0.22: icmp_seq=3 ttl=255 time=0.2 ms 64 bytes from 10.0.0.22: icmp_seq=4 ttl=255 time=0.2 ms 64 bytes from 10.0.0.22: icmp_seq=5 ttl=255 time=16.8 ms 64 bytes from 10.0.0.22: icmp_seq=6 ttl=255 time=1.8 ms 64 bytes from 10.0.0.22: icmp_seq=7 ttl=255 time=1.7 ms)RP( )EP()0 P(Pas *un* paquet ping n'a \351t\351 perdu\240! Apr\350s 4 paquets, j'ai d\351con)HY(nect\351)YH( mon P200 du r\351seau, et mon 486 a pris le relais, ce qui est visible par l'augmen)HY(ta)HY(tion)YH( du temps de latence.)EP()LD()BR()EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 166 H(Chapitre\24019.\240Lectures)WB 333 Sn()WB 164 Sn( suppl\351)HY(men)HY(taires)YH()EH()BR()BR()BR()0 P()BR()0 DL()0 DT()R56 2 A(http://snafu.freedom.org/linux2.2/iproute-notes.html)EA()DD()0 P(Contient beau)HY(coup)YH( d'infor)HY(ma)HY(tions)YH( tech)HY(niques)YH(, et de commen)HY(taires)YH( sur le noyau.)EP()0 DT()R57 2 A(http://www.davin.ottawa.on.ca/ols/)EA()DD()0 P(Trans)HY(pa)HY(rents)YH( de Jamal Hadi Salim, un des auteurs du contr\364)HY(leur)YH( de trafic de Linux.)EP()0 DT()R58 2 A(http://defiant.coinet.com/iproute2/ip-cref/)EA()DD()0 P(Version HTML de la docu)HY(men)HY(ta)HY(tion)YH( LaTeX d'Alexeys\240; explique une partie d'iproute2 en d\351tails.)EP()0 DT()R59 2 A(http://www.aciri.org/floyd/cbq.html)EA()DD()0 P(Sally Floyd a une bonne page sur CBQ, incluant ses publi)HY(ca)HY(tions)YH( origi)HY(nales)YH(. Aucune n'est sp\351ci)HY(fique)YH( \340 Linux, mais il y a un travail de discus)HY(sion)YH( sur la th\351orie et l'utili)HY(sa)HY(tion)YH( de CBQ. Contenu tr\350s tech)HY(nique)YH(, mais une bonne lecture pour ceux qui sont int\351)HY(res)HY(s\351s)YH(.)EP()0 DT(Diffe)HY(ren)HY(tia)HY(ted)YH( Services on Linux)DD()0 P(This )R32 2 A(docu)HY(ment)YH()EA( par Werner Almes)HY(ber)HY(ger)YH(, Jamal Hadi Salim et Alexey Kuznet)HY(sov)YH(. D\351crit les fonc)HY(tions)YH( Diff)HY(Serv)YH( du noyau Linux, entre autres les gestion)HY(naires)YH( de mise en file d'attente TBF, GRED, )SM(DSMARK)ES( et le clas)HY(si)HY(fi)HY(ca)HY(teur)YH( tcindex.)EP()0 DT()R60 2 A(http://ceti.pl/~ekra)HY(vietz)YH(/cbq/NET4_tc.html)EA()DD()0 P(Un autre HOWTO, en polo)HY(nais)YH(\240! Vous pouvez cepen)HY(dant)YH( copier/coller les lignes de commandes, elles fonc)HY(tionnent)YH( de la m\352me fa\347on dans toutes les langues. L'auteur travaille en colla)HY(bo)HY(ra)HY(tion)YH( avec nous et sera peut \352tre bient\364t un auteur de sections de cet HOWTO.)EP()0 DT()WB 165 Sn()R61 2 A(IOS Commit)HY(ted)YH( Access Rate)EA()DD()0 P(Des gens de Cisco qui ont pris la louable habi)HY(tude)YH( de mettre leur docu)HY(men)HY(ta)HY(tion)YH( en ligne. La syntaxe de Cisco est diff\351)HY(rente)YH( mais les concepts sont iden)HY(tiques)YH(, sauf qu'on fait mieux, et sans mat\351)HY(riel)YH( coutant le prix d'une voiture\240:-\202)EP()0 DT(TCP/IP Illus)HY(tra)HY(ted)YH(, volume 1, W. Richard Stevens, ISBN 0-201-63346-9)DD()0 P(Sa lecture est indis)HY(pen)HY(sable)YH( si vous voulez r\351el)HY(le)HY(ment)YH( comprendre TCP/IP, et de plus elle est diver)HY(tis)HY(sante)YH(.)EP()LD()BR( )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 167 H(Chapitre\24020.\240Remer)WB 334 Sn()HY(cie)HY(ments)YH()WB 166 Sn()EH()BR()BR()BR()0 P(Notre but est de faire la liste de toutes les personnes qui ont contri)HY(bu\351)YH( \340 ce HOWTO, ou qui nous ont aid\351s \340 expliquer le fonc)HY(tion)HY(ne)HY(ment)YH( des choses. Alors qu'il n'existe pas actuel)HY(le)HY(ment)YH( de tableau d'honneur Netfil)HY(ter)YH(, nous souhai)HY(tons)YH( saluer les personnes qui apportent leur aide.)EP()0 P( )BR()UL()0 P()-1 LI( Junk Alins )BR()0 P()SM(<)0 2 A(juanjo@mat.upc.es)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Joe Van Andel )EP()0 P()-1 LI( Michael T. Babcock )BR()0 P()SM(<)0 2 A(mbab)HY(cock)YH(@fibres)HY(peed)YH(.net)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Chris)HY(to)HY(pher)YH( Barton )BR()0 P()SM(<)0 2 A(cpbar)HY(ton)YH(%uiuc.edu)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Peter Bierin)HY(ger)YH( )BR()0 P()SM(<)0 2 A(pb:bierin)HY(ger)YH(.de)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Ard van Breemen )BR()0 P()SM(<)0 2 A(ard%kwaak.net)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Ron Brinker )BR()0 P()SM(<)0 2 A(service%emcis.com)EA(>)ES()EP()BR( )EP()0 P()-1 LI( ?ukasz Bromirski )BR()0 P()SM(<)0 2 A(l.bromirski@mr0vka.eu.org)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Lennert Buyten)HY(hek)YH( )BR()0 P()SM(<)0 2 A(buytenh@gnu.org)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Esteve Camps )BR()0 P()SM(<)0 2 A(esteve@hades.udg.es)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Ricardo Javier Cardenes )BR()0 P()SM(<)0 2 A(ricardo%conysis.com)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Stef Coene )BR()0 P()SM(<)0 2 A(stef.coene@docum.org)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Don Cohen )BR()0 P()SM(<)0 2 A(don-lartc%isis.cs3-inc.com)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Jona)HY(than)YH( Corbet )BR()0 P()SM(<)0 2 A(lwn%lwn.net)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Gerry N5JXS Creager )BR()0 P()SM(<)0 2 A(gerry%cs.tamu.edu)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Marco Davids )BR()0 P()SM(<)0 2 A(marco@sara.nl)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Jona)HY(than)YH( Day )BR()0 P()SM(<)0 2 A(jd9812@my-deja.com)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Martin aka devik Devera )BR()0 P()SM(<)0 2 A(devik@cdi.cz)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Hannes Ebner )BR()0 P()SM(<)0 2 A(he%fli4l.de)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Derek Fawcus )BR()0 P()SM(<)0 2 A(dfawcus%cisco.com)EA(>)ES()EP()BR( )EP()0 P()-1 LI( David Fries )BR()0 P()SM(<)0 2 A(dfries%mail.win.org)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Stephan "Kobold" Gehring )BR()0 P()SM(<)0 2 A(Stephan.Gehring@bechtle.de)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Jacek Glin)HY(kowski)YH( )BR()0 P()SM(<)0 2 A(jglin)HY(kow)YH(%hns.com)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Andrea Glorioso )BR()0 P()SM(<)0 2 A(sama%perche)HY(topi)YH(.org)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Thomas Graaf )BR()0 P()SM(<)0 2 A(tgraf%suug.ch)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Sandy Harris )BR()0 P()SM(<)0 2 A(sandy%storm.ca)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Nadeem Hasan )BR()0 P()SM(<)0 2 A(nhasan@usa.net)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Erik Hensema )BR()0 P()SM(<)0 2 A(erik%hensema.xs4all.nl)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Vik Heyn)HY(dri)HY(ckx)YH( )BR()0 P()SM(<)0 2 A(vik.heyn)HY(dri)HY(ckx)YH(@edchq.com)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Spauldo Da Hippie )BR()0 P()SM(<)0 2 A(spauldo%usa.net)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Koos van den Hout )BR()0 P()SM(<)0 2 A(koos@kzdoos.xs4all.nl)EA(>)ES()EP()BR( )EP()0 P()-1 LI(Stefan Huel)HY(brock)YH( )EP()0 P()-1 LI( Ayotunde Itayemi )BR()0 P()SM(<)0 2 A(aitayemi:metrong.com)EA(>)ES()EP()BR( )EP()0 P()-1 LI(Alexan)HY(der)YH( W. Janssen )EP()0 P()-1 LI(Andreas Jellin)HY(ghaus)YH( )EP()0 P()-1 LI(Gareth John )EP()0 P()-1 LI( Dave Johnson )BR()0 P()SM(<)0 2 A(dj@www.uk.linux.org)EA(>)ES()EP()BR( )EP()0 P()-1 LI(Martin Josef)HY(sson)YH( )EP()0 P()-1 LI(Andi Kleen )EP()0 P()-1 LI(Andreas J. Koenig )EP()0 P()-1 LI(Pawel Krawc)HY(zyk)YH( )EP()0 P()-1 LI(Amit Kuche)HY(ria)YH( )EP()0 P()-1 LI(Edmund Lau )EP()0 P()-1 LI(Philippe Latu )EP()0 P()-1 LI(Arthur van Leeuwen )EP()0 P()-1 LI( Jose Luis Domingo Lopez )BR()0 P()SM(<)0 2 A(jdomingo@24x7linux.com)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Robert Lowe )BR()0 P()SM(<)0 2 A(robert.h.lowe@lawrence.edu)EA(>)ES()EP()BR( )EP()0 P()-1 LI(Jason Lunz )EP()0 P()-1 LI(Stuart Lynne )EP()0 P()-1 LI(Alexey Mahot)HY(kin)YH( )EP()0 P()-1 LI(Predrag Mali)HY(ce)HY(vic)YH( )EP()0 P()-1 LI(Patrick McHardy )EP()0 P()-1 LI(Andreas Mohr )EP()0 P()-1 LI(James Morris )EP()0 P()-1 LI(Andrew Morton )EP()0 P()-1 LI(Wim van der Most )EP()0 P()-1 LI(Stephan Mueller )EP()0 P()-1 LI(Togan Muftuo)HY(glu)YH( )EP()0 P()-1 LI(Chris Murray )EP()0 P()-1 LI(Patrick Nagel)HY(sch)HY(midt)YH( )EP()0 P()-1 LI(Ram Narula )EP()0 P()-1 LI(Jorge Novo )EP()0 P()-1 LI(Patrik )EP()0 P()-1 LI(P?l Osgy?ny )EP()0 P()-1 LI(Lutz Pre\337ler )EP()0 P()-1 LI(Jason Pyeron )EP()0 P()-1 LI(Rod Roark )EP()0 P()-1 LI(Pavel Roskin )EP()0 P()-1 LI(Rusty Russell )EP()0 P()-1 LI(Mihai RUSU )EP()0 P()-1 LI(Rob Pitman )EP()0 P()-1 LI(Jamal Hadi Salim )EP()0 P()-1 LI(Ren? Serral )EP()0 P()-1 LI(David Sauer )EP()0 P()-1 LI(Sheha)HY(ryar)YH( Suleman Shaikh )EP()0 P()-1 LI(Stewart Shields )EP()0 P()-1 LI(Nick Silber)HY(stein)YH( )EP()0 P()-1 LI(Konrads Smelkov )EP()0 P()-1 LI(William Stearns )BR()0 P()SM(<)0 2 A(wstearns@pobox.com)EA(>)ES()EP()BR()EP()0 P()-1 LI(Andreas Stein)HY(metz)YH( )EP()0 P()-1 LI(Matthew Strait )EP()0 P()-1 LI(Jason Tacka)HY(berry)YH( )EP()0 P()-1 LI(Charles Tassell )EP()0 P()-1 LI(Glen Turner )EP()0 P()-1 LI(Tea Sponsor: Eric Veld)HY(huy)HY(zen)YH( )EP()0 P()-1 LI(Thomas Walpuski )EP()0 P()-1 LI(Song Wang )EP()0 P()-1 LI( Chris Wilson )BR()0 P()SM(<)0 2 A(chris@netser)HY(vers)YH(.co.uk)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Lazar Yana)HY(ckiev)YH( )BR()0 P()SM(<)0 2 A(Lyana)HY(ckiev)YH(%gmx.net)EA(>)ES()EP()BR( )EP()0 P()-1 LI( Pedro Larroy )BR()0 P()SM(<)0 2 A(piotr%member.fsf.org)EA(>)ES()EP()BR( )BR()UL()0 P()-1 LI( Chap)HY(titre)YH( 15, section 10: Exemple d'une solu)HY(tion)YH( de traduc)HY(tion)YH( d'adresse avec de la QoS )EP()0 P()-1 LI( Chap)HY(titre)YH( 17, section 1: Confi)HY(gu)HY(rer)YH( OSPF avec Zebra )EP()LU()BR( )EP()LU()BR( )EP()2 Sl()BR()1 Sl()BR()WB NL /BO 0 D TC /Ba f D Bs /AU f D /UR () D RC ZF tH WB ND 1 gt{Ts 3 mul Np 0()0 C()BD(HOWTO du routage avancé et du contrôle de trafic sous Linux)ES()0 1 TN()EA()BN}if 1 NH le{167(1\240\240)1 C(HOWTO)WB 1 Sn( du routage avanc\351 et du contr\364le de trafic sous Linux)167 1 TN()EA()BN}if 3 NH le{168(1.0.1\240\240)3 C(Bert Hubert)168 1 TN()EA()BN}if 3 NH le{169(1.0.2\240\240)3 C(Laurent Foucher)169 1 TN()EA()BN}if 2 NH le{170(1.1\240\240)2 C(Chapitre\2401.\240D\351di)HY(cace)YH()WB 2 Sn()170 1 TN()EA()BN}if 2 NH le{171(1.2\240\240)2 C(Chapitre\2402.\240Intro)HY(duc)HY(tion)YH()WB 3 Sn()171 1 TN()EA()BN}if 2 NH le{172(1.3\240\240)2 C(1.\240Condi)HY(tions)YH()WB 4 Sn( de distri)HY(bu)HY(tion)YH( et Mise en garde )172 1 TN()EA()BN}if 2 NH le{173(1.4\240\240)2 C(2.\240Connais)HY(sances)YH()WB 5 Sn( pr\351a)HY(lables)YH()173 1 TN()EA()BN}if 2 NH le{174(1.5\240\240)2 C(3.\240Ce)WB 6 Sn( que Linux peut faire pour vous)174 1 TN()EA()BN}if 2 NH le{175(1.6\240\240)2 C(4.\240Notes)WB 7 Sn( diverses)175 1 TN()EA()BN}if 2 NH le{176(1.7\240\240)2 C(5.\240Acc\350s,)WB 8 Sn( CVS et propo)HY(si)HY(tions)YH( de mises \340 jour)176 1 TN()EA()BN}if 2 NH le{177(1.8\240\240)2 C(6.\240Liste)WB 9 Sn( de diffu)HY(sion)YH()177 1 TN()EA()BN}if 2 NH le{178(1.9\240\240)2 C(7.\240Plan)WB 10 Sn( du docu)HY(ment)YH()178 1 TN()EA()BN}if 2 NH le{179(1.10\240\240)2 C(Chapitre\2403.\240Intro)HY(duc)HY(tion)YH()WB 11 Sn( \340 iproute2)179 1 TN()EA()BN}if 2 NH le{180(1.11\240\240)2 C(1.\240Pourquoi)WB 12 Sn( iproute2\240?)180 1 TN()EA()BN}if 2 NH le{181(1.12\240\240)2 C(2.\240Un)WB 13 Sn( tour d'horizon d'iproute2)181 1 TN()EA()BN}if 2 NH le{182(1.13\240\240)2 C(3.\240Pr\351requis)WB 14 Sn()182 1 TN()EA()BN}if 2 NH le{183(1.14\240\240)2 C(4.\240Explo)HY(rer)YH()WB 15 Sn( votre confi)HY(gu)HY(ra)HY(tion)YH( courante)183 1 TN()EA()BN}if 3 NH le{184(1.14.1\240\240)3 C(4.1.\240)WB 16 Sn()BD(ip)ES( nous montre nos liens)184 1 TN()EA()BN}if 3 NH le{185(1.14.2\240\240)3 C(4.2.\240)WB 17 Sn()BD(ip)ES( nous montre nos adresses IP)185 1 TN()EA()BN}if 3 NH le{186(1.14.3\240\240)3 C(4.3.\240)WB 18 Sn()BD(ip)ES( nous montre nos routes)186 1 TN()EA()BN}if 2 NH le{187(1.15\240\240)2 C(5.\240ARP)WB 19 Sn()187 1 TN()EA()BN}if 2 NH le{188(1.16\240\240)2 C(Chapitre\2404.\240R\350gles)WB 20 Sn( - bases de donn\351es des poli)HY(tiques)YH( de routage)188 1 TN()EA()BN}if 2 NH le{189(1.17\240\240)2 C(1.\240Poli)HY(tique)YH()WB 21 Sn( de routage simple par l'adresse source)189 1 TN()EA()BN}if 2 NH le{190(1.18\240\240)2 C(2.\240Routage)WB 22 Sn( avec plusieurs acc\350s Inter)HY(net)YH(/four)HY(nis)HY(seurs)YH( d'acc\350s)190 1 TN()EA()BN}if 3 NH le{191(1.18.1\240\240)3 C(2.1.\240Acc\350s)WB 23 Sn( s\351par\351)191 1 TN()EA()BN}if 3 NH le{192(1.18.2\240\240)3 C(2.2.\240Balance)WB 24 Sn( de charge)192 1 TN()EA()BN}if 2 NH le{193(1.19\240\240)2 C(Chapitre\2405.\240GRE)WB 25 Sn( et autres tunnels)193 1 TN()EA()BN}if 2 NH le{194(1.20\240\240)2 C(1.\240Quelques)WB 26 Sn( remarques g\351n\351)HY(rales)YH( \340 propos des tunnels\240:)194 1 TN()EA()BN}if 2 NH le{195(1.21\240\240)2 C(2.\240IP)WB 27 Sn( dans un tunnel IP)195 1 TN()EA()BN}if 2 NH le{196(1.22\240\240)2 C(3.\240Le)WB 28 Sn( tunnel GRE)196 1 TN()EA()BN}if 3 NH le{197(1.22.1\240\240)3 C(3.1.\240Le)WB 29 Sn( tunnel IPv4)197 1 TN()EA()BN}if 3 NH le{198(1.22.2\240\240)3 C(3.2.\240Le)WB 30 Sn( tunnel IPv6)198 1 TN()EA()BN}if 2 NH le{199(1.23\240\240)2 C(4.\240Tunnels)WB 31 Sn( dans l'espace utili)HY(sa)HY(teur)YH()199 1 TN()EA()BN}if 2 NH le{200(1.24\240\240)2 C(Chapitre\2406.\240Tunnel)WB 32 Sn( IPv6 avec Cisco et/ou une dorsale IPv6 \2016bone\202)200 1 TN()EA()BN}if 2 NH le{201(1.25\240\240)2 C(1.\240Tunnel)WB 33 Sn( IPv6)201 1 TN()EA()BN}if 2 NH le{202(1.26\240\240)2 C(Chapitre\2407.\240IPSEC:)WB 34 Sn( IP s\351cu)HY(ris\351)YH( \340 travers Inter)HY(net)YH()202 1 TN()EA()BN}if 2 NH le{203(1.27\240\240)2 C(1.\240Intro)HY(duc)HY(tion)YH()WB 35 Sn( sur la gestion manuelle des cl\351s)203 1 TN()EA()BN}if 2 NH le{204(1.28\240\240)2 C(2.\240Gestion)WB 36 Sn( auto)HY(ma)HY(tique)YH( des cl\351s)204 1 TN()EA()BN}if 3 NH le{205(1.28.1\240\240)3 C(2.1.\240Th\351orie)WB 37 Sn()205 1 TN()EA()BN}if 3 NH le{206(1.28.2\240\240)3 C(2.2.\240Exemple)WB 38 Sn()206 1 TN()EA()BN}if 4 NH le{207(1.28.2.1\240\240)4 C(2.2.1.\240Probl\350mes)WB 39 Sn( et d\351fauts connus)207 1 TN()EA()BN}if 3 NH le{208(1.28.3\240\240)3 C(2.3.\240Gestion)WB 40 Sn( auto)HY(ma)HY(tique)YH( des cl\351s en utili)HY(sant)YH( les certi)HY(fi)HY(cats)YH( X.509)208 1 TN()EA()BN}if 4 NH le{209(1.28.3.1\240\240)4 C(2.3.1.\240Construire)WB 41 Sn( un certi)HY(fi)HY(cat)YH( X.509 pour votre h\364te)209 1 TN()EA()BN}if 4 NH le{210(1.28.3.2\240\240)4 C(2.3.2.\240Confi)HY(gu)HY(ra)HY(tion)YH()WB 42 Sn( et lance)HY(ment)YH()210 1 TN()EA()BN}if 4 NH le{211(1.28.3.3\240\240)4 C(2.3.3.\240Comment)WB 43 Sn( confi)HY(gu)HY(rer)YH( des tunnels s\351cu)HY(ri)HY(s\351s)YH()211 1 TN()EA()BN}if 2 NH le{212(1.29\240\240)2 C(3.\240tunnels)WB 44 Sn( IPSEC)212 1 TN()EA()BN}if 2 NH le{213(1.30\240\240)2 C(4.\240Autre)WB 45 Sn( logi)HY(ciel)YH( IPSEC)213 1 TN()EA()BN}if 2 NH le{214(1.31\240\240)2 C(5.\240Inter)HY(op\351)HY(ra)HY(bi)HY(lit\351)YH()WB 46 Sn( d'IPSEC avec d'autres syst\350mes)214 1 TN()EA()BN}if 3 NH le{215(1.31.1\240\240)3 C(5.1.\240Windows)WB 47 Sn()215 1 TN()EA()BN}if 3 NH le{216(1.31.2\240\240)3 C(5.2.\240)WB 48 Sn( Check Point VPN-1 NG)216 1 TN()EA()BN}if 2 NH le{217(1.32\240\240)2 C(Chapitre\2408.\240Routage)WB 49 Sn( multi)HY(dis)HY(tri)HY(bu)HY(tion)YH( \201)EM(multi)HY(cast)YH()ES(\202)217 1 TN()EA()BN}if 2 NH le{218(1.33\240\240)2 C(Chapitre\2409.\240Gestion)HY(naires)YH()WB 50 Sn( de mise en file d'attente pour l'admi)HY(nis)HY(tra)HY(tion)YH( de la bande passante)218 1 TN()EA()BN}if 2 NH le{219(1.34\240\240)2 C(1.\240Expli)HY(ca)HY(tion)YH()WB 51 Sn( sur les files d'attente et la gestion de la mise en file d'attente)219 1 TN()EA()BN}if 2 NH le{220(1.35\240\240)2 C(2.\240Gestion)HY(naires)YH()WB 52 Sn( de mise en file d'attente simples, sans classes)220 1 TN()EA()BN}if 3 NH le{221(1.35.1\240\240)3 C(2.1.\240)WB 53 Sn()SM(pfifo_fast)ES()221 1 TN()EA()BN}if 4 NH le{222(1.35.1.1\240\240)4 C(2.1.1.\240Para)HY(m\350tres)YH()WB 54 Sn( & usage)222 1 TN()EA()BN}if 3 NH le{223(1.35.2\240\240)3 C(2.2.\240Filtre)WB 55 Sn( \340 seau de jetons \201)EM(Token Bucket Filter)ES(\202)223 1 TN()EA()BN}if 4 NH le{224(1.35.2.1\240\240)4 C(2.2.1.\240Para)HY(m\350tres)YH()WB 56 Sn( & usage)224 1 TN()EA()BN}if 4 NH le{225(1.35.2.2\240\240)4 C(2.2.2.\240Confi)HY(gu)HY(ra)HY(tion)YH()WB 57 Sn( simple)225 1 TN()EA()BN}if 3 NH le{226(1.35.3\240\240)3 C(2.3.\240Mise)WB 58 Sn( en file d'attente stochas)HY(tique)HY(ment)YH( \351qui)HY(table)YH( \201)EM(Stochas)HY(tic)YH( Fair)HY(ness)YH( Queueing)ES(\202)226 1 TN()EA()BN}if 4 NH le{227(1.35.3.1\240\240)4 C(2.3.1.\240Para)HY(m\350tres)YH()WB 59 Sn( & usage)227 1 TN()EA()BN}if 4 NH le{228(1.35.3.2\240\240)4 C(2.3.2.\240Confi)HY(gu)HY(ra)HY(tion)YH()WB 60 Sn( simple)228 1 TN()EA()BN}if 2 NH le{229(1.36\240\240)2 C(3.\240Conseils)WB 61 Sn( pour le choix de la file d'attente)229 1 TN()EA()BN}if 2 NH le{230(1.37\240\240)2 C(4.\240termi)HY(no)HY(lo)HY(gie)YH()WB 62 Sn()230 1 TN()EA()BN}if 2 NH le{231(1.38\240\240)2 C(5.\240Gestion)HY(naires)YH()WB 63 Sn( de file d'attente bas\351s sur les classes)231 1 TN()EA()BN}if 3 NH le{232(1.38.1\240\240)3 C(5.1.\240Flux)WB 64 Sn( \340 l'int\351)HY(rieur)YH( des gestion)HY(naires)YH( bas\351s sur des classes & \340 l'int\351)HY(rieur)YH( des classes)232 1 TN()EA()BN}if 3 NH le{233(1.38.2\240\240)3 C(5.2.\240La)WB 65 Sn( famille des gestion)HY(naires)YH( de mise en file d'attente\240: racines, descrip)HY(teurs)YH(, descen)HY(dances)YH( et parents)233 1 TN()EA()BN}if 4 NH le{234(1.38.2.1\240\240)4 C(5.2.1.\240Comment)WB 66 Sn( les filtres sont utili)HY(s\351s)YH( pour clas)HY(si)HY(fier)YH( le trafic)234 1 TN()EA()BN}if 4 NH le{235(1.38.2.2\240\240)4 C(5.2.2.\240Comment)WB 67 Sn( les paquets sont retir\351s de la file d'attente et envoy\351s vers le mat\351)HY(riel)YH()235 1 TN()EA()BN}if 3 NH le{236(1.38.3\240\240)3 C(5.3.\240Le)WB 68 Sn( gestion)HY(naire)YH( de mise en file d'attente PRIO)236 1 TN()EA()BN}if 4 NH le{237(1.38.3.1\240\240)4 C(5.3.1.\240Para)HY(m\350tres)YH()WB 69 Sn( PRIO & usage)237 1 TN()EA()BN}if 4 NH le{238(1.38.3.2\240\240)4 C(5.3.2.\240Confi)HY(gu)HY(ra)HY(tion)YH()WB 70 Sn( simple)238 1 TN()EA()BN}if 3 NH le{239(1.38.4\240\240)3 C(5.4.\240Le)WB 71 Sn( c\351l\350bre gestion)HY(naire)YH( de mise en file d'attente CBQ)239 1 TN()EA()BN}if 4 NH le{240(1.38.4.1\240\240)4 C(5.4.1.\240Mise)WB 72 Sn( en forme CBQ en d\351tail )240 1 TN()EA()BN}if 4 NH le{241(1.38.4.2\240\240)4 C(5.4.2.\240Le)WB 73 Sn( compor)HY(te)HY(ment)YH( )EM(CBQ class)HY(ful)YH()ES()241 1 TN()EA()BN}if 4 NH le{242(1.38.4.3\240\240)4 C(5.4.3.\240Para)HY(m\350tres)YH()WB 74 Sn( CBQ qui d\351ter)HY(minent)YH( le partage & le pr\352t du lien)242 1 TN()EA()BN}if 4 NH le{243(1.38.4.4\240\240)4 C(5.4.4.\240Confi)HY(gu)HY(ra)HY(tion)YH()WB 75 Sn( simple)243 1 TN()EA()BN}if 4 NH le{244(1.38.4.5\240\240)4 C(5.4.5.\240D'autres)WB 76 Sn( para)HY(m\350tres)YH( CBQ\240: )SM(split)ES( & )SM(defmap)ES()244 1 TN()EA()BN}if 3 NH le{245(1.38.5\240\240)3 C(5.5.\240Seau)WB 77 Sn( de jetons \340 contr\364le hi\351rar)HY(chique)YH( \201)EM(Hierar)HY(chi)HY(cal)YH( Token Bucket)ES(\202)245 1 TN()EA()BN}if 4 NH le{246(1.38.5.1\240\240)4 C(5.5.1.\240Confi)HY(gu)HY(ra)HY(tion)YH()WB 78 Sn( simple)246 1 TN()EA()BN}if 2 NH le{247(1.39\240\240)2 C(6.\240Clas)HY(si)HY(fier)YH()WB 79 Sn( des paquets avec des filtres)247 1 TN()EA()BN}if 3 NH le{248(1.39.1\240\240)3 C(6.1.\240Quelques)WB 80 Sn( exemples simples de filtrage)248 1 TN()EA()BN}if 3 NH le{249(1.39.2\240\240)3 C(6.2.\240Toutes)WB 81 Sn( les commandes de filtres dont vous aurez norma)HY(le)HY(ment)YH( besoin)249 1 TN()EA()BN}if 2 NH le{250(1.40\240\240)2 C(7.\240Le)WB 82 Sn( p\351ri)HY(ph\351)HY(rique)YH( de file d'attente inter)HY(m\351)HY(diaire)YH( \201The Inter)HY(me)HY(diate)YH( queueing device \201IMQ\202\202)250 1 TN()EA()BN}if 3 NH le{251(1.40.1\240\240)3 C(7.1.\240Confi)HY(gu)HY(ra)HY(tion)YH()WB 83 Sn( simple)251 1 TN()EA()BN}if 2 NH le{252(1.41\240\240)2 C(Chapitre\24010.\240\311qui)HY(li)HY(brage)YH()WB 84 Sn( de charge sur plusieurs inter)HY(faces)YH()252 1 TN()EA()BN}if 2 NH le{253(1.42\240\240)2 C(1.\240Aver)HY(tis)HY(se)HY(ment)YH()WB 85 Sn()253 1 TN()EA()BN}if 2 NH le{254(1.43\240\240)2 C(Chapitre\24011.\240Netfil)HY(ter)YH()WB 86 Sn( et iproute - marquage de paquets)254 1 TN()EA()BN}if 2 NH le{255(1.44\240\240)2 C(Chapitre\24012.\240Filtres)WB 87 Sn( avanc\351s pour la \201re-\202clas)HY(si)HY(fi)HY(ca)HY(tion)YH( des paquets)255 1 TN()EA()BN}if 2 NH le{256(1.45\240\240)2 C(1.\240Le)WB 88 Sn( clas)HY(si)HY(fi)HY(ca)HY(teur)YH( )SM(u32)ES()256 1 TN()EA()BN}if 3 NH le{257(1.45.1\240\240)3 C(1.1.\240Le)WB 89 Sn( s\351lec)HY(teur)YH( U32)257 1 TN()EA()BN}if 3 NH le{258(1.45.2\240\240)3 C(1.2.\240S\351lec)HY(teurs)YH()WB 90 Sn( g\351n\351)HY(raux)YH()258 1 TN()EA()BN}if 3 NH le{259(1.45.3\240\240)3 C(1.3.\240Les)WB 91 Sn( s\351lec)HY(teurs)YH( sp\351ci)HY(fiques)YH()259 1 TN()EA()BN}if 2 NH le{260(1.46\240\240)2 C(2.\240Le)WB 92 Sn( clas)HY(si)HY(fi)HY(ca)HY(teur)YH( )SM(route)ES()260 1 TN()EA()BN}if 2 NH le{261(1.47\240\240)2 C(3.\240Les)WB 93 Sn( filtres de r\351gle)HY(men)HY(ta)HY(tion)YH( \201)EM(Poli)HY(cing)YH( filters)ES(\202)261 1 TN()EA()BN}if 3 NH le{262(1.47.1\240\240)3 C(3.1.\240Tech)HY(niques)YH()WB 94 Sn( de r\351gle)HY(men)HY(ta)HY(tion)YH()262 1 TN()EA()BN}if 4 NH le{263(1.47.1.1\240\240)4 C(3.1.1.\240Avec)WB 95 Sn( l'esti)HY(ma)HY(teur)YH( du noyau)263 1 TN()EA()BN}if 4 NH le{264(1.47.1.2\240\240)4 C(3.1.2.\240Avec)WB 96 Sn( le )EM(Token Bucket Filter)ES()264 1 TN()EA()BN}if 3 NH le{265(1.47.2\240\240)3 C(3.2.\240Actions)WB 97 Sn( de d\351pas)HY(se)HY(ment)YH( de limite \201)EM(Over)HY(li)HY(mit)YH( actions)ES(\202)265 1 TN()EA()BN}if 3 NH le{266(1.47.3\240\240)3 C(3.3.\240Exemples)WB 98 Sn()266 1 TN()EA()BN}if 2 NH le{267(1.48\240\240)2 C(4.\240Filtres)WB 99 Sn( hach\351s pour un filtrage massif tr\350s rapide)267 1 TN()EA()BN}if 2 NH le{268(1.49\240\240)2 C(5.\240Filtrer)WB 100 Sn( le trafic IPv6)268 1 TN()EA()BN}if 3 NH le{269(1.49.1\240\240)3 C(5.1.\240Comment)WB 101 Sn( se fait-il que ces filtres tc IPv6 ne fonc)HY(tionnent)YH( pas\240?)269 1 TN()EA()BN}if 3 NH le{270(1.49.2\240\240)3 C(5.2.\240Marquer)WB 102 Sn( les paquets IPv6 en utili)HY(sant)YH( ip6tables)270 1 TN()EA()BN}if 3 NH le{271(1.49.3\240\240)3 C(5.3.\240Utili)HY(ser)YH()WB 103 Sn( le s\351lec)HY(teur)YH( u32 pour rep\351rer le paquet IPv6)271 1 TN()EA()BN}if 2 NH le{272(1.50\240\240)2 C(Chapitre\24013.\240Para)HY(m\350tres)YH()WB 104 Sn( r\351seau du noyau)272 1 TN()EA()BN}if 2 NH le{273(1.51\240\240)2 C(1.\240Filtrage)WB 105 Sn( de Chemin Inverse \201)EM(Reverse Path Filte)HY(ring)YH()ES(\202)273 1 TN()EA()BN}if 2 NH le{274(1.52\240\240)2 C(2.\240Confi)HY(gu)HY(ra)HY(tions)YH()WB 106 Sn( obscures)274 1 TN()EA()BN}if 3 NH le{275(1.52.1\240\240)3 C(2.1.\240ipv4)WB 107 Sn( g\351n\351)HY(rique)YH()275 1 TN()EA()BN}if 3 NH le{276(1.52.2\240\240)3 C(2.2.\240Confi)HY(gu)HY(ra)HY(tion)YH()WB 108 Sn( des p\351ri)HY(ph\351)HY(riques)YH()276 1 TN()EA()BN}if 3 NH le{277(1.52.3\240\240)3 C(2.3.\240Poli)HY(tique)YH()WB 109 Sn( de voisi)HY(nage)YH()277 1 TN()EA()BN}if 3 NH le{278(1.52.4\240\240)3 C(2.4.\240Confi)HY(gu)HY(ra)HY(tion)YH()WB 110 Sn( du routage)278 1 TN()EA()BN}if 2 NH le{279(1.53\240\240)2 C(Chapitre\24014.\240Gestion)HY(naires)YH()WB 111 Sn( de mise en file d'attente avanc\351s & moins communs)279 1 TN()EA()BN}if 2 NH le{280(1.54\240\240)2 C(1.\240)WB 112 Sn()SM(bfifo)ES(/)SM(pfifo)ES()280 1 TN()EA()BN}if 3 NH le{281(1.54.1\240\240)3 C(1.1.\240Para)HY(m\350tres)YH()WB 113 Sn( & usage)281 1 TN()EA()BN}if 2 NH le{282(1.55\240\240)2 C(2.\240Algo)HY(rithme)YH()WB 114 Sn( Clark-Shenker-Zhang \201CSZ\202)282 1 TN()EA()BN}if 2 NH le{283(1.56\240\240)2 C(3.\240)WB 115 Sn()SM(DSMARK)ES()283 1 TN()EA()BN}if 3 NH le{284(1.56.1\240\240)3 C(3.1.\240Intro)HY(duc)HY(tion)YH()WB 116 Sn()284 1 TN()EA()BN}if 3 NH le{285(1.56.2\240\240)3 C(3.2.\240A)WB 117 Sn( quoi )SM(DSMARK)ES( est-il reli\351\240?)285 1 TN()EA()BN}if 3 NH le{286(1.56.3\240\240)3 C(3.3.\240Guide)WB 118 Sn( des services diff\351)HY(ren)HY(ci\351s)YH()286 1 TN()EA()BN}if 3 NH le{287(1.56.4\240\240)3 C(3.4.\240Travailler)WB 119 Sn( avec )SM(DSMARK)ES()287 1 TN()EA()BN}if 3 NH le{288(1.56.5\240\240)3 C(3.5.\240Comment)WB 120 Sn( )SM(SCH_DSMARK)ES( travaille.)288 1 TN()EA()BN}if 3 NH le{289(1.56.6\240\240)3 C(3.6.\240Le)WB 121 Sn( filtre TC_INDEX)289 1 TN()EA()BN}if 2 NH le{290(1.57\240\240)2 C(4.\240Gestion)HY(naire)YH()WB 122 Sn( de mise en file d'attente d'entr\351e \201)EM(Ingress qdisc)ES(\202)290 1 TN()EA()BN}if 3 NH le{291(1.57.1\240\240)3 C(4.1.\240Para)HY(m\350tres)YH()WB 123 Sn( & usage)291 1 TN()EA()BN}if 2 NH le{292(1.58\240\240)2 C(5.\240)WB 124 Sn()EM(Random Early Detec)HY(tion)YH()ES( \201RED\202)292 1 TN()EA()BN}if 2 NH le{293(1.59\240\240)2 C(6.\240Generic)WB 125 Sn( Random Early Detec)HY(tion)YH()293 1 TN()EA()BN}if 2 NH le{294(1.60\240\240)2 C(7.\240Emula)HY(tion)YH()WB 126 Sn( VC/ATM)294 1 TN()EA()BN}if 2 NH le{295(1.61\240\240)2 C(8.\240Weigh)HY(ted)YH()WB 127 Sn( Round Robin \201WRR\202)295 1 TN()EA()BN}if 2 NH le{296(1.62\240\240)2 C(Chapitre\24015.\240Recettes)WB 128 Sn( de cuisine)296 1 TN()EA()BN}if 2 NH le{297(1.63\240\240)2 C(1.\240Faire)WB 129 Sn( tourner plusieurs sites avec diff\351)HY(rentes)YH( SLA \201auto)HY(ri)HY(sa)HY(tions)YH(\202)297 1 TN()EA()BN}if 2 NH le{298(1.64\240\240)2 C(2.\240Prot\351)HY(ger)YH()WB 130 Sn( votre machine des inon)HY(da)HY(tions)YH( SYN)298 1 TN()EA()BN}if 2 NH le{299(1.65\240\240)2 C(3.\240Limiter)WB 131 Sn( le d\351bit ICMP pour emp\352)HY(cher)YH( les d\351nis de service)299 1 TN()EA()BN}if 2 NH le{300(1.66\240\240)2 C(4.\240Donner)WB 132 Sn( la prio)HY(rit\351)YH( au trafic inter)HY(ac)HY(tif)YH()300 1 TN()EA()BN}if 2 NH le{301(1.67\240\240)2 C(5.\240Cache)WB 133 Sn( web trans)HY(pa)HY(rent)YH( utili)HY(sant)YH( netfil)HY(ter)YH(, iproute2, ipchains et squid)301 1 TN()EA()BN}if 3 NH le{302(1.67.1\240\240)3 C(5.1.\240Sch\351ma)WB 134 Sn( du trafic apr\350s l'impl\351)HY(men)HY(ta)HY(tion)YH()302 1 TN()EA()BN}if 2 NH le{303(1.68\240\240)2 C(6.\240Circon)HY(ve)HY(nir)YH()WB 135 Sn( aux probl\350mes de la d\351cou)HY(verte)YH( du MTU de chemin en confi)HY(gu)HY(rant)YH( un MTU par routes)303 1 TN()EA()BN}if 3 NH le{304(1.68.1\240\240)3 C(6.1.\240Solu)HY(tion)YH()WB 136 Sn()304 1 TN()EA()BN}if 2 NH le{305(1.69\240\240)2 C(7.\240Circon)HY(ve)HY(nir)YH()WB 137 Sn( aux probl\350mes de la d\351cou)HY(verte)YH( du MTU de chemin en impo)HY(sant)YH( le MSS \201pour les utili)HY(sa)HY(teurs)YH( de l'ADSL, du c\342ble, de PPPoE & PPtP\202)305 1 TN()EA()BN}if 2 NH le{306(1.70\240\240)2 C(8.\240Le)WB 138 Sn( Condi)HY(tion)HY(neur)YH( de Trafic Ultime\240: Faible temps de latence, T\351l\351)HY(char)HY(ge)HY(ment)YH( vers l'amont et l'aval rapide)306 1 TN()EA()BN}if 3 NH le{307(1.70.1\240\240)3 C(8.1.\240Pourquoi)WB 139 Sn( cela ne marche t-il pas bien par d\351faut\240?)307 1 TN()EA()BN}if 3 NH le{308(1.70.2\240\240)3 C(8.2.\240Le)WB 140 Sn( script \201CBQ\202)308 1 TN()EA()BN}if 3 NH le{309(1.70.3\240\240)3 C(8.3.\240Le)WB 141 Sn( script \201HTB\202)309 1 TN()EA()BN}if 2 NH le{310(1.71\240\240)2 C(9.\240Limi)HY(ta)HY(tion)YH()WB 142 Sn( du d\351bit pour un h\364te ou un masque de sous-r\351seau)310 1 TN()EA()BN}if 2 NH le{311(1.72\240\240)2 C(10.\240Exemple)WB 143 Sn( d'une solu)HY(tion)YH( de traduc)HY(tion)YH( d'adresse avec de la QoS)311 1 TN()EA()BN}if 3 NH le{312(1.72.1\240\240)3 C(10.1.\240Commen\347ons)WB 144 Sn( l'opti)HY(mi)HY(sa)HY(tion)YH( de cette rare bande passante)312 1 TN()EA()BN}if 3 NH le{313(1.72.2\240\240)3 C(10.2.\240Clas)HY(si)HY(fi)HY(ca)HY(tion)YH()WB 145 Sn( des paquets)313 1 TN()EA()BN}if 3 NH le{314(1.72.3\240\240)3 C(10.3.\240Am\351lio)HY(rer)YH()WB 146 Sn( notre confi)HY(gu)HY(ra)HY(tion)YH()314 1 TN()EA()BN}if 3 NH le{315(1.72.4\240\240)3 C(10.4.\240Rendre)WB 147 Sn( tout ceci actif au d\351mar)HY(rage)YH()315 1 TN()EA()BN}if 2 NH le{316(1.73\240\240)2 C(Chapitre\24016.\240Construire)WB 148 Sn( des ponts et des pseudo ponts avec du Proxy ARP)316 1 TN()EA()BN}if 2 NH le{317(1.74\240\240)2 C(1.\240Etat)WB 149 Sn( des ponts et iptables)317 1 TN()EA()BN}if 2 NH le{318(1.75\240\240)2 C(2.\240Pont)WB 150 Sn( et mise en forme)318 1 TN()EA()BN}if 2 NH le{319(1.76\240\240)2 C(3.\240Pseudo-pont)WB 151 Sn( avec du Proxy-ARP)319 1 TN()EA()BN}if 3 NH le{320(1.76.1\240\240)3 C(3.1.\240ARP)WB 152 Sn( & Proxy-ARP)320 1 TN()EA()BN}if 3 NH le{321(1.76.2\240\240)3 C(3.2.\240Impl\351)HY(men)HY(tez)YH(-le)WB 153 Sn()321 1 TN()EA()BN}if 2 NH le{322(1.77\240\240)2 C(Chapitre\24017.\240Routage)WB 154 Sn( Dyna)HY(mique)YH( - OSPF et BGP)322 1 TN()EA()BN}if 2 NH le{323(1.78\240\240)2 C(1.\240Confi)HY(gu)HY(rer)YH()WB 155 Sn( OSPF avec Zebra)323 1 TN()EA()BN}if 3 NH le{324(1.78.1\240\240)3 C(Pedro Larroy Tovar)324 1 TN()EA()BN}if 3 NH le{325(1.78.2\240\240)3 C(1.1.\240Pr\351requis)WB 156 Sn()325 1 TN()EA()BN}if 3 NH le{326(1.78.3\240\240)3 C(1.2.\240Confi)HY(gu)HY(rer)YH()WB 157 Sn( Zebra)326 1 TN()EA()BN}if 3 NH le{327(1.78.4\240\240)3 C(1.3.\240Ex\351cu)HY(ter)YH()WB 158 Sn( Zebra)327 1 TN()EA()BN}if 2 NH le{328(1.79\240\240)2 C(2.\240Confi)HY(gu)HY(rer)YH()WB 159 Sn( BGP4 avec Zebra)328 1 TN()EA()BN}if 3 NH le{329(1.79.1\240\240)3 C(2.1.\240sch\351ma)WB 160 Sn( r\351seau \201Exemple\202)329 1 TN()EA()BN}if 3 NH le{330(1.79.2\240\240)3 C(2.2.\240Confi)HY(gu)HY(ra)HY(tion)YH()WB 161 Sn( \201Exemple\202)330 1 TN()EA()BN}if 3 NH le{331(1.79.3\240\240)3 C(2.3.\240V\351ri)HY(fi)HY(ca)HY(tion)YH()WB 162 Sn( de la confi)HY(gu)HY(ra)HY(tion)YH()331 1 TN()EA()BN}if 2 NH le{332(1.80\240\240)2 C(Chapitre\24018.\240Autres)WB 163 Sn( possi)HY(bi)HY(li)HY(t\351s)YH()332 1 TN()EA()BN}if 2 NH le{333(1.81\240\240)2 C(Chapitre\24019.\240Lectures)WB 164 Sn( suppl\351)HY(men)HY(taires)YH()333 1 TN()EA()BN}if 2 NH le{334(1.82\240\240)2 C(Chapitre\24020.\240Remer)HY(cie)HY(ments)YH()WB 166 Sn()334 1 TN()EA()BN}if /TE t D NP TU PM 0 eq and{/Pn () D showpage}if end restore .