Linux 上透明桥接的 arp 问题

Linux 上透明桥接的 arp 问题

我一直尝试通过将虚拟机放在具有 2 个接口(一个在前面,一个在后面)的透明桥后面来保护我的 esx 服务器上的虚拟机。

我的目的是将所有防火墙规则放在一个地方(而不是放在每个虚拟服务器上)。

我一直在使用基于 arch linux 的新空​​白虚拟机作为桥接器(但我怀疑它是哪个品牌的 linux 并不重要)。

我有 2 个虚拟交换机(因此有两个虚拟网络,VN_front 和 VN_back),每个交换机有 2 种类型的端口(交换/分离或混杂/机器可以看到所有数据包)。

在我的桥接机器上,我设置了 2 个虚拟 NIC,一个在 VN_front 上,一个在 VN_back 上,都处于混杂模式。

我已经创建了一个包含两个 NIC 的网桥 br0:

brctl addbr br0
brctl stp br0 off
brctl addif br0 front_if
brctl addif br0 back_if

然后提出来:

ifconfig front_if 0.0.0.0 promisc
ifconfig back_if 0.0.0.0 promisc
ifconfig br0 0.0.0.0

(我使用混杂模式,因为我不确定我是否可以不用它,因为我认为数据包可能无法到达 NIC)

然后我把位于 VN_front 上的一个虚拟服务器插入到 VN_back 上(这是我正在考虑的一个巧妙的用例,只需更改服务器所插入的 VN 即可移动服务器,而无需更改配置中的任何内容)。

然后我查看了我的无地址桥接器所“看到”的 mac brctl showmacs br0,它确实从两侧显示了我的服务器:

我得到了如下结果:

port no mac addr                is local?       ageing timer
  2     00:0c:29:e1:54:75       no                 9.27
  1     00:0c:29:fd:86:0c       no                 9.27
  2     00:50:56:90:05:86       no                73.38
  1     00:50:56:90:05:88       no                 0.10
  2     00:50:56:90:05:8b       yes                0.00  << FRONT VN
  1     00:50:56:90:05:8c       yes                0.00  << BACK  VN
  2     00:50:56:90:19:18       no                13.55
  2     00:50:56:90:3c:cf       no                13.57

问题是插在前面/后面的服务器没有显示在正确的端口上。

我怀疑 ARP 世界正在发生一些可怕的事情... :-/

如果我从前端虚拟服务器 ping 后端虚拟服务器,则只有后端机器 ping 前端的某个机器时,我才能看到后端机器。一旦我停止从后端机器 ping,从前端机器 ping 就无法通过...

我注意到,如果后面的机器 ping 通,那么它在桥上的端口就是正确的......

我尝试使用 /proc/sys 的 arp_ 开关,但对最终结果没有明显影响... /proc/sys/net/ipv4/ip_forward 在使用网桥时似乎没有任何用处(似乎所有工作都由 brctl 处理)/proc/sys/net/ipv4/conf//arp_似乎也没有太大变化......(尝试将 arp_announce 设置为 2 或 8 - 就像其他地方建议的那样 - 并将 arp_ignore 设置为 0 或 1 )

我见过的所有例子两边都有不同的子网,如 10.0.1.0/24 和 10.0.2.0/24 ...就我而言,我希望两边都有 10.0.1.0/24(就像一个透明交换机 - 除了它是一个隐藏的 fw)。

打开/关闭 stp 似乎对我的问题没有任何影响。

就好像 arp 数据包通过网桥,用虚假数据破坏了另一端...我尝试-arp在每个接口上使用它,br0,前面,后面...它把整个事情都破坏了...我怀疑这与双方都在同一个子网上有关......

我曾考虑过将我的所有机器都放在fw后面,以便将所有相同的子网放在后面...但我的提供商网关与我的子网的一部分一起位于前面(实际上是3个设备来路由整个子网),所以无论我做什么,我总是会在两侧拥有来自同一子网的ips......(我在委托的子网上使用固定的前端IP)。

我很茫然...-_-''谢谢你的帮助。

(有人尝试过这样的事情吗?在 ESXi 内部?)

(这不仅仅是一个噱头,其想法是在某些服务器上运行类似 fail2ban 的东西,将其被禁止的 IP 发送到网桥/防火墙,以便它也可以禁止它们 - 一次性拯救所有其他服务器免受同一攻击者的攻击,允许一些蜜罐通过任何合适的响应触发防火墙,诸如此类的事情......

我知道我可以使用像 snort 这样的东西,但它以完全不同的方式解决了一些完全不同的问题......)

答案1

如果我理解正确的话,您想要的网络是:

         +----------+  +-----+  +---------+
<--inet--+ VN_front +--+ br0 +--+ VN_back |
         +--+-------+  +-----+  +------+--+
            |                          |       
            |                          |       
         +--+----------+    +----------+--+
         | VM          |    | VM          |
         | 10.0.1.2/24 |    | 10.0.1.3/24 |
         +-------------+    +-------------+

通过左边的箭头进入互联网网关?

您在桥接器上使用 ebtables 或 iptables 来防火墙,那么网络“后端”部分是什么?

我确信这可以实现,但我不会这样做。这是一个复杂且不常见的设置。就像程序员说的那样,总有两个人会调试你创建的任何内容 - 你和六个月后你已经忘记了所有内容的你。

您所见过的所有具有两个子网(并且大概是更简单的防火墙)的示例都是常见的做法,原因在于 - 它们第一次就能起作用,而且配置、更改、维护和排除故障都很明显。

简单是网络的一切。避免构建复杂的网络。为你的简单而稳定的网络感到自豪,一个训练有素的猴子(甚至是 MCSE)都可以运行。让你的老板给你提供关于你收到的票数的 KPI产生并证明这种稳定性并提供激励。

(如果您的 MAC 地址出现在错误的桥接端口后面,那是因为您创建了网络循环,并且 ARP 请求被广播到桥接器的两个接口,而最后接收的接口会了解 MAC 地址的位置。从您后来的评论来看,听起来您就是这么做的。)

相关内容