思科和Linux和Vlans

我似乎对Linux如何在VLAN上工作有一些基本的误解,我希望这里的好人能够教育我。

演员:一个思科3560,一个VLAN和一个Linux机器[1]。

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

思科有一个Vlan 37接口,IP地址为10.40.37.252/24。 我想把10.40.37.1/24放在Linux机器上。

当思科解封装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 

但是,当我将端口设置为中继并在Linux端分配vlan 37时,它停止工作:

 # 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 

我在这里错过了什么?

编辑:解决scheme:

Shane的关于MAC地址表的问题使我想到了一个解决scheme:使用“ip addr”在每个VLAN子接口上设置不同的唯一L2(MAC)地址,并且突然生效。

我没有尝试的另一个可能的解决scheme(因为我的硬件太旧)使用“ethtool”来禁用NIC本身的VLAN卸载,并强制内核处理标记。

谢谢Shane!

编辑:更多信息根据意见:

总体目标是有三个vlan(公共,专用,oam&p)终止在linux上的三个单独的IP地址,不同的应用程序绑定到本地地址。 如果有必要,我可以进一步扩展,但我试图保持简单的问题描述和讨论,因为在我有三个vlans工作之前,我需要一个工作。 🙂

安托万 – > 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 

查询 – > wireshark和/或tcpdump不显示标签,但这显然是Linux上的正常限制,由于内核中vlan处理和pcap的处理顺序[6]。 另外,未标记的VLAN被设置为1 [7]。

[1]我已经在CentOS 5.5和Ubuntu 11.04上试了这个,两者都有同样的问题。

[2]注意configuration不是剪切和粘贴,所以这里的任何错别字只是我的不良记忆。

[3]“不讨论”开或关对问题没有影响。

[4] Vlan 37在链路上显示为有效和无修剪,因此“允许”不是问题。

[5] serverfault: 启用8021q在一个networking

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

[7]本地(无标记)VLAN是1.手动设置“switchport trunk native vlan 1”没有效果。

你希望主机只能访问vlan 37,还是希望主机访问多个vlan?

这个IOSconfiguration意味着设置本地 (这是无标记的)vlan为37。

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

在Linux端,vconfig命令为标记为vlan 37的stream量创build一个接口别名。

 vconfig add eth0 37 

你看到这个问题吗? 交换机正在发送您的主机未标记的stream量,主机正在查找/生成已标记的stream量。

您可能需要在本地vlan 37中使用eth0,或者更改交换机configuration以使其通过标记的stream量,例如。

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

在相当老的IOS设备上,你需要将卡车封装设置为8021q,因为它们将默认为ISL。

现在我不是这方面的Linux专家,通过我的切换知识,你有configuration为dot1q中继的Linux机器上的eth0接口? 我不知道是否有一个在Linux机器上运行多个vlans的规定,但是我假设你有一个单独的接口,它被configuration为作为Vlan37的一部分工作,从而使你的Linux机器的NIC成为一个访问端口。 接入端口不能直接与中继端口通信,不能创build或理解中继封装。

根据我的理解,你希望Linux机器在Vlan 37内工作。只需将ge0 / 1端口恢复为Vlan37下的访问端口,并定期为Linux机器分配Vlan37子网下的任何IP。 你真的不需要中继,它只用于通过单个链路传送多个Vlan信息。

我认为这个问题是与您的交换机configuration。 在将端口设置为具有802.1q标记的中继模式后,您需要将交换机configuration为发送vlan 37作为标记的stream量,您可能还需要将端口设置为使用另一个vlan来处理未标记的stream量。 当我设置这个时,我还必须设置哪个VLAN在该端口上被允许/拒绝。 我的IOS有点生疏,但我认为这是你正在寻找的。

您还应该能够使用eth0上的wireshark来确认您的交换机configuration,因为它会显示数据包上的VLAN标记。 思科LLDP数据包也可能给你一个线索ge0 / 1正在做什么。