Linux 上的 VLAN

作者:Paul Frieden

首先,我们必须对 LAN 有一个更正式的定义。LAN 代表局域网。通常认为集线器和交换机参与单个 LAN。通常,如果您将两台计算机连接到同一个集线器或交换机,它们就在同一个 LAN 上。同样,如果您将两个交换机连接在一起,它们也都在同一个 LAN 上。

LAN 包括广播域中的所有系统。也就是说,单个 LAN 上的所有系统都会收到该 LAN 中任何成员发送的广播。根据这个定义,LAN 的边界是由路由器或其他在 OSI 协议栈第三层运行的设备定义的。

现在我们已经定义了 LAN,那么什么是 VLAN 呢?VLAN 代表虚拟 LAN。一台支持 VLAN 的交换机能够同时参与多个 LAN。

仅此功能就有多种用途,但当 VLAN 与 trunking 结合使用时,会变得更加有趣。Trunk 是一条可以承载多个 VLAN 的物理连接。跨越 trunk 的每个帧都附加了一个 VLAN 标识符,因此可以识别它并将其保留在正确的 VLAN 中。

Trunk 可以用于两个交换机之间、交换机和路由器之间,或者交换机和支持 trunking 的计算机之间。当连接到路由器或计算机时,每个 VLAN 都显示为单独的虚拟接口。

当使用 trunk 时,重要的是要考虑到在 trunk 上传输的所有 VLAN 共享相同的带宽。例如,如果 trunk 在 100Mbps 接口上运行,则跨越该 trunk 的所有 VLAN 的总带宽限制为 100Mbps。

VLAN 的优势

VLAN 为网络设计者提供了许多好处。第一个优点是可以减少实现给定网络拓扑所需的设备数量。如果没有 VLAN,如果您的网络设计需要将十台机器划分为五个不同的 LAN,您将需要五个不同的交换机或集线器,并且大部分端口将被浪费。使用 VLAN,可以使用一台设备完成这项工作。

大多数路由器和标准计算机可以支持有限数量的物理网络接口。虽然可以使用双端口和四端口以太网适配器,但这些都很昂贵。例如,四端口以太网卡可能花费 400 美元。支持 VLAN 的交换机的起价约为 500 美元,但它们支持更多的接口。

根据具体情况,VLAN 和 trunk 可以提供一种有效的方式来分割网络,而无需管理许多物理接口的费用和复杂性。

Trunk 的类型

有几种 trunk 封装可用。Trunk 可以在各种接口类型上进行传输,但本文仅涉及以太网。用于在以太网上承载 VLAN 的两个主要协议是 ISL 和 802.1q。ISL 是 Cisco 在 802.1q 标准化之前创建的,并且是专有的。另一方面,802.1q 是一个开放标准,并且被广泛支持。此后,对 trunking 的引用均指 802.1q-over-以太网。作为旁注,802.1q 仅在 100Mbps 或更高的以太网上定义;它不支持 10Mbps。

VLAN 的工作原理

使用 802.1q 协议的 Trunk 通过向每个帧添加 4 字节的 VLAN 标识符来工作。这在两端都用于标识每个单独的帧属于哪个 VLAN。当交换机收到标记的单播帧时,它会同时使用目标 MAC 地址和 VLAN 标识符来查找传出端口。当收到广播帧时,它会被洪泛到参与该 VLAN 的所有活动端口。

当支持 VLAN 的路由器或计算机收到标记的帧时,它会检查标签以确定该帧属于哪个虚拟接口。此虚拟接口可以具有 IP 地址,并且其行为与正常的物理接口基本相同。

某些交换机在 trunk 连接上具有本机 VLAN 的概念。从此 VLAN 上的 trunk 端口发送出去的数据包是未标记的。同样,在此端口上接收到的未标记数据包与此 VLAN 关联。trunk 两端的本机 VLAN 必须匹配。trunk 两端的本机 VLAN 不匹配会导致使用在每端配置的本机 VLAN 时出现问题。

VLAN 和 Trunk 的安全考虑

对于 VLAN 和 trunking 的所有好处,必须权衡一些风险。与网络段之间的物理隔离相反,VLAN 依赖于交换机来做正确的事情。错误配置或错误可能会导致 VLAN 屏障被打破。

与 VLAN 相关的两个风险。首先,数据包从一个 VLAN 泄漏到另一个 VLAN,可能泄露敏感信息。其次,将特制的数据包注入到另一个 VLAN 中。任何可能导致 VLAN 屏障被打破的攻击都需要一台直接连接到物理网络的机器。这意味着只有本地机器才能对交换机执行攻击。

当交换机配置正确时,这些问题发生的可能性很小,但仍然存在可能性。这取决于您检查您的需求和您的安全策略,以确定 VLAN 是否适合您。

准确描述如何安全地配置您的交换机超出了本文的范围,但大多数供应商都提供了概述最佳实践的文档。简而言之,您应该至少配置以下内容

  • 禁用所有端口(绝对必要的端口除外)上的 trunking 和 trunk 协商。

  • 在所有端口上启用 MAC 泛洪保护。

  • 将管理 VLAN 与工作站和服务器隔离。

Linux 和 VLAN

长期以来,Linux 一直能够使用内核补丁连接到 VLAN trunk,并且该功能已集成到 2.4.14 的主流内核中。内核 2.6 也支持 VLAN trunking。

为了使用 802.1q trunking,只需在配置内核时设置 CONFIG_VLAN_8021Q 选项即可。根据您拥有的以太网卡,您可能需要修补驱动程序以使 VLAN 正常工作。本文稍后将更详细地讨论此过程。

MTU 问题

如前所述,802.1q 的工作原理是用 4 字节的 VLAN 标识符标记每个帧。但是,某些以太网驱动程序假定最大帧大小为 1,500 字节。添加 4 字节标记不会为数据留下太多空间。因此,虽然小数据包可以正确发送和接收,但大数据包会失败。解决方案是降低 VLAN 设备的 MTU,或者更正驱动程序的假设。

Linux VLAN 网站上提供了各种网卡的补丁(请参阅“资源”)。一些驱动程序可以开箱即用(或 tar.gz,视情况而定),包括用于基于 Intel 的网卡的 e100 驱动程序。

Linux 配置

在 Linux 下配置 VLAN 的过程类似于配置常规以太网接口。主要区别在于您首先必须将每个 VLAN 附加到物理设备。这是通过 vconfig 实用程序完成的。如果 trunk 设备本身已配置,则将其视为本机设备。例如,以下命令在设备 eth0 上定义 VLAN 2-4

vconfig add eth0 2
vconfig add eth0 3
vconfig add eth0 4

vconfig 程序可以设置各种其他选项,包括设备命名约定。此后,这些都假定为默认值。

一旦定义了虚拟接口,它们就可以像其他接口一样使用。标准实用程序(如 ifconfig 和 route)都接受 VLAN 接口并按预期运行。例如,可以使用以下命令列出所有 VLAN 接口ifconfig -a.

根据您的发行版,可能支持在启动时自动配置 VLAN。Debian 3.0 或更高版本支持此功能,但 Red Hat 和 Fedora 目前不支持。对于其他发行版,您只需编写一个脚本,在主网络启动脚本之前执行 vconfig 即可。

交换机配置

由于不同品牌的交换机的配置界面都不同,因此本节的重点是常见的 Cisco 2924。所有交换机配置均来自此型号,但在其他基于 IOS 的交换机上稍作更改即可工作。有许多与 trunking 相关的配置命令,但这里仅介绍最基本的命令。示例还假设端口都具有默认配置。具体来说,这意味着所有端口都配置为 VLAN 1 中的接入端口。

本文重点介绍配置的 Linux 方面,因此仅给出交换机命令的基本说明。列表 1 是一个配置片段,可以将其输入到 Cisco Catalyst 2924 交换机中。有关这些命令的完整文档的 URL,请参阅“资源”。

列表 1. 配置 Cisco Catalyst 2924 交换机

interface FastEthernet 0/1
  switchport mode trunk
  switchport trunk encapsulation dot1q
  switchport trunk native vlan 1
interface FastEthernet 0/2
  switchport access vlan 2

如果您熟悉前面介绍的 VLAN 术语,则此处的命令相当不言自明。简而言之,第一部分将第一个端口转换为运行 802.1q 封装且本机 VLAN 为 1 的 trunk。第二部分只是将端口 2 移入 VLAN 2。

重要的是要了解 VLAN 是如何在交换机上配置和运行的。首要任务是查看特定端口的状态。可以使用以下命令完成此操作show interfaces <interface> switchport命令。

列表 2. show interfaces <interface> switchport

#show interfaces FastEthernet 0/1 switchport
Name: Fa0/1
Switchport: Enabled
Administrative mode: trunk
Operational Mode: trunk
Administrative Trunking Encapsulation: dot1q
Operational Trunking Encapsulation: dot1q
Negotiation of Trunking: Disabled
Access Mode VLAN: 0 ((Inactive))
Trunking Native Mode VLAN: 1 (VLAN0001)
Trunking VLANs Enabled: ALL
Trunking VLANs Active: 1-5
Pruning VLANs Enabled: 6-1001
...

可能最有用的命令是 show vlan 命令。它显示一个表格,指示哪些端口在哪些 VLAN 中。

示例

了解 VLAN 工作原理的最佳方法是通过示例。假设您在 Widgets, Inc. 工作。大约有 20 人来自多个部门在您的所在地工作。十个人在工程部门工作,两个人在会计部门,五个人在销售部门,三个人在市场营销部门。Widgets, Inc. 目前有一个扁平网络,所有机器都在同一个 LAN 上。所有这些机器都连接到 Cisco 2924 交换机,并且位于 10.0.0.0/24 私有网络中。

图 1. Widgets, Inc. 的私有网络

为了提高安全性,您已经说服管理层让您分割网络。您已经有一个运行 Debian 3.0 的 Linux 防火墙面向 Internet,但现在您需要扩展它以分割网络。第一个障碍是您只获得了最少的项目预算。

经过一番考虑,您已决定将内部网络划分为四个网段:管理、销售和营销、会计和工程以及用于各种服务器的 DMZ。管理 VLAN 没有与之关联的工作站,仅用于交换机的配置界面。

图 2. 分割的网络

您现有的防火墙无法容纳三个以上的物理接口。您最近读到一篇关于如何将 VLAN 与 Linux 一起使用的有趣文章,这给了您一个想法。借助 VLAN,可以使用现有接口实现新的拓扑。事实上,您的网络的物理布局根本没有改变。使用 VLAN 在组合中添加了一个管理网络,总共达到五个。

图 3. 带有 VLAN 的分割网络

您还决定为新网段子网化您现有的 IP 地址。使用子网掩码 255.255.255.224 为每个网段提供了足够的 IP,并为您留下了几个备用子网供以后使用。您已经在使用 DHCP 分配 IP 地址,因此客户端重新配置不是问题。

列表 3. 分配 IP 地址

Description             VLAN    IP Subnet
Management              1       10.0.0.0/27
DMZ                     2       10.0.0.32/27
Accounting              3       10.0.0.64/27
Engineering             4       10.0.0.96/27
Sales & Marketing       5       10.0.0.128/27
准备工作

由于此处的网络更改可能会导致连接丢失,因此事先做好一切准备非常重要。确保您的防火墙满足上述先决条件。还建议您在开始之前准备好串行控制台连接。显然,这些类型的更改应在营业时间之后进行。

准备工作是网络项目最重要的部分。在本例中,重要的是提前计划好一切。您应该计划好您的防火墙策略、服务器配置、DNS 更新等等。考虑网络日常运行所需的所有功能,并考虑此处描述的更改可能对它们产生的影响。例如,提前几天减少 DHCP 租约时间可以让工作站更快地检索到它们的新租约。

防火墙配置

新网络配置的第一步是在防火墙和交换机之间建立 trunk。在 Debian 上,vlan 软件包包含所需的实用程序。大多数其他发行版也提供包含这些实用程序的软件包。像往常一样编译和安装您的内核,并启用 802.1q 支持 (CONFIG_VLAN_8021Q).

Debian 接口文件(位于 /etc/network/interfaces 中)提供对创建 VLAN 接口的支持。每个接口都像正常情况一样定义,并添加了vlan_native_interface行。如果您的发行版不支持定义 VLAN 接口,则您需要编写一个脚本在网络启动之前定义它们。列表 4 显示了一个 Debian 接口文件,使用 DHCP 检索外部接口的 IP。

列表 4. Debian 接口文件

auto lo
iface lo inet loopback
auto eth0 eth1 vlan2 vlan3 vlan4 vlan5
iface eth0 inet dhcp

# VLAN 1 - native management VLAN
iface eth1 inet static
        address 10.0.0.1
        netmask 255.255.255.224
        vlan_raw_device eth1

# VLAN 2 - DMZ
iface vlan2 inet static
        address 10.0.0.33
        netmask 255.255.255.224
        vlan_raw_device eth1

# VLAN 3 - Accounting
iface vlan3 inet static
        address 10.0.0.65
        netmask 255.255.255.224
        vlan_raw_device eth1

# VLAN 2 - DMZ
iface vlan2 inet static
        address 10.0.0.33
        netmask 255.255.255.224
        vlan_raw_device eth1

# VLAN 3 - Accounting
iface vlan3 inet static
        address 10.0.0.65
        netmask 255.255.255.224
        vlan_raw_device eth1

# VLAN 4 - Engineering
iface vlan4 inet static
        address 10.0.0.97
        netmask 255.255.255.224
        vlan_raw_device eth1

# VLAN 5 - Sales & Marketing
iface vlan5 inet static
        address 10.0.0.129
        netmask 255.255.255.224
        vlan_raw_device eth1

如果您使用的是 Debian 以外的发行版,则可以将列表 5 中的类似行放在启动脚本中,该脚本在网络配置之前运行。

列表 5. 非 Debian 发行版的启动脚本

vconfig add eth1 2
vconfig add eth1 3
vconfig add eth1 4
vconfig add eth1 5

定义新接口后,您可以使用以下命令启动它们ifup <设备名称>。您还需要 ifdown 和 ifup eth1 来设置正确的 IP 和子网掩码。

交换机配置

在开始配置之前,请确保交换机的 IP 地址位于新的管理子网内。IP 配置与虚拟接口关联。这通常是 VLAN1。

列表 6. VLAN1 的 IP 地址

interface VLAN1
  ip address 10.0.0.2 255.255.255.224

防火墙连接到交换机上的端口 1,在 IOS 表示法中称为 FastEthernet 0/1。首要任务是设置封装和本机 VLAN,然后您可以启用 trunk。

列表 7. 启用 Trunk

interface FastEthernet 0/1
  switchport trunk encapsulation dot1q
  switchport trunk native vlan 1
  switchport mode trunk

一旦 trunk 处于活动状态,您需要将端口从默认 VLAN 移动到它们的新 VLAN。这是通过进入接口配置并发出switchport access vlan <vlan id>来完成的。虽然不是必需的,但将 VLAN 进行物理分组有助于更轻松地管理它们。

列表 8. 移动端口

interface FastEthernet0/2
  switchport access vlan 2
interface FastEthernet0/3
  switchport access vlan 2
interface FastEthernet0/4
  switchport access vlan 3
interface FastEthernet0/5
  switchport access vlan 3
interface FastEthernet0/2
  switchport access vlan 3

完成更改后,您可以使用 show vlan 命令查看哪些端口在哪些 VLAN 中。

完成

首要任务是测试您是否可以成功移动各种大小的数据包而没有 MTU 问题。大于 1,476 字节的数据包应触发您遇到的任何 MTU 问题。这可以通过从防火墙 ping 到非本机 VLAN 上的机器来测试。如果小数据包工作正常,但大数据包不工作,则您很可能遇到了 MTU 问题。

由于您正在使用 DHCP,因此您现在需要更新您的 dhcpd.conf 文件以反映新的子网。一旦重新启动,客户端计算机将开始接收它们的新 IP 地址。

如果没有策略,防火墙是无用的。不幸的是,定义该策略超出了本文的范围。但是,有各种有效的工具可免费用于此目的。

现在一切正常,我们需要确保交换机的新配置已写入内存。这是从启用模式使用 write memory 命令完成的。

结论

如您所见,VLAN trunking 可能是一个非常有价值的工具。我希望您已经了解了它在何处有用、使用它的风险和好处以及其配置的基础知识。即使本文重点介绍了 Cisco 2924 交换机,将此处的配置转换为任何支持 802.1q trunk 的交换机应该也不困难。

我要特别感谢 Cheryl Lehman 帮助使我的第一篇文章具有可读性,并感谢 Randall Shutt 审阅了内容。

Paul Frieden 从事 Linux 工作已有八年。他目前在 Parkland College 担任网络专家。如果您有其他问题,可以通过 paul@frieden.us 与他联系。

加载 Disqus 评论