Назад | Перейти на главную страницу

Cisco, Linux и Vlan

Похоже, у меня есть фундаментальное непонимание того, как 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 (общедоступный, частный, oam и p), оканчивающиеся на трех отдельных IP-адресах на Linux-сервере, с привязкой различных приложений к локальным адресам. При необходимости я могу расширить его, но я стараюсь, чтобы описание проблемы и обсуждение были простыми, поскольку, прежде чем у меня будут работать три vlan, мне как бы нужен один для работы. :)

Антуан -> ifup и ifconfig не имеет значения.

Пеполуан -> Я полагаю, это то, что вы искали. Обратите внимание, что отсутствие ссылок на 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

Чак -> wirehark и / или tcpdump не отображают теги, но это очевидно нормальное ограничение для Linux из-за порядка обработки vlan и pcap в ядре [6]. Кроме того, для нетегированной VLAN установлено значение 1 [7].

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

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

[3] включение или выключение «nonegotiate» не влияет на проблему.

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

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

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

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

Вы хотите, чтобы хост имел доступ только к 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.

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

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

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

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