Windows Server上高危端口暴露是导致服务器被入侵的最常见原因之一,尤其是远程桌面(3389)、文件共享(445)、SQL Server(1433)等端口。直接关闭这些端口是最有效的防护手段之一,但手动配置防火墙规则既繁琐又容易出错。这里提供一个集成了检测、屏蔽和日志记录功能的一键PowerShell脚本,你只需以管理员身份运行一次,就能自动屏蔽常见高危端口,并生成详细的操作报告。
为什么必须主动屏蔽Windows Server的高危端口?
服务器在互联网上开放的任何端口都是一个潜在的入口。攻击者利用自动化工具全天候扫描全球IP段,专门寻找开放了3389、22、445、1433、5900等端口的机器。一旦发现,就会尝试暴力破解密码或利用已知漏洞入侵。许多管理员认为“改了端口号”或“密码足够复杂”就安全了,但这只是提高了攻击门槛,并未消除风险。最根本的解决方法是:除非业务必需,否则应在防火墙层面彻底阻断外部对这些端口的访问。对于必须开放的端口,则应结合IP白名单、网络层防火墙或VPN进行保护。
一键脚本的核心设计逻辑与安全考量
这个脚本并非粗暴地禁用所有知名端口,而是遵循了“最小权限原则”和“可审计原则”。其核心逻辑分为三步:首先,通过"Get-NetTCPConnection"命令获取当前所有活跃的监听端口,并与预设的高危端口列表进行比对,生成一份“实际开放的高危端口清单”。其次,针对清单中的每一个端口,在Windows Defender防火墙中创建两条入站规则:一条阻止所有IP(IPv4和IPv6)对该端口的连接;另一条则允许本地子网(如192.168.1.0/24)的访问,确保内网管理不受影响。最后,将所有操作记录写入日志文件,包括规则名称、创建时间、受影响的端口等,方便后续审计和回滚。
完整的一键屏蔽脚本代码与解读
以下脚本适用于Windows Server 2012及以上版本,请将其保存为".ps1"文件(例如"Block-HighRiskPorts.ps1")后执行。
# Windows Server 高危端口一键屏蔽脚本
# 必须以管理员权限运行
# 1. 定义需要屏蔽的高危端口列表(可根据实际情况增删)
$HighRiskPorts = @(21, 22, 23, 25, 135, 139, 445, 1433, 1434, 3306, 3389, 5900, 8080)
# 2. 初始化日志
$LogPath = "C:\Windows\Logs\PortBlock-$(Get-Date -Format 'yyyyMMdd-HHmmss').log"
"脚本开始执行时间: $(Get-Date)" | Out-File -FilePath $LogPath -Encoding UTF8
"预设的高危端口列表: $($HighRiskPorts -join ', ')" | Out-File -FilePath $LogPath -Encoding UTF8 -Append
# 3. 获取服务器当前实际正在监听的高危端口
$ListeningPorts = Get-NetTCPConnection -State Listen | Select-Object -ExpandProperty LocalPort -Unique
$PortsToBlock = $HighRiskPorts | Where-Object { $_ -in $ListeningPorts }
"经检测,服务器当前正在监听的高危端口有: $($PortsToBlock -join ', ')" | Out-File -FilePath $LogPath -Encoding UTF8 -Append
# 4. 遍历需要屏蔽的端口,创建防火墙规则
foreach ($Port in $PortsToBlock) {
$RuleNameBlockAll = "Block_HighRisk_Port_$Port_ALL"
$RuleNameAllowLocal = "Allow_HighRisk_Port_$Port_LocalSubnet"
# 检查规则是否已存在,避免重复创建
$ExistingRule = Get-NetFirewallRule -DisplayName $RuleNameBlockAll -ErrorAction SilentlyContinue
if (-not $ExistingRule) {
# 创建阻止所有IP访问的规则
New-NetFirewallRule -DisplayName $RuleNameBlockAll `
-Direction Inbound `
-LocalPort $Port `
-Protocol TCP `
-Action Block `
-Enabled True `
-Description "一键脚本创建:阻止所有IP访问高危端口 $Port"
"已创建防火墙规则: $RuleNameBlockAll (阻止所有入站连接)" | Out-File -FilePath $LogPath -Encoding UTF8 -Append
} else {
"防火墙规则已存在: $RuleNameBlockAll,跳过创建。" | Out-File -FilePath $LogPath -Encoding UTF8 -Append
}
# 创建允许本地子网访问的规则(优先级高于阻止规则)
$ExistingAllowRule = Get-NetFirewallRule -DisplayName $RuleNameAllowLocal -ErrorAction SilentlyContinue
if (-not $ExistingAllowRule) {
New-NetFirewallRule -DisplayName $RuleNameAllowLocal `
-Direction Inbound `
-LocalPort $Port `
-Protocol TCP `
-Action Allow `
-RemoteAddress "192.168.1.0/24,fe80::/64" ` # 请根据实际内网网段修改
-Enabled True `
-Description "一键脚本创建:允许内网子网访问端口 $Port"
"已创建防火墙规则: $RuleNameAllowLocal (允许内网子网访问)" | Out-File -FilePath $LogPath -Encoding UTF8 -Append
} else {
"防火墙规则已存在: $RuleNameAllowLocal,跳过创建。" | Out-File -FilePath $LogPath -Encoding UTF8 -Append
}
}
# 5. 输出执行摘要
$Summary = @"
脚本执行完成。
检测到的高危端口: $(if ($PortsToBlock) { $PortsToBlock -join ', ' } else { '无' })
防火墙规则已创建/确认。
详细日志请查看: $LogPath
"@
Write-Host $Summary -ForegroundColor Green
$Summary | Out-File -FilePath $LogPath -Encoding UTF8 -Append脚本关键功能点与自定义配置指南
第一,端口列表自定义:变量"$HighRiskPorts"定义了默认要屏蔽的端口。你可以根据服务器上运行的具体服务进行调整。例如,如果服务器是Web服务器且需要开放8080,则应将其从列表中移除。第二,内网网段配置:脚本中"-RemoteAddress "192.168.1.0/24,fe80::/64""部分设定了允许访问的内网IP范围。你必须将其修改为你机房或办公室的实际内网网段,例如"10.0.0.0/8"或"172.16.0.0/12"。这是确保你在内网仍能通过远程桌面等管理服务器的关键。第三,规则优先级:Windows防火墙规则按特定顺序评估。脚本先创建“阻止所有”的规则,再创建“允许内网”的规则。由于Windows防火墙默认允许更具体的规则优先,因此“允许内网”规则会生效,而其他所有地址的连接将被阻止。
脚本执行后的验证与管理方法
运行脚本后,你需要验证规则是否生效。首先,打开“高级安全Windows Defender防火墙”,在“入站规则”列表中,搜索“Block_HighRisk”和“Allow_HighRisk”,应能看到对应的规则,且状态为“已启用”。其次,可以在同一内网的另一台机器上使用"telnet [服务器IP] 3389"测试,连接应成功;而从一台外网机器或手机热点网络测试,连接应超时或被拒绝。所有操作日志保存在"C:\Windows\Logs\"目录下,以"PortBlock-时间戳.log"命名。如果需要回滚,只需在防火墙管理界面中找到这些规则并手动删除,或者使用命令"Get-NetFirewallRule -DisplayName "Block_HighRisk*" | Remove-NetFirewallRule"进行批量删除。
超越脚本:构建纵深防御体系
一键脚本是服务器安全加固的快速起点,但真正的安全需要纵深防御。首先,对于必须向公网开放的服务(如HTTP/80、HTTPS/443),应前置Web应用防火墙或云服务商的安全组,只允许业务所需的HTTP/HTTPS流量,并在服务器主机防火墙上做同样的限制。其次,对于数据库端口(1433、3306),最佳实践是绝不向公网开放,所有访问应通过跳板机或建立私有网络隧道。再次,定期更新脚本中的高危端口列表,关注新的漏洞情报(例如新出现的RDP漏洞可能涉及其他端口)。最后,将此脚本与系统基线配置管理工具结合,确保所有新部署的服务器都能自动执行此加固步骤,实现安全配置的标准化和自动化。
总之,利用这个一键脚本,你可以在几分钟内显著降低Windows Server因高危端口暴露而遭受攻击的风险。它提供了自动化、可审计和可自定义的解决方案,将复杂的安全配置工作简化为一次性的执行动作。结合合理的网络架构和持续的安全监控,能为你的服务器奠定坚实的安全基础。
