Linux 路由器的防火墙和 Vlan

Linux 路由器的防火墙和 Vlan

我目前正在运行一个 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 标记和未标记之间定义一个桥接器enp4s0manual意味着没有完成任何 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或如上所述的诡计这里

概念概述:

在此处输入图片描述

相关内容