wiele fizycznych interfejsów z adresami IP w tej samej podsieci

13

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 eth1podszywanie się pod inne, ale nadal nie mogę eth1pomyślnie pingować niczego poza adresem. (np. z drugiego komputera na tym samym przełączniku, 192.168.123.1reaguje 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)

frustrated_tester
źródło
Czy możesz opublikować tablicę routingu?
ponsfonze
2
Jaki jest twój cel w tworzeniu tej konfiguracji? Co próbujesz osiągnąć
David Schwartz,
w ten sposób leży szaleństwo.
Sirex,
jeśli chcesz połączyć te interfejsy, będziesz musiał je połączyć.
resmon6
1
@DavidSchwartz Nie, maszyna nie powinna działać jak przełącznik (lub router). Pomyśl o tym bardziej jak o uruchomieniu 8 maszyn wirtualnych z dedykowaną fizyczną kartą sieciową dla każdej maszyny wirtualnej ( uwaga: nie uruchamiam maszyn wirtualnych, to tylko analogia ). Z punktu widzenia innego urządzenia w tej samej sieci mój pojedynczy komputer powinien być całkowicie nie do odróżnienia od ośmiu dyskretnych komputerów.
frustrated_tester

Odpowiedzi:

17

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:

  1. Skonfiguruj arp_filter = 1 i arp_ignore = 2 na wszystkich interfejsach.

  2. Dodaj routing oparty na źródłach dla ruchu wychodzącego. (Interfejs docelowy należy wybrać na podstawie adresu źródłowego).

  3. 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.

David Schwartz
źródło
6

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.

Be2eB
źródło
AFAIK, to właściwie powinna być poprawna odpowiedź dla Linuksa. Linux radzi sobie z wieloma problemami wymienionymi w odpowiedzi Davida za pomocą urządzeń mostkowych (czyli unikania problemów L3 poprzez budowanie lepszej sieci logicznej L2).
Dave
4

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ąć.

bahamat
źródło
4

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.

Skaperen
źródło
Materiały do ​​czytania: Programowanie w sieci Unix: API Sockets Networking autorstwa Stevensa, Fennera i Rudoffa. Zobacz także RFC1122 i RFC4907.
Skaperen
0

Tak, możliwe jest po sugestii Davida Schwartza:

echo -ne 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth3/rp_filter

// 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

echo -ne 0 > /proc/sys/net/ipv4/conf/all/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth1/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

//Create a table called "new_rt_table" and create a routing rule that says any packet with a mark equal to '1' gets routed according to the "new_rt_table"(can name it whatever you want) table. The file /etc/iproute2/rt_tables is the only source of table names on the system. Internally, routing tables have integer identifiers.

echo 1 new_rt_table >> /etc/iproute2/rt_tables
ip rule add from all fwmark 1 table new_rt_table

// skonfiguruj tabelę „new_rt_table”, aby kierować pakiety przez eth1

ip route add default dev eth1 table new_rt_table
ip route show table new_rt_table

// zaznacz pakiety, aby „ip route” mogła je trasować przez eth1

iptables -F -t mangle
iptables -t mangle -I OUTPUT -s <ip addr of eth1> -o eth0 -j MARK --set-mark 1

// 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.

noel av
źródło