思科,Linux和Vlan


9

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

演员:一台Cisco 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

我在这里想念什么?

编辑:解决方案:

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

杂工 ->

$ 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

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

[1]我在CentOS 5.5和Ubuntu 11.04上都尝试过,并且都存在相同的问题。

[2]请注意,这些配置不是剪切粘贴,因此此处的任何拼写错误都只是我的记性不好。

[3]启用或禁用“非协商”对问题没有影响。

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

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

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

[7]本机(未标记)VLAN为1。使用“ switchport trunk native vlan 1”手动设置它无效。


您是否尝试过ifup eth0而不是ifconfig eth0 0.0.0.0 up?
安东尼(Antoine Benkemoun)

您可以将输出lsmod发布到Linux机器上吗?
pepoluan 2011年

2
做什么ifconfig eth0.37和/或ifconfig -a什么样子?
Handyman5

还请发表/proc/net/vlan/config
Handyman5

1
sho mac address-table vlan 37
Shane Madden

Answers:


2

您是否要让主机只能访问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或更改switch conf,以使其传递已标记的流量,例如。

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

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


访问工作正常,中继没有。目标是拥有三个或更多VLAN,每个VLAN都有自己的子网,并在Linux机器上终止。解决方案/解决方法是确保Linux端的每个VLAN都有一个不同的MAC地址。
达伦·H

好吧,这取决于您所说的“工作”。当IOS设备的端口处于访问模式时,这意味着“ 输入到此端口的所有数据包都将在[交换机内部]标记为VLAN X”。这意味着您从Linux主机添加的802.1q标头将被剥离。您可以通过在vlan 37上也设置为访问模式的其他端口上运行tcpdump轻松证明这一点。您应该能够在linux机器上看到来自所有三个“ vlan”接口的广播流量。
2011年

我应该提到两件事。1)我确实在生产虚拟化环境中的Cisco&Blade Networks交换机上的centos 5上使用了vlan标签。2)switch port mode access还将删除出口流量上的所有802.1q标签。这就是为什么您不得不摆弄Mac地址才能使通信正常工作的原因。没有目的地具有不同的mac地址,它们都将结束本机vlan接口,因为数据包没有vlan标记地进入Linux主机。
2011年

为了清楚起见,在IOS上,“ trunk”表示使用802.1q vlan标签。
约书亚·霍布利特

0

现在,根据我的交换知识,我不是Linux方面的专家,您在Linux机器上是否已为dot1q中继配置了eth0接口?我不知道在Linux机器中是否有多个VLAN可以运行,但是我假设您有一个配置为Vlan37一部分的单一接口,因此实际上使Linux机器的NIC成为访问端口。接入端口无法直接与中继端口通信,它将无法创建或了解中继封装。

据我了解,您希望Linux机器在Vlan 37中运行。只需将ge0 / 1端口还原为Vlan37下的访问端口,并定期为Linux机器分配Vlan37子网下的任何IP。您确实不需要中继,该中继仅用于在单个链路上传送多个Vlan信息。


1
vconfig部分配置dot1q中继:)
Antoine Benkemoun

最终目标是使多个VLAN在Linux系统上终止;我首先必须工作;)
Darren H

您的意思是您希望Linux计算机成为多个Vlan的一部分,还是希望它可以从多个其他Vlan中访问而留在Vlan37中?
gokul varma nk 2011年

前者-linux机器应具有多个不重叠的IP地址,每个IP地址都在自己的VLAN中。主体进行了编辑以阐明这一点。
达伦·H

0

我认为问题出在您的交换机配置上。将端口设置为具有802.1q标签的中继模式后,您需要将交换机配置为将VLAN 37发送为带标签的流量,并且可能还需要将端口设置为对另一个非标签流量使用另一个VLAN。设置该端口时,我还必须设置该端口允许/拒绝的VLAN。我的IOS有点生锈,但是我认为这是您想要的。

您还应该能够使用eth0上的wirehark确认交换机配置,因为它将在数据包上显示VLAN标记。Cisco LLDP数据包还可能为您提供有关ge0 / 1端口正在做什么的线索。


发布时,我没有注意到第3点和第4点。我仍然会尝试Wireshark,因为它可以让您验证用于交换机的流量是否在vlan 37上发送
chuck

Linux上的Wireshark通常无法显示VLAN标记,不幸的是,这里就是这种情况。参见上面编辑的问题中的新脚注[6]。
达伦·H

根据问询者设置的默认设置将vlan 1作为本机vlan,将所有其他vlan标记为vlan。
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.