我似乎对 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
但是,当我将端口设置为中继并在 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
我在这里遗漏了什么?
编辑:解决方案:
Shane 关于 mac 地址表的问题让我找到了一个解决方案:使用“ip addr”在每个 VLAN 子接口上设置不同的唯一 L2(MAC)地址,它就突然起作用了。
我没有尝试的另一种可能的解决方案(因为我的硬件太旧)是使用“ethtool”来禁用 NIC 本身的 VLAN 卸载,并强制内核处理标签。
谢谢你,肖恩!
编辑:根据评论提供更多信息:
总体目标是让三个 vlan(公共、私有、oam&p)终止于 Linux 机器上的三个单独 IP 地址,并将不同的应用程序绑定到本地地址。如有必要,我可以进一步扩展,但我试图使问题描述和讨论保持简单,因为在我让三个 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
查克--> wireshark 和/或 tcpdump 不显示标签,但这显然是 Linux 上的正常限制,这是由于内核中 vlan 处理和 pcap 的处理顺序造成的 [6]。此外,未标记的 VLAN 设置为 1 [7]。
[1] 我在 CentOS 5.5 和 Ubuntu 11.04 上都尝试过,都存在同样的问题。
[2] 请注意,配置不是剪切和粘贴的,所以这里的任何拼写错误都只是我的记忆力不好。
[3] 开启或关闭“nonegotiate”对该问题没有影响。
[4] Vlan 37 在链路上显示为活动的且未被修剪,因此“允许”不是问题。
[5] 服务器故障:在网卡上启用 8021q
[6]http://wiki.wireshark.org/CaptureSetup/VLAN#Linux
[7] 本机(未标记)VLAN 为 1。使用“switchport trunk native vlan 1”手动设置它无效。
答案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
您发现问题了吗?交换机正在向您的主机发送未标记的流量,而主机正在寻找/生成标记的流量。
您要么只需要在本机 vlan 37 中使用 eth0,要么更改交换机配置以便它传递标记流量,例如。
interface GigabitEthernet 0/1
switchport trunk allowed vlan 37
switchport mode trunk
在相当旧的 IOS 设备上,您可能需要将卡车封装设置为 8021q,因为它们将默认为 ISL。
答案2
现在我不是 Linux 方面的专家,根据我的交换知识,您是否已将 Linux 计算机上的 eth0 接口配置为 dot1q 中继?我不知道是否有在 Linux 计算机中运行多个 vlan 的规定,但我假设您有一个配置为作为 Vlan37 的一部分工作的单个接口,因此本质上使您的 Linux 计算机的 NIC 成为访问端口。访问端口无法直接与中继端口通信,它无法创建或理解中继封装。
据我所知,您希望 Linux 机器在 Vlan 37 内工作。只需将 ge0/1 端口恢复为 Vlan37 下的访问端口,并定期为 Linux 机器分配 Vlan37 子网下的任何 IP。您真的不需要中继,它仅用于通过单个链路传达多个 Vlan 信息。
答案3
我认为问题出在您的交换机配置上。将端口设置为中继模式并带有 802.1q 标签后,您需要配置交换机以将 vlan 37 作为标记流量发送,并且您可能还需要将端口设置为使用另一个 vlan 来发送非标记流量。当我设置它时,我还必须设置在该端口上允许/拒绝哪些 vlan。我的 IOS 有点生疏,但我认为这就是您要找的。
您还应该能够在 eth0 上使用 wireshark 确认您的交换机配置,因为它会向您显示数据包上的 VLAN 标签。Cisco LLDP 数据包也可能为您提供有关端口 ge0/1 正在做什么的线索。