Linux:桥上的端口隔离以正确使用 OLSR

Linux: Port Isolation on a Bridge to use OLSR correctly

在路由器 运行 OLSR 上有四个 ports/interfaces 连接的设备相互通信 OLSR。 现在我不喜欢为每个接口使用一个 IP 地址,而是桥接所有接口并在桥上只设置一个 IP 地址。

现在的问题是,这些设备不应该在 layer2 上看到彼此,否则 olsr 路由更改错误的方式(因为桥)。这些设备应仅由 OLSR 在第 3 层上路由。好的,所以有一个选项可以使用 ebtables...

我已经阅读了 this post,但这并不是我要找的内容。 所以我想弄清楚如何让每个连接的设备与路由器通信 OLSR,同时拒绝所有连接的设备在第 2 层上相互看到。

# deny talking to each other
ebtables -P FORWARD DROP
ebtables -F FORWARD

工作正常,但路由器本身看不到任何连接的设备,所以我想我需要允许接口与路由器本身通信。

# allow port eth1
ebtables -F FORWARD -i eth1 -j ACCEPT
ebtables -F FORWARD -o eth1 -j ACCEPT

但是这样放的太多了,效果和把策略设置回accept一样

我应该如何设置 ebtables 规则以使其以正确的方式工作?

当一台设备想要与另一台设备通信时,发送设备会查看第 3 层目标地址。那么:

  • 如果目标三层地址与发送设备在同一网络中,则 设备将查看 ARP 缓存(发送一个 ARP,它是第 2 层 如果它不在缓存中则广播)以确定第 2 层(MAC) 目标设备的地址,以便第 3 层数据包可以 封装到第 2 层帧中。然后将第 2 层帧发送出接口。
  • 如果目标三层地址在不同的网络中, 发送设备将使用网关的二层(MAC)地址作为 目的二层地址。网关(路由器)丢弃 来自第 3 层数据包的第 2 层帧,将其路由到不同的 接口,并重复该过程以获取新的第 2 层地址和 在发送之前将第 3 层数据包封装在新的第 2 层帧中 出界面。

根据您在接口之间阻止第 2 层的要求,同一网络中一个接口上的设备与另一个接口上的设备将永远无法联系另一台设备,因为它们无法通过第 2 层。

如果您需要使用给定的 public 地址范围,您可以将该范围划分为四个 /31 子网。这给每个 link 两个 IP 地址,每个 link 都在不同的网络中。第 3 层边界(路由器)将阻塞其接口之间的第 2 层。路由会处理剩下的事情。

你真的需要明白这一点;它非常基本的网络。不要误会,但您似乎应该聘请具备适当技能的人来设置您的网络一小时或一天。

它就像将所有端口放入网桥 br0 中一样简单,然后:

ebtables -P FORWARD DROP
ip link set br0 promisc on

(在 ubnt edgerouter 上按预期工作,但之前也在 linux 盒子上测试过,所以应该也能在那里工作)