我似乎对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正在做什么。