===== 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''