“查看 Windows IP”这五个字,放在任何一个运维群里,大概率会被当成一句废话——谁还不会打开命令提示符敲一下 ipconfig?但我带过的新人里,至少有一半在第一次做远程支持时栽在这上面:用户念出来的地址是 192.168.1.10,他记成了 192.168.1.1O;机器上插着网线、连着无线、还跑着两个虚拟机网卡,ipconfig 一屏刷出来五段 IPv4,他随手挑了一个填进工单,结果后面的排查方向从头到尾都是错的。所以这篇东西不打算教“怎么查 IP”这种一句话就能讲完的事,而是想把查看 Windows IP 这个动作拆到骨头里:不同场景该走哪条路径、输出的每一行到底在说什么、多网卡和虚拟网卡怎么排除、怎么把这个动作变成一条能批量跑、能存档、能贴进工单的脚本。不管你是刚接触 Windows 桌面的新手,还是天天被同事喊去“帮忙看下网络”的半吊子运维,把下面这些内容过一遍,至少能保证你报出去的地址是对的。
1. 先把“查看IP”这件事拆开:你到底要看哪个IP
1.1 四类真实场景决定了你该用哪条命令
很多人以为“查 IP”是一个动作,实际上它至少对应四种完全不同的需求,选错路径的代价差别很大。第一种是自己机器上看一眼,比如配个本地开发环境、连个打印机、填个远程桌面的白名单,这种场景图形界面三十秒就能搞定,没必要开命令行。第二种是远程指导别人看,电话那头的人可能连“命令提示符”在哪都不知道,你得用最不容易出错的方式,通常是让对方按 Win+R 输入 cmd 再敲一条短命令,甚至直接让他打开设置页面截图。第三种是批量采集,公司要做资产盘点、要核对某批机器的网段归属、要排查哪台设备占了 IP,这时候手工一条条看就是灾难,必须上 PowerShell 脚本导出表格。第四种是排障取证,机器时好时坏、IP 会变、网关丢包,你要的不只是一个地址,而是地址、掩码、网关、DNS、MAC、租约时间这一整套快照,还得能对比前后两次的差异。
这四类场景对应的工具链完全不一样:图形界面适合第一类和第二类,ipconfig 的完整输出适合第四类,PowerShell 的 Get-NetIPConfiguration 系列适合第三类。我在实际工作中见过太多人拿图形界面去做资产盘点,拿着截图一个个手敲进 Excel,敲到第五十台就开始出错。工具选型这件事上没有绝对的好坏,只有匹配不匹配,先想清楚你是“看一眼”还是“存一份”,后面的路径自然就定了。
1.2 IPv4、IPv6、私网、公网:几个必须先分清的概念
打开任何一台 Windows 机器执行 ipconfig,你大概率会看到不止一个地址,所以有几个概念必须先厘清,否则看到一堆数字只会更晕。IPv4 地址是我们最熟悉的那串四段数字,比如 192.168.1.37,它是当前绝大多数内网环境的主力。IPv6 地址长得像 2408:8207:1234:5678:abcd:ef01:2345:6789 这种,或者以 fe80 开头的一长串,前者是全球可路由的地址,后者是链路本地地址,只在同一段链路内有效,出了这台交换机就没意义。Windows 默认同时启用两套协议栈,所以你会看到两类地址并存,这属于正常现象,不是“中病毒了”。
再往下是私网地址和公网地址的区别,这个区分对排查问题极其关键。私网地址只有三段:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。你家路由器分给你的 192.168.1.x、公司里常见的 10.20.x.x、云主机内网的 172.17.x.x,全都属于这三段。私网地址的特点是只能在自己的网络内部使用,出了边界就失效,所以你在本机 ipconfig 里看到的地址,绝大多数情况下不可能是“对外网显示的地址”。这一点特别重要,后面第 5 节会专门展开。
还有一个容易被忽略的:回环地址 127.0.0.1,它指向本机自己,任何机器上都有,跟网卡状态无关。以及169.254 开头的地址,这个段叫 APIPA,当机器启用了自动获取地址但没能从 DHCP 服务器拿到租约时,系统会自己随便挑一个 169.254.x.x 顶上,看起来“有 IP”,实际上根本不通外网——看到这个段,基本可以直接判定为“没拿到地址”,而不是“网络正常但打不开网页”。把这几类地址的特征记牢,很多问题在看到输出的第一眼就能定性。
2. 图形界面:最快出结果,但也最容易看错
2.1 三条常用入口与各自的显示差异
Windows 里通往 IP 信息的图形入口至少有四条,但常用的就三条,而且它们显示的内容并不完全一致,这一点很多人没注意。最直接的是任务栏网络图标右键 → 打开网络和 Internet 设置 → 属性,这条路能看到当前连接下的 IPv4 地址、子网掩码、默认网关、DNS 服务器,信息比较全,缺点是只显示“当前活动连接”,如果你有多块网卡,其他网卡的信息在这里看不到。
第二条是控制面板 → 网络和共享中心 → 更改适配器设置,也就是常说的“网络连接”窗口。这个窗口的好处是一次列出所有适配器,包括已断开、已禁用的,右键某个适配器点“状态 → 详细信息”,能看到该适配器完整的地址、DHCP 状态、租约时间、MAC 地址。做远程支持时我更喜欢让对方走这条路,因为窗口里的图标状态一目了然,网线插没插、是不是红叉、是不是黄色感叹号,一眼可见。
第三条是Win+R 输入 ncpa.cpl 直接打开网络连接窗口,比从控制面板一层层点进去快得多,这条我基本是条件反射在用。至于“设置”应用里的网络状态页,它把 IPv4 地址藏得比较深,需要点进具体连接的属性里才能看到,日常用起来反而绕。
2.2 “网络连接”窗口里的隐藏信息
网络连接窗口真正有价值的地方,不是它显示了多少,而是它能帮你排除掉多少干扰。一块适配器图标是灰色的、显示“网络电缆被拔出”,那就说明物理层没通,此时你去看 IP 没有任何意义,先去查线、查交换机端口。图标上有个黄色感叹号,通常意味着链路通了但拿不到有效配置,结合后面要讲的 169.254 段就能快速定位。图标正常但显示“未识别的网络”,多半是网关或 DHCP 那边的问题,也可能是网段配置和实际拓扑对不上。
还有一个细节:这个窗口里默认不显示隐藏的适配器。有些机器装过虚拟机软件、装过某些客户端之后,会留下一堆已禁用但依然存在的虚拟适配器,它们不在这个窗口里显示,但 ipconfig /all 会老老实实把它们列出来。所以如果你发现命令行输出的适配器数量比图形界面多,别慌,这是正常的,勾上“显示隐藏的设备”或者直接在设备管理器里开启“显示隐藏的设备”就能看到全貌。我在排查“机器上莫名多出一个网段”这类问题时,第一步永远是先确认到底有几块适配器在活动,而不是急着改配置。
2.3 图形界面最容易踩的三个坑
第一个坑是把虚拟网卡当成物理网卡。装了 Hyper-V、VMware、VirtualBox、Docker Desktop、WSL 的机器,几乎必然会出现 vEthernet 开头的适配器,它们的地址段往往和物理网络完全不同,比如物理网是 192.168.1.x,虚拟网卡是 172.28.x.x。新手看到两个 IPv4 地址,第一反应是“我是不是有双 IP”,然后开始怀疑人生。判断方法很简单:看适配器名称,vEthernet、VMnet、VirtualBox Host-Only 这类基本都是虚拟的;再不行就看 MAC 地址前缀,虚拟网卡的 MAC 往往是固定前缀。
第二个坑是只看到一个地址就以为是全部。有些机器的活动连接不止一个,比如有线连着内网、无线连着另一个网络,图形界面默认只展示“当前用于访问 Internet 的那个连接”,另一个就被隐藏了。这种情况下 ipconfig 反而是更可靠的入口。
第三个坑是截图信息不全。远程支持时让对方截图,经常只截了 IP 那一行,掩码和网关都没了,我只能再问一遍。后来我学乖了,直接告诉对方“打开网络连接 → 右键属性 → 把整个详细信息窗口截全”,或者干脆让他跑一条命令输出到文件。图形界面的问题就在于此:它很友好,但友好往往意味着信息被裁剪过,而排障恰恰需要那些被裁掉的部分。
3. 命令行三件套:ipconfig、netsh、getmac
3.1 ipconfig 的参数组合与输出逐行解读
ipconfig 是查看 Windows IP 最经典的命令,但真正会用它的人不多,大部分人只会敲一个裸的 ipconfig 看个大概。裸命令输出的是“简化视图”:连接名、IPv4 地址、子网掩码、默认网关,够用但不够全。真正做排障必须用ipconfig /all,它会额外给出物理地址(MAC)、DHCP 是否启用、租约获得时间和过期时间、DNS 服务器列表、是否启用了 NetBIOS over TCP/IP。这些信息在判断“地址是静态配的还是自动获取的”“租约什么时候到期”“DNS 到底指向哪”时是决定性的。
举个实际的例子。假设输出是这样的:
以太网适配器 以太网: 连接特定的 DNS 后缀 . . . . . . . : 描述. . . . . . . . . . . . . . . : Realtek PCIe GbE Family Controller 物理地址. . . . . . . . . . . . . : 3C-7C-3F-1A-2B-9C DHCP 已启用 . . . . . . . . . . . : 是 自动配置已启用. . . . . . . . . . : 是 IPv4 地址 . . . . . . . . . . . . : 192.168.1.37(首选) 子网掩码 . . . . . . . . . . . . : 255.255.255.0 获得租约的时间 . . . . . . . . . : 2024年5月12日 8:31:07 租约过期的时间 . . . . . . . . . : 2024年5月13日 8:31:06 默认网关. . . . . . . . . . . . . : 192.168.1.1 DHCP 服务器 . . . . . . . . . . . : 192.168.1.1 DNS 服务器 . . . . . . . . . . . : 192.168.1.1这里面几个点值得展开。“首选”两个字表示这个地址是当前主用地址,如果出现多个 IPv4 且标注不同(比如“临时”),说明存在地址漂移或多重配置。子网掩码 255.255.255.0等价于前缀长度 /24,换算方法是把掩码写成二进制,数连续的 1 有多少个:255 是 8 个 1,三个 255 就是 24 个 1,所以是 /24。反过来,看到 /22 就要知道掩码是 255.255.252.0——第三段 252 的二进制是 11111100,只有 6 个 1,加上前两段的 16 个,共 22 个。
知道掩码之后就能算网段。以 192.168.1.37/24 为例,网络地址是 192.168.1.0,广播地址是 192.168.1.255,可用主机范围是 192.168.1.1 到 192.168.1.254,可用数量 2^(32-24)-2 = 254 个。再举个稍复杂的:10.20.30.40/22,块大小是 2^(24-22) = 4,那么第三个八位按 4 的倍数切块,28、32、36……30 落在 28 和 32 之间,所以网络地址是 10.20.28.0,广播是 10.20.31.255,可用范围 10.20.28.1 到 10.20.31.254。这个计算看着枯燥,但当你发现两台机器的 IP 看起来都是 10.20.x.x 却 ping 不通时,用它一验就知道是不是被 /22 的边界切到了不同子网。
租约时间那一对也很有用。如果获得的租约是几小时前、过期时间就在明天,说明 DHCP 工作正常;如果租约获得时间是几个月前,那这地址可能是长期保留的;如果你看到的是 169.254 段而 DHCP 已启用,那基本可以判定为 DHCP 服务器没响应。DNS 服务器这一行在有多个地址时会全部列出,顺序就是查询优先级,前两个不通会拖慢解析速度,这也是“网页打开慢但能打开”的常见原因。
除了 /all,还有几个参数值得记住:ipconfig /release释放当前 DHCP 租约,ipconfig /renew重新申请,这两个组合起来是解决“IP 冲突、地址不对”的第一招;ipconfig /flushdns清空 DNS 解析缓存,改完 hosts 或者刚换 DNS 服务器时必须执行;ipconfig /displaydns把当前缓存全列出来,排查“为什么这台机器解析到旧地址”时特别管用;ipconfig /registerdns让机器主动去更新自己的 DNS 记录,适合域环境里机器改名之后用。
注意:/release 和 /renew 会让网络短暂中断,远程操作时千万别对着自己正在用的那条连接执行,否则会话直接断掉,人还得跑一趟现场。
3.2 netsh 的结构化输出,适合贴进工单
如果说 ipconfig 是“看一眼”,netsh 就是“留证据”。netsh interface ipv4 show config会按适配器分段输出,格式非常规整,包含地址、掩码、网关、DHCP 状态、接口跃点数,直接复制进工单不用二次整理。netsh interface ipv4 show interfaces则是另一个维度的信息:每个接口的编号(Idx)、跃点数(Met)、MTU、状态(connected/disconnected)、名称。接口编号在配置路由、绑定策略时经常要用到,很多人不知道怎么查,其实就是这条命令。
跃点数(Metric)这个概念值得单独说。当一台机器有多条可用路由都能到达目的地时,系统靠跃点数决定优先走哪条,数值越小优先级越高。有线网卡的自动跃点数通常比无线低,所以插网线时系统会优先走有线。但自动跃点不是万能的,如果两个网卡都在同一个网段、或者一条走内网一条走特殊链路,就可能出现“明明有线连着却走了无线”的怪现象。排查时用netsh interface ipv4 show interfaces看各接口的 Met,再用route print看实际路由表,两个对照一下就清楚了。
netsh interface ipv4 show neighbors也值得一记,它显示的是 ARP 缓存,也就是“这个 IP 对应哪个 MAC”的映射表。局域网里出现 IP 冲突时,两台机器的 MAC 会抢同一个 IP,ARP 表里能看到同一个地址在两个 MAC 之间跳变,这是最直接的证据。不过这命令的输出会随着网络活动不断刷新,多执行几次对比更有意义。
3.3 getmac 与 route print:搞清“哪块网卡、走哪条路”
getmac /v /fo list是我特别喜欢的一条命令。它一次列出所有网络适配器的 MAC 地址、传输名称、连接名,格式是清单式,特别适合抄录。MAC 地址在实际工作中有两个用处:一是做资产绑定,很多内网准入策略是按 MAC 放行的;二是做定位,交换机上按 MAC 查端口,能快速找到一台机器接在哪个物理口上。虚拟网卡也有 MAC,而且往往能看出厂商前缀,这就是为什么有时候一眼就能认出“这个 MAC 是虚拟机的”。
route print输出的是路由表,看起来密密麻麻,其实只需要关注三段。第一段是接口列表,列出所有接口的编号和对应 IP;第二段是IPv4 路由表,其中最关键的是一行0.0.0.0 0.0.0.0 默认网关 IP 跃点数,这行告诉你默认流量走哪里,如果这行缺失或者指向一个不存在的地址,那就出不了网;第三段是永久路由,如果有静态路由配置会显示在这里。很多“能 ping 通内网但上不了外网”的问题,本质上就是默认路由丢了或者被覆盖了。
把这套命令组合起来形成习惯:先用 ipconfig /all 拿全局快照,再用 netsh 看接口和跃点,最后用 route print 和 getmac 定位具体走哪条路、对应哪块卡。一套下来不超过两分钟,比在图形界面上点来点去快得多,而且所有输出都能直接复制存档。
4. PowerShell:从“看一眼”升级到批量采集
4.1 Get-NetIPConfiguration 与 Get-NetIPAddress 怎么选
一旦数量超过三台,命令行一条条敲就不可接受了,这时候必须换 PowerShell。Windows 内置的网络模块有几个核心 cmdlet,最容易混淆的是Get-NetIPConfiguration和Get-NetIPAddress,它们面向的层次不一样。前者是以“网络配置”为单位,一个适配器一条记录,把 IP、网关、DNS 打包在一起,适合回答“这台机器怎么联网的”。后者是以“IP 地址”为单位,一个地址一条记录,适合回答“这个网段里有哪些地址”。
最实用的组合是Get-NetIPConfiguration,它的输出结构非常贴近人的理解:
Get-NetIPConfiguration | Where-Object { $_.IPv4Address -ne $null } | Select-Object InterfaceAlias, @{n='IPv4';e={$_.IPv4Address.IPAddress}}, @{n='Prefix';e={$_.IPv4Address.PrefixLength}}, @{n='Gateway';e={$_.IPv4DefaultGateway.NextHop}}这段跑出来是一张干净的表,每个有 IPv4 的适配器一行,显示别名、地址、前缀长度、网关。注意IPv4Address是个数组属性,即使只有一个地址也会返回集合,所以取.IPAddress时要留意有些场景返回的可能是数组,用-join ','包一下更稳妥。另外Where-Object那个过滤条件是为了排除纯 IPv6 的虚拟适配器,很多机器上这类适配器有一堆,不过滤输出会很乱。
Get-NetIPAddress更适合做筛选,比如“列出所有 10.20 网段的地址”:
Get-NetIPAddress -AddressFamily IPv4 | Where-Object { $_.IPAddress -like '10.20.*' } | Select-Object IPAddress, PrefixLength, InterfaceAlias而Get-NetAdapter解决的是另一个问题:只看物理网卡。加-Physical参数会过滤掉所有虚拟适配器,这在排查“到底哪块是真网卡”时非常省事。我一般会先跑Get-NetAdapter | Sort-Object InterfaceMetric看看哪些是 Up 状态的、跃点是多少,再对照Get-NetIPConfiguration的输出确认地址归属,两步就能把一台陌生机器的网络拓扑摸清。
4.2 用 CIM/WMI 兼容老系统
PowerShell 的 NetTCPIP 模块是从 Windows 8 / Server 2012 才开始内置的,如果目标环境里还有更老的系统,或者脚本需要兼容性更强,就得退回到 CIM/WMI 这条路。Get-CimInstance Win32_NetworkAdapterConfiguration -Filter "IPEnabled = TRUE"是标准写法,返回的对象里 IPAddress 是一个数组,通常 IPv4 在前、IPv6 在后,IPSubnet、DefaultIPGateway 同样是数组,取的时候要按下标对应。
这条路的坑在于数组的顺序并不严格保证。理论上 IPAddress[0] 对应 IPSubnet[0],但在双栈环境里偶尔会错位,所以严谨的脚本应该按地址格式自行判断,而不是盲取下标。另外一个坑是DefaultIPGateway可能为空数组,直接取 [0] 会报错,得先判断长度。
更老的系统上还能用 wmic,比如wmic nicconfig where IPEnabled=true get IPAddress,MACAddress,DefaultIPGateway /format:list,输出是键值对形式,适合快速查看。但 wmic 在新版本 Windows 里已经被标记为弃用,能不写就别写了,除非目标环境确实受限。兼容性这件事我的原则是:新环境直接用 NetTCPIP 模块,老环境用 CIM,实在不行再退到 wmic,不要为了“一套脚本通吃”而牺牲可读性,那样的脚本半年后自己都看不懂。
4.3 一份可直接抄的资产盘点脚本
下面这段是我实际在用的简化版盘点脚本,逻辑是遍历本机所有物理适配器,取 Up 状态的、有 IPv4 地址的,输出别名、地址、前缀、网关、MAC、DHCP 状态,最后导成 CSV。字段不多,但足够支撑“这台机器在哪个网段、走的哪个网关、是不是自动获取”这三个最常问的问题。
$result = foreach ($adapter in (Get-NetAdapter -Physical | Where-Object Status -eq 'Up')) { $cfg = Get-NetIPConfiguration -InterfaceIndex $adapter.ifIndex -ErrorAction SilentlyContinue if ($null -eq $cfg.IPv4Address) { continue } [pscustomobject]@{ HostName = $env:COMPUTERNAME Adapter = $adapter.Name IPv4 = ($cfg.IPv4Address.IPAddress -join ',') PrefixLen = ($cfg.IPv4Address.PrefixLength -join ',') Gateway = ($cfg.IPv4DefaultGateway.NextHop -join ',') MacAddress = $adapter.MacAddress DhcpEnabled = $adapter.Dhcp LinkSpeed = $adapter.LinkSpeed } } $result | Export-Csv -Path .\ip-inventory.csv -NoTypeInformation -Encoding UTF8 $result | Format-Table -AutoSize几个细节值得说。-Physical是关键,没有它,Hyper-V 的 vEthernet、WSL 的虚拟交换机、各种客户端软件留下的假适配器全都会混进来,盘点结果直接失真。-ErrorAction SilentlyContinue是为了跳过那些取配置失败的适配器,比如刚断开还没清理干净的。-join ','处理的是多地址场景,一块网卡上挂多个 IPv4 虽然少见但确实存在。最后导出用 UTF8 编码,否则中文适配器名在 Excel 里打开会变成乱码——这个坑我踩过不止一次,导出文件发给同事,对方打开全是问号,还得重来一遍。
如果要批量跑多台机器,把这段包进Invoke-Command -ComputerName里就行,前提是目标机器开启了远程管理并且你有权限。没有域环境的话,可以用-Credential传凭据,或者退一步用登录脚本在开机时自动跑一遍写进共享目录。我在一个几十台机器的小环境里就是用登录脚本方案,每台机器开机写一行 CSV 到共享盘,月底汇总一次,比一台台远程连过去省事得多。
5. 公网出口地址:本机看不到的那一半
5.1 为什么 ipconfig 永远给不出公网地址
这个问题我被问过很多次:“我 ipconfig 看到的地址和查 IP 网站显示的不一样,是不是被改了?”答案很简单:它们本来就不是一回事。ipconfig 显示的是本机网卡上配置的地址,这个地址在绝大多数网络环境里都是私网地址;而外部网站看到的是你的流量经过网络出口后呈现的地址,中间隔着地址转换设备。就像你在公司内部打电话,分机号是 8001,但对方来电显示的是公司的总机号码——分机号对内,总机号对外,两个都真实,只是视角不同。
理解这一点之后,很多现象就说得通了。你在家里看到 192.168.1.x,在咖啡厅看到 10.x.x.x,在公司看到 172.16.x.x,这些都是本机地址,随环境变化;而对外呈现的地址由出口设备决定,可能整栋楼几百台机器共用一个,也可能按部门分出几个。所以当有人问“我的 IP 是多少”时,正确的反问是“你要的是本机地址还是对外地址”,这两个答案的用途完全不同:本机地址用于内网配置、端口映射、访问控制;对外地址用于对外提供服务、加白名单、做远程接入。
顺带说一个判断技巧:如果本机地址落在 10/8、172.16/12、192.168/16 这三段里,那它一定是私网地址,对外必然经过转换;如果本机地址直接就是一个看起来像公网的地址(比如 100.64 段之外的、非保留段),那说明这台机器可能直接持有一个可路由地址,这种情况在机房和云环境里更常见。不过 100.64.0.0/10 这个段要特别注意,它属于运营商级转换用的保留段,看到这个段说明你处在一层额外的地址转换之后,本机地址和对外地址的差距可能比想象中大。
5.2 用脚本拿到出口地址并做记录
要知道对外地址,只能从外部视角回看自己。最土的办法是打开浏览器访问一个公共的地址查询页面,看一眼记下来;稍微工程化一点的做法是用脚本请求一个返回纯文本地址的公共接口,把结果存进变量。PowerShell 里一行就够:
$egress = Invoke-RestMethod -Uri "https://<公共地址查询接口>" -TimeoutSec 10 Write-Output "对外地址: $egress"这里我故意把接口地址写成占位符,因为公共查询服务换得比较勤,写死一个具体地址过几个月可能就失效了,实际用的时候换成当时可用的即可。要点是选返回纯文本或简单 JSON 的接口,别选那种返回一整页 HTML 的,解析起来麻烦还容易因为页面改版而失败。加-TimeoutSec是必须的,默认超时时间偏长,网络不通的时候脚本会卡在那里很久。
这个动作在几个场景下很有价值。一是出口地址变更监控,有些环境的对外地址不是固定的,会随链路切换而变化,写个定时任务每小时记录一次,出问题时能对上时间线。二是多出口环境核对,一台机器可能同时连着内网和另一条链路,分别请求两次、对比结果,就知道当前流量走的是哪个出口。三是给外部对接方报地址,对方要做访问控制,需要你提供来源地址,这时候拿脚本跑一下比口头问“我们的出口是多少”靠谱得多。
注意:这类查询请求本身会经过网络出口,如果环境里有审计要求,脚本频率别设太高,每小时一次足够,没必要做成秒级轮询。
还有一点值得提醒:有些机器上装了多个网络适配器,脚本请求默认走系统路由表里优先级最高的那条,结果可能和你预期的不一致。想指定走哪块网卡,得用更底层的方式绑定源地址,普通场景没必要折腾到这个程度,知道有这个影响因素就行。
6. 常见问题与排查技巧实录
6.1 高频问题速查表
下面这张表是我这些年被问最多的问题汇总,基本上覆盖了八成以上的现场情况。看到现象先对表,能省掉不少瞎猜的时间。
| 现象 | 最可能的原因 | 第一步动作 |
|---|---|---|
| ipconfig 显示 169.254.x.x | 没拿到 DHCP 租约 | 确认网线/无线状态,检查 DHCP 服务是否可达 |
| 有 IPv4 但 ping 不通网关 | 掩码或网关配置错误、VLAN 不匹配 | 用掩码算出网段,确认网关是否在同一子网 |
| 出现多个默认网关 | 多网卡同时启用 | route print 看跃点,禁用不用的适配器 |
| 只有 vEthernet 没有物理网卡 | 物理网卡被禁用或驱动异常 | Get-NetAdapter 查 Status,设备管理器看驱动 |
| 能上内网不能上外网 | 默认路由缺失或 DNS 异常 | route print 看 0.0.0.0 那行,nslookup 测解析 |
| 地址正常但网页打不开 | DNS 指向错误或缓存污染 | ipconfig /flushdns,检查 DNS 服务器地址 |
| IP 频繁变化 | DHCP 租约短或被其他设备抢占 | 查租约时间,必要时改静态或做地址保留 |
| 两台机器 IP 相同 | 手动配置冲突 | arp -a 看 MAC 是否跳变,逐台断开定位 |
表格里每一条背后都能展开一大段,但现场排查讲究的是快速缩小范围,先定性再定量。比如看到 169.254 就别再纠结 DNS 了,那是另一个层次的问题;看到多个默认网关就先想“是不是有块网卡不该启用”,而不是去改路由。
6.2 几个只有踩过才知道的细节
第一,中文系统下用 findstr 过滤要小心。很多人喜欢用ipconfig | findstr IPv4快速取地址,这在英文系统上没问题,中文系统输出的是“IPv4 地址”,包含“IPv4”字样所以也能匹配上,看似通用。但如果你匹配的是“地址”这种纯中文词,在不同语言的系统上就完全失效了。更稳的写法是匹配IPv4这个协议名,它在任何语言版本里都不翻译。同理,取网关时别匹配“默认网关”,匹配Default Gateway反而在中文系统上匹配不到,这时候要么用netsh的结构化输出,要么老老实实用 PowerShell 的对象属性,别跟文本匹配较劲。
第二,报地址的时候永远截图或复制全文,不要口头念。数字 0 和字母 O、数字 1 和字母 l、小数点位置,这三样是电话沟通的重灾区。我现在的习惯是让对方执行ipconfig | findstr IPv4然后把结果截图发过来,或者直接让对方把命令输出复制粘贴到聊天窗口。省下来的返工时间远超这点沟通成本。
第三,ipconfig 的输出顺序不代表优先级。输出里排在前面的适配器不一定就是流量实际走的那块,真正的决定因素是路由表的跃点数和目的地匹配。所以看到“第一个是 192.168.1.x,第二个是 10.0.0.x”就断定走第一条,是很容易翻车的。判断实际出口要看Get-NetRoute -DestinationPrefix "0.0.0.0/0",它会列出所有默认路由及其跃点,最小的那个才是真正生效的。
第四,虚拟网卡会“抢”地址段。有些虚拟化软件默认分配 192.168.56.x 之类的段,如果你的办公网恰好也是这个段,就会出现路由歧义,表现为“有时能连有时不能连”。这类问题的排查思路是先列出所有适配器及其网段,看有没有重叠,有的话改虚拟网卡的网段,别去动物理网络。
第五,导出的 CSV 一定要指定编码。PowerShell 5.1 的Export-Csv默认编码在某些场景下会让中文变成乱码,显式加上-Encoding UTF8能解决大部分问题。如果是给非技术同事看,导出前用Format-Table在控制台确认一遍字段名,别让表头是IPv4Address.IPAddress这种带点的形式,用@{n='地址';e={...}}重命名一下,对方打开就能看懂。
第六,别在远程会话里对当前连接执行释放操作。这一条前面提过,但值得再强调一次。ipconfig /release一执行,正在用的远程连接立刻断开,而且因为地址没了,自动重连也会失败。如果确实需要重新获取地址,用Invoke-CimMethod或者干脆让对方在本地操作,别拿自己的会话冒险。
第七,长期记录比单次快照有用得多。网络问题往往是间歇性的,出问题那一刻你不在现场,等赶到机器已经恢复正常了。我的做法是在关键机器上放一个定时任务,每十五分钟记录一次 IP、网关、DNS 和到网关的连通性,写到滚动日志里。下次再出问题,翻日志就能看到故障前后配置有没有变化,比任何猜测都可靠。这个脚本不复杂,几十行就能写完,但它的价值在半年后才会真正体现出来。
再补充一个容易被忽视的点:查看 Windows IP 这件事在不同权限下结果可能不同。普通用户执行 ipconfig 能看到地址,但某些虚拟适配器或者受策略管理的连接可能不显示;用管理员权限跑一次,适配器列表往往更完整。做资产盘点这类需要“看全”的场景,记得用管理员权限启动 PowerShell,否则漏掉的恰恰是你最需要的那几块网卡。