如何将非发往 Linux 主机的数据包转发到容器

如何将非发往 Linux 主机的数据包转发到容器

我正在尝试对主机中的 lxc 容器进行一些流量检查。我的主机连接到镜像端口,并正在向其发送本地网络上其他 4-5 台机器的流量副本。

我可以通过 wireshark 看到来自这些其他机器的所有流量,因此我知道它们正在到达我的接口,但我无法将这些最后一跳转发到我的 lxc 容器。

我曾尝试通过 iptables 进行 NAT,但在阅读其他几篇帖子后,我怀疑它们在到达 iptables 之前已被过滤。我看到了一两个关于 ebtables 的建议,并尝试进行一些静态路由,但没有成功。

如能得到任何帮助或对现有文献的指点,我将不胜感激。

答案1

我强烈建议你以某种方式封装你的流量。最简单的方法可能是 VLAN(因为我知道如何使用),但 ERSPAN 当然是事实上的标准。如果没有封装,就很难猜测收到的流量是发往您的系统还是来自镜像(广播、多播、ARP 呢?)

所以我在这里给出一种简单的复制方法再次所有接收到的流量都发送到您的容器,但 IPv4 数据包除外,这些数据包具有您自己的 IP(我不会关心 ARP 数据包或您主机的其他此类不太频繁的流量)。如果接收到的流量被封装,则将有更多选项可用(从重定向而不是镜像所有内容开始),并且必须重新制定此答案。

接收镜像流量时,您不能指望正常路由,甚至桥接也能应用。您可以使用可用的低级工具来执行此操作:交通管制tc)。它是一种相当复杂的工具,能够处理各种不同的网络功能,主要用于流量整形等。可以说,有一个行动重复那里描述的数据包:tc mirred,即行动筛选并且筛选适用于分类队列规则(队列规定)即将到来,特别入口 队列规定用来。

我不会描述如何将其自动与 LXC 集成(可能可以通过为连接到lxc.net.[i].veth.pair用于 LXC 的桥接器的一侧提供固定名称来实现,而不是让 LXC 选择随机名称,然后使用一些脚本钩子,只要在调用钩子时已经创建了接口即可)。因为在创建过滤器,手动执行此操作时,容器必须开始于,

因此让我们假设这一点(编辑以适合您的配置):

  • 你独特的真实界面被称为eth0
  • 您的“外部”(分配给eth0)系统 IP 是 192.0.2.2,
  • 你启动了两个容器,以及它们的韦特主机上的对端称为veth123456veth89ABCD。它们被用作桥接端口(例如:lxcbr0)这一事实并不重要。

让我们进行初始管道工程:

tc qdisc add dev eth0 ingress

让我们添加第一个副本,并附带一个过滤优先级(稍后覆盖它)以及添加更多内容的规定:

tc filter add dev eth0 ingress prio 10 matchall \
   action mirred egress mirror dev veth123456 continue

因为继续使用了控制,此过滤器不是最终版本。可以添加更多(并且继续可以再次添加更多过滤器):

tc filter add dev eth0 ingress prio 10 matchall \
   action mirred egress mirror dev veth89ABCD

由于条件相同(匹配全部),因此也可以使用以下方式重写前两个过滤器:管道动作控制,用这个独特的过滤器来代替:

tc filter add dev eth0 ingress prio 10 matchall \
   action mirred egress mirror dev veth123456 pipe \
   action mirred egress mirror dev veth89ABCD

现在,可以很容易地插入一个优先级较高的过滤器,以防止复制目标 IP(但不是 ARP 或广播或多播或 IPv6...)的数据包,这些数据包旨在发往主机(经过使该操作成为最终操作):

tc filter add dev eth0 ingress prio 5 protocol ip \
   u32 match ip dst 192.0.2.2 action pass

请注意,执行此操作时,网桥(以及几乎所有网络堆栈)都被完全绕过:数据包从一个接口移动到另一个接口,短路中间的所有内容。您还可以创建一个额外的 veth 接口,主机端不连接到网桥(如果 LXC 允许这样做?否则只需使用虚拟网桥)并将数据包复制到那里,从而在容器中拥有一个专用接口。

要显示带有使用情况统计信息的过滤器:

tc -statistics filter show dev eth0 ingress

要取消所有内容,请删除队列规定还将删除过滤器:

tc qdisc delete dev eth0 ingress

更新:接口正在接收非预期的流量,这意味着以太网帧的目标地址很可能不是接口的 MAC 地址。默认情况下,接口的硬件将过滤掉这些帧,系统永远不会看到它们,包括,只留下镜像广播(例如:ARP 请求)可见。因此最好将接口设置为混杂模式:

ip link set dev eth0 promisc on

相关内容