使用 PortQry 命令行工具
PortQry 是一种命令行工具,可用于帮助排查 TCP/IP 连接问题。 此工具报告本地计算机或远程计算机上的目标 TCP 和用户数据报协议 (UDP) 端口的状态。 它还提供有关本地计算机的端口使用情况的详细信息。
由于 PortQry 旨在用作故障排除工具,因此使用它来排查特定问题的用户应充分了解其计算环境。
可以在多种模式之一的命令提示符中使用 PortQry:
注意
可以下载名为 PortQryUI 的单独工具,其中包括 PortQry 的图形 UI。 PortQryUI 具有多个功能,可更轻松地使用 PortQry。 若要获取 PortQryUI 工具,请参阅 PortQryUI - PortQry 命令行端口扫描程序的用户界面。
适用于: 支持的 Windows 版本
PortQry 测试和结果
典型的端口扫描工具报告,如果目标 UDP 端口未返回 Internet 控制消息协议(ICMP)“目标无法访问”消息,则端口具有 侦 听状态。 由于以下一个或两个原因,此结果可能不准确:
- 如果没有对定向数据报的响应,则目标端口可能已 筛选。
- 大多数服务不会响应发送给它们的未格式化用户数据报。 通常,侦听端口的服务或程序仅响应使用特定会话层或应用程序层协议的消息。
为了生成更准确且有用的结果,PortQry 使用双重测试过程。
步骤 1:端口状态测试
PortQry 将端口的状态报告为以下三个值之一:
- 侦听:此响应指示进程正在侦听目标端口。 PortQry 从目标端口收到响应。
- 未侦听:此响应指示没有进程正在侦听目标端口。 PortQry 从目标端口收到了以下 ICMP 消息之一:
目标无法访问端口不可访问
- FILTERED:此响应指示正在筛选目标端口。 PortQry 未收到来自目标端口的响应。 进程可能正在侦听目标端口,也可能不侦听。 默认情况下,PortQry 在返回 FILTERED 响应前三次查询 TCP 端口,并在返回 FILTERED 响应之前查询 UDP 端口一次。
步骤 2:专用测试
如果目标 UDP 端口没有响应,PortQry 将报告端口正在 侦听或筛选。 但是,排查连接问题时,了解端口是正在筛选还是正在侦听,这很有用。 这在包含一个或多个防火墙的环境中尤其如此。
PortQry 使用第二组测试来优化其端口状态报告,这些测试可与侦听目标端口的服务或程序进行交互。 对于此测试,PortQry 执行以下操作:
- PortQry 使用位于 %SYSTEMROOT%\System32\Drivers\Etc 文件夹中的服务文件来确定哪个服务侦听每个端口。
- PortQry 将创建一个专门为预期服务或程序构造的消息,然后将该消息发送到目标端口。 根据服务或程序,消息可能会请求有助于故障排除的信息,例如:
- 域和域控制器信息(LDAP 查询)
- 已注册的客户端服务和端口(RPC 查询)
- 是否允许匿名访问(FTP 查询)
- MAC 地址 (NetBIOS 查询)
- Mspclnt.ini文件信息(ISA 服务器查询)
- PortQry 分析、格式化,然后将服务或程序的响应作为其测试报告的一部分返回。
用于对本地计算机进行故障排除的其他测试
若要排查安装 PortQry 的计算机上的端口问题,请在本地模式下使用 PortQry。 在命令行中使用本地模式参数时,可以在本地计算机上执行如下任务:
- 枚举端口映射
- 监视特定端口以获取更改
- 监视特定流程以查找更改
有关详细信息,请参阅 在本地(命令行)模式下使用 PortQry。
在命令行模式下使用 PortQry
可以在命令提示符处以与任何其他命令行工具相同的方式运行 PortQry。 本文中的大多数示例都显示了命令行 PortQry 命令。 在命令行模式下,可以将多个选项添加到命令字符串,以指定要运行的查询以及如何运行它。 若要在命令行模式下运行 PortQry,请运行使用以下语法的命令:
portqry.exe -n <name_to_query> [options]
注意
在此命令中, <name_to_query> 是要查询的 IP 地址、计算机名或域。 此参数是必需的。 [options] 是可选参数。
命令行模式的 PortQry 参数
以下参数在常规命令行模式下可用:
参数 | 说明 | 注释 |
---|---|---|
-n <name> |
查询特定目标 |
|
-p <protocol> |
使用指定的协议 |
|
-e <port_number> |
指定目标端口(也称为“终结点”) |
|
-o <port_number>,<port_number> |
在序列中指定多个目标端口 | port_number,port_number>><值表示要在序列中查询的端口号的逗号分隔列表。< 不要在逗号周围使用空格。 |
-r <port_number>:<port_number> |
指定目标端口的范围 |
|
-l <filename.txt> |
生成日志文件 |
|
-y |
覆盖以前的日志文件 |
|
-sl |
等待额外的时间进行响应(也称为慢链接延迟) | 使用此参数将 PortQry 等待来自 UDP 端口的响应的时间加倍,然后 PortQry 确定端口未侦听或已筛选。 查询慢速或不可靠的网络链接时,正常等待时间可能太短,无法接收响应。 |
-nr |
跳过反向名称查找 |
|
-sp <port_number> |
从特定源端口进行查询 |
|
-cn !<community_name>! |
查询 SNMP 社区 |
|
-q |
以静默模式运行 PortQry |
|
命令行模式下参数的备注
- 任何端口号值必须是介于 1 到 65535 之间的有效端口号(含)。
-e
参数-o
和-r
参数互斥。 单个 PortQry 命令只能使用这些参数之一。- 对 UDP 端口 389(LDAP)的查询可能不适用于运行 Windows Server 2008 的域控制器。 若要检查 UDP 端口 389 上运行的服务的可用性,可以使用 Nltest 而不是 PortQry。 有关详细信息,请参阅 Nltest。
- 使用
-e
或-o
查询端口 135 (RPC)时,PortQry 将返回当前注册到 RPC 终结点映射器的所有终结点。重要
使用
-r
时,PortQry 不会查询 RPC 终结点映射器。 - 查询端口 53(DNS)时,PortQry 会使用 TCP 和 UDP 发送 DNS
portqry.microsoft.com
查询。 如果服务器返回响应,PortQry 将确定端口正在侦听。注意
DNS 服务器是否返回正响应或负响应并不重要。 任何响应都指示端口正在侦听。
在本地(命令行)模式下使用 PortQry
可以在本地模式下使用 PortQry 获取有关 Tcp 端口和本地计算机上运行 PortQry 的 UDP 端口的详细信息,而不是查询远程目标计算机上的端口。 使用以下语法在本地模式下运行 PortQry:
portqry -local | -wpid <pid> | -wport <port_number> [-wt <seconds>] [-l <filename.txt>] [-v]
此语法中的占位符在下表中介绍了本地模式参数:
参数 | 说明 | 注释 |
---|---|---|
-local |
检索本地信息 |
|
-wport <port_number> |
监视端口 |
|
-wpid <pid> |
监视进程 ID (PID) |
|
-wt <seconds> |
在特定时间间隔检查 |
|
-l <filename.txt> |
生成日志文件 |
|
-y |
覆盖以前的日志文件 |
|
-v |
生成详细输出 | PortQry 为屏幕输出(以及日志文件(如果使用)提供了其他详细信息。 |
本地模式下参数的备注
-local
参数-wport
和-wpid
参数互斥。 单个 PortQry 命令字符串中只能使用这些参数之一。- 该
-q
参数在本地模式下不起作用。 - 在某些情况下,PortQry 可能会报告系统空闲进程(PID 0)正在使用一些 TCP 端口。 如果本地程序连接到 TCP 端口,然后停止,则可能会出现此行为。 即使程序不再运行,程序与端口的 TCP 连接也可能处于“计时等待”状态几分钟。 在这种情况下,PortQry 可能会检测到端口正在使用,但它无法识别正在使用端口的程序,因为 PID 已发布。 默认情况下,端口保持“计时等待”状态,最长的段生存期为两倍。
- 对于每个进程,PortQry 报告尽可能多的信息,因为它可以访问。 对某些信息的访问权限受到限制。 例如,禁止访问空闲和 CSRSS 进程的模块信息,因为它们的访问限制会阻止用户级代码打开它们。 为了获得最佳结果,请在本地管理员或具有类似凭据的帐户的上下文中运行本地模式命令。
- 使用任一
-wport
或-wpid
一起使用-l
时,使用 Esc 键中断和退出 PortQry,而不是 Ctrl+C。 必须按 Esc 以确保 PortQry 正确关闭日志文件并退出。 如果按 Ctrl+C 而不是 Esc 停止 PortQry,则日志文件可能变为空或已损坏。
在交互模式下使用 PortQry
排查计算机之间的连接问题时,可能需要键入许多重复命令。 在交互模式下使用 PortQry 可以更轻松地执行此类操作。
交互模式类似于 Nslookup DNS 实用工具或 Nblookup WINS 实用工具中的交互式功能。
若要在交互模式下启动 PortQry,请使用 -i
参数。 例如,运行以下命令:
portqry -i
此命令的输出类似于以下摘录:
Portqry Interactive Mode
Type 'help' for a list of commands
Default Node: 127.0.0.1
Current option values:
end port= 80
protocol= TCP
source port= 0 (ephemeral)
>
交互模式命令
可以在交互模式下使用以下命令:
命令 | 说明 | 注释 |
---|---|---|
node <name> 或 n <name> |
将目标设置为查询 |
|
query 或 q |
发送查询 |
|
set <option>=<value> |
设置查询选项的值 |
|
exit |
退出交互模式 |
交互式模式查询快捷方式
可以将以下快捷方式与命令结合使用 query
来运行常见查询,而无需设置端口和协议选项。 使用以下语法:
q <shortcut>
注意
在此命令中, <快捷方式> 表示下表中的一个快捷方式。 如果省略快捷方式,命令将 q
查询 TCP 端口 80。
快捷方式 | 要查询的端口 |
---|---|
dns |
TCP 端口 53、UDP 端口 53。 |
ftp |
TCP 端口 21 |
imap |
TCP 端口 143 |
ipsec |
UDP 端口 500 |
isa |
TCP 端口 1745、UDP 端口 1745 |
ldap |
TCP 端口 389、UDP 端口 389 |
l2tp |
UDP 端口 1701 |
mail |
TCP 端口 25、110 和 143 |
pop3 |
TCP 端口 110 |
rpc |
TCP 端口 135、UDP 端口 135 |
smtp |
TCP 端口 25 |
snmp |
UDP 端口 161 |
sql |
TCP 端口 1433、UDP 端口 1434 |
tftp |
UDP 端口 69 |
例如,在交互模式下输入 q dns
相当于在常规命令行模式下运行 portqry -n 127.0.0.1 -p both -e 135
。
交互模式选项
可以使用 set
命令设置源端口或慢链接延迟等选项。 使用以下语法:
set <option>=<value>
注意
在此命令中,<选项>表示要设置的选项的名称,值<>表示选项的新值。
选项 | 说明 | 注释 |
---|---|---|
set all |
显示选项的当前值 | |
set port=<port_number> set e=<port_number> |
指定目标端口 | <port_number>值表示要在目标计算机上查询的端口。 |
set sport=<port_number> set sp=<port_number> |
指定源端口 |
|
set protocol=<protocol> set p=<protocol> |
指定要使用的协议 | 协议<>值表示要查询的端口类型(tcp 或)。 udp both |
set cn=<community_name> |
指定 SNMP 社区 |
|
set nr |
关闭或打开反向名称查找 |
|
set sl |
打开或关闭慢速链接延迟 |
|
假设要查询 IP 地址为 10.0.1.10 的计算机。 在交互模式命令提示符下,输入 n 10.0.1.10
。 此命令生成类似于以下摘录的输出:
Default Node: 10.0.1.10
>
若要发送 DNS 查询,请在交互式模式命令提示符处输入 q dns
。 此命令生成类似于以下摘录的输出:
resolving service name using local services file...
UDP port resolved to the 'domain' service
IP address resolved to myserver.contoso.com
querying...
UDP port 53 (domain service): LISTENING
>
自定义端口和服务之间的关联
默认情况下,每个基于 Windows 的计算机都有一个位于 %SYSTEMROOT%\System32\Drivers\Etc 文件夹中的服务文件。 PortQry 使用此文件将端口号解析为其相应的服务名称。 PortQry 使用此信息来为其查询选择格式。 可以编辑此文件以指示 PortQry 将格式化消息发送到备用端口。 例如,以下条目显示在典型的 Services 文件中:
ldap 389/tcp #Lightweight Directory Access Protocol
可以编辑此端口条目或添加其他条目。 若要强制 PortQry 将 LDAP 查询发送到端口 1025,请修改条目,如下所示:
ldap 1025/tcp #Lightweight Directory Access Protocol
示例
以下示例演示如何使用 PortQry 及其参数:
本地模式
命令行模式
查询本地计算机
输出 portqry -local
类似于以下摘录:
TCP/UDP Port Usage
96 active ports found
Port Local IPState Remote IP:Port
TCP 80 0.0.0.0 LISTENING 0.0.0.0:18510
TCP 80 169.254.149.9 TIME WAIT 169.254.74.55:3716
TCP 80 169.254.149.9 TIME WAIT 169.254.200.222:3885
TCP 135 0.0.0.0 LISTENING 0.0.0.0:10280
UDP 135 0.0.0.0 :
UDP 137 169.254.149.9 :
UDP 138 169.254.149.9 :
TCP 139 169.254.149.9 LISTENING 0.0.0.0:43065
TCP 139 169.254.149.9 ESTABLISHED 169.254.4.253:4310
TCP 139 169.254.149.9 ESTABLISHED 169.254.74.55:3714
访问受限时查询本地计算机
在本地模式下运行 PortQry 时,如上例所示,你可能会看到类似于以下摘录的输出。 此类输出指示 PortQry 正在使用的安全上下文没有足够的权限来访问它请求的所有信息。
Port and Module Information by Process
Note: restrictions applied to some processes may
prevent Portqry from accessing more information
For best results run Portqry in the context of
the local administrator
======================================================
Process ID: 0 (System Idle Process)
PIDPortLocal IPState Remote IP:Port
0TCP 4442 169.254.113.96 TIME WAIT 169.254.5.136:80
0TCP 4456 169.254.113.96 TIME WAIT 169.254.5.44:445
Port Statistics
TCP mappings: 2
UDP mappings: 0
TCP ports in a TIME WAIT state: 2 = 100.00%
Could not access module information for this process
======================================================
使用特定间隔监视进程 ID
以下命令监视特定进程:
portqry.exe -wpid 1276 -wt 2 -v -l pid.txt
因此,PortQry 执行以下操作:
- 标识具有 1276 PID 的进程,并检查其每两秒使用的端口的状态,直到按 Esc。
- 创建日志文件 pid.txt。 如果存在具有该名称的文件,PortQry 会提示你确认要覆盖该文件。
- 记录日志文件中的任何输出,包括额外的详细输出。
日志文件的内容类似于以下摘录:
PortQry Version 2.0 Log File
System Date: <DateTime>
Command run:
portqry -wpid 1276 -wt 2 -v -l pid.txt
Local computer name:
host123
Watching PID: 1276
Checking for changes every 2 seconds
verbose output requested
Service Name: DNS
Display Name: DNS Server
Service Type: runs in its own process
============
System Date: <DateTime>
======================================================
Process ID: 1276 (dns.exe)
Service Name: DNS
Display Name: DNS Server
Service Type: runs in its own process
PIDPortLocal IPState Remote IP:Port
1276TCP 53 0.0.0.0 LISTENING 0.0.0.0:2160
1276TCP 1087 0.0.0.0 LISTENING 0.0.0.0:37074
1276UDP 1086 0.0.0.0 :
1276UDP 2126 0.0.0.0 :
1276UDP 53 127.0.0.1 :
1276UDP 1085 127.0.0.1 :
1276UDP 53 169.254.11.96 :
Port Statistics
TCP mappings: 2
UDP mappings: 5
TCP ports in a LISTENING state: 2 = 100.00%
Loaded modules:
C:\WINDOWS\System32\dns.exe (0x01000000)
C:\WINDOWS\system32\ntdll.dll (0x77F40000)
C:\WINDOWS\system32\kernel32.dll (0x77E40000)
C:\WINDOWS\system32\msvcrt.dll (0x77BA0000)
C:\WINDOWS\system32\ADVAPI32.dll (0x77DA0000)
C:\WINDOWS\system32\RPCRT4.dll (0x77C50000)
C:\WINDOWS\System32\WS2_32.dll (0x71C00000)
C:\WINDOWS\System32\WS2HELP.dll (0x71BF0000)
C:\WINDOWS\system32\USER32.dll (0x77D00000)
C:\WINDOWS\system32\GDI32.dll (0x77C00000)
C:\WINDOWS\System32\NETAPI32.dll (0x71C40000)
指定目标和协议
注意
本节中的每个示例都查询端口 80(默认端口)。
以下命令查询使用其完全限定域名(FQDN)指定的计算机上的默认 TCP 端口:
portqry -n myDomainController.example.com -p tcp
以下命令查询使用计算机名称指定的计算机上的默认 UDP 端口:
portqry -n myServer -p udp
以下命令查询使用其 IP 地址指定的计算机的默认 TCP 和 UDP 端口:
portqry -n 192.168.1.20 -p both
以下命令与上一个命令运行相同的查询,但跳过名称解析步骤:
portqry -n 192.168.1.20 -p both -nr
以下命令查询 Web 服务器的默认 TCP 端口:
portqry -n www.widgets.microsoft.com
指定一个或多个目标端口
以下命令通过查询 TCP 端口 25 来测试邮件服务器的 SMTP 服务:
portqry -n mail.example.com -p tcp -e 25
以下命令查询 IP 地址为 192.168.1.20 的计算机的 TCP 端口 60897 和 UDP 端口 60897:
portqry -n 192.168.1.20 -p both -e 60897
以下命令在计算机“myServer”上查询 UDP 端口 139、1025 和 135(序列中):
portqry -n myServer -p udp -o 139,1025,135
以下命令将计算机“myServer”上的端口范围从端口 135 查询到端口 139(含):
portqry -n myServer -p udp -r 135:139
指定 PortQry 输出的日志文件
以下命令在 mail.widgets.microsoft.com 上查询 TCP 端口 143,并记录portqry.txt文件中的输出。 如果文件已存在,则 PortQry 将覆盖它,而不会提示确认。
portqry -n mail.widgets.microsoft.com -p tcp -e 143 -l portqry.txt -y
查询慢速链接
以下命令在 mail.widgets.microsoft.com 上查询 TCP 端口 143、110 和 25。 对于每个目标端口,PortQry 等待响应的两倍。
portqry -n mail.widgets.microsoft.com -p tcp -o 143,110,25 -sl
指定源端口
以下命令使用本地计算机上的 UDP 端口 3001(如果可用)将查询发送到 192.168.1.20 上的 UDP 端口 53。 如果服务正在侦听该端口并响应查询,则会在本地计算机上将响应发送到 UDP 端口 3001。
portqry -p udp -e 53 -sp 3001 -n 192.168.1.20
以下命令使用本地计算机上的 UDP 端口 3000(如果可用)将查询发送到 myDomainController.contoso.com 上的 UDP 端口 389。 默认情况下,LDAP 服务应侦听此端口。 如果 LDAP 服务响应第一个查询,则 PortQry 使用临时源端口发送格式化的查询并接收任何响应。
portqry -n myDomainController.contoso.com -e 389 -sp 3000
使用批处理文件以静默模式运行 PortQry
以下文本是一个批处理文件的示例,该文件以静默模式运行 PortQry:
:Top
portqry -n 169.254.18.22 -e 443 -nr -l pqlog.txt -q
:end
运行此批处理文件时,PortQry 将生成名为 pqlog.txt的日志文件。 此文件的内容如下所示:
PortQry Version 2.0 Log File
System Date: Thu Sep 16 10:35:03 2021
Command run:
portqry -n 169.254.18.22 -e 443 -nr -l pqlog.txt -q
Local computer name:
SOURCESERVER
Querying target system called:
169.254.18.22
TCP port 443 (https service): LISTENING
========= end of log file =========
查询端口 135 (RPC 服务)
以下命令在 myServer 计算机上查询 UDP 端口 135。 默认情况下,RPC 服务应侦听此端口。
portqry -n myServer -p udp -e 135
因此,PortQry 执行以下操作:
- PortQry 使用 %SYSTEMROOT%\System32\Drivers\Etc 文件夹中的服务文件将 UDP 端口 135 解析为服务。 使用默认配置,PortQry 将端口解析为 RPC 终结点映射器服务(Epmap)。
- PortQry 将未格式化的用户数据报发送到目标计算机上的 UDP 端口 135。
PortQry 不会从目标端口接收响应。 这是因为 RPC 终结点映射器服务仅响应格式正确的 RPC 查询。 PortQry 报告端口正在 侦听或筛选。 - PortQry 创建格式正确的 RPC 查询,该查询请求当前注册到 RPC 终结点映射器的所有终结点。 PortQry 将此查询发送到目标计算机上的 UDP 端口 135。
- 根据响应,PortQry 执行以下操作之一:
- 如果 PortQry 收到对此查询的响应,则 PortQry 会向用户返回整个响应,并报告端口正在 侦听。
- 如果 PortQry 未收到对此查询的响应,则会报告端口已 筛选。
UDP port 135 (epmap service): LISTENING or FILTERED
Querying Endpoint Mapper Database...
Server's response:
UUID: 50abc2a4-574d-40b3-9d66-ee4fd5fba076
ncacn_ip_tcp:169.254.12.191[4144]
UUID: ecec0d70-a603-11d0-96b1-00a0c91ece30 NTDS Backup Interface
ncacn_np:\\MYSERVER[\PIPE\lsass]
UUID: e3514235-4b06-11d1-ab04-00c04fc2dcd2 MS NT Directory DRS Interface
ncacn_ip_tcp:169.254.12.191[1030]
UUID: e3514235-4b06-11d1-ab04-00c04fc2dcd2 MS NT Directory DRS Interface
ncadg_ip_udp:169.254.12.191[1032]
UUID: 12345678-1234-abcd-ef00-01234567cffb
ncacn_np:\\MYSERVER[\PIPE\lsass]
UUID: 12345678-1234-abcd-ef00-01234567cffb
ncacn_np:\\MYSERVER[\PIPE\POLICYAGENT]
Total endpoints found: 6
==== End of RPC Endpoint Mapper query response ====
UDP port 135 is LISTENING
在此输出中,不仅可以确定服务是否在端口上侦听,还可以确定目标计算机上的 RPC 终结点映射器数据库注册了哪些服务或程序。 输出包括每个程序的通用唯一标识符(UUID)、批注名称(如果存在)、每个程序使用的协议、程序绑定到的网络地址以及程序的终结点(方括号)。
注意
在 PortQry 命令中指定 -r
用于扫描一系列端口的选项时,PortQry 不会查询 RPC 终结点映射器以获取终结点信息。 此参数可加速扫描一系列端口。