核心是停服务而非封端口:先用ss -tuln、lsof -i、/etc/services和systemctl交叉验证端口归属,再systemctl stop/disable停服务(xinetd类需改配置,内核模块类需禁协议),防火墙仅作补漏,最后验证监听消失、本地连不通、远程扫描非open。

安全关闭不需要的系统端口,核心不是“封住端口”,而是“停掉背后的服务”——因为端口只是服务对外暴露的入口,服务不停,端口随时可能被重新监听,防火墙规则也只起遮挡作用,不解决根本风险。
先确认哪些端口真在监听、谁在用
别只信 netstat -anp 或一眼扫过的 LISTEN 行。有些服务(比如 xinetd 托管的 telnet、chargen)平时不常驻进程,但端口仍可被触发响应。稳妥做法是三步交叉验证:
- 查监听状态:
sudo ss -tuln,重点关注0.0.0.0:*和[::]:*这类通配绑定,说明服务对所有网卡开放 - 查对应进程:
sudo lsof -i :22(把 22 换成你要查的端口),比 grep 更准,尤其对 UDP 或非 root 进程有效 - 查服务归属:
grep -w 22 /etc/services确认是否 SSH 默认端口;再查 systemd 是否启用:systemctl list-unit-files --state=enabled | grep -i ssh
云服务器还要额外检查:控制台里的安全组规则、SELinux 状态(sestatus)、以及 iptables/nftables 是否做过端口重定向。
关服务,别只杀进程
用 kill -9 PID 只能临时断连,服务重启或崩溃后自动拉起,端口又开了。正确顺序是:
- 先停服务:
sudo systemctl stop rpcbind(对应端口 111)、sudo systemctl stop vsftpd(端口 21)等 - 再禁开机自启:
sudo systemctl disable rpcbind,防止 reboot 后复活 - 若服务由 xinetd 托管(如 telnet),改
/etc/xinetd.d/telnet中disable = yes,再运行sudo systemctl restart xinetd - 对内核模块级服务(如 SMBv1),光关
smbd不够,还得禁协议:echo 'options cifs disable_legacy_dialects=1' | sudo tee /etc/modprobe.d/cifs.conf,再执行sudo modprobe -r cifs && sudo modprobe cifs
防火墙封端口只是补漏,不是首选
ufw 或 firewalld 封端口,本质是丢包,但服务仍在后台监听,照样占内存、CPU,还可能泄露 banner 或被扫描误判。只在以下情况考虑封而非关停:
- 无法停服务(例如共享主机上共用 nginx,你只管自己 location)
- 需保留服务但限制访问来源:
sudo ufw allow from 10.0.1.0/24 to any port 5432 - 临时应急:发现异常连接正打 3389,而 RDP 服务不能立刻下线,先
sudo ufw deny 3389挡住外网
注意:ufw 默认不处理出站流量。若防反弹 shell,得加 sudo ufw default deny outgoing,再显式放行 53、443 等必需端口。
关完必须验证效果
停止服务 + 禁用启动后,三项验证缺一不可:
- 监听消失:
sudo ss -tuln | grep :21应无输出 - 本地连不通:
telnet localhost 21或nc -zv 127.0.0.1 21显示 connection refused - 远程扫描非 open:
nmap -sT -p 21 your-server-ip返回 filtered 或 closed,且日志里不再有新连接记录











