是否有可能在Linux网桥上启用端口隔离?

在大多数pipe理型交换机上,您可以启用第2层端口隔离。 不同供应商的实施和术语不同,但一般而言,您将一个或多个端口保持在默认的混合(Cisco)或上行链路(HP)状态,并将其他端口configuration为隔离(Cisco)或私有(HP)。 之后,孤立的港口只能与混杂的港口交谈,而不能互相交谈。

有没有什么办法来实现这个与Linux桥梁,例如。 将虚拟机彼此隔离? 也许通过ebtables?

您可以尝试使用ebtables并创build涉及input/输出桥端口的自己的规则。

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

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 

按照@pQd的要求,当主机是上行链路,所有虚拟机应该彼此隔离时,这里有一个与虚拟机隔离的工作示例(这里是基于Proxmox VE的 )。 我使用这个内部服务networking(DNS,更新等)。 网桥是vmbr1 ,虚拟以太网设备是vethNNN.1 (其中NNN是VID)。 如果你只是想隔离,这应该是足够的:

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

如果要configuration多个网桥,并且其他VM也应该是veth100.1 veth102.1 (这里是: veth100.1veth102.1 ),这样的更合适(未经testing):

 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 

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

例如,虚拟机在192.168.12.x/24 ,网关在192.168.12.254 。 前两条线允许每个方向进出网关。 第三行阻止子网上其他主机之间的所有其他IPv4stream量:

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

我还没有制定如何也阻止这些客户之间的“一切”(非IPV4stream量),因为我希望你可能仍然需要通过像ARP一样的东西?