是否可以在 Linux 桥上启用端口隔离?

是否可以在 Linux 桥上启用端口隔离?

在大多数托管交换机上,您可以启用第 2 层端口隔离。不同供应商的实现和术语有所不同,但一般来说,您将一个或多个端口保持在默认的混杂 (Cisco) 或上行链路 (HP) 状态,并将其他端口配置为隔离 (Cisco) 或私有 (HP)。之后,隔离端口只能与混杂端口通信,而不能相互通信。

有没有办法通过 Linux 桥接器来实现这一点,例如将虚拟机彼此隔离?也许通过 ebtables?

答案1

你可以尝试使用ebtables并创建涉及输入/输出桥接端口的自己的规则。

我手头没有带桥接的服务器,但我会做这样的事情:

ebtables -P FORWARD DROP
ebtables -F FORWARD
ebtables -A FORWARD -i $uplinkPort -j ACCEPT # let the traffic flow from uplink to any ports
ebtables -A FORWARD -o $uplinkPort -j ACCEPT # let the traffic flow from any ports to uplink

答案2

自从这个问题被提出以来(2012 年),一种新的方法出现了(2018 年),Linux 内核>=4.18 并且相关的版本足够新iproute2工具:桥接端口隔离。

它是在 KernelNewbies for Linux 4.18 中描述

  • bridge:增加对端口隔离的支持。隔离端口之间不能互相通信,但仍可以与非隔离端口通信犯罪

如果一个接口(通常命名为点击X对于虚拟机或vethX对于容器)已设置为名为bridge0像这样:

# ip link set dev tap0 master bridge0

可以将其设置为隔离bridge命令如下:

# bridge link set dev tap0 isolated on

直到同一座桥的至少一个第二个端口也被隔离时,这才会产生任何明显的效果:

# bridge link set dev tap1 isolated on

现在大桥港口tap0点击1无法向其他端口发送或接收任何数据包,但仍可与网桥的其他任何端口正常通信。您可以选择隔离除一个端口之外的所有端口,该端口用作默认混杂/上行链路端口。

笔记:

  • 如提交中所述,它是按端口进行的。如果隔离桥接端口上有多个 VLAN,则所有 VLAN 都会受到影响,
  • 目前还不清楚这座桥梁的自接口(bridge0这里)本身可以被隔离(即使使用正确的语法:self当设备本身就是桥接名称时附加关键字),
  • 所有较新的高级功能均可通过(rt)网络链接ip link和命令bridge在较旧的 ioctl API 中没有等效功能,因此brctl无法用于此。

答案3

根据@pQd 的要求,这里有一个使用虚拟机进行端口隔离的工作示例(此处:基于Proxmox VE),当主机是上行链路时,所有虚拟机应彼此隔离。我将其用于内部服务网络(DNS、更新等)。桥接器是vmbr1,虚拟以太网设备是vethNNN.1NNNVID 在哪里)。如果您只想要隔离,这应该足够了:

ebtables --append FORWARD --logical-in vmbr1 --jump DROP

如果需要配置多个网桥,并且其他虚拟机也应该是上行链路(此处:veth100.1veth102.1),则类似下面的方法更合适(未经测试):

for br in $(seq 0 1); do
    br=vmbr$br
    ebtables --new-chain $br
    ebtables --policy $br DROP
    ebtables --append FORWARD --logical-in $br --jump $br
done
for if in 100.1 102.1; do
    br=vmbr$(echo $if | cut -d. -f2)
    if=veth$if
    ebtables --append $br --in-if $if
    ebtables --append $br --out-if $if
done

如果主机不应该是上行链路,那么这应该可以工作(虽然我也没有尝试过):

ebtables --append INPUT --logical-in vmbr1 --jump vmbr1
ebtables --append OUTPUT --logical-out vmbr1 --jump vmbr1

答案4

这可能是将虚拟机/其他客户端彼此隔离的一种更简单的方法,同时仍允许它们与上游网关进行通信 - 使用IP 地址(此处为 IPv4)。

例如,虚拟机位于192.168.12.x/24,网关位于192.168.12.254。前两行允许往返网关的每个方向。第三行阻止子网上其他主机之间的所有其他 IPv4 流量:

ebtables -A FORWARD -p IPv4 --ip-src 192.168.12.0/24 --ip-dst 192.168.12.254 -j ACCEPT ebtables -A FORWARD -p IPv4 --ip-src 192.168.12.254 --ip-dst 192.168.12.0/24 -j ACCEPT ebtables -A FORWARD -p IPv4 --ip-src 192.168.12.0/24 --ip-dst 192.168.12.0/24 -j DROP

我还没有想出如何阻止这些客户端之间的“其他所有内容”(非 IPv4 流量),因为我预计您可能仍然需要允许某些内容通过,例如 ARP?

相关内容