使用 PortQry 命令行工具
PortQry 是一种命令行工具,可用于帮助排查 TCP/IP 连接问题。 此工具在本地计算机或远程计算机上报告目标 TCP 和用户数据报协议 (UDP) 端口的状态。 它还提供有关本地计算机的端口使用情况的详细信息。
由于 PortQry 旨在用作故障排除工具,因此使用它来排查特定问题的用户应充分了解其计算环境。
可以通过以下几种模式之一从命令提示符使用 PortQry:
注意
可以下载名为 PortQryUI 的单独工具,其中包含 PortQry 的图形 UI。 PortQryUI 具有多个功能,可简化使用 PortQry。 若要获取 PortQryUI 工具,请参阅 PortQryUI - PortQry 命令行端口扫描程序的用户界面。
适用于: 支持的 Windows 版本
PortQry 测试和结果
典型的端口扫描工具报告,如果目标 UDP 端口未返回 Internet 控制消息协议 (ICMP) “目标无法访问”消息,则端口处于 侦听 状态。 由于以下一个或两个原因,此结果可能不准确:
- 如果没有对定向数据报的响应,则目标端口可能是 FILTERED。
- 大多数服务不会响应发送给它们的未格式化用户数据报。 通常,侦听端口的服务或程序仅响应使用特定会话层或应用程序层协议的消息。
为了生成更准确和有用的结果,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 查询)
- ) netBIOS 查询 (MAC 地址
- (ISA Server 查询) Mspclnt.ini 文件信息
- PortQry 将分析、格式化,然后返回来自服务或程序的响应,作为其测试报告的一部分。
用于对本地计算机进行故障排除的其他测试
如果必须对安装了 PortQry 的计算机上的端口进行故障排除,请在本地模式下使用 PortQry。 在命令行中使用本地模式参数时,可以在本地计算机上执行如下任务:
- 枚举端口映射
- 监视特定端口的更改
- 监视特定流程的更改
有关详细信息,请参阅 在本地 (命令行) 模式下使用 PortQry。
在命令行模式下使用 PortQry
可以在命令提示符处以与任何其他命令行工具相同的方式运行 PortQry。 本文中的大多数示例都演示了命令行 PortQry 命令。 在命令行模式下,可以将多个选项添加到命令字符串,以指定要运行哪些查询以及如何运行它。 若要在命令行模式下运行 PortQry,请运行使用以下语法的命令:
portqry.exe -n <name_to_query> [options]
注意
在此命令中, <name_to_query> 是要查询的 IP 地址、计算机名称或域。 此参数是必需的。 [options] 是可选参数。
命令行模式的 PortQry 参数
以下参数在常规命令行模式下可用:
参数 | 说明 | Comments |
---|---|---|
-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 确定端口未侦听或已筛选之前,使用此参数将 PortQry 等待来自 UDP 端口的响应的时间加倍。 查询慢速或不可靠的网络链接时,正常的等待时间可能太短,无法接收响应。 |
-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 来获取有关运行 PortQry 的本地计算机上的 TCP 端口和 UDP 端口的详细信息,而不是查询远程目标计算机上的端口。 使用以下语法在本地模式下运行 PortQry:
portqry -local | -wpid <pid> | -wport <port_number> [-wt <seconds>] [-l <filename.txt>] [-v]
此语法中的占位符在以下本地模式参数表中进行了说明:
参数 | 说明 | Comments |
---|---|---|
-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 进程的模块信息,因为它们的访问限制阻止用户级代码打开它们。 为了获得最佳结果,请在本地管理员或具有类似凭据的帐户的上下文中运行本地模式命令。
- 将 或
-wpid
与-l
结合使用-wport
时,请使用 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)
>
交互模式命令
可以在交互模式下使用以下命令:
命令 | 说明 | Comments |
---|---|---|
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>
注意
在此命令中,<选项>表示要设置的选项的名称,值><表示选项的新值。
选项 | 说明 | Comments |
---|---|---|
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> |
指定要使用的协议 |
协议><值表示查询 (、 udp 或 both ) tcp 的端口类型。 |
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 将格式化消息发送到备用端口。 例如,以下条目显示在典型的服务文件中:
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,即默认端口。
以下命令查询计算机上的默认 TCP 端口,该端口使用其完全限定的域名 (FQDN) :
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
以下命令查询从端口 135 到端口 139 的端口范围, (计算机“myServer”上的端口范围(包括) ):
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 文件夹中的 Services 文件将 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 终结点映射程序以获取终结点信息。 此参数可加速扫描一系列端口。