Windows 开启/禁用 ICMP Ping回显(允许/禁止别人ping本机)
原理:Windows默认防火墙阻止入站ICMP Type‑8回显请求 ,外部ping本机会请求超时;本机ping别人不受此规则影响 ,只控制「别人ping你」。 两种方式:图形界面、命令行(CMD/netsh、PowerShell),全部需要管理员权限。

方式1:图形界面 wf.msc(最直观)
-
Win+R,输入
wf.msc回车,打开【高级安全 Windows Defender 防火墙】 -
左侧 → 入站规则
-
搜索两条预置规则:
-
文件和打印机共享(回显请求‑ICMPv4‑In)(IPv4 ping) -
文件和打印机共享(回显请求‑ICMPv6‑In)(IPv6 ping)注意:会有多条,分别对应「域、专用、公用」三种网络配置文件。
-
- ✅开启ping(允许ICMP回显) :右键规则 → 启用规则
- ❌禁用ping(禁止ICMP回显) :右键规则 → 禁用规则
如果你电脑连接的是公用网络,需要把「公用」那条也启用,否则外网依旧ping不通本机。

方式2:netsh 命令(管理员CMD)
开启Ping(允许外部ICMPv4回显请求)
ini
netsh advfirewall firewall add rule name="允许ICMPv4 Ping回显" protocol=icmpv4:8,any dir=in action=allow
关闭Ping(禁止外部ICMPv4回显请求)
ini
netsh advfirewall firewall add rule name="阻止ICMPv4 Ping回显" protocol=icmpv4:8,any dir=in action=block
删除自己手动创建的ping规则
ini
netsh advfirewall firewall delete rule name="允许ICMPv4 Ping回显"
netsh advfirewall firewall delete rule name="阻止ICMPv4 Ping回显"
提示:
icmpv4:8,8代表ICMP回显请求类型码,就是ping报文。
方式3:PowerShell(管理员,推荐脚本自动化)
启用系统预置ping规则 IPv4
arduino
Enable-NetFirewallRule -DisplayName "文件和打印机共享 (回显请求 - ICMPv4‑In)"
禁用系统预置ping规则 IPv4
arduino
Disable-NetFirewallRule -DisplayName "文件和打印机共享 (回显请求 - ICMPv4‑In)"
查询ping相关防火墙规则状态
sql
Get-NetFirewallRule -DisplayName "*回显请求*"
新建阻止ping规则
sql
New-NetFirewallRule -DisplayName "阻止ICMPv4 Ping回显" -Protocol ICMPv4 -IcmpType 8 -Direction Inbound -Action Block -Enabled True
🧪验证是否生效
在另外一台电脑执行:
ping 你的WindowsIP
- 能收到回复 = ICMP回显已开启
请求超时= ICMP回显被防火墙拦截(已禁用ping)
⚠️重要提醒
- 该设置只影响别人ping本机;本机ping其它设备完全不受影响。
- 第三方杀毒/安全软件自带防火墙,会覆盖Windows Defender防火墙设置,即使系统规则开了ping,依然会ping不通,需要在安全软件里面放行ICMP。
- 云服务器(阿里云/腾讯云)除了操作系统防火墙,还需要安全组放行ICMP协议,否则外网依旧ping不通。
- 修改规则无需重启电脑,立即生效。
常见误区
❌网上旧文档
netsh firewall set icmpsetting 8,是旧版XP/2003命令;Win10/11/Server2016+请用netsh advfirewall firewall系列命令,旧命令已经废弃,会有警告提示。
附 一键开启/关闭 ICMP Ping 批处理脚本
⚠️使用:右键bat文件 → 以管理员身份运行,修改防火墙规则立即生效,无需重启。
1️⃣ EnablePing.bat 【开启允许外部Ping本机】
新建文本,复制下面全部内容,保存,改后缀为 EnablePing.bat
bash
@echo off
chcp 65001 >nul
fltmc >nul 2>&1 || (
echo ❌ 请右键选择【以管理员身份运行】此脚本
pause
exit /b 1
)
echo ==============================================
echo 开启 Windows ICMPv4 Ping回显(允许外部ping本机)
echo ==============================================
:: 启用系统自带预置ICMPv4回显请求规则(域、专用、公用全部配置文件)
netsh advfirewall firewall set rule name="文件和打印机共享(回显请求 - ICMPv4-In)" new enable=yes >nul 2>&1
echo ✅ ICMPv4 Ping回显已开启
echo.
echo 验证方式:其他设备 ping 本机IP 看是否收到回复
pause
2️⃣ DisablePing.bat 【禁止外部Ping本机】
保存为 DisablePing.bat
bash
@echo off
chcp 65001 >nul
fltmc >nul 2>&1 || (
echo ❌ 请右键选择【以管理员身份运行】此脚本
pause
exit /b 1
)
echo ==============================================
echo 关闭 Windows ICMPv4 Ping回显(禁止外部ping本机)
echo ==============================================
:: 禁用系统自带预置ICMPv4回显请求规则
netsh advfirewall firewall set rule name="文件和打印机共享(回显请求 - ICMPv4-In)" new enable=no >nul 2>&1
echo ✅ ICMPv4 Ping回显已关闭
echo.
echo 验证方式:其他设备 ping 本机IP 将返回 请求超时
pause
3️⃣ CheckPingRule.bat 【查看当前ICMP Ping规则状态】
保存为 CheckPingRule.bat
ini
@echo off
chcp 65001 >nul
fltmc >nul 2>&1 || (
echo ⚠️建议管理员运行,部分规则信息查看不全
)
echo ==============================================
echo 查询ICMPv4 回显请求防火墙规则状态
echo ==============================================
netsh advfirewall firewall show rule name="文件和打印机共享(回显请求 - ICMPv4-In)"
pause
补充说明
- 脚本操作系统内置自带规则,不新建自定义规则;兼容 Win10 / Win11 / Windows Server 2016‑2022。
- 只控制别人ping你的机器;本机去ping其他设备完全不受影响。
- 如果安装第三方杀毒软件(火绒、360等),第三方防火墙会覆盖Windows防火墙配置,bat执行后依然ping不通,需要在安全软件中放行ICMPv4。
- 云服务器:操作系统放行后,还需要云平台安全组放行ICMP协议,外网才能ping通。
使用流程
- 复制代码保存为
.bat; - 右键 → 以管理员身份运行;
- 执行完成后用另一台设备
ping 本机IP验证效果。
Windows批处理:批量扫描网段IP,区分通/不通并输出文件
功能说明:
- 输入网段前3段,例如
192.168.1,扫描192.168.1.1‑254 - ping每个IP,可设置ping包次数(减少等待)
- 存活IP输出到
ip_alive.txt,不可达输出到ip_dead.txt - 自动清空旧结果文件,避免历史残留
- 纯bat,无需额外工具,Win10/Win11直接运行;不需要管理员权限
注意:ping受Windows防火墙ICMP策略影响;目标机器开启禁止ping时,脚本会判定为dead,即使网络实际连通。
脚本 ScanIP.bat
bash
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
:: 输出文件定义
set "file_alive=ip_alive.txt"
set "file_dead=ip_dead.txt"
:: 清空旧文件
echo. > %file_alive%
echo. > %file_dead%
echo ==============================================
echo Windows网段IP批量Ping扫描工具
echo 示例网段输入:192.168.1 将扫描1‑254
echo ==============================================
set /p net_prefix=请输入IP网段前3段(如192.168.1):
if "!net_prefix!"=="" (
echo 输入不能为空,退出
pause
exit /b
)
echo.
echo 开始扫描网段: !net_prefix!.1 ~ !net_prefix!.254
echo 扫描中,请稍候...
echo.
:: 循环1‑254
for /L %%i in (1,1,254) do (
set ip=!net_prefix!.%%i
:: -n 1:发送1个ping包;-w 200:超时200毫秒
ping -n 1 -w 200 !ip! >nul
if !errorlevel! equ 0 (
echo [✅可达] !ip!
echo !ip! >> %file_alive%
) else (
echo [❌不可达] !ip!
echo !ip! >> %file_dead%
)
)
echo.
echo ==============================================
echo 扫描完成!
echo 可达IP保存在: %file_alive%
echo 不可达IP保存在: %file_dead%
echo ==============================================
pause
endlocal
使用方法

- 复制全部代码,新建文本文档粘贴,保存为
ScanIP.bat; - 双击运行;输入网段前三段,例如
192.168.31; - 执行完毕,同目录生成两个结果文本:
ip_alive.txt:ping通的IP列表ip_dead.txt:ping超时/不通IP列表
性能说明
- 每个IP超时等待200ms,完整254个IP,理论约50秒左右完成;
- 如果想要更快,可以把
-w 200改成-w 100(最小建议100)。
局限性&补充
- ping只是ICMP探测;目标主机防火墙禁用ICMP回显,会判定为dead,但TCP端口可能通。
- 该脚本是串行ping,速度有限;如果需要高速并行端口/IP扫描,建议用PowerShell或者nmap。
【可选增强:PowerShell版本(并行扫描,速度快很多)】
保存为 ScanIP.ps1,powershell执行,多线程并发扫描,254个IP几秒扫完
perl
<#
批量ping网段,输出ip_alive.txt / ip_dead.txt
#>
$net = Read‑Host "输入网段前三段,例 192.168.1"
$aliveFile = "ip_alive_ps.txt"
$deadFile = "ip_dead_ps.txt"
"" | Out‑File $aliveFile
"" | Out‑File $deadFile
$jobs = 1..254 | ForEach‑Object {
$ip = "$net.$_"
Start‑Job ‑ScriptBlock {
param($ipaddr)
$res = Test‑Connection ‑ComputerName $ipaddr ‑Count 1 ‑TimeoutSeconds 0.2 ‑ErrorAction SilentlyContinue
if($res){ return @($ipaddr,$true) }else{ return @($ipaddr,$false) }
} ‑ArgumentList $ip
}
Wait‑Job $jobs | Out‑Null
foreach($j in $jobs){
$ret = Receive‑Job $j
$ipout = $ret[0]
$isok = $ret[1]
if($isok){
Write‑Host "✅ $ipout 可达"
$ipout | Out‑File ‑Append $aliveFile
}else{
Write‑Host "❌ $ipout 不可达"
$ipout | Out‑File ‑Append $deadFile
}
}
Remove‑Job $jobs ‑Force
Write‑Host "`n扫描完成!"
运行方式:PowerShell执行
sql
Set-ExecutionPolicy Bypass -Scope Process
.\IPScan.ps1
bat脚本简单无需权限;powershell版本并发,适合大量网段快速探测。