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”没有效果。
现在我不是 Linux 方面的专家,根据我的交换知识,您在 Linux 机器上是否有为 dot1q trunking 配置的 eth0 接口?我不知道是否有在 Linux 机器中运行多个 VLAN 的规定,但我假设您有一个配置为作为 Vlan37 的一部分工作的接口,从而本质上使您的 Linux 机器的 NIC 成为一个访问端口。接入端口无法直接与中继端口通信,它无法创建或理解中继封装。
据我了解,您希望Linux机器在Vlan 37内工作。只需将ge0/1端口恢复为Vlan37下的访问端口,并定期为Linux机器分配Vlan37子网下的任何IP即可。您确实不需要中继,它仅用于通过单个链路传送多个 Vlan 信息。