Wydaje mi się, że mam pewne fundamentalne nieporozumienie dotyczące działania sieci VLAN w systemie Linux i mam nadzieję, że dobrzy ludzie tutaj mnie nauczą.
Obsada: jeden Cisco 3560, jeden VLAN i jeden moduł Linux [1].
Cisco --------------- Linux
ge0/1 eth0
Cisco ma interfejs Vlan 37 o adresie IP 10.40.37.252/24. Chcę umieścić 10.40.37.1/24 na Linux-ie.
Gdy Cisco dekapsułkuje vlan 37, wszystko działa dobrze [2]:
# Cisco
interface Vlan37
ip address 10.40.37.252/24
interface GigabitEthernet 0/1
switchport mode access
switchport access vlan 37
# Linux
ip link set eth0 up
ip addr add 10.40.37.1/24 dev eth0
$ ping 10.40.37.252 && echo It works
Jednak gdy ustawię port na trunking i przypisuję vlan 37 po stronie Linuksa, przestaje on działać:
# Cisco
interface GigabitEthernet 0/1
switchport trunk encapsulation dot1q
switchport mode trunk
! [3] [4] [7]
# Linux
vconfig add eth0 37
ip link set eth0.37 up
ifconfig eth0 0.0.0.0 up # ensure no address
ip addr add 10.40.37.1/24 dev eth0.37
$ ping 10.40.37.252 || echo Why does this not work
Czego tu brakuje?
Edycja: Rozwiązania:
Pytanie Shane'a o tablicę adresów mac doprowadziło mnie do rozwiązania: użyj „ip addr”, aby ustawić różne unikalne adresy L2 (MAC) na każdym z pod-interfejsów VLAN, i to nagle działa.
Innym możliwym rozwiązaniem, którego nie próbowałem (ponieważ mój sprzęt jest za stary), jest użycie „ethtool” do wyłączenia odciążania sieci VLAN przez samą kartę sieciową i zmuszenie jądra do obsługi tagów.
Dziękuję Shane!
Edycja: Więcej informacji zgodnie z komentarzami:
Ogólnym celem jest, aby trzy vlany (publiczny, prywatny, OAM i p) kończyły się na trzech indywidualnych adresach IP w systemie Linux, z różnymi aplikacjami powiązanymi z lokalnymi adresami. W razie potrzeby mogę dalej rozwijać, ale staram się, aby opis problemu i dyskusja były proste, ponieważ zanim będę mógł uruchomić trzy sieci vlan, potrzebuję jednej z nich. :)
Antoine -> ifup kontra ifconfig nie ma znaczenia.
Pepoluan -> Zakładam, że tego właśnie szukałeś. Zauważ, że brak referencji sterowników phy jest pozornie normalny. [5]
$ lsmod | grep 802
8021q 25545 1 cxgb3
Złota rączka ->
$ ifconfig eth0
eth0 Link encap: Ethernet HWaddr 00:17:08:92:87:22
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 [...]
TX packets:31932 errors:0 dropped:0 overruns:0 carrier:0
$ ifconfig eth0.37
eth0.37 Link encap: Ethernet HWaddr 00:17:08:92:87:22
UP BROADCAST RUNNING MULTICAST MUT:1500 Metric:1
RX packets: 0 [...]
TX packets:32024 errors:90 dropped:0 overruns:0 carrier:0
$ cat /proc/net/vlan/config
VLAN Dev Name | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
eth0.37 | 37 | eth0
Chuck -> wireshark i / lub tcpdump nie pokazują tagów, ale najwyraźniej jest to normalne ograniczenie w Linuksie, ze względu na kolejność przetwarzania vlan i pcap w jądrze [6]. Ponadto nieoznaczony VLAN jest ustawiony na 1 [7].
[1] Próbowałem tego z CentOS 5.5 i Ubuntu 11.04 i oba mają ten sam problem.
[2] Uwaga: konfiguracje nie są metodą wycinania i wklejania, więc wszelkie literówki tutaj są po prostu moją złą pamięcią.
[3] Włączenie lub wyłączenie „nonegotiate” nie ma wpływu na problem.
[4] Vlan 37 jest pokazany jako aktywny i nie przycięty na łączu, więc „dozwolone” nie stanowi problemu.
[5] serverfault: Włączanie 8021q na nic
[6] http://wiki.wireshark.org/CaptureSetup/VLAN#Linux
[7] Natywna (nieoznaczona) sieć VLAN to 1. Ręczne ustawienie jej za pomocą „switchport trunk native vlan 1” nie ma wpływu.
lsmod
polu Linux?ifconfig eth0.37
i / lubifconfig -a
jak wygląda?/proc/net/vlan/config
?sho mac address-table vlan 37
?Odpowiedzi:
Czy chcesz, aby host miał dostęp tylko do vlan 37, czy chcesz, aby host miał dostęp do wielu sieci vlan?
Ta konfiguracja IOS oznacza ustawienie natywnego (nieoznaczonego) vlan na 37.
Po stronie linux polecenie vconfig tworzy alias interfejsu dla ruchu oznaczonego jako vlan 37.
Czy widzisz problem? Przełącznik wysyła do hosta nieoznaczony ruch, a host szuka / generuje otagowany ruch.
Musisz po prostu użyć eth0 w natywnym vlan 37 lub zmienić conf switch, aby przekazywał otagowany ruch, np.
Na dość starych urządzeniach IOS musisz ustawić hermetyzację ciężarówki na 8021q, ponieważ domyślnie ISL.
źródło
switch port mode access
usunie również wszystkie tagi 802.1q na ruchu wychodzącym. Właśnie dlatego musiałeś bawić się w adresy MAC, żeby komunikacja w ogóle działała. Bez miejsc docelowych z różnymi adresami mac wszystkie kończyły się na natywnym interfejsie vlan, ponieważ pakiety przychodzą do hosta Linux bez tagów vlan .Teraz nie jestem ekspertem od Linuksa, jeśli chodzi o moją wiedzę na temat przełączania, czy masz interfejs eth0 na komputerze z Linuksem skonfigurowany do trunkingu dot1q? Nie wiem, czy istnieje przepis na wiele sieci vlan do działania na maszynie z systemem Linux, ale zakładam, że masz jeden interfejs skonfigurowany do pracy jako część Vlan37, dzięki czemu karta sieciowa na komputerze z Linuksem ma być portem dostępu. Port dostępu nie może komunikować się bezpośrednio z portem trunk, nie będzie w stanie utworzyć ani zrozumieć enkapsulacji trunkingu.
Z tego, co rozumiem, chcesz, aby maszyna Linux działała w Vlan 37. Po prostu przywróć port ge0 / 1, aby był portem dostępu pod Vlan37 i rutynowo przypisuj maszynie linux dowolne IP w podsieci Vlan37. Naprawdę nie potrzebujesz trunkingu, który służy tylko do przesyłania wielu informacji Vlan za pomocą jednego łącza.
źródło
Myślę, że problem dotyczy konfiguracji przełącznika. Po ustawieniu portu w tryb trunk za pomocą znaczników 802.1q należy skonfigurować przełącznik tak, aby wysyłał vlan 37 jako ruch oznaczony, a może być również konieczne skonfigurowanie portu do używania innego vlan dla ruchu nieoznaczonego. Kiedy to ustawiłem, musiałem również ustawić, które vlan są dozwolone / zabronione na tym porcie. Moje IOS jest trochę zardzewiałe, ale myślę, że tego właśnie szukasz.
Powinieneś także być w stanie potwierdzić konfigurację przełącznika za pomocą wireshark na eth0, ponieważ pokażą ci tagi VLAN na pakietach. Pakiety Cisco LLDP mogą również dać ci wskazówkę, co robi port ge0 / 1.
źródło