如何使用MAC和ebtables防止IP欺骗?


10

我正在尝试在ebtables中创建IP-MAC配对规则。教程和相关问题[1]很少,但是我有一些特定的设置。

环境: 我有很多物理主机。每个主机只有很少的以太网卡,它们绑定在一起并用作桥的从属。每个主机(kvm,qemu,libvirt)上有许多虚拟机。每个虚拟机通过称为vnet [0-9] +的新端口连接到其物理主机的网桥。没有NAT。网络工作正常,所有物理主机均可ping通,所有虚拟机也均可。每个虚拟机都有自己的IP地址和MAC地址。

问题:在虚拟机内部,可以将IP地址更改为另一个。

解决方案: ebtables站点上有一个已知的解决方案[2],但是仅使用一个主机时,该解决方案才适用。它允许所有流量,并且如果来自IP的数据包与另一个MAC超出允许范围,则数据包将被丢弃。如果主机不止一个,则需要在所有主机上注册所有现有的IP-MAC对。需要反向策略解决方案。

制作的解决方案:我尝试以倒置方式使用ebtables。这是我尝试的示例。

例1

Bridge table: filter
Bridge chain: INPUT, entries: 2, policy: DROP
-i bond0 -j ACCEPT 
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT 
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

例子2

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: DROP
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT 
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

我想要的核心是具有默认策略DROP,并且仅允许来自在给定主机上部署了正确IP-MAC对的虚拟机的流量。但是,这些解决方案不起作用。

问题:如何仅对正在运行的虚拟机的指定IP-MAC对允许网桥上的流量,并丢弃来自端口vnet [0-9] +的所有未知IP-MAC对?

非常感谢您提供任何答案。


2
但是,如果有人伪造了Mac,该怎么办?
Zoredache

1
好吧,那也是一个问题。但是很难猜测正确的IP-MAC对,并且及时超过我服务的安全级别。
马丁

Answers:


12

我终于设法制定了一个可行的解决方案。

  1. 解决方案使用ebtables和IP-MAC对。
  2. 唯一需要的表是默认的“过滤器”表。
  3. 由于INPUT链与运行的虚拟机无关,因此无需向INPUT链添加任何规则或策略。过滤表中INPUT,OUTPUT和FORWARD链的含义的解释在ebtables手册页中。
  4. 由于ebtables在以太网级别工作,并且IP-MAC配对仅适用于IP数据包,因此有必要在规则中强调这一点,以便不阻止ARP帧和其他重要流量。

因此,一开始,没有任何规则,所有策略都已设置为接受。没有用户定义的链。过滤器表如下所示:

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

添加了新链。该链包含所有允许的IP-MAC对。它称为VMS。

# ebtables -N VMS

现在,重要的部分。对于从端口vnet [0-9] +穿过网桥的每个包含IP数据包(或其部分)的帧,请应用链策略和链VMS规则。换句话说,对于来自任何虚拟机的每个IP数据包,请应用VMS链。

# ebtables -A FORWARD -p ip -i vnet+ -j VMS

链式VMS的默认策略必须为DROP。这样,默认情况下会丢弃来自任何虚拟机的每个IP数据包。稍后,添加允许的IP-MAC对异常。默认策略DROP导致,来自具有IP-MAC对未知的任何虚拟机的所有流量都将立即被丢弃,从而使IP欺骗成为不可能。

# ebtables -P VMS DROP

表格过滤器现在看起来是这样的。同样,当没有虚拟机在运行(允许)时,它看起来也会这样。

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: ACCEPT
-p IPv4 -i vnet+ -j VMS
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
Bridge chain: VMS, entries: 0, policy: DROP

假设有两台正在运行的机器。如果我们尝试与它们之间进行ping操作,流量将被丢弃,目标将无法到达。由于此流量尚未被允许,因此这是理想的结果。仅一个命令就足以允许每个虚拟机通信。

# ebtables -A VMS -p ip --ip-src 192.168.11.125 -s 54:52:00:cc:35:fa -j ACCEPT
# ebtables -A VMS -p ip --ip-src 192.168.11.122 -s 54:52:00:98:d7:b6 -j ACCEPT

现在,来自允许的虚拟机的流量可以正常流动,并且可以防止IP欺骗。

该解决方案可能并不完美,如果您有任何意见或改进,我将很乐意听到。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.