tcpdump -i 任何和从属接口

tcpdump -i 任何和从属接口

核心需求可以表述为“从-i any中过滤掉从接口”。

在这种情况下,离开 bond0 的 vlan 的数据包也不应该被 bond0 或底层物理接口检索,并且在 ppp 接口的情况下,我们也不希望在 ifb 接口上再次看到流量。

(相当复杂)配置的详细信息:

  • bond0 在 802.3ad 中运行,具有从属 enp1s0f1 和 enp1s0f1 (2 x 10Gbps)。
  • 除此之外还涉及多个 VLAN(足以产生问题)。在某些情况下双重标记。
  • pppoe 服务器大约有 50 个。
  • 其他 VLAN 仅分配有普通 IP/网络。
  • 活动 pppoe + pppol2tp 连接(~200)。
  • 大多数 ppp 接口都有一个相关的 ifb-ppp 接口,用于使用 tc 进行入口整形(需要镜像操作)。

当前基本的 tcpdump 命令:

tcpdump -vnei any -s0 port 53 and host $loopback_ip

使用“ether proto 0x0800”不起作用。这几乎是理想的,因为在物理和 bond0 上,802.11q 的以太类型实际上不是 0x0800,而是 0x8100(但嵌套类型仍然是 0x0800,我怀疑这就是为什么 tcpdump 或 bpf 通常会返回此处的帧)。

这个想法是捕获进入或离开本地系统的每个 DNS 数据包的单个副本(而不是那些只是路由通过的数据包)。

输出看起来像这样(对于从 ppp 链路进入本地节点的单个数据包,并且响应再次返回):

12:33:43.996592 ppp155 In  ifindex 1428484 ethertype IPv4 (0x0800), length 80: (tos 0x0, ttl 63, id 14910, offset 0, flags [none], proto UDP (17), length 60)
    a.b.c.d.54070 > e.f.g.h.53: 38860+ A? www.google.com. (32)
12:33:43.996598 ifb-ppp155 Out ifindex 1428485 00:00:3f:11:16:20 ethertype IPv4 (0x0800), length 80: (tos 0x0, ttl 63, id 14910, offset 0, flags [none], proto UDP (17), length 60)
    a.b.c.d.54070 > e.f.g.h.53: 38860+ A? www.google.com. (32)
    enter code here

12:33:43.996649 ppp155 Out ifindex 1428484 ethertype IPv4 (0x0800), length 96: (tos 0x0, ttl 64, id 18785, offset 0, flags [DF], proto UDP (17), length 76)
    e.f.g.h.53 > a.b.c.d.54070: 38860 1/0/0 www.google.com. A 216.58.223.132 (48)

这是问题一。我们使用 ifb 设备来调整 tc 入口流量。是的,我们确实在这里塑造的不仅仅是警察。所以我们看到这个框架两次。我们不关心 ifb-ppp155 上的重复项。

响应仅给出一次,但看到 tc 不会“重定向”流量,这是预期的。由于流量随后被封装为 pppoe,因此过滤器还会过滤掉相关 vlan 上发出的 pppoe 帧,以 bond0 到任一底层接口(与传入类似)。

当流量位于原始 VLAN 上时,最容易通过查询将主机出站到远程服务器来说明问题:

12:38:55.396412 bond0.2 Out ifindex 7 00:11:0a:69:8f:b0 ethertype IPv4 (0x0800), length 80: (tos 0x0, ttl 62, id 3629, offset 0, flags [none], proto UDP (17), length 60)
    a.b.c.d.36796 > e.f.g.h.53: 21853+ A? www.google.com. (32)
12:38:55.396413 bond0 Out ifindex 6 00:11:81:00:00:02 ethertype IPv4 (0x0800), length 84: IP8 (invalid)
12:38:55.396414 enp1s0f0 Out ifindex 2 00:11:81:00:00:02 ethertype IPv4 (0x0800), length 84: IP8 (invalid)

12:38:55.396476 enp1s0f1 In  ifindex 3 48:df:81:00:00:02 ethertype IPv4 (0x0800), length 100: IP15 (invalid)
12:38:55.396476 bond0 In  ifindex 6 48:df:81:00:00:02 ethertype IPv4 (0x0800), length 100: IP15 (invalid)
12:38:55.396476 bond0.2 In  ifindex 7 48:df:37:3d:f5:c4 ethertype IPv4 (0x0800), length 96: (tos 0x0, ttl 64, id 47664, offset 0, flags [DF], proto UDP (17), length 76)
    e.f.g.h.53 > a.b.c.d.36796: 21853 1/0/0 www.google.com. A 172.217.170.100 (48)

添加额外的换行符以强调。这“六个”数据包实际上只是两个。我不希望那些给出“(无效)”的输出,理想情况下它们不应该通过 bpf 过滤器,这样它们就不会从内核到用户空间复制三次,而只是一次。

就目前情况而言,我们仅在 bond0.2 上捕获的流量不足以收集基于 DNS 的攻击的信息(特别是今天成为头条新闻的大规模中断),因此将过滤器扩展到 -i 任何原因太多流量被捕获,最终使事情变得混乱。我们怀疑一个或多个客户端路由器正在执行特制的查找,从而导致不良情况发生。我们正在网络边缘阻止并非发往已知 DNS 权威主机的入站 DNS 查询。

我现在能想到的唯一的其他可能性是实际使用 iptables 的 NFLOG 将相关的 INPUT 和 OUTPUT 帧发送到专门构建的用户空间应用程序,这可能最终成为可行的方法,但我认为如果我们可以使用 tcpdump 收集原始数据,然后我们应该能够使用wireshark或类似的工具来追踪攻击向量。并且应该比构建专用应用程序更快。

相关内容