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

我正在尝试在ebtables中创buildIP-MAC配对规则。 有几个教程和相关的问题[1]可用,但我有一种具体的设置。

环境:我有很多物理主机 。 每个主机都有几个以太网卡,join了债券,并用作桥的奴隶。 每台主机上有许多虚拟机(kvm,qemu,libvirt)。 每个虚拟机都通过称为vnet [0-9] +的新端口连接到其物理主机的网桥。 没有NAT。 networking工作正常,所有的物理主机都可以ping通,所有的虚拟机也是如此。 每个虚拟机都有自己的IP地址和MAC地址。

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

find解决scheme:在ebtables网站上有已知的解决scheme[2],但是这种解决scheme适用于仅使用一台主机的情况。 它允许所有stream量,并且如果存在来自IP的数据包与不允许的另一个MAC,则数据包将被丢弃。 如果有多个主机,则需要在所有主机上注册所有现有的IP-MAC对。 需要反向策略解决scheme。

已开发的解决scheme:我试图以倒置的方式使用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对的虚拟机的stream量。 但是,这些解决scheme不起作用。

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

非常感谢您的答复。

  • [1] Linux-KVM / iptables:通过在桥上匹配ip + mac地址来防止来宾欺骗
  • [2] http://ebtables.sourceforge.net/examples/basic.html#ex_anti-spoof

    我终于设法制定了一个工作解决scheme。

    1. 解决scheme使用ebtables和IP-MAC对。
    2. 只有需要的表是默认的“filter”表。
    3. 无需为INPUT链添加任何规则或策略,因为INPUT链与运行虚拟机无关。 过滤表中的INPUT,OUTPUT和FORWARD链的含义的解释在ebtables的manpage中。
    4. 由于ebtables工作在以太网级别,IP-MAC配对只适用于IP数据包,因此需要在规则中join这些configuration,以免阻止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对exception。 默认策略DROP会导致来自任何具有未知IP-MAC对的虚拟机的所有stream量立即被丢弃,从而无法进行IP欺骗。

     # ebtables -P VMS DROP 

    表格filter现在看起来就是这样。 而且,这样看起来什么时候没有虚拟机正在运行(允许)。

     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 /从他们ping,stream量被丢弃,目的地不可达。 这是期望的结果,因为这种stream量尚未被允许。 只有一个命令足以允许每一个虚拟机的stream量。

     # 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 

    现在,来自允许的虚拟机的stream量正常stream动,防止了IP欺骗。

    这个解决scheme可能不完美,如果你有任何意见或改进,我会很乐意听到他们。