Cisco 和 Linux 以及 Vlan

Dar*_*n H 9 linux cisco vlan 802.1 trunk

我似乎对 VLAN 在 Linux 上的工作方式有一些根本性的误解,我希望这里的好人可以教育我。

演员:一台 Cisco 3560、一台 VLAN 和一台 Linux 机器 [1]。

Cisco  ---------------  Linux
    ge0/1           eth0
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

但是,当我将端口设置为中继并在 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
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?

编辑:解决方案:

Shane关于mac地址表的问题让我找到了一个解决方案:使用“ip addr”在每个VLAN子接口上设置不同的唯一L2(MAC)地址,它突然起作用了。

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

谢谢谢恩!

编辑:根据评论的更多信息:

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

Antoine --> ifup 与 ifconfig 没有区别。

Pepoluan --> 我假设这就是你要找的。请注意, phy 驱动程序缺少引用显然是正常的。[5]

$ lsmod | grep 802
    8021q   25545 1 cxgb3
Run Code Online (Sandbox Code Playgroud)

杂工-->

$ 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
Run Code Online (Sandbox Code Playgroud)

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

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

[2] 请注意,配置不是剪切和粘贴,所以这里的任何错别字都只是我的糟糕记忆。

[3] “nonegotiate”开启或关闭对问题没有影响。

[4] Vlan 37 在链接上显示为活动且未修剪,因此“允许”不是问题。

[5] serverfault:在网卡上启用 8021q

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

[7] native (untagged) VLAN为1,手动设置为“switchport trunk native vlan 1”没有效果。

gok*_* nk 0

现在我不是 Linux 方面的专家,根据我的交换知识,您在 Linux 机器上是否有为 dot1q trunking 配置的 eth0 接口?我不知道是否有在 Linux 机器中运行多个 VLAN 的规定,但我假设您有一个配置为作为 Vlan37 的一部分工作的接口,从而本质上使您的 Linux 机器的 NIC 成为一个访问端口。接入端口无法直接与中继端口通信,它无法创建或理解中继封装。

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