135、137、138、139、445 是 Windows 服务器上被扫得最勤的五个端口,WannaCry、EternalBlue 这类大规模勒索事件的主要入口都在这里。公网上开放的 445 端口被自动化扫描工具盯上通常撑不过一天,内网里它们则是横向移动的标准跳板。封掉这五个端口不需要任何第三方工具,Windows 自带防火墙就能完成。这篇先讲清每个端口对应什么服务、为什么危险,再给图形界面和命令行两种封法,最后是封完怎么验证、封之前要查什么依赖。

注:Windows 无法容器化实跑,本文操作步骤与命令语法来源为微软官方文档及原文生产环境操作记录,未在实机复测;执行前请在测试机上过一遍。

这五个端口各是什么

封端口之前得知道自己封的是什么。这五个端口分属两套机制:135 是 RPC 的入口,137/138/139 是 NetBIOS 家族,445 是 SMB 直接承载。

端口 协议 对应服务 危险在哪
135 TCP RPC Endpoint Mapper 远程过程调用入口,WMI/DCOM 依赖它;被利用做横向移动和远程代码执行
137 UDP NetBIOS Name Service 名称解析,暴露主机名/域信息,内网侦察常用
138 UDP NetBIOS Datagram Service 数据报服务,配合 137 做内网广播发现
139 TCP NetBIOS Session Service 早期 SMB 文件共享通道,445 的前身
445 TCP SMB over TCP Windows 文件共享核心端口,EternalBlue/WannaCry 的攻击面,公网暴露 445 = 等被扫

135 值得多说一句:它本身不承载业务,只提供 RPC 端点映射——客户端先连 135 问”我要调的服务的真实端口是多少”,再拿到的动态端口(Windows Vista/Server 2008 之后默认范围是 49152-65535)去发起真正的调用。WMI 远程执行、部分远控和横向移动工具走的都是这条路。所以”只封 445 就够了”是常见误解,135 开着等于远程调用通道还留着。

NetBIOS 三兄弟(137/138/139)是 Windows 2000 之前文件共享的老协议栈,现在的局域网里基本只剩历史包袱:暴露主机名和工作组信息、响应广播探测,除了给攻击者递情报外没有正经用途。老旧设备必须用 NetBIOS 名称解析的场景已经很少见。

一句话:服务器上不做内网文件共享和域环境服务,这五个端口全封无副作用。

图形界面操作

单台机器、临时处置,用图形界面最快。以 Windows Server 2016/2019/2022 为例(更早版本的菜单位置略有差异,规则逻辑相同):

  1. 直接 win+R 运行 wf.msc 打开「高级安全 Windows Defender 防火墙」(也可从控制面板 → 系统和安全 → Windows Defender 防火墙 → 高级设置进入);
  2. 打开后先确认右侧「防火墙状态」——域、专用、公用三个配置文件都应处于启用状态,防火墙关着规则不会生效;
  3. 左侧选择「入站规则」→ 右侧点击「新建规则」;
  4. 规则类型选「端口」→ 下一步;
  5. 选择 TCP,并在”特定本地端口”填入 135,139,445(逗号分隔);
  6. 操作选「阻止连接」→ 下一步;
  7. 配置文件保持默认(域、专用、公用全选)→ 下一步;
  8. 名称填 Block-NetBIOS-SMB-TCP(便于后续脚本化管理),描述可选,完成;
  9. 重复 3-8 步再建一条 UDP 规则,端口填 137,138,名称 Block-NetBIOS-Name-UDP。

两条规则建完立即生效,不需要重启。新建的阻止规则在「入站规则」列表里按名称排序,排除了绿色的对勾图标说明规则已启用。

命令行方案(netsh / PowerShell,可脚本化)

批量部署或写进自动化脚本,命令行是正路。两套工具任选:netsh 在所有受支持版本上可用,PowerShell 的 NetSecurity 模块(Windows Server 2012 起自带)可读性更好。

netsh 方式(需管理员权限的 CMD):

1
2
3
4
5
6
7
:: TCP 端口封禁
netsh advfirewall firewall add rule name="Block-NetBIOS-SMB-TCP" ^
dir=in action=block protocol=TCP localport=135,139,445

:: UDP 端口封禁
netsh advfirewall firewall add rule name="Block-NetBIOS-Name-UDP" ^
dir=in action=block protocol=UDP localport=137,138

PowerShell 方式(管理员权限):

1
2
3
4
5
New-NetFirewallRule -DisplayName "Block-NetBIOS-SMB-TCP" `
-Direction Inbound -Action Block -Protocol TCP -LocalPort 135,139,445

New-NetFirewallRule -DisplayName "Block-NetBIOS-Name-UDP" `
-Direction Inbound -Action Block -Protocol UDP -LocalPort 137,138

两套命令建出来的规则等价,都出现在 wf.msc 的入站规则列表里,可以混用管理。如果误建或业务变化需要回退,删掉同名规则即可:

1
2
netsh advfirewall firewall delete rule name="Block-NetBIOS-SMB-TCP"
netsh advfirewall firewall delete rule name="Block-NetBIOS-Name-UDP"

验证封禁真的生效了

封完必须验证,这一步省不得——防火墙规则没生效的场景(profile 关闭、规则被组策略覆盖、建错方向)比想象中常见。验证分三层。

第一层,本机查规则状态:

1
netsh advfirewall firewall show rule name="Block-NetBIOS-SMB-TCP"

正常输出里应有 Enabled: Yes、Action: Block、LocalPort: 135, 139, 445 这几行,四条配置文件(域/专用/公用,视版本)的 Profile 全部命中。

第二层,从另一台机器测连通性。PowerShell 的 Test-NetConnection 最方便:

1
2
3
# 在另一台机器上执行
Test-NetConnection -ComputerName 192.168.1.100 -Port 445
Test-NetConnection -ComputerName 192.168.1.100 -Port 135

被封端口的 TcpTestSucceeded 应返回 False。注意要留一个对照:拿一个确定没封的端口(比如开着的 3389)测一遍返回 True,才能证明测试本身是通的,否则 False 也可能是网络根本不通。

第三层,UDP 端口单独说。Test-NetConnection 只支持 TCP,137/138 这类 UDP 端口的封禁效果没法这样验,实用做法是确认规则状态(第一层)加上从对端用 PortQry 或 nmap 的 UDP 扫描确认无响应。

另外提醒一点:防火墙拦的是连接,不是监听。封禁后在本机 netstat -ano | findstr ":445" 依然能看到监听条目,这是正常现象——服务还在,只是外面的连接进不来。

治本方案:让端口不再监听(可选加固)

防火墙是拦,服务下线是不听。两条腿一起走更稳:

  • 禁用 TCP/IP 上的 NetBIOS:网络适配器属性 → IPv4 → 高级 → WINS 选项卡 → 选择”禁用 TCP/IP 上的 NetBIOS”。这样 137/138/139 直接不再监听,比防火墙拦截更干净。域环境操作前确认没有老旧客户端依赖 NetBIOS 名称解析。
  • 停用 Server 服务(LanmanServer):不做文件共享的服务器可以在 services.msc 里停用 Server 服务,445 的监听随之消失。域控和需要提供共享的机器不能停——域控的 SYSVOL/NETLOGON 共享依赖它。
  • 135 没法这样关:RPC 是系统基础设施,强行禁用相关服务会导致大量系统功能异常,135 只能靠防火墙限制来源。

注意事项

  • 防火墙必须开着:防火墙关闭时规则不会生效,封了等于没封。确认方法:netsh advfirewall show allprofiles state。
  • 先查业务依赖:内网文件共享(SMB)、打印机共享、域控制器的部分服务(AD 复制、组策略下发)会用到 135/139/445,全封之前要评估影响——域环境的域控通常需要保留 135/445,只在成员服务器上封禁。
  • 补丁照打:封端口只是缓解手段,SMB 漏洞的系统补丁(MS17-010 一族)还是要照常打——万一封禁规则被误删,补丁就是最后一道防线。
  • 出站方向:以上规则只拦入站(dir=in),不拦出站。内网横向移动防护需要在所有成员服务器上都加规则,不能只在边界设备上封。
  • 组策略批量部署:域环境建议把防火墙规则写进组策略(GPO),统一推送到所有服务器,避免逐台登录遗漏;本地建的规则与 GPO 下发的规则叠加生效,排查时两处都要看。

Windows 防火墙封端口这件事,技术难度几乎为零:GUI 八步、netsh 两条命令。真正的功夫在封之前查依赖——域控、共享、打印,哪一个误伤都是生产事故;以及封之后验生效——规则建了不等于拦住了。命令能脚本化,验证的那一步永远要人来把关。

本文由作者 2020-2024 年间的 CSDN 博客文章重构而来,原发布于 CSDN。