1. 为什么需要批量关闭Windows高危端口
每次看到新闻里报道某公司因为系统漏洞被黑客入侵,数据泄露造成重大损失,我都会下意识检查自己电脑的端口开放情况。你可能不知道,Windows系统默认开放的一些端口,比如135、139、445这些,简直就是给黑客开的"后门"。去年有个朋友的公司内网中了勒索病毒,溯源发现就是通过445端口进来的。
手动关闭这些端口也不是不行,但操作起来特别麻烦。首先得记住一长串命令,然后逐个执行,稍不留神就可能输错参数。更头疼的是,每次重装系统或者换电脑,又得重新来一遍。这就是为什么我们需要一个一键加固的解决方案——把复杂的操作打包成BAT脚本,点一下就能自动完成所有高危端口的封堵。
2. BAT脚本工作原理详解
2.1 认识netsh ipsec命令
这个脚本的核心是Windows自带的netsh ipsec命令组,它就像系统的网络保镖。我刚开始接触时也觉得这些命令很神秘,后来拆解后发现其实逻辑很清晰:
add policy创建安全策略(相当于建立一个新的安保方案)add filterlist创建过滤列表(相当于列出需要检查的证件类型)add filter添加具体规则(相当于说"持XX证件的一律不放行")add filteraction定义处理动作(抓到可疑分子后是"劝返"还是"拘留")add rule把所有设置打包成一条完整规则
2.2 脚本逐行解析
让我们拆解原始脚本的关键部分:
netsh ipsec static add policy name=qianye这行创建了一个名为"qianye"的安全策略,相当于新建了一个安保方案。名字可以自定义,我习惯用"PortBlocker"这样见名知意的标识。
netsh ipsec static add filterlist name=Filter1建立名为Filter1的过滤列表,后续所有端口规则都会放在这个列表里。就像安检时先把所有禁止携带的物品清单列出来。
netsh ipsec static add filter filterlist=Filter1 srcaddr=any dstaddr=me dstport=135 protocol=TCP这是最核心的过滤规则,意思是:对任何来源IP(srcaddr=any),访问本机(dstaddr=me)135端口的TCP请求,全部拦截。dstport参数就是我们要封堵的端口号。
3. 增强版脚本实战
3.1 基础脚本优化
原始脚本已经能用,但经过多次实践我做了这些改进:
- 增加状态提示:在每个端口关闭操作前添加echo提示,执行过程一目了然
- 错误处理:用if errorlevel检查命令是否执行成功
- 日志记录:关键操作结果重定向到日志文件
改进后的脚本片段:
echo [%time%] 开始执行端口加固 >> port_block.log netsh ipsec static add policy name=SecurePorts if %errorlevel% neq 0 ( echo 策略创建失败!请检查权限 >> port_block.log exit /b 1 )3.2 支持自定义端口列表
不同环境需要关闭的端口可能不同,我增加了从配置文件读取的功能:
- 新建ports.txt配置文件:
# 需要关闭的端口列表 135,TCP 135,UDP 445,TCP 3389,TCP- 脚本自动读取并处理:
for /f "tokens=1,2 delims=," %%i in (ports.txt) do ( if not "%%i"=="#" ( echo 正在关闭 %%i/%%j 端口... netsh ipsec static add filter filterlist=Filter1 dstport=%%i protocol=%%j ) )4. 部署与验证指南
4.1 脚本执行方法
很多新手第一次运行BAT脚本时会遇到问题,这里强调几个关键点:
- 管理员权限:右键选择"以管理员身份运行"
- 执行目录:脚本和ports.txt要放在同一目录
- 防病毒软件:部分安全软件会拦截,需要临时禁用
实测发现,在Windows 10/11和Server 2016+上运行最稳定。有次在Server 2008上执行时报错,后来发现需要先安装IPSec服务。
4.2 效果验证技巧
执行完脚本别急着关窗口,我教你几种验证方法:
- 本地测试:
telnet 127.0.0.1 445如果显示"无法打开连接"说明端口已关闭
网络扫描: 使用Advanced Port Scanner等工具从另一台电脑扫描
策略检查:
netsh ipsec static show all这个命令会列出所有IPSec策略,确认我们的规则已生效
5. 常见问题排查
5.1 脚本执行报错处理
有读者反馈执行时报"参数错误",通常是这些原因:
- 策略已存在:先用
delete policy删除旧策略 - 端口格式错误:检查ports.txt中是否有空行或错误协议类型
- 特殊端口限制:如80端口需要先停止IIS服务
我的调试建议是:
- 在脚本开头加
@echo on显示详细执行过程 - 每步操作后添加
timeout /t 2给系统处理时间
5.2 与其他防火墙的冲突
如果同时使用第三方防火墙(如360、火绒),可能会遇到:
- 规则被覆盖:在防火墙设置中将我们的策略设为最高优先级
- 端口仍可访问:暂时关闭其他防火墙测试是否是冲突导致
- 网络异常:某些VPN软件会修改IPSec规则,需要调整配置
遇到最棘手的情况是某次在域控服务器上执行后,域认证出现问题。后来发现是封堵了Kerberos用的88端口,所以提醒大家修改前一定要确认端口用途。
6. 进阶应用场景
6.1 域环境批量部署
在企业环境中,可以通过组策略批量下发这个脚本。具体步骤:
- 将脚本保存到网络共享目录
- 创建GPO策略,在"计算机配置→策略→Windows设置→脚本"中添加启动脚本
- 设置适当的权限和网络访问控制
注意要先在测试环境验证,有次我直接在生产环境部署导致大量打印机连接中断,就是因为没考虑打印机服务器使用的端口。
6.2 定期自动更新
安全不是一劳永逸的,我建立了这样的维护机制:
- 每周自动从内网服务器下载最新的ports.txt
- 通过任务计划程序设置每月1号凌晨执行更新
- 脚本开头先删除旧策略再创建新的
对应的任务计划创建命令:
schtasks /create /tn "PortUpdate" /tr "C:\Scripts\port_block.bat" /sc monthly /d 1 /st 03:007. 安全注意事项
虽然这个脚本很实用,但也要注意:
- 不要盲目关闭所有端口:先确认业务需求,比如远程办公可能需要保留3389
- 备份原始配置:执行前运行
netsh ipsec static exportpolicy C:\bak.ipsec - 网络设备配合:在路由器/防火墙上也做相应限制,实现纵深防御
有次我关闭了某台服务器的135-139端口后,文件共享功能完全失效。后来才知道这些端口是NetBIOS必需的,所以现在执行前都会先用netstat -ano查看实际使用的端口。
8. 脚本优化方向
经过多个项目的实践,我总结出这些优化思路:
- 图形化界面:用PowerShell封装成带进度条的窗口程序
- 端口例外机制:支持白名单配置,如允许特定IP访问3389
- 状态监控:实时显示被封端口的访问尝试记录
- 邮件通知:当检测到异常访问时自动发送告警
一个典型的白名单添加示例:
netsh ipsec static add filter filterlist=Filter1 srcaddr=192.168.1.100 dstaddr=me dstport=3389 protocol=TCP mirrored=yes这样192.168.1.100这台管理机就能正常使用远程桌面了。