服务器上开放的非必要端口是黑客最常用的攻击入口。例如,Windows的远程桌面端口3389、文件共享端口445,Linux的SSH端口22(若配置不当)等,一旦被暴力破解或利用漏洞攻击,将导致服务器被完全控制或数据被勒索加密。关闭不必要的端口是服务器安全加固的第一步,也是成本最低、效果最显著的安全措施。
在关闭端口前,你需要先知道哪些端口是开放的、哪些是必须保留的。
在Windows服务器上,以管理员身份打开命令提示符(CMD)或PowerShell,执行:
``` netstat -ano | findstr LISTENING ```在Linux服务器上,打开终端,执行:
``` sudo netstat -tulpn ```或者使用更现代的ss命令:
``` sudo ss -tulpn ```根据上一步的输出,记录下每个监听端口(Local Address列中冒号后的数字)及其对应的PID(Windows)或程序名(Linux)。
常见的高危或非必要端口列表:
注意:以上端口如果被业务必需,则不能简单关闭,而应通过防火墙做IP白名单限制。下文会详细说明。
Windows主要通过防火墙和关闭对应服务来禁用端口。
这是最规范、可追溯的方法。
步骤1:打开“高级安全Windows防火墙”。按Win+R,输入`wf.msc`并回车。
步骤2:在左侧选择“入站规则”,右侧点击“新建规则”。
步骤3:规则类型选择“端口”,点击“下一步”。
步骤4:选择“TCP”或“UDP”(根据之前netstat查到的协议),在“特定本地端口”中输入要关闭的端口号,例如`445`。多个端口用逗号隔开,如`135,139,445`。点击“下一步”。
步骤5:选择“阻止连接”,点击“下一步”。
步骤6:何时应用规则,三个选项(域、专用、公用)全部勾选,点击“下一步”。
步骤7:为规则命名,例如“阻止高危TCP端口445”,描述可写“用于关闭SMB服务端口,防范勒索病毒”。点击“完成”。
此时,该端口的入站连接已被彻底阻断。
如果需要批量操作,可以使用PowerShell管理员命令行。
以下命令创建一条阻止TCP 135,139,445端口入站的规则:
``` New-NetFirewallRule -DisplayName "Block High-Risk TCP Ports" -Direction Inbound -LocalPort 135,139,445 -Protocol TCP -Action Block ```以下命令创建一条阻止UDP 137,138端口入站的规则:
``` New-NetFirewallRule -DisplayName "Block High-Risk UDP Ports" -Direction Inbound -LocalPort 137,138 -Protocol UDP -Action Block ```仅用防火墙屏蔽端口,服务仍在运行。彻底关闭服务能释放资源并消除隐患。
按Win+R,输入`services.msc`打开服务管理器。
找到并双击以下服务,将“启动类型”改为“禁用”,并点击“停止”:
警告:关闭“Server”服务会导致本机的文件共享功能失效。请确保业务不需要此功能。
Linux主要通过防火墙(iptables或firewalld)和控制服务(systemctl)来管理端口。
以下以最常用的firewalld(CentOS/RHEL 7+、Fedora、部分OpenSUSE)和UFW(Ubuntu/Debian)为例。
步骤1:确保firewalld正在运行。
``` sudo systemctl status firewalld ```如果未运行,启动并设为开机自启:
``` sudo systemctl start firewalld sudo systemctl enable firewalld ```
步骤2:查看当前开放的所有端口。
``` sudo firewall-cmd --list-ports ```步骤3:永久移除一个高危端口,例如关闭不必要的TCP 21端口(FTP)。
``` sudo firewall-cmd --permanent --remove-port=21/tcp ```步骤4:重新加载防火墙配置使其生效。
``` sudo firewall-cmd --reload ```步骤5:验证端口是否已移除。
``` sudo firewall-cmd --list-ports ```如果看到端口已不在列表中,说明操作成功。
步骤1:启用UFW(如果之前未启用)。
``` sudo ufw enable ```步骤2:查看当前规则,确认要关闭的端口号。
``` sudo ufw status numbered ```步骤3:删除允许该端口的规则。假设要删除允许TCP 21端口的规则,从`status numbered`的输出中找到该规则对应的编号(如`[1]`),然后执行:
``` sudo ufw delete 1 ```或者,直接通过规则描述删除:
``` sudo ufw delete allow 21/tcp ```步骤4:拒绝特定端口的任何访问(更严格)。如果你希望明确拒绝而不是简单地“不允许”,可以添加拒绝规则:
``` sudo ufw deny 21/tcp ```找到监听高危端口的服务并停止它。
步骤1:使用netstat或ss找到端口对应的服务名。
``` sudo ss -tulpn | grep :21 ```输出中可能包含`pid=1234`和`process name`信息。
步骤2:使用systemctl停止并禁用服务。假设查到是vsftpd服务。
``` sudo systemctl stop vsftpd sudo systemctl disable vsftpd ```步骤3:验证服务状态。
``` sudo systemctl status vsftpd ```应显示`inactive (dead)`和`disabled`。
对于业务必须使用的端口(如MySQL的3306、SSH的22),不能一关了之。正确的做法是仅允许特定的、可信的IP地址访问。
在“高级安全Windows防火墙”中创建入站规则时,在第5步选择“允许连接”,在第4步后的“作用域”设置中,于“远程IP地址”部分选择“下列IP地址”,添加你允许的办公网络IP或跳板机IP,然后完成规则创建。这样,只有白名单IP能访问该端口,其他IP的访问会被默认的“阻止”规则(或更早创建的阻止该端口的规则)拦截。
例如,只允许IP为`192.168.1.100`的主机访问本机的TCP 22端口(SSH)。
移除原来对所有人开放的22端口规则(如果存在):
``` sudo firewall-cmd --permanent --remove-service=ssh 或 sudo firewall-cmd --permanent --remove-port=22/tcp ```添加富规则(rich rule)实现白名单:
``` sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="22" protocol="tcp" accept' ```重新加载:
``` sudo firewall-cmd --reload ```在UFW中,规则是有顺序的。确保默认策略是拒绝所有入站:
``` sudo ufw default deny incoming ```添加允许特定IP访问特定端口的规则:
``` sudo ufw allow from 192.168.1.100 to any port 22 ```1. 本地验证端口关闭:在服务器本机再次执行`netstat -ano`或`ss -tulpn`,确认高危端口已不在“LISTEN”状态。
2. 远程验证端口关闭:从另一台机器使用`telnet`或`nmap`扫描。例如,在另一台机器的命令行执行:
``` telnet [你的服务器IP] 445 ```如果连接失败或超时,说明端口已成功关闭。使用nmap扫描更全面:
``` nmap -sT -p 135,139,445,3389 [你的服务器IP] ```如果这些端口状态显示为`filtered`或`closed`,而非`open`,则成功。
3. 业务验证:进行正常的业务操作测试,确保关闭端口没有影响必要的应用功能。如果发现问题,检查是否是误关了业务端口,并按第五部分的方法将其加入白名单。
4. 记录变更:将本次关闭的端口、采用的方法(防火墙规则/服务禁用)、白名单IP等信息记录到运维文档中,便于日后排查和审计。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图