三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Windows端口检查全攻略:从Netstat到TCPView的实战指南

Windows端口检查全攻略:从Netstat到TCPView的实战指南

1. 端口检查:从“网络邻居”到“数字门牌”的认知升级

在Windows的世界里,网络连接就像一座繁忙的城市交通。你的电脑是城市中心,而每一个运行的程序,无论是浏览器、游戏客户端还是后台服务,都可能需要与外界(互联网)或其他内部程序(本地网络)进行通信。它们不能像人一样随意走动,而是必须通过固定的“门”进出,这些“门”在计算机网络中被称为“端口”。一个端口号,就是一个16位的数字,范围从0到65535,它和IP地址一起,构成了一个完整的通信端点,也就是我们常说的“套接字”。

想象一下,你家里的路由器分配给你的电脑一个内网IP,比如192.168.1.100。当你在浏览器里输入www.example.com时,浏览器默认会去连接example.com服务器的80端口(HTTP)或443端口(HTTPS)。同时,你的电脑上可能有一个文件共享服务正监听在445端口,等待局域网内其他设备的访问;一个远程桌面服务监听在3389端口;甚至一些不请自来的恶意软件,也可能偷偷打开一个端口,作为“后门”与攻击者通信。因此,了解你的Windows电脑上当前打开了哪些TCP/IP端口,哪些程序在使用它们,以及这些连接的状态,是一项至关重要的系统管理和安全自查技能。这不仅能帮你排查网络应用故障(比如“端口被占用”错误),更是发现潜在安全风险、优化系统性能的第一步。无论你是开发者、运维人员,还是希望更深入了解自己电脑的进阶用户,掌握端口检查方法都像拥有了一把查看系统网络活动的“内窥镜”。

2. 命令行利刃:Netstat与Get-NetTCPConnection的深度解析

对于习惯与系统直接对话的用户来说,命令行工具永远是最高效、最强大的选择。Windows提供了两个核心命令来查看端口信息:经典的netstat和PowerShell中的Get-NetTCPConnection。它们各有侧重,结合起来使用能获得最全面的视图。

2.1 经典工具Netstat:全能但需解读

netstat(网络统计)是一个历史悠久的命令行工具,几乎存在于所有操作系统中。它的输出信息非常丰富,但也因此需要一些解读技巧。

打开命令提示符(CMD)或PowerShell,输入最基本的命令:

netstat -ano

这里的参数是关键:

  • -a:显示所有连接和监听端口。
  • -n:以数字形式显示地址和端口号。强烈建议始终加上,否则它会尝试将IP解析为主机名、将端口号解析为服务名(如80->http),这会拖慢显示速度,并且在网络有问题时可能导致命令卡住。
  • -o:显示每个连接关联的进程ID(PID)。这是将端口与具体程序关联起来的核心参数。

执行后,你会看到一个类似下面的列表:

协议 本地地址 外部地址 状态 PID TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1100 TCP 192.168.1.100:139 0.0.0.0:0 LISTENING 4 TCP 192.168.1.100:5040 0.0.0.0:0 LISTENING 7412 TCP 192.168.1.100:5353 192.168.1.255:5353 ESTABLISHED 5356 TCP [::]:445 [::]:0 LISTENING 4 UDP 0.0.0.0:5353 *:* 5356

如何解读这张表?

  • 协议:通常是TCP或UDP。TCP是面向连接的可靠协议,UDP是无连接的。我们主要关注TCP端口。
  • 本地地址IP地址:端口号0.0.0.0表示监听所有网络接口(网卡)上的连接;127.0.0.1localhost表示仅监听本机内部的环回连接;像192.168.1.100:5353这样的,表示监听在特定IP的特定端口上。
  • 外部地址:远程连接的地址。对于监听状态(LISTENING)的端口,这里通常是0.0.0.0:0
  • 状态:这是理解连接活动的关键。
    • LISTENING:表示该端口正在开放并等待传入连接。这是我们需要重点审查的状态,尤其是那些监听在0.0.0.0(所有接口)上的高权限端口。
    • ESTABLISHED:表示一个活跃的、正在进行数据传输的连接。
    • TIME_WAIT/CLOSE_WAIT:表示连接正在关闭过程中,通常是正常的。
  • PID:进程标识符。有了它,我们才能知道是哪个程序打开了这个端口。

注意netstat -ano的输出是瞬时的,只反映命令执行那一刻的网络状态。对于监控动态变化的连接(如下载、视频流),你可能需要结合其他命令或工具。

进阶用法与过滤

  • 只查看TCP连接netstat -ano -p tcp
  • 只查看监听端口netstat -ano | findstr LISTENING(在CMD中)或netstat -ano | Select-String LISTENING(在PowerShell中)。
  • 查找特定端口:例如查找谁占用了8080端口:netstat -ano | findstr :8080
  • 查找特定PID:如果你知道一个程序的PID,想看看它打开了哪些端口:netstat -ano | findstr PID号,例如findstr 7412

2.2 PowerShell的现代武器:Get-NetTCPConnection

对于Windows 8/Server 2012及更高版本的系统,PowerShell提供了更面向对象、更易于筛选和处理的cmdlet——Get-NetTCPConnection。它的输出默认就更整洁,并且能无缝集成到PowerShell的管道中做进一步处理。

打开PowerShell,输入:

Get-NetTCPConnection

你会得到一份包含本地地址、本地端口、远程地址、远程端口、状态以及关联的进程ID(OwningProcess)的列表。信息结构与netstat类似,但默认格式更友好。

它的强大之处在于强大的筛选能力

  • 查看所有监听端口Get-NetTCPConnection -State Listen
  • 查看所有已建立连接Get-NetTCPConnection -State Established
  • 按本地端口筛选Get-NetTCPConnection -LocalPort 443
  • 按远程IP筛选Get-NetTCPConnection -RemoteAddress 192.168.1.1
  • 组合筛选并格式化输出:这是一个非常实用的命令,它能清晰展示监听端口及其对应的进程名:
    Get-NetTCPConnection -State Listen | Select-Object LocalAddress, LocalPort, @{Name="ProcessName"; Expression={(Get-Process -Id $_.OwningProcess).Name}}, OwningProcess | Format-Table -AutoSize
    这个命令做了以下几件事:
    1. Get-NetTCPConnection -State Listen获取所有监听状态的TCP连接。
    2. Select-Object选择要显示的字段,并创建一个计算属性ProcessName
    3. (Get-Process -Id $_.OwningProcess).Name通过管道中当前对象的OwningProcess(PID)来获取进程的名称。
    4. Format-Table -AutoSize以表格形式美观输出。

Netstat vs. Get-NetTCPConnection 如何选择?

  • 兼容性netstat几乎存在于所有Windows版本,甚至在安全模式、恢复环境下都可能可用,是“最后的保障”。Get-NetTCPConnection需要较新的系统和PowerShell环境。
  • 信息量netstat -ano默认包含UDP信息,而Get-NetTCPConnection只处理TCP。查看UDP端口需使用Get-NetUDPEndpoint
  • 易用性:对于简单的查看,两者区别不大。但对于自动化脚本、复杂筛选和数据处理Get-NetTCPConnection的PowerShell对象特性让它具有压倒性优势。你可以轻松地将结果导出为CSV、JSON,或者与其他系统信息组合查询。

3. 图形化界面:资源监视器与TCPView的直观透视

不是所有人都喜欢命令行。对于图形界面爱好者或需要更直观、实时监控的场景,Windows自带和第三方工具提供了出色的解决方案。

3.1 系统自带:资源监视器

资源监视器是一个被严重低估的系统组件,它集成了性能、CPU、内存、磁盘和网络监控。

  1. 按下Ctrl + Shift + Esc打开任务管理器。
  2. 切换到“性能”选项卡,点击左下角的“打开资源监视器”。
  3. 在资源监视器窗口中,切换到“网络”选项卡。

在这里,你可以看到:

  • “带有网络活动的进程”:列表显示了所有正在进行网络通信的进程,以及它们发送/接收的字节数。你可以在这里排序,快速找到最“活跃”的程序。
  • “TCP连接”:这部分与netstat的输出对应,但以表格形式呈现,更易读。它列出了所有TCP连接的本地地址/端口、远程地址/端口、状态、数据包丢失和延迟(非常有用!)。
  • “侦听端口”这是查看开放端口的黄金位置。它清晰地列出了所有处于LISTENING状态的端口、对应的地址以及进程名称和PID。你可以直接在这里排序端口号,快速找到某个特定端口(如8080, 3306)是被哪个程序占用的。

资源监视器的优势

  • 集成度高:无需额外安装,与系统深度集成。
  • 实时性:数据是动态更新的,你可以看到网络活动的实时变化。
  • 关联性强:轻松在进程、连接、端口视图之间建立联系。
  • 性能指标:提供了数据包丢失和延迟,这对诊断网络质量问题很有帮助。

3.2 第三方神器:Sysinternals TCPView

如果说资源监视器是瑞士军刀,那么微软Sysinternals套件中的TCPView就是专业的手术刀。它由著名的Windows内核专家Mark Russinovich开发,完全免费,无需安装(单文件执行)。

运行TCPView后,它会以一个持续刷新的列表展示所有TCP和UDP端点。它的界面色彩丰富,信息直观:

  • 颜色编码:新建立的连接会以绿色高亮显示,关闭的连接会以红色显示然后消失,这让网络活动一目了然。
  • 进程信息:直接显示进程名、PID以及完整的进程路径。这对于识别伪装成系统进程的恶意软件极其有用。
  • 右键菜单功能强大
    • 结束进程:可以直接结束占用端口的进程(需管理员权限)。
    • 关闭连接:可以强制关闭一个已建立的TCP连接,而不结束进程本身。
    • Whois:可以对远程IP地址执行Whois查询(需联网)。
    • 属性:查看进程的详细信息。
  • 过滤功能:可以快速过滤显示特定进程、端口或状态的连接。

TCPView的核心价值在于动态监控和深度进程关联。当你在排查“端口冲突”问题时,打开TCPView,然后启动你的应用程序,你可以立刻看到它试图绑定到哪个端口,以及是否已经有其他进程(可能是之前未正常退出的实例)占用了该端口。这种实时可视化的能力是命令行工具难以比拟的。

使用建议

  • 日常快速查看,用资源监视器的“侦听端口”选项卡就够了。
  • 当需要进行深入的网络活动分析、排查疑难杂症,或者需要“杀死”特定连接时,TCPView是你的不二之选。首次运行时可能需要接受许可协议,建议将其放入你的“工具箱”文件夹。

4. 端口排查实战:从“被占用”到“查木马”的完整流程

了解了工具,我们来演练几个真实的场景,将知识串联起来。

4.1 场景一:解决“端口已被占用”错误

这是开发者最常见的场景。当你启动一个Web服务器(如Tomcat on 8080)、数据库(MySQL on 3306)或任何网络服务时,系统提示“Address already in use”。

标准排查流程:

  1. 定位占用者

    • 命令行快速定位:打开PowerShell,运行:
      # 查找占用8080端口的进程 Get-NetTCPConnection -LocalPort 8080 -ErrorAction SilentlyContinue | Select-Object OwningProcess, State
      如果找到,记下PID。如果没找到,尝试用netstat再确认一次:netstat -ano | findstr :8080
    • 图形化定位:打开资源监视器 -> “网络”选项卡 -> “侦听端口”,按本地端口排序,找到8080端口,查看对应的进程名。
  2. 识别进程

    • 如果通过PID查找,在任务管理器的“详细信息”选项卡中,按PID排序找到该进程,或者直接在PowerShell中运行:
      Get-Process -Id <PID>
    • 查看进程的“命令行”列(在任务管理器中需右键点击列标题添加该列),这能帮你确认这是否是你自己之前启动的未退出的服务实例。
  3. 采取行动

    • 如果是已知的正常进程:比如另一个Tomcat实例。你有两个选择:
      • 停止该进程:在任务管理器或命令行(taskkill /PID <PID> /F)中结束它。/F参数表示强制结束。
      • 修改配置:将你的新服务改为使用另一个空闲端口。
    • 如果是未知进程:需要提高警惕。记录下进程名和路径,用搜索引擎查询一下。可能是系统服务,也可能是潜在的恶意软件。

4.2 场景二:安全自查——发现可疑监听端口

系统安全要求我们定期检查是否有不熟悉的端口在监听,尤其是监听在0.0.0.0(所有接口)上的高危端口。

自查步骤:

  1. 获取基线:首先,了解你系统在“干净”状态下的正常监听端口。在一台新装或确认安全的系统上,运行Get-NetTCPConnection -State Listen并保存结果。常见的系统端口如135(RPC)、445(SMB)、3389(RDP)等会出现在这里。
  2. 定期检查与对比:定期运行上述命令,与基线对比。重点关注:
    • 高位端口:1024以上的端口,通常是用户程序开启的。突然出现一个陌生的高位端口在监听,需要调查。
    • 陌生进程名:监听端口对应的进程名你不认识,或者看起来是伪装成系统进程的(如svchost.exe是正常的,但scvhost.exe就极其可疑)。
    • 非本地监听:除了127.0.0.1::1(IPv6本地环回)之外,如果发现服务只监听在公网IP或0.0.0.0上,而你认为它不应该对外公开,就需要检查其配置。
  3. 深度调查可疑端口
    • 使用TCPView,右键点击可疑进程 -> “属性”,查看其文件路径、公司名称、数字签名等信息。未签名或路径在临时文件夹的程序风险很高。
    • 使用Get-Process -Id <PID> | Select-Object Path, Company查看进程详细信息。
    • 在搜索引擎中搜索“端口号 + 木马”或进程名,看看是否有相关的安全报告。
  4. 使用专门工具:对于深度安全排查,可以结合使用微软的Autoruns(查看所有自启动项)和Process Explorer(比任务管理器更强大的进程查看器),看看可疑进程是否设置了自启动,以及它加载了哪些DLL模块。

4.3 场景三:网络连接故障排查

你的应用程序无法连接到某个服务器,或者连接异常缓慢。

  1. 检查连接状态:使用Get-NetTCPConnection -RemoteAddress <服务器IP>查看与目标服务器的所有连接状态。如果状态是SYN_SENT(持续),可能表示防火墙阻止了出站连接或网络不通。如果是ESTABLISHED但没有数据流,可能是应用层问题。
  2. 检查本地监听:确认你的客户端程序是否成功打开了本地端口(通常是随机高位端口)用于连接。如果根本没有出站连接记录,可能是程序本身没有发起连接请求。
  3. 利用资源监视器:在资源监视器的“TCP连接”视图中,找到目标连接,观察“数据包丢失”和“延迟”列。高丢失率或高延迟直接指向网络质量问题。
  4. 结合防火墙日志:如果怀疑是防火墙拦截,需要查看Windows防火墙的高级安全日志(需预先启用日志记录),或者第三方防火墙软件的日志。

5. 进阶技巧与自动化监控脚本

对于需要频繁检查或自动化运维的场景,将上述命令封装成脚本会极大提升效率。

5.1 一键式端口-进程查询脚本

创建一个PowerShell脚本(例如portcheck.ps1),内容如下:

# 定义要查询的端口,可以修改这个数组 $portsToCheck = @(80, 443, 8080, 3306, 3389) Write-Host "正在检查指定端口的监听情况..." -ForegroundColor Cyan foreach ($port in $portsToCheck) { $connections = Get-NetTCPConnection -LocalPort $port -ErrorAction SilentlyContinue if ($connections) { foreach ($conn in $connections) { $proc = Get-Process -Id $conn.OwningProcess -ErrorAction SilentlyContinue $procName = if ($proc) { $proc.Name } else { "PID: $($conn.OwningProcess) (进程可能已结束)" } Write-Host "端口 $port 被占用 - 状态: $($conn.State), 进程: $procName ($($conn.OwningProcess)), 本地地址: $($conn.LocalAddress):$($conn.LocalPort)" -ForegroundColor Yellow } } else { Write-Host "端口 $port 未被占用。" -ForegroundColor Green } } Write-Host "`n所有TCP监听端口及对应进程:" -ForegroundColor Cyan Get-NetTCPConnection -State Listen | Select-Object LocalAddress, LocalPort, @{Name="ProcessName"; Expression={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).Name}}, OwningProcess | Sort-Object LocalPort | Format-Table -AutoSize

这个脚本首先检查你关心的特定端口,然后列出所有监听端口。保存后,在PowerShell中右键点击脚本文件选择“使用PowerShell运行”,或者以管理员身份运行PowerShell,然后执行.\portcheck.ps1

5.2 监控异常外联脚本

一个简单的监控脚本,用于记录所有新建立的、连接到非内网地址的TCP连接,可用于发现可疑外联:

# 记录文件路径 $logFile = "C:\Logs\ExternalConnections_$(Get-Date -Format 'yyyyMMdd').log" # 定义内网网段(根据你的网络修改) $internalSubnets = @("192.168.0.0/16", "10.0.0.0/8", "172.16.0.0/12") # 将CIDR转换为IP地址范围比较函数(此处省略函数体,实际脚本中需实现) # function Test-IPInSubnet { ... } # 获取当前所有已建立连接 $previousConnections = @(Get-NetTCPConnection -State Established | Where-Object { $_.RemoteAddress -ne '0.0.0.0' -and $_.RemoteAddress -ne '::' }) Start-Transcript -Path $logFile -Append Write-Output "监控开始于 $(Get-Date)" while ($true) { Start-Sleep -Seconds 5 # 每5秒检查一次 $currentConnections = @(Get-NetTCPConnection -State Established | Where-Object { $_.RemoteAddress -ne '0.0.0.0' -and $_.RemoteAddress -ne '::' }) # 找出新增的连接(简化逻辑,实际应用中需更严谨的比较) foreach ($conn in $currentConnections) { # 这里应调用 Test-IPInSubnet 判断是否为内网IP,假设不是内网则记录 $isInternal = $false foreach ($subnet in $internalSubnets) { # 伪代码:if (Test-IPInSubnet -IP $conn.RemoteAddress -Subnet $subnet) { $isInternal = $true; break } } if (-not $isInternal) { $proc = Get-Process -Id $conn.OwningProcess -ErrorAction SilentlyContinue $procName = if ($proc) { $proc.Name } else { "Unknown" } Write-Output "[$(Get-Date)] 新外联 - 远程: $($conn.RemoteAddress):$($conn.RemotePort), 本地端口: $($conn.LocalPort), 进程: $procName (PID: $($conn.OwningProcess))" } } $previousConnections = $currentConnections }

重要提示:上述监控脚本是一个概念示例。实际部署需要完善IP子网判断函数、去重逻辑、性能优化,并以计划任务或服务形式运行。频繁查询网络连接会对系统产生轻微负载。

5.3 防火墙与端口的联动认知

检查端口时,必须意识到防火墙的存在。Windows防火墙(或其他第三方防火墙)可以允许或阻止流量到达某个端口,即使该端口正在监听。

  • 查看防火墙规则:在PowerShell中,可以使用Get-NetFirewallRuleGet-NetFirewallPortFilter来查看现有的入站/出站规则。例如,查看所有允许入站连接的规则:Get-NetFirewallRule -Direction Inbound -Action Allow | Where-Object {$_.Enabled -eq 'True'} | Format-Table Name, DisplayName, Direction, Action -AutoSize
  • 端口开放 != 服务可达:一个端口在netstat中显示为LISTENING,只表示有程序绑定了它。如果防火墙有一条阻止规则针对该端口,外部连接依然无法成功。因此,在诊断“从外部连不上”的问题时,需要同时检查本地监听状态和防火墙规则。

掌握端口检查,就如同掌握了Windows网络活动的脉搏。从简单的命令行查询到图形化实时监控,再到自动化脚本,这些工具和方法构成了你诊断网络问题、保障系统安全的基石。我个人的习惯是,在搭建任何新服务后,都会用Get-NetTCPConnection -State Listen快速扫一眼,确认服务监听的地址和端口是否符合预期;在感觉系统网络异常缓慢时,会打开资源监视器看看哪个进程在大量收发数据。把这些检查变成一种习惯,你对系统的掌控力会提升一个数量级。

← 返回列表