===== TUN / TAP =====
TUN i TAP to rozwiązania w Linuksie które pozwalają zastąpić protokoły warstwy łącza danych i fizycznej programem \\ https://en.wikipedia.org/wiki/TUN/TAP
Porównaj:\\
'' '' Interface sieciowy mający z jednego końca system operacyjny, z drugiego – kabel / fale radiowe. \\
''TUN lub TAP'' Interface sieciowy mający z jednego końca system operacyjny, z drugiego – program.
TAP działa na warstwie łącza danych (program dostaje i generuje ramki ethernetowe) \\
TUN działa bezpośrednio na warstwie sieci (program dostaje i generuje pakiety IP)
Zastosowania:
* tunele
* maszyny wirtualne (np. qemu)
Komendy:
* ''ip tuntap add dev [mode {tun|tap}] [user ]''
* ''tunctl [-n|-t] [-u ] [-t ]''
Interfejs programistyczny:
* https://www.kernel.org/doc/Documentation/networking/tuntap.txt
===== Mostki =====
System Linux może emulować zwykły przełącznik sieciowy (switch).
W tym celu należy stworzyć wirtualne urządzenie - mostek (bridge). (Mostek to switch na 2 porty.) Wirtualne mostki pozwalają na podpięcie dowolnej liczby urządzeń.
W efekcie kilka kart w systemie Linux zostanie zastąpione jedną - tzn, karty podpięte do wirtualnego mostka nie mogą mieć adresu IP.
Mostek działa na warstwie 2, więc nie potrzebuje adresu IP. Dodanie adresu IP do mostka jest równoznaczne z podłączeniem komputera do przełącznika.
^ ^ iproute2 ^ bridge-utils ^
| stworzenie mostka | ''ip link add type bridge'' \\ // ''ip link add br0 type bridge'' // | ''brctl addbr '' \\ // ''brctl addbr br0'' // |
| usunięcie mostka | ''ip link del dev br0'' | ''brctl delbr br0'' |
| włączenie mostka | ''ip link set dev br0 up'' | ''ifconfig br0 up'' |
| dodanie adresu\\ do mostka | ''ip addr add / br0'' | ''ifconfig br0 [netmask ]'' |
| dodanie \\ urządzenia\\ do mostka | ''ip link set dev master '' \\ // ''ip link set dev eth0 master br0'' // | ''brctl addif '' \\ // ''brctl addif br0 eth0'' // |
| usunięcie \\ urządzenia\\ z mostka | ''ip link set dev nomaster'' \\ // ''ip link set dev eth0 nomaster'' // | ''brctl delif '' \\ // ''brctl delif br0 eth0'' // |
===== Agregacja łączy =====
Jeśli mamy więcej kart w 1 komputerze i więcej kabli w ścianach, to może by je użyć do:
* zwiększenia wydajności, lub
* uodpornienia na awarie
Podstawowy cel - użyć (połączyć, zagregować, ang. //aggregate//) wielu połączeń (łącz, ang. //link//) tak, by reszta konfiguracji pozostała bez zmian – w szczególności nie dodaje się kolejnych adresów IP.
Dużo pomysłów jak to zrobić, część własnościowych: \\ http://en.wikipedia.org/wiki/Link_aggregation#Proprietary_link_aggregation
Czym jest a czym nie jest agregacja łączy:
* agregacja łączy nie stwarza jednego łącza o większej przepustowości (tylko pozwala użyć wielu łączy naraz)
* w wielu rozwiązaniach ruch przychodzący wchodzi tylko jednym łączem
* sprawdza się przy połączeniach z wieloma komputerami
==== Linux bonding driver ====
Kilka trybów pracy (http://en.wikipedia.org/wiki/Link_aggregation), przykładowo:
* balance-rr,
* active-backup
* balance-alb
Jak zbalansować ruch wychodzący? Łatwo. Wiadomości z __różnych__ połączeń mogą iść innym łączem.\\
Jak zbalansować ruch przychodzący? Trudno. Dlaczego? Patrz: protokół ARP.
Adaptive load balancing - oszukuje urządzenia w sieci podając każdemu inny (jeden z kilku) MAC jako swój.
Kroku do ustawienia agregacji pod Linuksem:
- stwórz urządzenie typu bond
- dodaj do niego łącza
- skonfiguruj urządzenie typu bond (włącz, nadaj adres etc.)
Tworzenie wirtualnego interface'u:
* Używając ''ip link''
* wyświetlenie pomocy: ''ip link add dev type bond help''
* dodanie (gorszy przykład): ''ip link add dev bond0 type bond''
* dodanie (lepszy przykład):\\ ''ip link add dev bond0 type bond mode balance-alb xmit_hash_policy layer3+4 miimon 100''
* usunięcie (przykład): ''ip link del bond0''
* wyświetlanie szczegółów w ip link: ''ip -d link'' / ''ip --details link''
* Używając tradycyjnych mechanizmów:
* załadowanie modułu jądra systemu operacyjnego, w momencie załadowania dodawane jest urządzenie:\\ ''modprobe bonding mode=balance-alb xmit_hash_policy=layer3+4 miimon=100''
* usunięcie modułu: ''modprobe -r bonding''
* automatyzacja (1) dodanie aliasu modułu (2) ustawienie opcji dla aliasu (3) [opcjonalnie] ładowanie przy starcie modułu przez nazwę aliasu https://wiki.archlinux.org/index.php/kernel_modules
Wyświetlanie ustawień i stanu:
* ''cat /proc/net/bonding/bond0''
* katalog ''/sys/class/net/bond0/bonding''
Dodawanie/usuwanie łącz:
* używając ''ip link''
* dodanie: ''ip l set dev eth0 master bond0''
* usunięcie: ''ip l set dev eth0 nomaster''
* używając ''ifenslave''
* dodanie: ''ifenslave bond0 eth0 eth1''
* usuniięcie: ''ifenslave -d bond0 eth0 eth1''
https://www.kernel.org/doc/Documentation/networking/bonding.txt
==== LACP / 802.3ad / EtherChannel ====
EtherChannel - pierwszy pomysł agregacji portów, przejęty i rozwijany przez CISCO
802.3ad - przestarzały standard powstały w dużej mierze na EtherChannel, zastąpiony przez IEEE 802.1AX-2008
LACP - protokół realizujący EtherChannel/802.3ad - automatycznie "dogadujący" agregację
Do zadziałania obie strony muszą być skonfigurowane
Ze strony Linuksa - tryb 802.3ad, np:
* ''ip link add dev bond0 type bond mode 802.3ad''
* ''ip link add dev bond0 type bond mode 802.3ad xmit_hash_policy layer2+3 miimon 100 ad_select bandwidth lacp_rate fast''
* ''modprobe bonding mode=802.3ad''
Ze strony switcha CISCO, przykładowa konfiguracja:
Switch> enable
Switch# conf t
Switch(config)# interface Port-channel 1 pozwala ustawiać parametry całego kanału
Switch(config-if)# exit
Switch(config)# interface range GigabitEthernet 0/1-2 zmienia ustawienia wszystkich interfejsów z zakresu
Switch(config-if-range)# channel-group 1 mode active dodaje łącze do grupy; mode active wymusi wysyłanie wiadomości protokołu LACP
Switch(config-if-range)# exit
Switch(config-if-range)# interface range GigabitEthernet 0/3-4
Switch(config-if-range)# channel-group 2 mode active
Switch(config-if-range)# exit
Switch(config)# interface range GigabitEthernet 0/1-4
Switch(config-if-range)# no channel-group usunie interfejsy z kanału
Uwaga! Tutaj nie uda się uzyskać lepszej prędkości między dwoma stacjami, potrzeba trzech do testów.\\ ''netperf -H 10.0.0.2 & netperf -H 10.0.0.3''