Get-NetTCPConnection 连接排查
PowerShell 提供的连接查看命令,输出是结构化对象而不是文本表格,可以直接按状态与地址过滤、排序,还能把进程号接上进程信息。相比 netstat,它更适合写进脚本做批量与定期采集;相比任务管理器,它能一次看到所有连接与所属进程。排查外联时通常的做法是:先按状态筛出已建立的连接,排除本机环回地址,再用进程号反查进程名与路径。
基本信息
| 核心命令 | Get-NetTCPConnection;UDP 使用 Get-NetUDPEndpoint |
|---|---|
| 常用过滤 | -State Established、-LocalPort、-RemoteAddress |
| 进程定位 | OwningProcess 字段配合 Get-Process 反查进程名 |
| 补充信息 | CreationTime 给出连接建立时间,排查时间窗很有用 |
| 权限要求 | 查看全部连接需管理员权限 |
| 替代命令 | 旧系统用 netstat -ano 加 tasklist 组合 |
典型使用场景
- 确认主机是否存在对外的可疑连接,并定位到进程
- 按端口反查监听服务与占用进程
- 核对远程桌面、数据库等服务的访问来源
- 定期采集连接清单作为资产基线,便于发现新增外联
- 与进程命令行信息结合,形成完整的现场快照
外联与进程对照
外联与进程对照
Get-NetTCPConnection -State Established | Select-Object LocalAddress,LocalPort,RemoteAddress,RemotePort,State,OwningProcess | Sort-Object RemoteAddress
Get-NetTCPConnection -State Listen | Sort-Object LocalPort
Get-NetUDPEndpoint | Select-Object LocalAddress,LocalPort,OwningProcess | Sort-Object LocalPort | Select-Object -First 20
Get-NetTCPConnection -State Established | Where-Object { $_.RemoteAddress -notmatch '^(127\.|::1|10\.|192\.168\.)' } | ForEach-Object { [pscustomobject]@{Remote=($_.RemoteAddress + ':' + $_.RemotePort); Proc=(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName; Created=$_.CreationTime} }
Get-NetTCPConnection -RemoteAddress 203.0.113.10 -ErrorAction SilentlyContinue字段读法
| 字段 | 含义 | 异常信号 |
|---|---|---|
| LocalAddress 与端口 | 本机地址与端口 | 监听在 0.0.0.0 且端口非常规 |
| RemoteAddress 与端口 | 对端地址与端口 | 对端为陌生公网地址、端口高位或非标准 |
| State | 连接状态:Listen、Established、TimeWait 等 | 大量 TimeWait 说明连接频繁重建 |
| OwningProcess | 持有该连接的进程号 | 进程名与业务不符,或进程已退出无法反查 |
| CreationTime | 连接建立时间 | 与告警或文件落地时间吻合 |
进程号会被复用:凭一个 PID 判定「就是那个进程」之前,先核对进程的启动时间是否早于连接建立时间,否则容易把无关进程当成元凶。
别忘记 UDP:DNS 隧道与部分远控走 UDP,只看 TCP 会得到「没有异常连接」的错误结论。用 Get-NetUDPEndpoint 补一遍,并留意非标准端口的持续通信。
有公网连接不等于被控:更新服务、遥测、时间同步都会连公网。判断要看「地址加端口加进程」的组合是否符合业务身份,再结合时间与发起频率综合判断。