我想要处理通过我们的网关服务器(运行 Debian 4.0)的所有数据包及其大小。
我的想法是使用 tcpdump,但我有两个问题。
我目前想到的命令是tcpdump -i iface -n -t -q
。
- tcpdump 能保证处理所有数据包吗?如果 CPU 满负荷工作会发生什么?
- 输出行的格式是
IP ddd.ddd.ddd.ddd.port > ddd.ddd.ddd.ddd.port: tcp 1260
。1260 到底是什么?我怀疑它是数据包的有效负载(以字节为单位),这正是我需要的,但我不确定。它可能是 TCP 窗口大小。
或者也许有更好的方法?我考虑过在 iptables 中使用 LOG 规则,但 tcpdump 似乎更简单,而且我不知道 iptables 是否可以记录数据包长度。
更新:
它现在已在 IpTables 中实现。为每个网络段使用单独的链,我得到了一个深度为 3 的树。
机器的软中断负载很高,尤其是在晚上(我们的大多数用户都在线),但到目前为止还可以接受。
感谢您的输入。
答案1
tcpdump 不能保证处理所有数据包。虽然有一些缓冲,但如果数据包通过网络接口的速率快于 CPU 通过 tcpdump 运行数据包的速率,内核就会开始丢弃数据包。对 CPU 的需求越高,网络流量越大,丢弃的可能性就越大(无法具体说明,您必须在系统上进行测试才能确定丢弃阈值)。
恕我直言,我不知道。
至于更好的方法,您需要的术语是“流量统计”。它内置于 IPTables 中,因此任何现代 Linux 发行版都应该开箱即用地支持它。简而言之,一些简单的“直通”IPTables 规则可以为您提供实时传输的总字节数,几乎可以满足您的任何指定流量类型(按协议、端口、IP 等细分,或不按协议细分)。
这里有一个很棒的演示,其中包含具体的命令:http://www.catonmat.net/blog/traffic-accounting-with-iptables
这应该比 tcpdump 更轻量和可靠,因为 Netfilter 完全在内核中处理它,并且内核有数据包长度信息。
答案2
补充一下 Ryan B. Lynch 的精彩回应:
- tcpdump 的输出格式记录在手册页中(“输出格式”部分,“TCP 数据包”子部分)。您提到的示例看起来不像 tcpdump TCP 格式,所以我无法解释什么是 1260。正常输出类似于
192.168.2.1.38528 > 192.168.2.25.22: P 1649:2241(592) ack...
- 该选项
-e
可能很有用,因为它打印链路级(第 2 层)标头的特征,包括数据包的长度(至少在以太网上)。19:12:32.238240 00:1c:23:00:6b:7f > 00:1e:8c:76:29:b6, ethertype IPv4 (0x0800), length 66: 192.168.2.25.22 > 192.168.2.1.58759: . ack 2369...
答案3
我认为您应该澄清“通过我们网关的所有数据包及其大小”的含义。您只想要一个总 IP 流量计数器吗?例如,过去一小时内通过路由器的字节数为 5678898。在这种情况下,您只需设置几个 iptables 规则并使用其计数器即可。或者您需要查看每个数据包的大小?
如果您从事大流量会计工作,请查看 NeTraMet 或 pmacct 项目。