以下对Windows中抓包与网络分析相关的netstat、Get-NetTCPConnection、TCPView、Process Monitor、Wireshark、RawCap命令与工具进行了说明,并说明了Windows本地回环地址无法抓包的解决方法。
以下主要对Windows环境、Linux环境及Java程序的网络分析相关工具进行分析,主要包括网络连接查看、网络包捕获等。
相关内容如下:
Windows抓包与网络分析工具总结:https://blog.csdn.net/a82514921/article/details/104609924
Linux抓包与网络分析工具总结:https://blog.csdn.net/a82514921/article/details/104616502
Java程序网络连接分析方法总结:https://blog.csdn.net/a82514921/article/details/104616519
iptables模拟网络连接问题并分析:https://blog.csdn.net/a82514921/article/details/104616548
Windows的netstat命令用于显示协议统计和当前 TCP/IP 网络连接。
在cmd命令窗口中执行netstat -?查看选项如下:
NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-t] [interval]
-a 显示所有连接和侦听端口。 -b 显示在创建每个连接或侦听端口时涉及的可执行程序。 在某些情况下,已知可执行程序承载多个独立的 组件,这些情况下,显示创建连接或侦听端口时涉 及的组件序列。此情况下,可执行程序的名称 位于底部[]中,它调用的组件位于顶部,直至达 到 TCP/IP。注意,此选项可能很耗时,并且在您没有 足够权限时可能失败。 -e 显示以太网统计。此选项可以与 -s 选项结合使用。 -f 显示外部地址的完全限定域名(FQDN)。 -n 以数字形式显示地址和端口号。 -o 显示拥有的与每个连接关联的进程 ID。 -p proto 显示 proto 指定的协议的连接;proto 可以是下列任 何一个: TCP、UDP、TCPv6 或 UDPv6。如果与 -s 选 项一起用来显示每个协议的统计,proto 可以是下列任 何一个: IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 或 UDPv6。 -r 显示路由表。 -s 显示每个协议的统计。默认情况下,显示 IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6 的统计;-p 选项可用于指定默认的子网。 -t 显示当前连接卸载状态。 interval 重新显示选定的统计,各个显示间暂停的间隔秒数。 按 CTRL+C 停止重新显示统计。如果省略,则 netstat 将打印当前的配置信息一次。 |
l -a
-a选项显示所有连接和侦听端口,当不指定-a选项时,不会显示状态为LISTENING及协议为UDP的连接信息。
l -b
使用-b选项可以显示每个连接对应的进程信息,可能需要足够的权限。
l -n
-n选项使用数字形式显示连接对应的地址与端口。
当不使用-n选项时,地址可能以主机名形式显示,端口可能以协议名称形式显示,如“localtest:http”。
当使用-n选项时,地址会显示为数字形式的IP,端口也以数字形式显示,如“127.0.0.1:80”。
l -o
-o选项可以显示连接对应的进程PID。
在cmd命令窗口中执行“netstat -abno”,结果如下:
活动连接
协议 本地地址 外部地址 状态 PID TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 932 RpcSs [svchost.exe] TCP 0.0.0.0:5985 0.0.0.0:0 LISTENING 4 无法获取所有权信息 TCP 0.0.0.0:6781 0.0.0.0:0 LISTENING 4 无法获取所有权信息 TCP 0.0.0.0:8064 0.0.0.0:0 LISTENING 7760 [tencentdl.exe] TCP 0.0.0.0:28511 0.0.0.0:0 LISTENING 1584 [HDPCommunication.exe] TCP 0.0.0.0:28521 0.0.0.0:0 LISTENING 4 |
可使用findstr命令对netstat命令的执行结果进行过滤。
例如只显示ESTABLISHED状态的连接,执行“netstat -ano|findstr ESTABLISHED”,执行结果示例:
TCP 127.0.0.1:28511 192.168.0.1:45884 ESTABLISHED 1584 |
Windows PowerShell 是专门为系统管理员设计的 Windows 命令行 Shell。 Windows PowerShell 包括可以单独或组合使用的交互提示和脚本编写环境。
PowerShell的说明见“Getting Started with Windows PowerShell”(https://docs.microsoft.com/en-us/powershell/scripting/getting-started/getting-started-with-windows-powershell?view=powershell-6 )。
从Windows 7、Windows Server 2008开始,支持PowerShell,可查看“Windows PowerShell System Requirements”( https://docs.microsoft.com/zh-cn/powershell/scripting/install/windows-powershell-system-requirements?view=powershell-6 )。
在“运行”中输入powershell可打开PowerShell命令窗口;或在进入cmd命令窗口后,执行powershell命令进入。
在cmd命令窗口中执行“powershell [powershell命令]”,可以执行PowerShell中的命令。
执行PowerShell命令时,支持使用TAB提示命令自动补全。
Get-NetTCPConnection是PowerShell中的命令,可以查看TCP连接属性,例如本地或远程IP地址,本地或远程端口以及连接状态。
Get-NetTCPConnection的说明见https://docs.microsoft.com/en-us/powershell/module/nettcpip/get-nettcpconnection?view=win10-ps。
使用说明:
Get-NetTCPConnection [[-LocalAddress] [[-LocalPort] [-RemoteAddress [-RemotePort [-State [-AppliedSetting [-OwningProcess [-CreationTime [-OffloadState [-CimSession [-ThrottleLimit [-AsJob] [ |
可在PowerShell命令窗口中执行Get-NetTCPConnection命令,或在cmd命令窗口中执行“powershell Get-NetTCPConnection”。
在PowerShell版本为5.1.15063.786的Windows 10操作系统中,可以执行Get-NetTCPConnection命令;在PowerShell版本为2.0的Windows 7操作系统中,不存在Get-NetTCPConnection命令。
在PowerShell命令窗口中执行Get-NetTCPConnection,结果如下(与netstat结果类似):
LocalAddress LocalPort RemoteAddress RemotePort State AppliedSetting ------------ --------- ------------- ---------- ----- -------------- ::1 49898 :: 0 Listen 0.0.0.0 59023 0.0.0.0 0 Bound 127.0.0.1 59023 192.168.0.1 80 Established Internet 127.0.0.1 59008 192.168.0.1 8080 TimeWait |
在执行Get-NetTCPConnection命令时,使用-LocalAddress、-LocalPort、-RemoteAddress、-RemotePort、-State参数,可根据本地地址、本地端口、远程地址、远程端口、状态对输出结果进行过滤,详情见Get-NetTCPConnection说明。
示例如下:
命令 |
说明 |
Get-NetTCPConnection -LocalAddress "0.0.0.0" |
只查看本地地址符合的连接 |
Get-NetTCPConnection -LocalPort 135 |
只查看本地端口符合的连接 |
Get-NetTCPConnection -RemoteAddress "0.0.0.0" |
只查看远程地址符合的连接 |
Get-NetTCPConnection -RemotePort 80 |
只查看远程端口符合的连接 |
Get-NetTCPConnection -State listen |
只查看连接状态符合的连接 |
Get-NetTCPConnection -OwningProcess 4 |
只查看特定进程(PID)的连接 |
Windows Sysinternals是一个提供技术资源和实用工具的网站,用于管理,诊断,排除故障和监视Microsoft Windows环境。由Winternals公司开发,Winternals公司已被微软收购。
相关说明见https://en.wikipedia.org/wiki/Sysinternals。
可从以下地址下载Sysinternals工具:
https://docs.microsoft.com/en-us/sysinternals/downloads/
TCPView是Sysinternals中的一个工具,下载及说明地址为https://docs.microsoft.com/en-us/sysinternals/downloads/tcpview。
TCPView是一个Windows程序,它显示系统上所有TCP和UDP端点的详细列表,包括本地和远程地址以及TCP连接的状态。
TCPView类似图形化版本的netstat,截图如下所示:
启动TCPView时,它将枚举所有活动的TCP和UDP端点,将所有IP地址解析为其域名版本。 您可以使用工具栏按钮或菜单项来切换解析名称的显示。
默认情况下,TCPView会将IP地址以主机名显示,将端口以协议名称显示。当关闭解析地址功能时,会将IP地址及端口以数字形式显示。点击“Options”“Resolve Addresses”菜单可关闭解析地址功能,如下所示:
默认情况下,TCPView每秒更新一次,可以使用“View”“Update Speed”菜单项来更改速率,如下所示。
状态有改变的的端点会以黄色突出显示;被删除的会以红色显示,新产生的会以绿色显示。
可以通过选择“File”“Close Connection”,或右键单击连接并从弹出的菜单中选择“Close Connection”来关闭已建立的TCP/IP连接(标记为ESTABLISHED状态的连接)。
可以使用“File”“Save”菜单项将TCPView的输出窗口保存到文件中。
TCPView下载中还包含了Tcpvcon工具,为命令行工具,与TCPView具有等同的功能。
说明如下:
Tcpvcon usage is similar to that of the built-in Windows netstat utility: Usage: tcpvcon [-a] [-c] [-n] [process name or PID] Parameter Description -a Show all endpoints (default is to show established TCP connections). -c Print output as CSV. -n Don't resolve addresses. |
Process Monitor也是Sysinternals中的一个工具,下载及说明地址为https://docs.microsoft.com/en-us/sysinternals/downloads/procmon。
Process Monitor是Windows的高级监视工具,可实时显示各进程的文件、注册表、网络和进程/线程行为。
点击Process Monitor中的按钮,可以分别启用或关闭对于注册表、文件、网络及进程/线程操作的监控。当某个按钮处于点击状态时,启用对应操作的监控;当某个按钮牌未点击状态时,关闭对应操作的监控。如下图所示,全部功能的监控均为关闭状态。
打开Process Monitor时,会自动打开过滤器窗口。也可通过点击图标,或“Filter”“Filter”菜单打开过滤器窗口。
打开过滤器窗口,如下所示。
过滤器中包含4个下拉框,分别为Column、Relation、Value、Action。
Column为需要过滤的属性,如进程PID、进程名等;
Relation为过滤的方式,如Value等于或不等于设置的值时,则执行Action对应的操作;
Value为过滤的内容,如Column选择通过进程PID进行过滤时,Value需要设置为进程PID;
Action为过滤的操作,即对于满足过滤条件的记录,包含还是排除。
如下图所示,以下过滤规则代表对于进程名为“java.exe”的进程,监控其行为。
可以设置多个过滤规则同时生效。
点击“Add”按钮,可增加过滤规则。
选中过滤规则后点击“Remove”按钮,可删除过滤规则。
双击过滤规则,可进行重新编辑。
当取消列表中某个过滤规则的单选框时,对应的过滤规则不会生效。
在Process Monitor,仅点击网络监控对应的按钮,可以分别仅启用对于网络操作的监控,关闭对于注册表、文件进程/线程操作的监控。如下图所示。
在Process Monitor的“Options”菜单中取消钩选“Show Resolved Network Addresses”,可取消对IP地址与端口的转换。
若不取消钩选该选项,地址可能以主机名形式显示,端口可能以协议名称形式显示,如“localtest:http”。
当取消钩选该选项时,地址会显示为数字形式的IP,端口也以数字形式显示,如“127.0.0.1:80”。
在过滤器中将Column选择“Operation”时,查看Value下拉框,可以看到如下与网络相关的操作:
与网络相关的操作包括:
TCP Accept TCP Connect TCP Disconnect TCP Other TCP Receive TCP Reconnect TCP Retransmit TCP Send TCP TCPCopy TCP Unknown UDP Accept UDP Connect UDP Disconnect UDP Other UDP Receive UDP Reconnect UDP Retransmit UDP Send UDP TCPCopy UDP Unknown |
在Process Monitor的过滤器窗口中添加过滤规则,“Operation is TCP Connect then Include”,可仅对进程的TCP连接行为进行监控,如下所示:
为了使Process Monitor仅展示关注的信息,可仅监控对于特定IP或端口的网络行为,添加过滤规则“Path contains xxx the Include”,如下所示,仅当IP为“220.181.57.216”时,才进行监控:
以下以telnet命令为例,监控其TCP连接的行为。
添加过滤规则“”,仅监控进程名为“telnet.exe”的行为,如下所示:
当前的过滤规则如下:
在cmd窗口中执行“telnet 220.181.57.216 443”(执行3次),查看Process Monitor监控结果如下,可以看到telnet.exe进程进行了三次TCP连接操作。
Wireshark是一个网络数据包分析器,尝试捕获网络数据包并尝试尽可能详细地显示该数据包数据。
Wireshark功能非常强大,以下仅对捕获网络数据包的部分功能进行说明。
Wireshark依赖WinPcap或Npcap,https://wiki.wireshark.org/WinPcap中有说明。
以下使用的Wireshark版本为2.4.0。
关于Wireshark捕获过滤器的说明可查看以下链接:
https://wiki.wireshark.org/CaptureFilters
https://www.wireshark.org/docs/wsug_html_chunked/ChCapCaptureFilterSection.html
http://www.tcpdump.org/manpages/pcap-filter.7.html
Wireshark使用与tcpdump,WinDump,Analyzer以及任何其他使用libpcap/WinPcap库的程序相同的捕获过滤器语法。
在选择网卡开启抓包时,可以设置捕获过滤器,如下图所示:
在打开“捕获接口”窗口后,选择网卡,也可以设置捕获过滤器,如下图所示:
关于Wireshark显示过滤器的说明可查看以下链接:
https://wiki.wireshark.org/DisplayFilters
https://www.wireshark.org/docs/wsug_html_chunked/ChWorkBuildDisplayFilterSection.html
https://www.wireshark.org/docs/man-pages/wireshark-filter.html
启动Wireshark捕获后,可在以下编辑框中设置显示过滤器规则。
设置显示过滤器规则后,点击按钮,可以清空显示过滤器规则。
捕获过滤器与显示过滤器不同,捕获过滤器更到受多的限制,用于减少原始数据包捕获的大小;显示过滤器用于隐藏来自数据包列表的一些数据包。
捕获过滤器在开始捕获数据包之前设置,在捕获期间无法修改;显示过滤器没有此限制,可以动态更改它们。
设置捕获过滤器后,Wireshark只会捕获满足过滤规则的数据包,对于不满足的数据包不会捕获;显示过滤器不会影响数据包捕获,只是影响数据包的展示。
Wireshark网页中有对于捕获过滤器的详细说明,以下仅对常用命令进行说明。
2.5.5.1 捕获过滤器常用示例
仅捕获进出IP地址为172.18.5.4的流量:
host 172.18.5.4 |
仅捕获端口为53的流量:
port 53 |
仅捕获访问IP地址为172.18.5.4,端口为53,协议为tcp的流量:
tcp host 172.18.5.4 and port 53 |
仅捕获访问IP地址非172.18.5.4,且端口非53的流量:
host not 172.18.5.4 and port not 53 |
仅捕获请求方IP地址为172.18.5.4的流量:
src host 172.18.5.4 |
仅捕获请求方端口为53的流量:
src port 53 |
仅捕获接收方IP地址为172.18.5.4的流量:
dst host 172.18.5.4 |
仅捕获接收方端口为53的流量:
dst port 53 |
以下设置捕获过滤器为“host 10.1xx.xxx.xxx and port 80”,仅捕获IP地址为“10.1xx.xxx.xxx”,且端口为80的数据包,捕获数据包示例如下(请求一次):
在Info列可看到请求方与接口方端口。
2.5.5.2 捕获TCP连接示例
在TCP连接三次握手过程中,第二次接收者会回应SYN与ACK标志。
可通过捕获过滤器设置仅捕获存在SYN与ACK标志的数据包,捕获TCP连接请求,如下所示:
tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0 |
以下设置捕获过滤器为“host 10.1xx.xxx.xxx and port 80 and tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0”,仅捕获IP地址为“10.1xx.xxx.xxx”,且端口为80的数据包的TCP连接请求,捕获数据包示例如下(请求三次):
Wireshark网页中有对于显示过滤器的详细说明,以下仅对常用命令进行说明。
2.5.6.1 显示过滤器常用示例
仅展示进出IP地址为172.18.5.4的流量:
ip.addr == 172.18.5.4 |
仅展示端口为53的流量:
tcp.port == 53 |
仅展示进出IP地址为172.18.5.4,端口为53,协议为tcp的流量:
tcp && ip.addr == 172.18.5.4 && tcp.port == 53 |
tcp and ip.addr == 172.18.5.4 and tcp.port == 53 |
仅展示请求方IP地址为172.18.5.4的流量:
ip.src == 172.18.5.4 |
仅展示请求方端口为53流量:
tcp.srcport == 53 |
仅展示接收方IP地址为172.18.5.4的流量:
ip.dst == 172.18.5.4 |
仅展示接收方端口为53流量:
tcp.dstport == 53 |
仅展示方法为GET的HTTP协议流量:
http.request.method == "GET" |
仅展示内容包含“Connection”的TCP协议流量:
tcp contains "Connection" |
仅展示内容包含“Connection”的HTTP协议流量:
http contains "Connection" |
以下设置显示过滤器为“ip.addr == 10.1xx.xxx.xxx && tcp.port == 80 && tcp contains "Connection"”,仅展示IP地址为“10.1xx.xxx.xxx”,且端口为80的数据包,且TCP数据包含“Connection”的数据包,如下:
2.5.6.2 显示TCP连接示例
可通过显示过滤器设置仅显示存在SYN与ACK标志的数据包,捕获TCP连接请求,如下所示:
tcp.flags.syn == 1 && tcp.flags.ack == 1 |
tcp.flags.syn == 1 and tcp.flags.ack == 1 |
以下设置显示过滤器为“ip.addr == 10.1xx.xxx.xxx && tcp.port == 80 && tcp.flags.syn == 1 && tcp.flags.ack == 1”,仅捕获IP地址为“10.1xx.xxx.xxx”,且端口为80的数据包的TCP连接请求,捕获数据包示例如下(请求三次):
在列表中选中记录,点击右键,选择“追踪流”“TCP流/HTTP流”菜单,可通过追踪TCP流窗口查看TCP/HTTP通信数据。
通过追踪TCP流窗口查看TCP通信数据如下。可以使用查找、修改展示方式、保存数据包内容等功能,方便分析TCP通信数据。
在Windows环境中,使用WinPcap等数据包捕获驱动程序,无法对本地环回地址127.0.0.1进行捕获。https://wiki.wireshark.org/CaptureSetup/Loopback对此有说明。
如在Windows环境中,IP地址为192.168.0.1,监听了80端口,在本机访问http://127.0.0.1/或http://192.168.0.1/,使用Wireshark均无法捕获数据包。
在Windows环境可以使用像RawCap这样的原始套接字嗅探器来捕获localhost网络流量。
RawCap说明及下载地址为https://www.netresec.com/?page=RawCap。
RawCap是一个使用原始套接字的Windows环境免费命令行网络嗅探器,可以嗅探任何有IP地址的网络接口,包括127.0.0.1(localhost/loopback)。
RawCap.exe可直接执行,或在cmd命令窗口中执行。
执行“RawCap.exe --help”,可查看RawCap使用说明。
RawCap使用说明如下:
Usage: RawCap.exe [OPTIONS] |
RawCap选项如下:
-f 每个数据包后刷新数据到文件(无缓冲区) -c -s |
执行RawCap.exe后,会显示当前机器的网络接口信息并提示选择,如下所示:
Interfaces: 0. 192.168.0.1 本地连接 2 Ethernet 1. 127.0.0.1 Loopback Pseudo-Interface 1 Loopback Select interface to sniff [default '0']: |
输入对应的数字,可以选择需要嗅探的网络接口,如输入“1”,则对回环伪接口进行嗅探。
选择需要嗅探的网络接口后,需要输入保存网络数据包的文件名,默认使用“dumpfile.pcap”,如下所示:
Output path or filename [default 'dumpfile.pcap']: |
直接回车则使用默认文件名“dumpfile.pcap”,或使用指定的文件名。开始嗅探后,显示如下所示:
Sniffing IP : 127.0.0.1 File : dumpfile.pcap Packets : 24 |
在启动RawCap.exe时,可以指定网络接口信息及保存网络数据包的文件名,如:
RawCap.exe 127.0.0.1 localhost_capture.pcap |
在本机启动HTTP服务,监听80端口,在本机访问80端口并捕获数据包。
2.6.2.1 访问127.0.0.1
当客户端通过127.0.0.1访问时,需要对127.0.0.1对应的网络接口进行捕获。
使用以下命令开始捕获:
RawCap.exe 127.0.0.1 127.0.0.1.pcap |
捕获产生的pcap文件可以使用Wireshark打开,如下所示:
可以看到127.0.0.1对应的数据包通过RawCap可以成功捕获(无法通过Wireshark捕获)。
2.6.2.2 访问局域网IP
当客户端通过局域网IP访问时,需要对局域网IP对应的网络接口进行捕获。
使用以下命令开始捕获:
RawCap.exe 192.168.0.1 local.pcap |
使用Wireshark打开捕获产生的文件如下:
可以看到局域网IP对应的数据包通过RawCap可以成功捕获(无法通过Wireshark捕获)。