我试图在我的主机上对一个lxc容器做一些交通检查。我的主机连接到镜像端口,并被发送本地网络上4-5台其他计算机通信量的副本。
我可以通过wireshark看到来自其他机器的所有通信量,所以我知道它们正在到达我的接口,但是我很难将这些最后一跳转发到我的lxc容器。
我尝试过通过iptable来做NAT,但是在阅读了其他几篇文章之后,我怀疑它们是在到达iptable之前被过滤的。我看到了一两条关于退潮的建议,并试图做一些静态路由,但没有成功。
任何对现有文献的帮助或指点都将不胜感激。
发布于 2019-12-28 00:24:03
我强烈建议你以某种方式封装你的流量。最简单的可能是VLAN (因为我知道如何使用tc轻松地处理这个问题),但是ERSPAN当然是一个事实上的标准。如果没有封装,就很难猜测接收到的通信量是用于您的系统还是来自镜像(广播呢?多播?ARP?)
因此,我在这里给出了一种简单的方法,可以再次将接收到的所有通信量复制到容器中,但拥有自己IP的IPv4数据包除外(我不关心ARP数据包或其他不太频繁的主机流量)。如果封装了接收到的通信量,就会有更多的选项可用(从重定向开始,而不是镜像所有内容),这个答案必须重新工作。
您不能期望正常的路由,甚至在接收镜像通信时应用桥接。您可以使用可用于此的低级工具:交通管制 (tc)。它是一个非常复杂的工具,能够处理各种不同的网络特性,主要是用于流量整形和类似的。只需说明有一个操作可以复制在其中描述的数据包:tc镜像,一个操作由过滤器使用,过滤器应用于类队列规则(qdisc)。当它传入时,使用特殊的入口qdisc。
我不会描述如何自动与LXC集成(可能可以在lxc.net.[i].veth.pair中为用于LXC的桥接端提供一个固定的名称,而不是让LXC选择一个随机名称,然后使用一些钩子作为脚本,只要在调用钩子时已经创建了接口)。由于在创建tc筛选器时必须存在接口名称,因此在手动执行此操作时,必须先启动容器,
因此,让我们假设(编辑以适应您的配置):
eth0,eth0)系统IP为192.0.2.2,veth123456和veth89ABCD。事实上,他们被奴役为桥梁港口(如:对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 .)为主机准备的(pass使操作成为最终操作):
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若要取消所有操作,删除qdisc还将删除筛选器:
tc qdisc delete dev eth0 ingress更新:接口接收的通信量不是为它准备的,这意味着以太网帧的目标地址很可能不是接口的MAC地址。默认情况下,接口的硬件将过滤掉这些帧,系统将永远看不到它们,包括tc,只留下镜像广播(例如: ARP请求)可见。因此,最好在混杂模式下切换界面:
ip link set dev eth0 promisc onhttps://serverfault.com/questions/996913
复制相似问题