Documente Academic
Documente Profesional
Documente Cultură
traficului
Autori:
Bert Hubert
Netherlabs BV
bert.hubert@netherlabs.nl
Gregory Maxwell (Section Author)
remco%virtu.nl
Remco van Mook (Section Author)
remco@virtu.nl
Martijn van Oosterhout (Section Author)
kleptog@cupid.suninternet.com
Paul B Schroeder (Section Author)
paulsch@us.ibm.com
Jasper Spaans (Section Author)
jasper@spaans.ds9a.nl
Pedro Larroy (Section Author)
piotr%omega.resa.ed
Traducere && adaptare: sasinu.
Data nasterii(lartc): 2002/12/14 22:52:31
Index
1. Dedicatie
2. Introducere
2.1. Licenta && Disclaimer
2.2. Cunostiinte necesare
2.3. Ce poate face Linux
2.4. Note de intretinere
2.5. Acces, CVS si subscrierea actualizarilor
2.6. Lista de mail
2.7. Formatul acestui document
3. Introducere - iproute2
3.1. De ce iproute2 ?
3.2. Tur iproute2
3.3. Chestii necesare
3.4. Explorarea configuratiei curente
3.4.1. Cum vedem link-urile
3.4.2. Cum vedem adresele ip
3.4.3. Cum vedem rutele
3.5. ARP
1. DEDICATIE
Lu' tipu'.
2. INTRODUCERE
Acest document incearca sa aduca putina lumina in metodele
de rutare Linux 2.2/2.4. Desi poate nu stiti, deja folositi niste
instrumente care va permit realizarea unor lucruri spectaculoase.
Comenzi ca route sau ifconfig sunt de fapt niste interfete la
puternica infrastructura iproute2.
3. INTRODUCERE - IPROUTE2
3.1. De ce iproute2 ?
In acest moment majoritatea distributiilor Linux si
majoritate Unix-urilor folosesc venerabilele comenzi arp,
ifconfig si route. Desi aceste instrumente sunt viabile, in
versiunile Linux 2.2 si mai avansate, functioneaza intr-un mod
neasteptat. De exemplu, tunelele GRE fac parte din procesul de
rutare dar necesita instrumente diferite.
Cu iproute2, tunelele sunt integrate in setul de
instrumente.
Kernel-urile 2.2 si mai avansate includ un subsistem de
retea complet refacut. Codul nou de retea aduce o performanta si
functionalitate Linuxului putin comparabila cu alte produse. De
fapt, noul cod pentru rutare, filtrare si clasificare este mult
mai complex decat cel oferit de rutere dedicate, firewall-uri si
produse pentre modelare a traficului.
Odata cu aparitia unor noi concepte de retea, au aparut si
metode de aplicare a acestora pe infrastructura existenta in
sistemele de operare. Aceasta stratificare constanta a dus la
aparitia codurilor de retea cu comportare ciudata, fenomen
intalnit si in limbile vorbite. In trecut, Linux simula, aproape
in intregime, subsistemul de retea SunOS, care nu era ideal.
Aceasta infrastructura noua ofera posibilitati care nu
existau in versiunile anterioare.
3.5. ARP
ARP inseamna Address Resolution Protocol descris in RFC
826 (http://www.faqs.org/rfcs/rfc826.html). ARP este utilizat de
o masina conectata la retea pentru rezolvarea adresei/locatiei
hardware a unei alte masini in aceeasi retea locala. Aceasta este
metoda prin care o masina din reteaua foo.com poate comunica cu o
alta masina care este in reteaua bar.net. Totusi, o adresa ip nu
poate identifica si locatia unui masini. De acest lucru se ocupa
ARP.
Sa luam un exemplu simplu. Presupun ca am o retea formata
din cateva calculatoare. Doua din ele, in reteaua mea, sunt foo
cu adresa 10.0.0.1 si bar cu adresa 10.0.0.2. Foo da ping pe bar
sa verifice daca este pornit, dar foo nu are nici cea mai mica
idee unde este bar. Cand foo incearca sa dea ping pe bar va
trimite un ARP request (cerere ARP). Aceasta ARP request este
similar unui strigat al lui foo pe retea: "Bar(10.0.0.2), ceara
ma-ti! Unde esti?" Fiecare masina de pe retea va auzi request-ul
ARP. Doar bar (10.0.0.2) va raspunde. Bar va trimie un ARP reply
(raspuns ARP) inapoi la foo care contine adresa
ceruta:"Foo(10.0.0.1.)...Puiule...Sunt la 00:60:94:e9:12". Dupa
aceasta tranzactie simpla care a permis localizarea prietenului
sau in retea, foo poate comunica cu bar pana cand va uita (cand
intrarea asociata cu bar va fi stearsa din cache-ul arp) unde
este bar (de obicei 15 minute in Unix).
Pentru a vedea tabela arp a vecinilor:
[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
Dupa cum vedeti statia mea espa041 (9.3.76.41) stie cum sa
gaseasca espa042 (9.3.76.42) si espagate (9.3.76.1). Sa mai
adaugam o masina in cache-ul arp.
[root@espa041 /home/paulsch/.gnome-desktop]# ping -c 1 espa043
/
/
+---------------+ Provider 1
|
|
|
+------+------+
+------------+
|
if1
|
/
\
|
|
| Retea locala -----+ Ruter Linux |
Internet
\_
__/
|
|
\__
__/
|
if2
|
\__/
+------+------+
+------------+
|
|
|
+---------------+ Provider 2
|
|
+------------+
__
__/ \__
_/
\__
+---------|
|
|
|
|
|
|
|
|
|
+---------|
\
\_____
route
route
route
route
add
add
add
add
$P1_NET
default
$P2_NET
default
dev
via
dev
via
5. GRE SI TUNELE
Exista trei tipuri de tunele in Linux. Tunele IP in IP,
tunele GRE si tunele care nu sunt incluse in kernel (de exemplu
PPTP).
retea 3ffe:406:5:1:5:a:2:1/96
Adresa noastra IPv4 este 172.16.17.18 si ruterul 6bone are
adresa IPv4 172.22.23.24.
#ip tunnel add sixbone mode sit remote 172.22.23.24 local
172.16.7.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
Sa discutam aceasta configuratie (gyeah!). In prima linie
am creat un tunnel device (dispozitiv tunel) pe care l-am numit
sixbone. L-am pus in modul 'sit' (asta inseamna incapsulare IPv6
in IPv4) si i-am specificat adresa locala (local) si adresa de la
celalalt capat (remote). TTL este setat la maximum - 255. In
continuare am activat device-ul. Apoi am adaugat adresa IPv6 a
retelei noastre si am pus ruta pentru 3ffe::/15 (singura retea in
6bone)prin tunel.
In acest moment tunelele GRE sunt un standard acceptat si
in afara comunitatii Linux asa ca este metoda preferata si
recomandata de tunelare.
7.2.1. Teorie
Dupa cum am explicat mai sus, semnarea automata elimina
partea mai plictisitoare a configurarilor (care ar trebuie sa o
facem noi). Mai exact, creeaza SA din mers. Totusi nu stabiliste
politicile, care raman la latitudinea noastra (normal).
Deci, pentru a utiliza IKE, stabiliti o politica, dar nu
configurati nici un SA. Daca kernel-ul gaseste o politica IPSEC,
dar nu si un SA, va anunta demonul IKE, care va incerca sa
negocieze propriile SA.
Daca nu va mai aduceti aminte, un SP inseamna _ce_ dorim
iar un SA _cum_ dorim sa facem o chestie. Folosirea automatic
keying (semnare automata) ne face scapati de la configurarea a
ceea _ce_ vrem.
7.2.2. Exemplu
Kame racoon vine cu o haita mare de optiuni, majoritatea
au niste valori predefinite misto, deci nu trebuie sale mai
setam. Dupa cum am povestit mai sus, operatorul trebuie sa
defineasca un SP, dar nu si un SA.
In acest exemplu, 10.0.0.11 si 10.0.0.216 vor fi conectate
cu o legatura securizata, de aceasta data cu putin ajutor de la
racoon. Pentru simplitatea configuratiei vom folosi chei prepartajate, infioratoareale 'secrete partajate'. Certificatele
X.509 sunt discutate intr-o sectiune separata (7.2.3).
Vom incerca sa pastram cat mai mult din configuratia
prestabilita pe ambele host-uri:
Pe 10.0.0.216
10.0.0.11 password2
Aveti grija ca aceste fisiere sa fie detinute de root si
proprietatile sa fie setate la 0600 altfel racoon nu va avea
"incredere" in continutul lor. Daca nu ati observat cele doua
fisiere sunt in oglinda.
In continuare vom seta politica dorita. Simplu.
Pe 10.0.0.216:
#!/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;
Pe 10.0.0.11:
#!/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;
Remarcati ca politicile sunt in oglinda din nou.
Acum tot ce mai ramane de facut e sa lansam racoon. Odata
lansat, in momentul in care incercam sa ne conectam prin telnet
de la 10.0.0.11 la 10.0.0.216, sau invers, racoon va incepe
negocierea:
12:18:44: INFO: isakmp.c:1689:isakmp_post_acquire(): IPsec-SA
request for 10.0.0.11 queued due to no phase1 found.
12:18:44: INFO: isakmp.c:794:isakmp_ph1begin_i(): 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(): begin
Aggressive mode.
lifetime:0(s) validtime:0(s)
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(s) validtime:0(s)
spid=3609 seq=4 pid=17134
refcnt=3
hash_algorithm sha1;
authentication_method rsasig;
dh_group 2 ;
}
}
racoon.conf fiind setat pe ambele host-uri, mai ramane
mutarea fisierelor cheie in locul lor. Masina 'upstairs' are
nevoie de upstairs.private, upstairs.public si laptop.public
in /usr/local/etc/racoon/certs iar 'laptop' are nevoie de
laptop.private, laptop.public si upstairs.public tot in
/usr/local/etc/racoon/certs. Aveti grija ca acest director sa fie
detinut de root si aiba drepturi 0600 altfel racoon nu le va
citi. Cu alte cuvinte fiecare host are nevoie de propria cheie
publica si privata si cheia publica a host-ul de la distanta.
Verificati daca SP este setat (liniile spdadd in sectiunea 7.2.2.
Lansati racoon si totul ar trebuie sa mearga.
7.4.1. Windows
Idem 7.4
8. RUTARE MULTICAST
(difuzare pe grupuri)
9.2.1. pfifo_fast
Aceasta este, cum spune si numele, First In First Out
(primul intrat primul iesit), ceea ce inseamna ca toate pachetele
sunt tratate la fel. Aproximativ. Queue-ul pfifo_fast are 3 asazise benzi (bands). In fiecare banda, se aplica regulile FIFO. Cu
toate astea, cat timp sunt pachete in banda 0, banda 1 nu va fi
procesata. La fel pentru 1 si 2.
Kernel-ul tine cont de flag-ul Type of Service (TOS tipul serviciului) al pachetelor si are grija sa insereze pachete
cu intarziere minima (minimum delay) in banda 0.
Sa nu confundati acest qdisc simplu fara clase (classless
simple qdisc) cu cel PRIO cu clase! Desi se comporta similar
pfifo_fast nu suporta clase si nu pot fi adaugate alte qdisc-uri
cu ajutorul comenzii tc.
Biti
Semnificatie
Prioritate
Banda
----------------------------------------------------------------------------------0x0
0
Normal Service
0
Best Effort
1
0x2
1
Minimize Monetary Cost
1
Filler
2
0x4
2
Maximize Reliability
0
Best Effort
1
0x6
3
mmc+mr
0
Best Effort
1
0x8
4
Maximize Throughput
2
Bulk
2
0xa
5
mmc+mt
2
Bulk
2
0xc
6
mr+mt
2 Bulk
2
0xe
0x10
Interactive
0x12
Interactive
0x14
Interactive
0x16
Interactive
0x18
7
2
8
0
9
0
10
0
11
0
12
mmc+mr+mt
2 Bulk
Minimize Delay
mmc+md
mr+md
mmc+mr+md
mt+md
4 Int. Bulk
13
mmc+mt+md
4 Int. Bulk
14
mr+mt+md
4 Int. Bulk
15
mmc+mr+mt+md
4 Int. Bulk
1
0x1a
1
0x1c
1
0x1e
1
O gasca de numere. A doua coloana are valorile bitilor TOS
relevanti, iar pe a treia semnificatia acestora. De exemplu 15
inseamna un pachet care "cere" cost minim, siguranta maxima, rata
de transfer maxima si intarziere minima. Eu il numesc pachet
"olandez". A patra coloana arata modul in care kernel-ul Linux
interpreteaza bitii TOS - prioritatea la care sunt mapati.
Ultima coloana arata rezultatul prestabilit priomap. In
linie de comanda priomap arata cam asa:
1, 2, 2, 2, 1, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1
Asta inseamna ca prioritatea 4, de exemplu, este mapata la
banda 1. Priomap permite folosirea unor prioritati mai mari (>7)
care nu corespund maparilor TOS, dar care sunt setate prin alte
mijloace.
Acest tabel din RFC 1349 (sa-l cititi pentru mai multe
detalii) prezinta modul in care aplicatiile pot sa-si seteze
bitii TOS:
TELNET
FTP
1000
Control
(intarziere minima)
1000
(intarziere
0100
minima)
TFTP
SMTP
Date
1000
(intarziere
minima)
Faza de date 0100
0010
Erori
Cereri(Requests)
(cost minim)
0000
0000
ori)
ori)
txqueuelen - Lungimea acestei cozi este obtinuta din configurarea
interfetei, care poate fi afisata si setata cu ajutorul ifconfig
si ip. Pentru a seta lungimea cozii la 10, scrieti in linia de
comanda:
#ifconfig eth0 txqueuelen 10
Acest parametru nu poate fi setat cu tc!
9.4. Terminologie
Pentru a intelege configuratii mai importante trebuie
clarificate cateva concepte. Datorita complexitatii si
"prospetimii" tematicii abordate, sunt folositi diferiti termeni
care, de fapt, inseamna acelasi lucru.
Am folosit ca referinta draft-ietf-diffserv-model-06.txt,
An Informal Management
Model for Diffserv Routers. Il puteti gasi la
http://www.ietf.org/internet-drafts/draft-ietf-diffserv-model06.txt
Cititi-l pentru a vedea definitile oficiale.
Queueing Discipline (regula de asteptare) - Un algoritm care
administreaza queue-ul unui device, pentru intrare (ingress) sau
iesire (egress)
Classless qdisc (regula de asteptare fara clase) - un qdisc fara
subdiviziuni interne configurabile
Classful qdisc (regula de asteptare cu clase) - Un classful qdisc
contine mai multe clase. Fiecare dintre aceste clase contine un
alt qdisc, care poate fi la randul cu sau fara clase. Conform
definitiei stricte, pfifo_fast este cu clase, deoarece are trei
benzi care sunt,de fapt, clase. Cu toate acestea din perspectiva
|
|
+------------> Stiva IP
|
|
|
|
|
|
|
|
/
|
/
|
/
/-qdisc1-\
|
/
Egress
/--qdisc2--\
|
|
| /
------>a
|
|/
|
|
^
|
--->------------->Ingress
|
|
Qdisc
|
Classifier---qdisc3--\--qdisc4--/
\-qdiscn-/
+-------------------------------------------------------------------+
Schema realizata de Jamal Hadi Salim.
Cam asa arata kernel-ul. Sageata din stanga jos reprezinta
traficul de intrare care se duce in qdisc-ul Ingress unde sunt
aplicate (daca exista) filtre. Aceasta operatie se numeste
policing - pachetele care intra pot fi procesate devreme, din
moment ce n-au parcus un anumit traseu in kernel. Daca vreti sa
le opriti (drop) aici este cel mai bun loc pentru a evita
folosirea puterii de calcul.