Telekommunikációs hálózatok > Gyakorlati anyag >
Mininet
Mininet
A Mininet egy népszerű hálózatszimulációs eszköz, amely segítségével könnyedén
tudunk hálózatokat szimulálni egy gépen. A Mininet képes arra, hogy realisztikus virtuális hálózatot
hozzon létre, amely tartalmaz gépeket, switcheket, kábeleket és routereket. Széles körben használják
kutatási célokra és hálózatok tesztelésére. Amint egy hálózat működik Mininetben könnyedén
átültethető valós fizikai eszközökre.
Mininet telepítése virtuális gépre:
A Mininetet egy virtuális gépen fogjuk használni, amely tartalmaz minden
szükséges programot, innen kell
letölteni. A virtuális gép beállításához itt
található segédlet (videó). Aki Mac-en dolgozik, annak ezen a linken
található segédlet.
Virtuális gép beállítása (Hyper-V):
A felhasználónév és a jelszó is: mininet.
Virtuális gép beállítása (VirtualBox):
A felhasználónév és a jelszó is: mininet.
Szöveges segédlet a telepítéshez és a beállításhoz VirtualBox-ban:
Töltsük le és csomagoljuk ki a tömörített lemezképet a VirtualBox-hoz!
A VirtualBox-ban készítsünk egy új VM-t, úgy hogy a kicsomagolt lemezt használja!
típusnál Linux-ot állítsunk be
verziónál Ubuntu (64 bit)-et
Mielőtt elindítanánk:
NE engedélyezzük az EFI-t (Rendszer/Alap)
Network Interfacetcseréljük le: Host-only kártyát
Indítsuk el a VM-t!
A felhasználónév és a jelszó is: mininet.
Ha nem kap IP-t a VM, akkor futtassuk a dhclient parancsot.
mininet@mininet-vm:~$ sudo dhclient
Ha nem érjük el a gépet, akkor indítsuk újra a sshd-t!
mininet@mininet-vm:~$ sudo service sshd restart
SSH kapcsolat kialakítása VS code-al:
Ha megvan vagy Hyper-V-vel vagy VirtualBox-al, akkor már tudjuk használni és a feladatokat is meg tudjuk oldani. Azonban a terminál nem kényelmes, sok hibája van. Ezért a futó virtuális gépre SSH segítségével be fogunk lépni VS code-ban, így a VS code terminálját fogjuk tudni használni. FONTOS: ne állítsd le a virtuális gépet, annak futnia kell, hogy be tudjunk rá lépni.
Bal alul található egy kék gomb, arra kell rányomni.
Újra nyomjunk rá a kék gombra bal alul és Connect to host.
3 dolgot fog megkérdezni. Milyen operációs rendszer a virtuális gép, ez Linux. Majd megkérdezi, hogy folytatni szeretnéd-e, nyomjunk egy ENTER-t. Végül megkérdezi a jelszót, ami mininet. Ha nyitunk egy terminált és azt látjuk, ami az alábbi képen van, akkor meg is vagyunk.
Mininet feladatok:
Ez a virtuális gép már tartalmazza az összes órai mininet scriptet. A mininet
tartalmaz egy miniedit nevű scriptet, ami egy GUI-s felületet nyit meg. Ezzel gyorsan és könnyedén
tudunk hálózatokat összeállítani. Ha jobb klikkelünk egy eszközre, a properties részen be is
állíthatunk bizonyos dolgokat az eszközön.
mininet@mininet-vm:~$ cd mininet/examples/
mininet@mininet-vm:~/mininet/examples$ python3 miniedit.py
Egy összeállított topológiát le lehet menteni .mn formátumban, illetve ki is
lehet exportálni python3 scriptként. A File menüben az „Export Level 2 Script”-tel lehet
létrehozni a python szkriptet.
Csináljuk meg a képen látható topológiát és állítsuk be az ip címeket. Majd ezek
után mentsük le test.py néven. Ha belenézünk ebbe a python scriptbe az alábbi kódot láthatjuk:
Ha beírjuk a helpet láthatjuk, hogy milyen parancsok elérhetőek a mininetben.
Alap parancsok a net, links, nodes.
Alapvetően bármelyik eszközön tudunk futtatni parancsot: mininet> [hostname] [command]. Viszont ha
külön terminált szeretnénk nyitni, akkor használjuk az xterm h1 parancsot.
mininet> help
mininet> nodes
mininet> links
mininet> net
mininet> h1 ifconfig
mininet> xterm h1
Most azt láthatjuk, hogy a hostok nem tudják egymást elérni, mivel más
alhálózatban vannak. Ezért amikor megpróbálunk kiküldeni csomagokat, a host nem fogja tudni, hogy az
a másik alhálózat merre található, melyik interfészén kellene kiküldeni. Ezért be kell állítanunk
route-ot. Az alábbi paranccsal azt állítjuk, be hogy ha nem tudja, mit kezdjen az adott csomaggal,
akkor küldje ki az adott interfészen.
mininet> h1 ip route add default via 10.0.1.254 dev h1-eth0
mininet> h1 route
A routeren még be kell állítanunk ip címeket, mert az kimaradt a legelején,
illetve a többi hoszton is be kell
állítani a route-ot, hogy ők is tudják, hogy mit kezdjenek azokkal a csomagokkal, amelyek másik
alhálózatba szólnak. Ezzel működik is a hálózatunk.
mininet> h2 ip route add default via 10.0.2.254 dev h2-eth0
mininet> h3 ip route add default via 10.0.3.254 dev h3-eth0
mininet> links
h1-eth0<->r1-eth0 (OK OK)
h2-eth0<->r1-eth1 (OK OK)
h3-eth0<->r1-eth2 (OK OK)
mininet> r1 ip addr add 10.0.1.254/24 dev r1-eth0
mininet> r1 ip addr add 10.0.2.254/24 dev r1-eth1
mininet> r1 ip addr add 10.0.3.254/24 dev r1-eth2
mininet> h1 ping h2
64 bytes from 10.0.2.1: icmp_seq=1 ttl=63 time=0.046 ms
64 bytes from 10.0.2.1: icmp_seq=2 ttl=63 time=0.033 ms
^C
--- 10.0.2.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1007ms
rtt min/avg/max/mdev = 0.033/0.039/0.046/0.006 ms
Iptables
Az iptables segítségével képesek vagyunk hálózati csomagokat szűrni, irányítani,
illetve NAT-ot alkalmazni. Az eszköz lehetővé teszi a beérkező, kimenő és a rendszer által
továbbított hálózati forgalom szabályozását.
Táblák (Tables):
filter: A legáltalánosabb tábla, amelyet a csomagszűréshez használnak. Ez szabályozza, hogy mely
csomagok engedélyezettek vagy eldobandók.
nat: A NAT (Network Address Translation) kezelésére használják, például a forrás- vagy célcímek
átírására.
mangle: A csomagok tartalmának módosítására használható.
raw: Előzetes feldolgozásokra szolgál, például a csomagkövetés kikapcsolására.
Láncok (Chains):
INPUT: A beérkező csomagok kezelése, amelyek a helyi géphez érkeznek.
OUTPUT: A helyi gép által küldött csomagok szabályozása.
FORWARD: A gépen átmenő, de nem a gép számára szánt csomagok kezelése (jellemzően routerként
működő gépeknél).
PREROUTING: Mielőtt a célcím alapján a csomagokat továbbítanák (főleg NAT-hoz használják).
POSTROUTING: A csomagok továbbítása előtt, amikor a forráscímet kell átírni (NAT után).
Amikor egy csomag megérkezik az interfacere, először átmegy a PREROUTING láncon.
Ezek után eldől, hogy a csomag a helyi gépre érkezett vagy továbbításra kerül, vagy az INPUT láncba
kerül (ha a helyi géphez tartozik), vagy a FORWARD láncon megy át (ha továbbítani kell). Végül mikor
a gép egy csomagot küld, a OUTPUT láncon halad keresztül, majd a POSTROUTING láncon, mielőtt
ténylegesen kilépne a hálózatra.
Filter:
Filter és Nat együtt:
Pirossal láthatjuk a filter-t és sárgával a nat-ot.
Minden egyben:
A szabályok céljai határozzák meg, hogy mi történjen a csomaggal, miután egy
szabály egyezik:
ACCEPT: A csomag engedélyezve van.
DROP: A csomagot eldobják, mintha soha nem is érkezett volna.
REJECT: A csomag eldobása mellett visszajelzés is küldődik a küldőnek.
SNAT: Forrás NAT alkalmazása.
DNAT: Célcím NAT alkalmazása.
Mininet feladat iptables használatával:
Folytassuk az előbbi példát. Az alábbi parancsokat adjuk ki. Az elsővel
paranccsal ( iptables-save ) le tudjuk kérdezni az iptables szabályokat. A másodikkal (
iptables -I
INPUT -p icmp --icmp-type echo-request -j DROP
) letiltottuk az inputon az ICMP
echo request-eket. Ez azt jelenti, hogy minden beérkező ICMP ping kérést eldobunk. Viszont ettől
függetlenül ICMP kérést tudunk küldeni, de választ nem, mivel nem kapjuk meg a kérést. Amint
beérkezik a kérés a gépre, azonnal eldobódik. Ebből adódik, hogy a h1 tudja pingelni h2-t, de
visszafelé nem. A harmadik ( iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP )
paranccsal
a kimenő ICMP kéréseket tiltjuk le, így már h1-nél elakadnak a csomagok. Majd végül töröljük mindkét
tűzfal szabályt ( iptables -D OUTPUT -p icmp --icmp-type echo-request -j DROP ) (
iptables -D INPUT -p
icmp --icmp-type echo-request -j DROP
).
Indítsuk el egy ssh daemont a h3-on. Ez egy daemon program, amely egy biztosnágos
és titkosított kommunikációt biztosít két host között egy hálózaton keresztül. Ezek után az r1-en
azt csináljuk, hogy ha r1-eth0 interfészen (h1 irányából) beérkezik TCP csomag, amely a 10.0.2.1
(h2) felé megy a 2222 porton, akkor azt irányítsuk át inkább a 10.0.3.1 22-es portjára, azaz a h3
ssh portjára. Az ssh jelszó mininet. Miután beléptünk, az ifconfig parancs segítségével
leellenőrizhetjük, hogy valóban a h3-on vagyunk, amely az ip címből látható is.
A következő példában egy olyan hálózatot fogunk nézni, amely hurkokat tartalmaz.
Ez azért gond, mert így akár a végtelenségig is körözhetnek csomagok a hálózatban. Erre nyújt
megoldást az STP protokoll. Indítsuk el az sw-topo.py scriptet.
mininet@mininet-vm:~$ cd gyakorlat/
mininet@mininet-vm:~/gyakorlat$ sudo python3 sw-topo.py
Először nézzük meg, hogy fut-e az stp (sh brctl show). Látható, hogy nem fut az
stp. Ha megpingeljük h2-t h1-ről, látjuk, hogy nagy a késés. Ha h4-et pingeljük át se mennek a
csomagok. Ugyanakkor tcpdump-pal érdekes jelenség látható. Multicast üzenetek próbálják a hálózatot
felderíteni. Konklúzió az, hogy ha hurok van a hálózatban, nem igazán működik semmi.
mininet> sh brctl show
mininet> h1 ping h2
mininet> sh tcpdump -n -i any
Ha megnézzük a python script forráskódját látható, hogy van egy --stp opciója. Ha
ezzel együtt indítjuk, akkor elindítja az stp-t is a script. Ha megnézzük valamelyik switchet
láthatjuk, hogy lesz olyan portja, amelyet blocking módba rak, mivel az stp egy fát épít fel, hogy
elkerülje a hurkokat. Azok az interface-ek, amelyek blocking módban vannak azok nem továbbítanak
csomagot. A designated root-nál az is látható, hogy kit gondolnak a fa gyökerének a switchek.
mininet@mininet-vm:~/gyakorlat$ sudo python3 sw-topo.py --stp
mininet> sh brctl show
mininet> sh brctl showstp s2
Feladatok
Az alábbi feladatok a gyakorlatokon elvégzendő kötelező, illetve
gyakorló
feladatok.
1. feladat:
Csináljunk egy python scriptet minitopo.py néven, amely tartalmát
megtaláljuk itt.
Indítsuk el a scriptet. Néhány ip cím már be van állítva, de néhány hiányzik.
Állítsuk be a routerek ip címeit:
r5-s3 : 10.5.1.254/8
r5-s4 : 11.5.1.254/8.
r6-s3 : 10.6.1.254/8
r6-s4 : 11.6.1.254/8
r6-r7 : 13.6.1.254/8
r7-r6 : 13.7.1.254/8
r7-h7 : 12.7.1.254/8
Miután megvannak az ip címek, route-olnunk is kell, hogy a hostok
elérhessék egymást: h1,h2,h3-nak az r5 legyen a default route, h4,h5,h6-nak az
r6 legyen a default route, h7-nek az r7 legyen a default route, r5 r6 felé
továbbítsa a csomagot, ami
12.0.0.0/8 vagy 13.0.0.0/8 irányba megy, r6 r7 felé továbbítsa a csomagot, ami
12.0.0.0/8 irányba megy, r7 r6 felé továbbítsa a csomagot, ami
10.0.0.0/8 vagy 11.0.0.0/8 irányba megy. Ha mindent jól csináltunk, akkor a
pingall parancs azt mutatja, hogy mindenki elér mindenkit.
Egészítsük ki a feladatot úgy, hogy az r7 dobja el azokat a
csomagokat, amelyek h7-ről jönnek és a h1,h2,h3 irányába mennek, továbbá r7
irányítsa át a csomagokat, amelyek h7-ről jönnek: ha 1422-es port a címzett,
akkor a h4 22 portjára, ha 1522-es port a címzett, akkor a h5 22 portjára.
Indítsuk el az ssh daemont h1-en és h4-en, majd teszteljük a beállításokat:
h7-ről h1-re történő ssh (h7 ssh 10.0.1.1), ezek el
lesznek dobva, h7-ről ssh h4-re (h7 ssh -p 1422 mininet@12.7.1.254), ezeket r7
routernek címezzük.