真正要做的,是先停服务、再封流量、最后盯异常连接——三者缺一不可;需组合用 ss、lsof、/etc/services、systemctl 查端口归属,并区分常驻服务与 xinetd/内核模块类服务,防火墙封端口仅为补漏,关后必须验证监听消失、本地连不通、远程扫描非 open 且无残留日志。

直接关端口不等于关风险。真正要做的,是先停服务、再封流量、最后盯异常连接——三者缺一不可。
怎么确认哪个端口在跑什么服务
别只看 netstat -anp 或 ss -tuln 的 LISTEN 行,有些服务(比如 xinetd 管理的)不会常驻进程,但端口仍可被触发。更可靠的方式是组合查:
- 查监听状态:
sudo ss -tuln,重点关注0.0.0.0:*和[::]:*这类通配绑定 - 查对应进程:
sudo lsof -i :21(把 21 换成你要查的端口号),比grep更准,尤其对 UDP 或非 root 进程 - 查服务归属:
grep -w 21 /etc/services,确认是不是 FTP 默认端口;再查 systemd 单元:systemctl list-unit-files --state=enabled | grep -i ftp - 云服务器必须额外检查:安全组(阿里云/AWS 控制台)、主机防火墙(如 SELinux 的
sestatus)、以及是否被iptables或nftables重定向过
杀进程 vs 关服务:选哪个更稳妥
临时用 kill -9 PID 只能断连,服务下次开机或崩溃后自动拉起,端口又开了。正确顺序是:
- 先停服务:
sudo systemctl stop rpcbind(对应端口 111)、sudo systemctl stop vsftpd(端口 21)等 - 再禁启动:
sudo systemctl disable rpcbind,防止 reboot 后复活 - 若服务由
xinetd托管(常见于 telnet、chargen),改配置文件/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(PostgreSQL) - 临时应急:发现异常连接正打 3389,而 RDP 服务不能立刻下线,先
sudo ufw deny 3389挡住外网 - 注意:ufw 默认不处理出站,若要防反弹 shell,得加
sudo ufw default deny outgoing,再显式放行53、443等必需端口
验证是否真关干净了
很多人执行完命令就以为结束了,但没验证。真实闭环是:
- 本机确认监听消失:
sudo ss -tuln | grep ':23'(Telnet 端口),输出为空才可信 - 本地连不通:
nc -zv 127.0.0.1 23应返回Connection refused,不是 timeout - 远程扫描验证:
sudo nmap -sT -p23 your-server-ip,结果必须是filtered或closed,绝不能是open - 日志里别留尾巴:关掉
rpcbind后,journalctl -u rpcbind --since "1 hour ago"不应再有新日志;若有,说明其他服务还在拉它
最容易被忽略的是“服务关了,但依赖它的另一个服务又把它拉起来了”,比如 systemd 的 WantedBy=multi-user.target 会隐式启动依赖项。每次关完,务必用 systemctl list-dependencies --reverse servicename 反查依赖链。










