This is an old revision of the document!


Laborator 7. Adresare IP și rutare în Linux

Cunoștințe și abilități ce vor fi dobândite

  • Configurare de adrese IP în Linux
  • Configurarea rutării în Linux
  • Depanarea problemelor de configurare a rețelei în Linux

Pregătire infrastructură de laborator

  • Vom rula o masină virtuală în cloud-ul facultății
  • Pentru a porni o astfel de masină urmăriți tutorialul de la această adresă.
    • Când creați instanța de mașină virtuală (în fereastra “Launch instance”):
      • La opțiunea Instance Boot Source să alegeți Boot from Image.
      • La opțiunea Image Name (apărută după ce efectuați pasul de mai sus) să alegeți imaginea RL2018
      • ATENȚIE: NU FOLOSIȚI RL_2019!! A fost o încurcătură și nu a fost uploadat ce trebuie, va fi rezolvată săptămâna viitoare :D .
  • Pentru a pregăti configurația de laborator, pe mașina virtuală (stația host) folosiți comenzile următoare din contul utilizatorului root de pe stația host (puteți da copy/paste la comenzi în terminal):
    root@host:~# wget https://raw.github.com/RL-UPB/rl-lab-prepare/master/rl-lab-07-prepare
    root@host:~# chmod +x rl-lab-07-prepare
    root@host:~# ./rl-lab-07-prepare
  • Deschideți trei noi tab-uri în terminal (folosiți combinația de taste Ctrl+Shift+t), și conectați-vă, din nou, la mașina virtuală folosind comanda ssh de mai sus.
    • De pe cele trei noi tab-uri, conectați-vă la cele trei containere (red, green și blue).

Detalii rulare masina virtuala VMware local

Detalii rulare masina virtuala VMware local

  • Deschideți VMware și porniți mașina virtuală RL_lab.
  • Dorim să folosim terminalul sistemului fizic și să lucrăm peste SSH cu mașina virtuală VMware (denumită și host). În acest fel vom putea folosi copy-paste în terminal sau alte facilități. Pentru aceasta urmați pașii de mai jos:
    • Autentificați-vă în mașina virtuală folosind contul root cu parola student.
    • Aflați adresa IP a mașinii virtuale de pe interfața eth0:
      root@host:~# ifconfig eth0
    • De pe sistemul fizic, deschideți un terminal și realizați o sesiune SSH folosind:
      student@mjolnir:~$ ssh root@$ADRESA_IP_MV

      unde $ADRESA_IP_MV este adresa IP a mașinii virtuale așa cum ați obținut-o mai sus.

Pentru a vedea cum accesați stațiile red, green și blue (containere LXC configurate peste mașina virtuală VMware - stația host) urmăriți indicațiile din pagina cu instrucțiuni de utilizare a mașinii virtuale.

Conturile de acces la mașina virtuală (stația host) sunt (username:parola):

  • root:student
  • student:student

În mod implicit folosiți contul root pentru conectare pe toate stațiile. Aveți nevoie de drepturi privilegiate pentru configurare. Folosiți contul student doar unde vi se cere explicit.

Topologie

Exerciții

În cadrul exercițiilor din laboratoarele de Linux vom folosi topologia de mai sus.

01. [10p] Configurare și ștergere adrese IP

Dorim, pentru început, să asigurăm conectivitate între stația host și red. În acest tutorial vom folosi suita iproute de pe Linux pentru a realiza configurările frecvente de nivel 3 (adresare IP).

Vom configura câte o adresă IP din clasa 192.168.0.0/24 pe interfețele de legătură dintre stația host și stația red. Adică între host(veth-red) (interfața veth-red de pe stația host) și red(eth0) (interfața eth0 de pe stația red).

Pe interfața veth-red de pe stația host vom configura adresa IP 192.168.0.1 cu masca 255.255.255.0 (/24 în forma prefixată):

root@host:~# ip address add 192.168.0.1/24 dev veth-red

Observați că suita iproute2 (adică utilitarul ip) folosește masca în format prefixat: /24.

Imediat după o configurare de rețea rulați o comandă pentru validarea configurării. În cazul nostru este comanda de afișare a configurării de nivel 3 (Rețea), adică a adresei IP:

root@host:~# ip address show dev veth-red
47: veth-red: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 4e:1b:b8:d9:14:bb brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 scope global veth-red

Pe interfața eth0 de pe stația red vom configura adresa IP 192.168.0.2 cu masca 255.255.255.0 (/24 în forma prefixată):

root@host:~# go red
[...]
root@red:~# ip address add 192.168.0.2/24 dev eth0
root@red:~# ip address show dev eth0
46: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:16:3e:8e:84:21 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.2/24 scope global eth0
    inet6 fe80::216:3eff:fe8e:8421/64 scope link 
       valid_lft forever preferred_lft forever

La fel, după o configurare de rețea, am rulat comanda de validare, în cazul acesta ip address.

Pentru a vă putea întoarce la consola stației host apăsați simultan tastele Ctrl+a, eliberați-le, după care apăsați tasta q.

Pentru a testa conectivitatea între stațiile host și red folosim comanda ping:

root@host:~# ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
^C
--- 192.168.0.2 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1007ms

După câteva secunde opriți comanda ping folosind combinația de taste Ctrl+c.

Observați că nu există conectivitatea între cele două stații: pachetele sunt pierdute în întregime (100% packet loss). Motivul este că nu am activat interfețele, ci doar am realizat configurații de nivel 3.

Urmăriți configurația de nivel 2 al interfețelor folosind comanda ip link:

root@host:~# ip link show dev veth-red
10: veth-red: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 3e:03:f0:76:76:ab brd ff:ff:ff:ff:ff:ff

Observați că interfața nu este activă la nivelul 2 (Legătură de date). Pentru a activa interfața folosiți comanda:

root@host:~# ip link set dev veth-red up

Urmăriți din nou configurația de nivel 2 (Legătură de date) a interfeței veth-red și observați că acum este parțial UP (apare și UP și DOWN în output-ul comenzii):

root@host:~# ip link show dev veth-red
10: veth-red: <NO_CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 3e:03:f0:76:76:ab brd ff:ff:ff:ff:ff:ff

Testați din nou conectivitatea folosiți comanda ping. În continuare nu există conectivitate. Acest lucru și faptul că apărea și DOWN în output-ul comenzii anterioare se datorează faptului că nu am activat interfața eth0 de pe stația red. Interfața eth0 de pe stația red este cea conectată la interfața veth-red de pe stația host; ambele trebuie să fie activate pentru a avea o conexiune activă.

Pe stația red verificați configuratia de nivel 2 a interfaței eth0 de pe red. Observați că este DOWN și activați nivelul 2 dacă este cazul, folosind comanda

root@red:~# ip link set dev eth0 up

Verificați că acum interfața este activă folosind comanda

root@red:~# ip link show dev eth0

Folosiți comanda ping ca să retestați conectivitatea între stațiile host și red.

Dorim să resetăm configurația la configurația inițială. Pentru acesta rulați o comandă de forma

# ip address flush dev INTERFACE

unde INTERFACE este interfața interfața veth-red pe stația host, respectiv eth0 pe stația red. Asigurați-vă că nu mai este configurată nici o adresă IP pe interfețe folosind o comandă de forma

# ip address show dev INTERFACE

unde INTERFACE este interfața interfața veth-red pe stația host, respectiv eth0 pe stația red.

02. [10p] Configurare adrese IP

Dorim să avem conectivitate între stația red și stația host, respectiv între stația green și stația host. Pentru aceasta, vom configura adrese IP pe fiecare.

Configurați câte o adresă IP din clasa 10.10.10.0/24 pe legătura dintre stația red și stația host (adică legătura red(eth0)host(veth-red)) și testați conectivitatea.

Configurați câte o adresă IP din clasa 10.10.20.0/24 pe legătura dintre stația green și stația host (adică legătura green(eth0)host(veth-green)) și testați conectivitatea.

Aveți în vedere să verificați nivelul Legătură de date folosind comanda ip link și să activați, la nevoie, interfețele.

03. [10p] Adresare IP și rutare

Dorim să realizăm conectivitate și între stațiile red și green. Întrucât cele două stații sunt în rețele locale diferite, va trebui să configurăm stația host ca default gateway pe fiecare stație.

Pentru a adăuga default gateway pe stația red folosiți comenzile:

root@host:~# go red
[...]
root@red:~# ip route add default via 10.10.10.1

După configurare (adăugarea rutei), validăm configurația cu o comandă specifică. În acest caz urmărim tabela de rutare folosind comanda:

root@red:~# ip route show
default via 10.10.10.1 dev eth0 
10.10.10.0/24 dev eth0  proto kernel  scope link  src 10.10.10.2

Adresa IP 10.10.10.1 reprezintă adresa IP a interfeței veth-red de pe stația host.

Intrați pe stația green și executați:

root@host:~# go green
[...]
root@green:~# ip route add default via 10.10.20.1
root@green:~# ip route show
default via 10.10.20.1 dev eth0 
10.10.20.0/24 dev eth0  proto kernel  scope link  src 10.10.20.2

La fel ca mai sus, am folosit comanda ip route show pentru afișarea tabelei de rutare și, astfel, a validării comenzii de adăugare de default gateway.

Adresa IP 10.10.20.1 reprezintă adresa IP a interfeței veth-green de pe stația host.

Testați conectivitatea între stația green și stația red. Accesați pe red și executați comanda ping către adresa IP a stației green. Observați că nu funcționează. Motivul pentru care nu există conectivitate este reprezentat de faptul că stația host nu are activată rutarea (nu trimite pachetele ce vin de pe o interfață pe altă interfață). Pentru a activa rutarea pe stația host rulați comanda:

root@host:~# sysctl -w net.ipv4.ip_forward=1

Pentru a valida configurarea de activare a rutării rulăm comanda:

root@host:~# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

Testați din nou conectivitatea între red și green și observați că funcționează.

Porniți comanda ping de pe stația red către stația green. Deschideți un nou terminal și executați pe stația host comanda:

root@host:~# tcpdump -n -i veth-red
listening on veth-red, link-type EN10MB (Ethernet), capture size 65535 bytes
18:46:48.783576 IP red.local > 10.10.20.2: ICMP echo request, id 434, seq 163, length 64
18:46:48.783622 IP 10.10.20.2 > red.local: ICMP echo reply, id 434, seq 163, length 64

Observați pachetele de tip ICMP echo request/reply care trec prin stația host (sau altfel zis stația host le rutează).

04. [10p] Configurare conectivitate completă

Dorim să asigurăm conectivitate completă între toate stațiile din topologie. Trebuie configurată corespunzător stația blue.

Configurați adrese IP din clasa 10.10.30.0/24 pe legătura dintre stația host și stația blue (adică între host(veth-blue) și blue(eth0)).

Țineți cont să verificați legătura de nivel 2 folosind comanda ip link.

Testați conectivitatea între stația host și stația blue.

Pe stația blue configurați ca default gateway stația host, pentru a permite conectivitata la celelalte stații.

Pe stația blue folosiți ca default gateway adresa IP de pe interfața veth-blue a stației host.

Testați conectivitatea între oricare două stații.

05. [10p] Tabela ARP

ARP (Address Resolution Protocol) este protocol care face intern fiecărui sistem de operare asocierea între adresele IP și adresele MAC ale stațiilor cu care comunică. De multe ori stațiile cunosc adresele IP ale vecinilor dar nu știu adresele MAC; protocolul ARP completează o tabelă ARP locală sistemului cu intrările necesare. Protocolul ARP este rulat implicit de sistemul de operare atunci când se comunică cu o stație a cărei adresă MAC nu este cunoscută.

Ne propunem să urmărim tabela ARP a unui sistem Linux.

Pe stația host urmăriți tabela ARP folosind comanda:

root@host:~# ip neighbor show
[...]

Este posibil ca tabela să fie vidă (neexistând comunicație recentă) sau să aibă unele intrări (cele mai recente comunicații) sau intrările să fie marcate STALE (intrări nesigure).

Pentru a popula tabela ARP inițiați comunicație cu celelalte stații folosind comanda ping:

root@host:~# ping -c 1 10.10.10.2
PING 10.10.10.2 (10.10.10.2) 56(84) bytes of data.
64 bytes from 10.10.10.2: icmp_req=1 ttl=64 time=0.033 ms
[...]
root@host:~# ping -c 1 10.10.20.2
PING 10.10.20.2 (10.10.20.2) 56(84) bytes of data.
64 bytes from 10.10.20.2: icmp_req=1 ttl=64 time=0.036 ms
[...]
root@host:~# ping -c 1 10.10.30.2
PING 10.10.30.2 (10.10.30.2) 56(84) bytes of data.
64 bytes from 10.10.30.2: icmp_req=1 ttl=64 time=0.080 ms
[...]

Urmăriți din nou tabela ARP:

root@host:~# ip neighbor show
10.10.10.2 dev veth-red lladdr 00:16:3e:8e:84:21 REACHABLE
10.10.20.2 dev veth-green lladdr 00:16:3e:d1:b2:95 REACHABLE
10.10.30.2 dev veth-blue lladdr 00:16:3e:32:0f:ae REACHABLE
10.8.0.1 dev eth0 lladdr 0a:00:27:00:00:00 REACHABLE

Observați că fiecare stație (red, green și blue) are câte o intrare aferentă în tabela ARP marcată cu REACHABLE (intrare validă). Intrarea suplimentară este comunicarea mașinii virtuale (stației host) cu sistemul fep.grid.pub.ro.

Realizați pașii de mai sus pentru fiecare dintre stațiile red, green și blue:

  1. Urmăriți tabela ARP.
  2. Inițiați comunicație cu celelalte stații pentru a popula tabela ARP.
  3. Urmăriți din nou tabela ARP.

Observați că în tabela ARP a fiecăreia dintre stațiile red, green și blue se găsește câte o intrare ARP, corespunzătoare stației host. Aceasta se întâmplă întrucât comunicațiile trec prin default gateway (adică prin stația host) iar fiecare stație trebuie să cunoască doar adresa MAC a gateway-ului.

06. [10p] Depanare problemă de configurare adresă IP

Rulați scriptul de pregătire cu argumentul 6:

root@host:~# ./rl-lab-07-prepare 6

În urma rulării scriptului au fost repornită stațiile red și au fost refăcute configurațiile. Va trebui să vă reconectați pe stația red folosind comanda:

root@host:~# go red

și folosind username-ul root și parola student.

Scriptul configurează adresa IP 7.7.7.1 pe interfața veth-red a stației host și adresa IP 7.7.7.2 pe interfața eth0 a stației red. Folosiți comenzile:

root@red:~# ip address show eth0
46: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:16:3e:8e:84:21 brd ff:ff:ff:ff:ff:ff
    inet 7.7.7.2/32 scope global eth0
    inet6 fe80::216:3eff:fe8e:8421/64 scope link 
       valid_lft forever preferred_lft forever
 
root@host:~# ip address show veth-red
47: veth-red: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 4e:1b:b8:d9:14:bb brd ff:ff:ff:ff:ff:ff
    inet 7.7.7.1/32 scope global veth-red

pentru a urmări configurația IP pe interfața INTERFACE.

Folosiți comanda ping pentru a testa conectivitatea între cele două adrese IP (7.7.7.1 și 7.7.7.2) pe cele două stații. Observați ca nu există conectivitate.

Pentru a depana această problemă, urmărim tabela de rutare a fiecărei stații:

root@red:~# ip r s
root@red:~# 
 
root@host:~# ip r s
10.10.20.0/24 dev veth-green  proto kernel  scope link  src 10.10.20.1
10.10.30.0/24 dev veth-blue  proto kernel  scope link  src 10.10.30.1
192.168.56.0/24 dev eth0  proto kernel  scope link  src 192.168.56.101

Observați că nu apar rutele relevante în tabela de rutare. Fie interfețele sunt dezactivate, fie configurația este greșită. Dacă rulăm comenzile de afișare a informațiilor de nivel 3, observăm:

root@red:~# ip address show eth0
46: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:16:3e:8e:84:21 brd ff:ff:ff:ff:ff:ff
    inet 7.7.7.2/32 scope global eth0
    inet6 fe80::216:3eff:fe8e:8421/64 scope link 
       valid_lft forever preferred_lft forever
 
root@host:~# ip address show veth-red
47: veth-red: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 4e:1b:b8:d9:14:bb brd ff:ff:ff:ff:ff:ff
    inet 7.7.7.1/32 scope global veth-red

Interfețele sunt active (UP). Observăm însă că aceste adrese au masca /32. Acest lucru înseamnă că nu pot comunica în rețea unele cu altele și explică și absența rutei relevante din tabela de rutare. Repararea acestei greșeli se face prin folosirea unor adrese cu mască potrivită (de exemplu, pentru o mască /24 este vorba de 7.7.7.1/24 și 7.7.7.2/24).

O greșeală relativ frecventă în configurarea adresei IP în Linux este omiterea măștii de rețea. Aveți în vedere să nu omiteți masca în momentul în care configurați adrese IP pe interfețe în Linux.

Listarea tabelei de rutare a unei stații este printre primii pași care trebuie urmați pentru depanarea unei probleme de conectivitate.

07. [10p] Refacere configurare adresă IP

Refaceți configurația anterioară pentru stația host și stația red. Adică adresa 10.10.10.1 pe interfața veth-red a stației host, adresa 10.10.10.2 pe interfața eth0 a stației red și configurarea adresei 10.10.10.1 ca default gateway pe stația red.

Ca să refaceți configurația, se recomandă să eliminați vechea configurație folosind comanda

# ip address flush INTERFACE

unde INTERFACE este interfața a cărei configurație vreți să o eliminați.

După configurare testați din conectivitatea între toate stațiile din topologie folosind comanda ping.

08. [20p] Subnetare și configurare parametri de rețea

Dorim să facem o configurare nouă de adrese IP pe toate stațiile din topologie. Pentru aceasta folosiți spațiul 4.4.4.0/22. Împărțiți-l în trei subrețele cu masca /24 și atribuiți adrese din acele subrețele pe interfețele legăturilor dintre stații.

Înainte de a realiza configurarea eliminați vechile configurații prin folosirea comenzii:

# ip address flush dev INTERFACE

unde INTERFACE este interfața pentru care se dorește eliminarea configurației. Este vorba de interfața eth0 de pe fiecare dintre stațiile red, green și blue, respectiv interfețele veth-red, veth-blue și veth-blue de pe stația host.

Aveți în vedere atât configurarea adreselor IP pe toate stațiile din topologie cât și a default gateway pe stațiile red, green și blue.

Pentru testarea conectivității folosiți comanda ping.

Pentru depanare, primul pas recomandat este afișarea tabelei de rutare. Tabela de rutare vă va ajuta pentru depanare în cazul în care anumite intrări sunt absente sau configurate greșit.

09. [10p] Depanare problemă de conectivitate

Ne propunem să depanăm o problemă de conectivitate. Pentru a “genera” problema rulați scriptul de pregătire cu argumentul 9:

root@host:~# ./rl-lab-07-prepare 9

Pentru depanare, primul pas recomandat este afișarea tabelei de rutare. Tabela de rutare vă va ajuta pentru depanare în cazul în care anumite intrări sunt absente sau configurate greșit.

Verificați conectivitatea între toate stațiile din topologie. Observați că nu există conectivitate între nici o stație și stația blue. Rezolvați problemele de conectivitate la stația blue.

Nu schimbați adresele IP deja configurate. Doar identificați și soluționați problemele.

Rezolvare
Interfața eth0 a stației blue este dezactivată. Acest lucru se poate vedea prin consultarea tabelei de rutare:
root@blue:~# ip route show
root@blue:~# 

și prin urmărirea configurației de nivel 2:

root@blue:~# ip link show dev eth0
55: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:16:3e:32:0f:ae brd ff:ff:ff:ff:ff:ff

Reactivarea interfeței eth0 a stației blue se realizează folosind comanda:

root@blue:~# ip link set dev eth0 up
root@blue:~# ip link show dev eth0
55: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:16:3e:32:0f:ae brd ff:ff:ff:ff:ff:ff

În urma acestei comenzi stația blue va fi conectată la stația host.

În continuare nu există conectivitate între stația blue și stațiile red și green. Afișarea tabelei de rutarea ne indică absența default gateway. Configurăm default gateway cu ajutorul comenzii:

root@blue:~# ip route add default via 15.15.15.1
root@blue:~# ip route show
default via 15.15.15.1 dev eth0 
15.15.15.0/24 dev eth0  proto kernel  scope link  src 15.15.15.2

În acest moment există conectivitate completă la nivelul topologiei.

10. [BONUS - 10p] Configurare persistentă

Dorim ca la o reponire a unei stații configurațiile de nivel 3 (adresele IP) să se păstreze. Configurările pe care le-am făcut până acum sunt temporare și sunt pierdute la repornirea stației. În Cisco IOS foloseam comanda

copy running-config startup-config

pentru a asigura persistența configurațiilor la repornire (reload). În Linux, persistența configurațiilor se realizează prin plasarea acestora în fișiere text specifice, fiecare distribuție (ex.: Debian, RedHat) având propriul mod de configurare.

Pentru a pregăti exercițiul, rulați scriptul de pregătire cu argumentul 10:

root@host:~# ./rl-lab-07-prepare 10

Realizați persistent configurațiile de la exercițiul 08. [20p] Subnetare și configurare parametri de rețea (adrese IP și default gateway). Distribuția de Linux folosită în laborator este Debian-based.

Pentru detalii despre cum puteți face configurații persistent pe sisteme Debian, consultați această pagină. Veți realiza o configurație statică.

După ce ați realizat configurațiile necesare, executați, pe fiecare stație comenzile:

# ifdown INTERFACE
# ifup INTERFACE

unde INTERFACE este interfața configurată. Observați că la executarea comenzii ifup interfața a preluat configurările din fișier.

Configurați sistemul astfel încât rutarea să fie activată la pornirea sistemului.

Pentru informații legate de activarea rutări, consultați această pagină.

Reporniți mașina virtuală (stația host), folosind comanda:

root@host:~# reboot

După repornire ar trebui să aveți configurațiile activate și conectivitate completă la nivelul topologiei.

rl/labs/07.1573412130.txt.gz · Last modified: 2019/11/10 20:55 by florin.stancu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0