核心是“先看清、再关严、后锁死”:先用ss -tuln和lsof精准识别监听端口与服务,再通过systemctl stop/disable安全停用高风险服务(如telnet、avahi、rpcbind),接着修改配置限制服务仅监听本地或指定IP,最后用firewalld/iptables默认拒绝并白名单放行,三层协同验证闭环。

限制不必要的服务监听端口,核心是“先看清、再关严、后锁死”——不盲目停服务,也不仅靠防火墙堵,而是从服务本身、内核监听、网络边界三层协同控制。
一、精准识别哪些端口和服务在监听
别猜,用命令直接看当前真实状态:
- 运行 sudo ss -tuln 查所有 TCP/UDP 监听端口(推荐,比 netstat 更快更准)
- 加 -p 参数(需 root):sudo ss -tulnp,直接显示占用端口的进程名和 PID
- 补查自启动项:sudo systemctl list-unit-files --type=service | grep enabled,筛出 ftp、telnet、avahi、cups、rpcbind 等高风险关键词
- 若发现陌生端口(如 5353、631、111),用 sudo lsof -i :5353 追踪具体服务名
二、安全停用服务,避免误伤业务
停服务不是删软件,而是切断监听行为,并阻止开机自动拉起:
- 先测试停止:sudo systemctl stop avahi-daemon,观察系统日志(journalctl -u avahi-daemon)和业务是否异常
- 确认无依赖:sudo systemctl list-dependencies --reverse avahi-daemon,确保没其他服务靠它运转
- 彻底禁用:sudo systemctl disable --now avahi-daemon(--now = stop + disable 一步到位)
- 常见可关服务示例:telnet.socket(明文远程)、cups.service(无打印机时)、rpcbind(不用 NFS 时)、bluetooth(服务器无蓝牙设备)
三、收紧监听范围,让服务只绑内网或特定 IP
有些服务必须留着(比如监控 agent、数据库),但不该对全网开放。改配置让它只监听本地或管理网段:
- SSH:编辑 /etc/ssh/sshd_config,添加 ListenAddress 10.10.0.5(指定管理 IP),重启 sshd
- Nginx/Apache:在 server 或 VirtualHost 块中写 listen 127.0.0.1:80 或 listen 192.168.1.100:443
- Redis:修改 /etc/redis/redis.conf 中的 bind 127.0.0.1,禁用 protected-mode no(保持为 yes)
- 验证效果:ss -tuln | grep :22 应只显示 127.0.0.1:22 或指定 IP,而非 0.0.0.0:22
四、防火墙兜底,默认拒绝 + 白名单放行
即使服务已停、绑定收紧,防火墙仍是最后一道防线。不能依赖“没开服务就安全”:
- firewalld(CentOS/RHEL):sudo firewall-cmd --set-default-zone=drop,再只加必要规则:firewall-cmd --permanent --add-port=22/tcp、--add-port=443/tcp
- iptables(通用):sudo iptables -P INPUT DROP,然后只允许回环、已建立连接、以及明确端口:iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- 保存并重载:firewall-cmd --reload 或 iptables-save > /etc/iptables/rules.v4(Debian/Ubuntu)
- 外部验证:用另一台机器执行 nc -zv 服务器IP 23,应返回 Connection refused;而 22 应通
真正有效的端口限制,是服务层关闭监听、绑定层缩小范围、网络层默认拦截三者叠加。每一步都可验证,每一步都不可跳过。


















