program-dog

2016年12月4日星期日

[Linux Net]:3 如何用wireshark和tcpdump抓包

网络程序员应该掌握抓包的技能,学会用wiresharktcpdump调试网络错误。要学习Linux网络,务必多动手抓包,本章意在教你如何抓包。

黑客帝国字幕雨

黑客帝国字幕雨



版权声明

Copyright 2016-2016 Program Dog

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled 'GNU Free Documentation License'.


3.1. wireshark

3.1.1. 安装wireshark

debian系列(包括Debian,Mint,Xubuntu等),

root@debian8:~$ apt-get install wireshark
Reading package lists... Done
Building dependency tree
Reading state information... Done
... (output truncated)

RHEL系列(包括CentOS,Fedora等),

[root@centos7 ~]$ yum install wireshark
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
... (output truncated)

3.1.2. 选择网口

第一次打开wireshark之时,先选择一个网口进行抓包。如下图所示,

选择wireshark的网口

选择wireshark的网口

如果发现没有网口可供选择,请尝试root权限操作,可尝试sudo wireshark

你也可以用tcpdump及其他工具抓包,然后用wireshark分析抓包结果。

3.1.3. 减小包缓存大小

网络抓包可能短时间内产生数千个数据包,占用大量磁盘。可以采用隔离网络的方式减小抓包文件大小。如通过建立虚拟网卡过滤控制抓包流量。

如果你在自己家里面学习抓包,可以关掉电脑其他程序,关掉其他联网设备,如平板手机等,从而减小抓包流量。

当然,更重要的是学会过滤数据包,这正是本章要讲的。

3.1.4. 过滤ping数据包

下面是我启动抓包软件后执行了3次ping命令(无须root权限)。

root@debian7:~# ping -c2 ns1.paul.local
PING ns1.paul.local (10.104.33.30) 56(84) bytes of data.
64 bytes from 10.104.33.30: icmp_req=1 ttl=64 time=0.010 ms
64 bytes from 10.104.33.30: icmp_req=2 ttl=64 time=0.023 ms

--- ns1.paul.local ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.010/0.016/0.023/0.007 ms
root@debian7:~# ping -c3 linux-training.be
PING linux-training.be (188.93.155.87) 56(84) bytes of data.
64 bytes from antares.ginsys.net (188.93.155.87): icmp_req=1 ttl=56 time=15.6 ms
64 bytes from antares.ginsys.net (188.93.155.87): icmp_req=2 ttl=56 time=17.8 ms
64 bytes from antares.ginsys.net (188.93.155.87): icmp_req=3 ttl=56 time=14.7 ms

--- linux-training.be ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 14.756/16.110/17.881/1.309 ms
root@debian7:~# ping -c1 centos7.paul.local
PING centos7.paul.local (10.104.33.31) 56(84) bytes of data.
64 bytes from 10.104.33.31: icmp_req=1 ttl=64 time=0.590 ms

--- centos7.paul.local ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.590/0.590/0.590/0.000 ms

总共抓到200多个包(看起来很混乱),但是尝试在filter上输入icmp协议,然后按apply(或回车)键,则与ping相关数据包清晰可见。

wireshark过滤icmp协议

wireshark过滤icmp协议

3.1.5. 过滤ping和dns数据包

抓包配置不变,只改变filter,就能同时抓取dnsicmp数据包。

filter输入dns or icmp,注意不是dns and icmp,不存在既是dns又是icmp的数据包。

wireshark过滤icmp或dns数据包

wireshark过滤icmp或dns数据包

上图中包25和26的来源和目的地都是ip 10.104.33.30,这是因为我的dns服务器和客户端都在同一台电脑上。

包31和32的情况也一样。

3.1.6. 过滤特定ip

下图示例如何同时查看dns和一个特定ip的数据包。在filter输入ip.addr==10.104.33.30 and dns。关键词and表示两个条件都满足。

wireshark过滤包:and的用法

wireshark过滤包:and的用法

包93是linux-training.be的dns查询请求,包98是dns服务器的回复。那么包93到包98之间的数据包是什么呢?请先思考一下再继续阅读(尝试猜测答案然后验证猜测会很有好处)。

3.1.7. 过滤桢(frame)

更漂亮的做法是按照桢(frame)而非包(packet)来分析(因为我们在模型的第二层)抓包结果。可以用frame.number关键词过滤。

wireshark通过桢过滤

wireshark通过桢过滤

3.1.8. 查看包详情

打开折叠按钮可以看到包详情。

图中我选中了我笔记本电脑的来源地址。

查看包详情

查看包详情

注意,当在同一个网口上抓包的时候,上面的例子没有问题。但是如果用诸如tcpdump -i any这样的命令,在所有的网卡上同时进行抓包的时候,有可能出现Linux cooked 现象(即得到一些假的或者不完整的数据)。

Linux coocked 现象

Linux coocked 现象

3.1.9. 过滤其他的包例子

下图是用or连接两个协议的例子,过滤arpbootp(或dhcp)的包。

wireshark过滤arp或bootp

wireshark过滤arp或bootp

下面是如何过滤dns和ip地址的例子。

wireshark过滤带有特定ip的dns

wireshark过滤带有特定ip的dns

3.2. tcpdump

可以用tcpdump进行命令行抓包。下面举个例子。

tcpdump host $ip抓取特定ip的所有流量。

root@ubuntu910:~# tcpdump host 192.168.1.38
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

tcpdump tcp port $port抓取端口22的流量。

root@deb503:~# tcpdump tcp port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
14:22:20.716313 IP deb503.local.37973 > rhel53.local.ssh: P 666050963:66605
14:22:20.719936 IP rhel53.local.ssh > deb503.local.37973: P 1:49(48) ack 48
14:22:20.720922 IP rhel53.local.ssh > deb503.local.37973: P 49:113(64) ack 
14:22:20.721321 IP rhel53.local.ssh > deb503.local.37973: P 113:161(48) ack
14:22:20.721820 IP deb503.local.37973 > rhel53.local.ssh: . ack 161 win 200
14:22:20.722492 IP rhel53.local.ssh > deb503.local.37973: P 161:225(64) ack
14:22:20.760602 IP deb503.local.37973 > rhel53.local.ssh: . ack 225 win 200
14:22:23.108106 IP deb503.local.54424 > ubuntu910.local.ssh: P 467252637:46
14:22:23.116804 IP ubuntu910.local.ssh > deb503.local.54424: P 1:81(80) ack
14:22:23.116844 IP deb503.local.54424 > ubuntu910.local.ssh: . ack 81 win 2
^C
10 packets captured
10 packets received by filter
0 packets dropped by kernel

-w参数即tcpdump -w $filename保存抓包的结果到文件。

root@ubuntu910:~# tcpdump -w sshdump.tcpdump tcp port 22
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
^C
17 packets captured
17 packets received by filter
0 packets dropped by kernel

tcpdump -r $filename查看刚刚保存的文件。

root@ubuntu910:~# tcpdump -r sshdump.tcpdump
注:也可用wireshark查看

更多例子请参考tcpdump手册。

3.3. 练习:网络抓包

1.安装wireshark到你的电脑(不是安装到虚拟机)。

2.ping另一台计算机。

3.对网络抓包。

4.用wireshark过滤,查看ping的数据包。

5.ping一个域名(如www.linux-training.be)并抓dns数据包。请问:抓包结果显示,dns服务器是多少?dns协议是走的tcp还是udp?

6.找一个能登陆的网站,用用户名paul和密码hunter2登陆,并抓包。然后查看相关的抓包结果。

3.4. 答案:网络抓包

1.安装wireshark到你的电脑(不是安装到虚拟机)。

Debian/Ubuntu: aptitude install wireshark
Red Hat/Mandriva/Fedora: yum install wireshark

2.ping另一台计算机。

ping $ip_address

3.对网络抓包。

(sudo) wireshark
# 然后选择一个网口

4.用wireshark过滤,查看ping的数据包。

在filter输入 'icmp' (没有逗号) 然后点击 'apply'或回车

5.ping一个域名(如www.linux-training.be)并抓dns数据包。请问:抓包结果显示,dns服务器是多少?dns协议是走的tcp还是udp?

# 首先开始抓包
# 然后过滤dns包
# 然后ping
root@ubuntu910:~# ping www.linux-training.be
PING www.linux-training.be (88.151.243.8) 56(84) bytes of data.
64 bytes from fosfor.openminds.be (88.151.243.8): icmp_seq=1 ttl=58 time=14.9 ms
64 bytes from fosfor.openminds.be (88.151.243.8): icmp_seq=2 ttl=58 time=16.0 ms
^C
--- www.linux-training.be ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 14.984/15.539/16.095/0.569 ms

下面是结果:

wireshark抓取dns

wireshark抓取dns

上面结果显示dns走了udp协议。

6.找一个能登陆的网站,用用户名paul和密码hunter2登陆,并抓包。然后查看相关的抓包结果。

本题请躬行:)


注:

1.本文由Program Dog翻译自 http://linux-training.be

2.本文原始链接:https://program-dog.blogspot.com/2016/12/linux-net-char03-network-sniffing.html


2 条评论 :

  1. 哈哈,跟着一步步做,收获还是蛮大滴!博主加油!

    回复删除