使用Linux工具进行网络流量分析

时间:2020-03-21 11:46:25  来源:igfitidea点击:

市场上可用的网络数据包分析工具部署起来非常昂贵,大多数时候需要通过对当前网络基础结构进行一些更改来实现它们。

在本文中,我们将尝试研究如何借助Linux中一些通常可用的工具来实现大量的网络数据包分析。
有时,在高流量服务器上,管理员非常需要快速分析流量模式,以便他可以据此做出一些决策。

PCAP是用于捕获网络数据包以进行分析的API。
PCAP的Windows实现称为WinPCAP。
几乎所有可用的网络数据包捕获工具都使用pcap捕获数据。
在Linux或者Unix之类的操作系统上(如果已在计算机上安装tcpdump),将在/usr/lib/libpcap.so位置中具有PCAP库供使用。

PCAP api用C编程语言编写。

通常,应用程序程序员在其应用程序内部使用此PCAP库来捕获网络数据包。
PCAP库最引人注目的功能是,我们可以将捕获的流量数据保存到扩展名为.pcap的文件中,然后可以使用pcap实现的工具读取该文件。

在本教程中,我们将使用一些可免费在Linux中安装的工具。

  • TCPDUMP命令
  • BASH(大多数发行版中的默认shell)
  • 一些shell脚本命令。

如前所述,我们可以使用tcpdump捕获网络流量数据(因为它使用libpcap实现了pcap库)并将其写入文件,这在我关于tcpdump命令的帖子中也已经得到了实际展示。

[root@myvm1 ~]# tcpdump -s0 -i any -w traffic.pcap
tcpdump: WARNING: Promiscuous mode not supported on the "any" device
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
8 packets captured
17 packets received by filter
0 packets dropped by kernel
[root@myvm1 ~]#

使用上面的tcpdump命令,我使用了-s0选项来捕获整个包的大小,-i用于捕获所有接口,并且使用-wi要求tcpdump命令将输出写入到名为traffic.pcap的文件中,该文件可以稍后由pcap工具阅读。

我们也可以使用wireshark工具执行相同的工作。

现在,我们将开始使用一些出色的Linux工具,以将捕获的tcpdump输出的输出表示在文件traffic.pcap中。

[root@myvm1 ~]# tcpdump -nn -r traffic.pcap | head
reading from file traffic.pcap, link-type LINUX_SLL (Linux cooked)
00:55:45.421932 IP 192.168.159.128.22 > 192.168.159.1.49587: P 1822700485:1822700537(52) ack 3115204597 win 202
00:55:45.421939 IP 192.168.159.128.22 > 192.168.159.1.49587: P 52:184(132) ack 1 win 202
00:55:45.421944 IP 192.168.159.1.49587 > 192.168.159.128.22: . ack 184 win 16199
00:55:46.241056 IP 192.168.159.128 > 192.168.159.128: ICMP echo request, id 6454, seq 14082, length 8

使用上面的命令,我已经读取了我们捕获的traffic.pcap文件的内容,并将该命令的输出重定向到“ head”命令。

注意:在上面显示的命令中,我使用了shell中的管道功能将输出重定向到“ head”命令。
Head命令将列出前10行,而不是在屏幕上输出整个输出。
当我们在Linux中有一个非常大的文件,并且只想查看前10行时,使用此命令非常方便。

现在,让我们了解tcpdump命令的输出。
tcpdump命令输出包括四个要注意的字段。

  • 第一个文件显示了时间戳记。
  • tcpdump中的第二个字段显示了协议
  • 第三个字段显示源IP以及源端口。其形式为源ip.source端口
  • 第四个字段显示目标IP和目标端口。这也以与目标ip.destination端口相同的方式显示

我解释tcpdump输出字段的主要原因是,它包含我们需要分析的大多数流量详细信息。
(我们将在以后进行分析)。

因此,这里要做的主要事情是,在短时间内捕获到所有接口的所有网络流量,然后从该文件中进行分析以发现异常。

我们将对traffic.pcap文件中所需文件的输出进行剪切和排序(需要捕获一小段时间以获得良好的结果)。

让我们看一下接收过多请求的“源Ip地址”。
我们将在Linux中使用“ cut”命令来实现结果。
让我们进行如下所示的排序。

我们将在Linux中使用“ cut”命令从其余输出中剪切源ip。

[root@myvm1 ~]# tcpdump -nn -r traffic.pcap | cut -f 3 -d " " | head
reading from file traffic.pcap, link-type LINUX_SLL (Linux cooked)
192.168.159.128.22
192.168.159.128.22
192.168.159.1.49587
192.168.159.128
192.168.159.128
192.168.159.128.22
192.168.159.1.49587
192.168.159.128

在上面显示的示例中,我只需要输出中的第三个字段,即源ip字段,因此,在cut命令中使用-f选项对第三个字段3rd进行了排序。
现在我们需要第三个场,直到第三个场中有相邻的空间为止。
因此,我们使用了-d“”选项。

但是上面的命令结果也包括源端口,需要将其从输出中删除并找到源ip的发送流量。
然后,我们需要对这些源IP进行计数。

[root@myvm1 ~]# tcpdump -nn -r traffic.pcap | cut -f 3 -d " " | cut -f 1-4 -d "." | sort | uniq -c | sort -n
reading from file traffic.pcap, link-type LINUX_SLL (Linux cooked)
      7 192.168.159.1
     17 192.168.159.128

在上面显示的命令中,通过再次将输出重定向到cut命令,我们删除了“端口”部分,该命令将仅显示字段1至4(即ip地址),并且每个字段都由一个“”分隔。
现在再次将此输出传递给sort命令,该命令将根据唯一值对输出进行排序。
现在,此输出传递给“ uniq”命令,该命令将对唯一值进行计数,然后进行排序将按数字顺序重新排列它们。

从以上命令的结果来看,很明显我收到了来自“ 192.168.159.128”的17个请求。
和来自ip“ 192.168.159.1”的7个请求(请注意,此列表仅在我们将tcpdump输出捕获到该traffic.pcap文件时的那个时期)。

现在,如果我们只想组织“ TCP&UDP”的输出,则可以使用以下命令进行。

[root@myvm1 ~]# tcpdump -nn -r traffic.pcap -p 'tcp or udp'| cut -f 3 -d " " | cut -f 1-4 -d "." | sort | uniq -c | sort -n
reading from file traffic.pcap, link-type LINUX_SLL (Linux cooked)
      7 192.168.159.1
      7 192.168.159.128

我们还可以使用相同的命令集对目标端口进行排序,如下所示。

[root@myvm1 ~]# tcpdump -nn -r traffic.pcap -p 'tcp or udp'| cut -f 5 -d " " | cut -f 5 -d "." | sort | uniq -c | sort -n
reading from file traffic.pcap, link-type LINUX_SLL (Linux cooked)
      7 22:
      7 49587:

如下所示对源端口进行排序。

[root@myvm1 ~]# tcpdump -nn -r traffic.pcap -p 'tcp or udp'| cut -f 3 -d " " | cut -f 5 -d "." | sort | uniq -c | sort -n
reading from file traffic.pcap, link-type LINUX_SLL (Linux cooked)
      7 22
      7 49587

现在,让tcpdump读取有效负载并向我们报告内容。
我将列出未加密的ftp端口21,我们将看到里面发生了什么。

[root@myvm1 ~]# tcpdump -Ann -r traffic.pcap 'dst port 25 or dst port 21' | head -20
reading from file traffic.pcap, link-type LINUX_SLL (Linux cooked)
02:19:57.916852 IP 192.168.159.1.50730 > 192.168.159.128.21: P 2484026965:2484026972(7) ack 2999050325 win 16325
E../..@...,Z.........*....>U...UP.?.....CWD /

02:19:57.917801 IP 192.168.159.1.50730 > 192.168.159.128.21: P 7:12(5) ack 38 win 16316
E..-..@...,[.........*....>\...zP.?.....PWD
.
02:19:57.918515 IP 192.168.159.1.50730 > 192.168.159.128.21: P 12:20(8) ack 47 win 16313
E..0..@...,W.........*....>a....P.?..X..TYPE A

02:19:57.919694 IP 192.168.159.1.50730 > 192.168.159.128.21: P 20:26(6) ack 77 win 16306
E.....@...,X.........*....>i....P.?.....PASV

如我们所见,对于上述输出,我要求tcpdump仅向我显示目标端口为25或者21的那些数据包的输出,以便我可以看到ftp和邮件流量数据。

现在,例如,如果我们想查看通过网络传递的大量邮件流量,则可以按照上面显示的方式进行操作。

同样,如果我们想从上述输出中搜索某些特定的字符串,则可以通过将输出再次传递到包含所需字符串的grep命令中来轻松完成此操作。
(请注意,我们将只能以这种方式查看未加密的流量)

当我们在下面运行DNS服务器时,上面显示的使用tcpdump捕获数据包并其中查找内容的方法非常有用。
因为我们可以识别DNS服务器中查询最多的域,哪些是请求中的顶级TLD,请求特定域的源ip等。

查找内部DNS流量的示例如下所示。

tcpdump -Ann -r traffic.pcap'dst端口53'| grep'(com | in | org)'

现在,让我们使用tcpdump从捕获的文件traffic.pcap中检查所有http通信的输出。

[root@myvm1 ~]# tcpdump -Ann -r traffic.pcap 'dst port 80' | head
reading from file traffic.pcap, link-type LINUX_SLL (Linux cooked)
02:35:12.079040 IP 192.168.159.1.51358 > 192.168.159.128.80: S 3067739367:3067739367(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>
E..4/[email protected].......... .................
02:35:12.079513 IP 192.168.159.1.51358 > 192.168.159.128.80: . ack 4028188194 win 16425
E..(/[email protected]"P.@)..........
02:35:12.080541 IP 192.168.159.1.51358 > 192.168.159.128.80: P 0:282(282) ack 1 win 16425
E..B/.@...
............P......F"P.@)....GET/HTTP/1.1
Host: 192.168.159.128
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[root@myvm1 ~]#

我们可以根据需要,使用grep,cut,sort,uniq等修改我们在http流量上方看到的输出。

例如,我们可以从http流量中使用与上述相同的命令获取所有用户代理。
并对它进行排序,以找到来自各种浏览器的请求数,如下所示。

[root@myvm1 ~]# tcpdump -Ann -r traffic.pcap 'port 80' | grep -Ei 'user-agent' | head -10
reading from file traffic.pcap, link-type LINUX_SLL (Linux cooked)
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0

现在让我们对用户代理输出进行排序,以便我们可以找到哪个浏览器提出了最高的请求。

[root@myvm1 ~]# tcpdump -Ann -r traffic.pcap 'port 80' | grep -Ei 'user-agent' | sort | uniq -c | sort -n
reading from file traffic.pcap, link-type LINUX_SLL (Linux cooked)
      2 User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0
     12 User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11
     23 User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)

我们可以分析流量中很多未加密的内容...根据需求对结果进行排序是此处的主要部分。
请记住,我们可以根据流量中的需求对任何内容进行排序,这取决于你的打击技巧。

使用上述方法分析数据包的另一个好处是,我们可以长时间捕获数据包,然后存储以供以后分析并获得有关流量的出色概览。