Cisco и Linux и Vlans

9

Похоже, у меня есть фундаментальное недопонимание того, как VLAN работают в Linux, и я надеюсь, что хорошие люди здесь могут научить меня.

В ролях: одна Cisco 3560, одна VLAN и одна коробка Linux [1].

Cisco  ---------------  Linux
    ge0/1           eth0

Cisco имеет интерфейс Vlan 37 с IP-адресом 10.40.37.252/24. Я хочу разместить 10.40.37.1/24 на коробке с Linux.

Когда Cisco де-инкапсулирует vlan 37, все работает нормально [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

Однако, когда я устанавливаю порт на транкинг и назначаю vlan 37 на стороне Linux, он перестает работать:

# 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

Что мне здесь не хватает?

Изменить: Решения:

Вопрос Шейна о таблице MAC-адресов привел меня к решению: использовать «ip addr» для установки разных уникальных адресов L2 (MAC) на каждом из подинтерфейсов VLAN, и это неожиданно работает.

Другое возможное решение, которое я не пробовал (поскольку мое оборудование слишком старое), использует «ethtool» для отключения разгрузки VLAN самой сетевой платой и заставляет ядро ​​работать с тегами.

Спасибо, Шейн!

Изменить: Больше информации в соответствии с комментариями:

Общая цель состоит в том, чтобы три vlan (public, private, oam & p) оканчивались на трех отдельных IP-адресах в linux box, а различные приложения связывались с локальными адресами. При необходимости я могу расширяться, но я стараюсь сделать описание проблемы и обсуждение простыми, поскольку, прежде чем я смогу работать с тремя виртуальными сетями, мне нужно, чтобы один из них работал. :)

Antoine -> ifup против ifconfig не имеет значения.

Pepoluan -> Я предполагаю, что это то, что вы искали. Обратите внимание, что отсутствие ссылок со стороны phy-драйверов является нормальным явлением. [5]

$ lsmod | grep 802
    8021q   25545 1 cxgb3

Разнорабочий ->

$ 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 и / или tcpdump не показывают теги, но это, по-видимому, нормальное ограничение для Linux, из-за порядка обработки обработки vlan и pcap в ядре [6]. Кроме того, для VLAN без тегов установлено значение 1 [7].

[1] Я пытался это сделать как с CentOS 5.5, так и с Ubuntu 11.04, и у обоих одинаковая проблема.

[2] Обратите внимание, что конфиги - это не вырезка и вставка, поэтому любые опечатки здесь просто моя плохая память.

[3] «не вести переговоры» не влияет на проблему.

[4] Vlan 37 показан как активный и необрезанный по ссылке, поэтому «разрешено» не является проблемой.

[5] serverfault: Включение 8021q на ник

[6] http://wiki.wireshark.org/CaptureSetup/VLAN#Linux

[7] Собственная (без тега) VLAN равна 1. Установка вручную с помощью «switchport trunk native vlan 1» не имеет никакого эффекта.

Даррен Х
источник
Вы пробовали использовать ifup eth0 вместо ifconfig eth0 0.0.0.0 up?
Антуан Бенкемун
Можете ли вы опубликовать вывод lsmodна Linux box?
pepoluan
2
На что ifconfig eth0.37и / или ifconfig -aпохож?
Handyman5
Также, пожалуйста, отправьте /proc/net/vlan/config?
Handyman5
1
sho mac address-table vlan 37?
Шейн Мэдден

Ответы:

2

Вы хотите, чтобы хост имел доступ только к vlan 37 или вы хотите, чтобы хост имел доступ к нескольким vlan?

Эта конфигурация IOS означает, что для нативного (без тегов) vlan установлено значение 37.

interface GigabitEthernet 0/1
    switchport mode access
    switchport access vlan 37

На стороне Linux команда vconfig создает псевдоним интерфейса для трафика, помеченного как vlan 37.

vconfig add eth0 37

Ты видишь проблему? Коммутатор отправляет трафик вашего хоста без тегов, а хост ищет / генерирует тегированный трафик.

Вам нужно просто использовать eth0 в нативном vlan 37 или изменить переключатель коммутатора так, чтобы он пропускал тегированный трафик, например.

interface GigabitEthernet 0/1
    switchport trunk allowed vlan 37
    switchport mode trunk

На довольно старых устройствах IOS вам нужно установить инкапсуляцию грузовика на 8021q, так как они по умолчанию будут ISL.

Джошуа Хоблитт
источник
Доступ работал нормально, транкинга нет. Цель состояла в том, чтобы три или более VLAN, каждая со своей подсетью, заканчивались на Linux. Решение / обходной путь заключался в том, чтобы каждая VLAN на стороне Linux имела отдельный MAC-адрес.
Даррен Х
Ну, это зависит от того, что вы подразумеваете под «работой». Когда устройство IOS имеет порт в режиме доступа, это означает, что «все пакеты, введенные в этот порт, будут помечены [внутри коммутатора] как vlan X». Это означает, что все заголовки 802.1q, добавленные вами с хоста Linux, удаляются. Вы можете легко доказать это, запустив tcpdump на другом порту, также установив режим доступа на vlan 37; вы должны видеть широковещательный трафик со всех трех ваших интерфейсов "vlan" на коробке linux.
Джошуа Хоблитт
Я должен был упомянуть две вещи. 1) То, что я использую теги vlan на centos 5 с коммутаторами Cisco & Blade Networks в моей производственной среде виртуализации. 2) switch port mode accessтакже удалит все теги 802.1q на исходящем трафике. Вот почему вам пришлось прибегнуть к манипуляциям с MAC-адресами, чтобы наладить общение. Без адресатов, имеющих разные mac-адреса, все они оказались на собственном интерфейсе vlan, поскольку пакеты поступают на хост Linux без тегов vlan .
Джошуа Хоблитт
Просто для ясности, на IOS "транк" означает использование тегов 802.1q vlan.
Джошуа Хоблитт
0

Теперь я не являюсь экспертом в области Linux, исходя из моих знаний по коммутации, есть ли у вас интерфейс eth0 на компьютере Linux, настроенный для транкинга dot1q? Я не знаю, есть ли условия для работы нескольких vlan-ов внутри Linux-машины, но я предполагаю, что у вас есть один интерфейс, настроенный для работы в составе Vlan37, таким образом, по сути, превращая сетевой адаптер вашей Linux-машины в порт доступа. Порт доступа не может напрямую связываться с магистральным портом, он не сможет создать или понять транкинговую инкапсуляцию.

Из того, что я понимаю, вы хотите, чтобы машина Linux работала в Vlan 37. Просто измените порт ge0 / 1 на порт доступа в Vlan37 и обычно назначайте машине Linux любой IP-адрес в подсети Vlan37. Вам действительно не нужен транкинг, который используется только для передачи нескольких данных Vlan по одной ссылке.

гокул варма нк
источник
1
Часть vconfig настраивает транкинг dot1q :)
Antoine Benkemoun
Конечная цель - иметь несколько VLAN, оканчивающихся в системе Linux; Сначала я должен получить одну работу;)
Даррен Х
Вы хотите сказать, что хотите, чтобы ваша Linux-машина была частью нескольких Vlan, или чтобы пребывание в Vlan37 было доступно для нескольких других Vlan?
gokul varma nk
Первый - у машины linux должно быть несколько непересекающихся IP-адресов, каждый в своей собственной VLAN. Основная часть отредактирована, чтобы прояснить это.
Даррен Х
0

Я думаю, что проблема с вашим конфигом. После установки порта в режим транка с тегами 802.1q вам необходимо настроить коммутатор для отправки vlan 37 в качестве тегированного трафика, а также, возможно, потребуется настроить порт на использование другого vlan для трафика без тегов. Когда я настроил это, мне также пришлось установить, какие vlan были разрешены / запрещены на этом порту. Мой IOS немного ржавый, но я думаю, что это то, что вы ищете.

Вы также должны быть в состоянии подтвердить свою конфигурацию коммутатора, используя wireshark на eth0, поскольку он покажет вам теги VLAN на пакетах. Пакеты Cisco LLDP также могут дать вам представление о том, что делает порт ge0 / 1.

зажимной патрон
источник
Я не заметил пунктов 3 и 4 при публикации. Я бы все еще попробовал wireshark, поскольку он позволил бы вам проверить, что трафик, предназначенный для коммутатора, отправляется по vlan 37
chuck
Wireshark на Linux часто не может показывать теги VLAN, и, к сожалению, так обстоит дело здесь. Смотрите новую сноску [6] в отредактированном вопросе выше.
Даррен Х
Значения по умолчанию согласно настройке запрашивающего будут иметь vlan 1 как родной vlan и все остальные как помеченные vlans.
MikeyB