在大多数托管交换机上,您可以启用第 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.1
(NNN
VID 在哪里)。如果您只想要隔离,这应该足够了:
ebtables --append FORWARD --logical-in vmbr1 --jump DROP
如果需要配置多个网桥,并且其他虚拟机也应该是上行链路(此处:veth100.1
和veth102.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?