Mam pole linux z 9 kartami sieciowymi i chcę, aby osiem z nich miało unikalne adresy w tej samej podsieci, np .:
ifconfig eth1 192.168.123.1 netmask 255.255.0.0
ifconfig eth2 192.168.123.2 netmask 255.255.0.0
ifconfig eth3 192.168.123.3 netmask 255.255.0.0
...
ifconfig eth8 192.168.123.8 netmask 255.255.0.0
Domyślne zachowanie ARP jest w tym przypadku wyjątkowo przeciwne do zamierzonego, ponieważ powoduje cały ruch dla wszystkich adresów IP przechodzących wyłącznie przez eth1
, co jest prawie całkowitym przeciwieństwem tego, czego chcę.
Więc zacząłem szperać i skończyłem wprowadzać pewne zmiany do sysctl, takie jak to:
net.ipv4.conf.all.arp_filter=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
To uniemożliwiło eth1
podszywanie się pod inne, ale nadal nie mogę eth1
pomyślnie pingować niczego poza adresem. (np. z drugiego komputera na tym samym przełączniku, 192.168.123.1
reaguje tylko na ping)
Zgaduję, że muszę coś zrobić z arptables, iproute lub COŚ, ale w tej dziedzinie jestem zagubiony na morzu.
Punkty bonusowe: Rozwiązanie musi być kompatybilne z Linuksem 2.6.27.27. (Mówiąc dokładniej, Slax 6.1.2)
źródło
Odpowiedzi:
Potrzebujesz silnego modelu systemu końcowego . Linux jest zasadniczo zbudowany na słabym modelu systemu wysyłania, więc naprawdę nie jest dobrym wyborem dla tej aplikacji.
Będziesz musiał sfałszować każde potrzebne zachowanie, od ARP przez routing zasad po wybór adresu źródłowego. Będziesz także potrzebował filtrów, aby zapobiec akceptowaniu pakietów, jeśli dotrą one do niewłaściwego interfejsu.
Zdecydowanie niezbędne kroki to:
Skonfiguruj arp_filter = 1 i arp_ignore = 2 na wszystkich interfejsach.
Dodaj routing oparty na źródłach dla ruchu wychodzącego. (Interfejs docelowy należy wybrać na podstawie adresu źródłowego).
Dodaj filtrowanie wejściowe dla poszczególnych interfejsów, aby po cichu upuszczać pakiety odebrane przez niewłaściwy interfejs. (Pakiety z adresem docelowym przypisanym do innego interfejsu).
Niestety nie ma zgody co do tego, czy te trzy kroki są wszystkim, czego potrzeba. Model systemu słabego końca jest wbudowany w cały stos Linux / TCP i nie jest jasne, co może pójść nie tak z subtelnymi problemami, takimi jak multiemisja.
Nie jest jasne, na przykład, jak wybrać interfejs wyjściowy dla transmisji. Czy powinien wyjść z nich wszystkich? Może. Jakie zachowanie jest prawidłowe, jeśli stos otrzyma transmisję wychodzącą z adresem źródłowym nieprzypisanym do jednego z interfejsów?
Ponownie wybrałeś niewłaściwe narzędzie do pracy.
źródło
Bardziej prawdopodobne jest utworzenie mostu z interfejsami 8/9, a następnie przypisanie adresu IP do tego mostu (pakiet most-utils, polecenie „brctl add”).
W ten sposób most będzie działał jak przełącznik i może mieć adres IP w podsieci.
źródło
Zalecam połączenie fizycznych interfejsów, a następnie skonfigurowanie wszystkich adresów w interfejsie z pojedynczym połączeniem.
Będziesz także potrzebował wsparcia na przełączniku.
Oto mini samouczek , którego możesz użyć, aby rozpocząć.
źródło
Wygląda na to, że potrzebujesz środowiska testowego odpowiadającego 9 oddzielnym komputerom i wierzysz, że 9 interfejsów na jednym komputerze może to naśladować. W Linuksie po prostu nie można tego zrobić za pomocą jednego stosu z powodów opisanych przez Davida Schwartza. BTDT i mieć blizny. Było wystarczająco źle z 2 interfejsami.
Lepszym rozwiązaniem może być uruchomienie 8 lub 9 dyskretnych maszyn wirtualnych na jednym hoście i połączenie 8 lub 9 interfejsów z tymi maszynami wirtualnymi.
źródło
Tak, możliwe jest po sugestii Davida Schwartza:
// Dla właściwej funkcjonalności, tj. Odpowiedzi ARP z eth1, aby zostać wygenerowane, gdy zarówno eth0, jak i eth1 znajdują się w tej samej podsieci
// skonfiguruj tabelę „new_rt_table”, aby kierować pakiety przez eth1
// zaznacz pakiety, aby „ip route” mogła je trasować przez eth1
// włącz obsługę wielu tabel routingu w konfiguracji jądra.
Konfiguracja jądra
→ Obsługa sieci → Opcje sieci
[*] IP: zaawansowany router
[*] IP: routing zasad
CONFIG_IP_ADVANCED_ROUTER
CONFIG_IP_MULTIPLE_TABLES
// powyższe kroki przekierowują pakiety przeznaczone do wyjścia z eth0, aby poprawnie wyjść z eth1.
Uprzejmie zasugeruj wszelkie inne metody, jeśli ktokolwiek sprawi, że zadziała.
źródło