我目前正在运行一个 DIY Ubuntu 18.04 路由器,它是为特定的本地 ISP 设置的。他们使用与 ONT 不同的端口来连接 IPTV,连接到一个哑交换机。它实际上是一个 x86 盒子,4 个英特尔 I211 以太网控制器运行 Ubuntu 18.04、firewalld(UFW 不适合用作路由器)、/networks/interfaces(netplan 有一个错误,使其不适合用途)和用于 DHCP 和 DNS 的 dnsmasq。
我正在更换 ISP,我的新 ISP 似乎使用 VLAN 来分离流量,其中 VLAN10 用于常规流量,VLAN20 用于 IPTV。有些人建议在路由器前面安装一个智能交换机,但我确实有空闲端口,而且这个看起来更简洁。我找到了一个设置示例“普通”路由器,它指示需要哪些 VLAN、优先级和标记,这似乎与设置我在别处发现
本质上这就是我想要的
+-----------------------------------------+
| |
| WAN LAN LAN VLAN20 |
| +-----+ +-----+ +-----+ +-----+ |
| | | | | | | | | |
| | | | | | | | | |
| +-----+ +-----+ +-----+ +-----+ |
| |
| |
+-----------------------------------------+
目前 - (你可以找到点击此处详细了解我的设置)
我已将 enp1s0 设置为我的接口的主端口,并将其他接口桥接起来。
然后我使用firewalld进行端口伪装 - 规则基本上是iptables规则。
我想我可以从桥上拉出一个或多个端口,然后在新的 VLAN 上进行设置。
如何为特定端口设置 vlan 20,是否需要为其余端口明确设置 vlan 10?
答案1
此答案将假设您使用ifupdown
和/etc/network/interfaces
,幸运的是,设置 VLAN 接口相当容易。以链接博客文章中的接口为起点:
#primary interface, to internet
auto enp1s0
iface enp1s0 inet dhcp
#3x secondary interfaces and wifi. On bridge
auto br0
iface br0 inet static
address 192.168.2.1
netmask 24
bridge_ports enp2s0 enp3s0 enp4s0 wlp5s0
我们最终得到的是这样的:
# raw primary interface to allow auto to work on vlans
auto enp1s0
iface enp1s0 inet manual
# primary interface, to internet
auto enp1s0.10
iface enp1s0.10 inet dhcp
# iptv bridge
auto br1
iface br1 inet manual
bridge_ports enp1s0.20 enp4s0
bridge_maxwait 0
# 2x secondary interfaces and wifi. On bridge
auto br0
iface br0 inet static
address 192.168.2.1
netmask 24
bridge_ports enp2s0 enp3s0 wlp5s0
您可能需要安装vlan
程序包。
内核模块8021q
也需要启用,但我相信它在现代系统上是默认的。
这样你就有了enp1s0.10
作为“互联网”接口、br0
作为“其他一切”桥接器和br1
作为 IPTV 桥接器。现在,你可以像以前一样enp1s0.10
在它们之间路由/NAT/进行任何操作。br0
这是如何运作的?让我们先从如何在 /etc/network/interfaces 中定义 vlan 接口。有两种方法:
- 您可以将接口命名为
vlan#
,其中#
是 VLAN ID。然后您需要指定vlan-raw-device
。VLAN ID 是从接口名称推断出来的。 - 或者,您可以将接口命名为
ethA.#
,其中ethA
是原始接口,#
是 VLAN ID。原始设备和 VLAN ID 是从接口名称推断出来的。
为了简洁起见,我使用后一种方法。
让我们将其分成几个部分。
首先,原始接口被标记为auto
无配置。这样做是因为 Linux 会检测原始接口上的热插拔,当它被启用时,其上的 VLAN 也会被启用。但是,没有定义原始接口的 VLAN 显然不会支持热插拔。
对“internet”接口进行轻微更改,使其在 enp1s0 上使用 VLAN 10 标记帧,而不是未标记帧。这相当简单。您需要更新之前使用 的任何其他网络配置enp1s0
,并改用enp1s0.10
。
enp1s0.20
接下来,在 VLAN 20 标记和未标记之间定义一个桥接器enp4s0
。manual
意味着没有完成任何 IP 配置;我们只需要一个第 2 层桥接器(匿名桥接器)。
最后,您的原始内容br0
大部分保持原样,只是被enp4s0
删除了,因为它现在是 IPTV 端口。
答案2
你的路由器是PC吗?
来自您的 ISP 的传入流量是否带有 Vlan 标记?
我假设这台电脑至少有 2 个 NIC,一个用于 WAN/ISP,另一个用于本地网络。
听起来你有超过 2 个 NIC,一个是 WAN/ISP,其他的则是桥接的并且基本上充当交换机。
我对 Linux 和 VLAN 没有太多经验,但是......
因此,您真正想要做的是拥有 2 个 WAN 接口,一个用于 vlan10,一个用于 vlan20。然后使用iptables
或其他方式将流量移动到您想要的位置。
您可以制定一些iptables
规则,基本上将所有来自您的流量发送ethwan.vlan20
到您的一个 LAN NIC。然后将其ethwan.vlan10
视为您之前的 WAN NIC。
如果您的 WAN NIC 具有硬件 VLAN 支持,并且 Linux 支持它,这vconfig
可能会对您有所帮助(这里有更多信息)-它将为 VLAN 创建接口,这些接口可以像普通硬件接口一样处理。
如果您的 WAN NIC 没有硬件 VLAN 支持 - 一个问题是 VLAN 是第 2 层的东西,而 iptables 在第 3 层工作。看起来通过 VLAN 分离流量会涉及ebtables
或如上所述的诡计这里。
概念概述: