这似乎是一个微不足道的问题,但经过一番搜索后,我仍然想不出答案。可以使用“any”作为接口描述来运行 tcpdump,即:
# tcpdump -i any -n host 192.168.0.1
Run Code Online (Sandbox Code Playgroud)
有什么方法可以强制 tcpdump 显示在哪个接口上显示的数据包被捕获?
更新:
随着越来越多的人确认使用 vanilla tcpdump 可能无法做到这一点,有人可以提出解决上述问题的方法吗?也许不同的嗅探器?
一般问题如下:在具有 50 个接口的系统上,确定来自特定 IP 地址的数据包的入站接口是什么。
任何人都可以推荐一个 linux 命令行工具来监视本地服务器和指定 IP 地址/端口之间传输的字节数。
等效的 tcpdump 命令将是:
tcpdump -s 0 -i any -w mycapture.trc port 80 host google.com
输出:
46 packets captured
131 packets received by filter
0 packets dropped by kernel
Run Code Online (Sandbox Code Playgroud)
我想要类似的输出:
54 bytes out, 176 bytes in
Run Code Online (Sandbox Code Playgroud)
我希望它在 RHEL 上工作并且是免费/开源的。如果有一个我也缺少的现有工具就好了!
[root@localhost ~]# cat /etc/issue
Fedora release 17 (Beefy Miracle)
Kernel \r on an \m (\l)
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.6.10-2.fc17.i686 #1 SMP Tue Dec 11 18:33:15 UTC 2012 i686 i686 i386 GNU/Linux
[root@localhost ~]# tcpdump -i p3p1 -n -w out.pcap -C 16
tcpdump: out.pcap: Permission denied
Run Code Online (Sandbox Code Playgroud)
为什么我得到错误?
我该怎么办?
我今天有一个谜团要告诉你。我们在 Azure 上运行一个基于 CoreOS (2023.5.0 / Linux 4.19.25-coreos) 的小型三节点 Elasticsearch 集群。Elasticsearch 在主机网络模式下的 docker 容器内运行。在几乎完全免维护运行一年多之后,我们看到机器进入了一种非常有趣的状态。
此问题已通过修复Linux 内核中的驱动程序解决。请参阅下面的答案。
基本上,受影响的机器和其他两个节点之间的网络连接失效。它们都在同一个虚拟网络和同一个子网中,通常可以与其他人通信。仍然可以从其他子网(我可以通过 ssh 进入)和不同的对等虚拟网络访问受影响的节点。这台机器也有(非常不稳定的)互联网连接,但大多数请求只是超时。
我们观察到,在受影响的节点上,报告的“使用的套接字”数量/proc/net/sockstat非常高(大约 4.5k 而不是健康节点上的大约 300)。监控显示,这个数字从节点变得不可用的那一刻起迅速上升。
有趣的是,我们似乎无法识别这些使用过的套接字的来源:
# cat /proc/net/sockstat
sockets: used 4566
TCP: inuse 2 orphan 0 tw 2 alloc 98 mem 4
UDP: inuse 1 mem 0
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
# cat /proc/net/sockstat6
TCP6: inuse 98
UDP6: inuse 1
UDPLITE6: inuse 0
RAW6: inuse 1
FRAG6: inuse …Run Code Online (Sandbox Code Playgroud) tcpdump linux-networking linux-kernel coreos azure-networking
我需要对大量数据进行 tcpdumping - 实际上来自处于混杂模式的 2 个接口,它们能够看到大量流量。
把它们加起来
现在我像这样使用 tcpdump:
ifconfig ethX promisc
ifconfig ethX promisc
tcpdump -n -C 1000 -z /data/compress.sh -i any -w /data/livedump/capture.pcap $FILTER
Run Code Online (Sandbox Code Playgroud)
该$FILTER包含SRC / DST过滤器,这样可以使用-i any。这样做的原因是,我有两个接口,我想在单个线程而不是两个线程中运行转储。
compress.sh 负责将 tar 分配给另一个 CPU 内核,压缩数据,给它一个合理的文件名并将其移动到存档位置。
我无法指定两个接口,因此我选择使用过滤器并从any接口转储。
现在,我不做任何内务处理,但我计划监控磁盘,当我有 100G 剩余时,我将开始擦除最旧的文件 - 这应该没问题。
我看到丢包了。这是来自一个已经运行了几个小时并收集了大约 250 个 pcap 文件的转储:
430083369 packets captured
430115470 packets received by …Run Code Online (Sandbox Code Playgroud) 我正在运行一组负载测试以确定以下设置的性能:
Node.js test suite (client) --> StatsD (server) --> Graphite (server)
Run Code Online (Sandbox Code Playgroud)
简而言之,node.js 测试套件每 x 秒向位于另一台服务器上的 StatsD 实例发送一定数量的指标。然后 StatsD 每秒将指标刷新到位于同一服务器上的 Graphite 实例。然后,我查看测试套件实际发送了多少指标以及 Graphite 接收了多少指标,以确定测试套件和 Graphite 之间的丢包率。
但是我注意到我有时会遇到非常大的丢包率(请注意,它是通过 UDP 协议发送的),范围为 20-50%。所以那是我开始调查这些数据包被丢弃的地方的时候,认为这可能是 StatsD 的一些性能问题。所以我开始记录系统每个部分的指标,以追踪发生这种下降的地方。这就是事情变得奇怪的地方。
我正在使用tcpdump创建一个捕获文件,在测试运行完成后我会检查该文件。但是每当我在运行 tcpdump 的情况下运行测试时,几乎不存在丢包!看起来 tcpdump 以某种方式提高了我的测试的性能,我无法弄清楚它为什么以及如何做到这一点。我正在运行以下命令来记录服务器和客户端上的 tcpdump 消息:
tcpdump -i any -n port 8125 -w test.cap
Run Code Online (Sandbox Code Playgroud)
在一个特定的测试案例中,我发送 40000 个指标/秒。运行tcpdump的测试有4%左右的丢包,没有的时候有20%左右的丢包
两个系统都作为 Xen VM 运行,具有以下设置:
我已经检查过潜在原因的事情:
当我使用 ssh 从 172.16.11.5 和 172.16.10.6 连接时,我有一个非对称双桥拓扑,如下所示,但由于 SynProxy 我无法连接。
-------
| |
---o--- 172.16.11.5
|
|
-----o----- 172.16.11.6
| |
| | default gw 1.1.1.1
| |
1.1.1.2/30 --o----o--- 2.2.2.2/30
| |
| |
| | (enp10s0f0)
----o----o-----
| |
| XXX |
| |
| br1 br0 | synproxy
| |
----o----o-----
| |
| |
| |
1.1.1.1/30 --o----o--- 2.2.2.1/30
| |
| | default gw 2.2.2.2
| |
-----o----- 172.16.10.1
|
|
---o--- 172.16.10.6
| |
------- …Run Code Online (Sandbox Code Playgroud) 我希望 tcpdump 捕获 VLAN 1000 或 VLAN 501。man pcap-filter说:
可以多次使用 vlan [vlan_id] 表达式来过滤 VLAN 层次结构。每次使用该表达式都会将过滤器偏移量增加 4。
当我做:
tcpdump -vv -i eth1 \( vlan 1000 \) and \( ip host 10.1.1.98 or ip host 10.1.1.99 \)
Run Code Online (Sandbox Code Playgroud)
我得到捕获的数据包。
但是当我这样做时:
tcpdump -vv -i eth1 \( vlan 1000 or vlan 501 \) and \( ip host 10.1.1.98 or ip host 10.1.1.99 \)
Run Code Online (Sandbox Code Playgroud)
我没有收到任何数据包——我推测是因为手册页中描述的“增加 4”行为。
如何一次捕获多个 VLAN 上的流量?
我对 tcpdump 很陌生。除了非常琐碎的任务外,我从未使用过它。
最近,我被要求完成以下工作。
我所拥有的:具有连接到交换机的网络接口的服务器。该交换机上的所有流量都将镜像到该服务器。我需要什么:将所有这些流量存储到 PCAP 格式文件中。该文件应包括
白天的流量约为 100MByte/s,对于我的工作,丢包是不能容忍的(必须连续24 小时)。
无论如何,如上所述,我不需要一切。
题:
谢谢你。
我需要做什么(通过 Linux 的“tcpdump”):
• 电子商务应用服务器:192.168.1.2、192.168.1.3、192.168.1.4。-这就是我想要捕获的内容(根据这些确切的 IP 进行过滤)。不是 IP 范围(子网)或单个 IP 地址,只是几个 IP 地址/服务器。
• 在此范围内还有其他应用程序,例如 PayRoll 应用程序在 192.168.1.5 上,我不想在我的捕获中看到任何此类流量。
我试过:
tcpdump 0 "/tmp" "host 192.168.1.2 or host 192.168.1.3 or host 192.168.1.4" 100000
Run Code Online (Sandbox Code Playgroud)
并且:
tcpdump 0 "/tmp" "ip.host==192.168.1.2 or ip.host==192.168.1.3 or ip.host==192.168.1.4" 100000
Run Code Online (Sandbox Code Playgroud)
两者都返回语法错误。
任何帮助深表感谢。
tcpdump ×10
linux ×5
coreos ×1
fedora ×1
graphite ×1
linux-kernel ×1
networking ×1
performance ×1
sniffing ×1
statsd ×1
tcp ×1
tshark ×1
udp ×1
vlan ×1