Ansible不能直接关闭端口,需通过停止监听服务或禁用对应进程实现;推荐使用systemd模块批量管理服务状态,并结合ss/lsof识别闲置端口,辅以firewalld/iptables封禁。

Ansible 本身不直接提供“关闭端口”的能力——端口是服务监听行为的体现,真正要做的,是批量停止监听这些端口的服务进程,或禁用对应服务。所谓“关闭未使用端口”,本质是识别并清理闲置服务,而非操作网络层端口本身。
明确目标:先识别,再关停
批量关停“未使用端口”前,必须先判断哪些端口属于“未使用”:
- 端口被占用 ≠ 业务需要:比如测试时临时起的 httpd、nginx、python -m http.server,上线后未清理
- 常见闲置服务:sshd(通常需保留)、telnet(应禁用)、ftp、rpcbind、nfs、postfix(若非邮件服务器)、cups、avahi-daemon 等
- 建议结合 netstat -tuln 或 ss -tuln + 进程名 + 启动时间综合判断,避免误停关键服务
Ansible 批量停止闲置服务(推荐方式)
用 systemd 模块统一管理服务状态,安全可靠:
- 停止并禁用 telnet(若存在):
ansible webservers -m systemd -a "name=telnetd state=stopped enabled=no" - 停止并禁用 rpcbind 和 nfs(非存储节点):
ansible storage-nodes -m systemd -a "name=rpcbind state=stopped enabled=no"
ansible storage-nodes -m systemd -a "name=nfs-server state=stopped enabled=no" - 批量检查并关停 Python 临时 Web 服务(监听 8000/8080):
先写一个简短脚本/tmp/kill-python-http.sh,内容为:pkill -f "python.*http.server.*80[0-9][0-9]" || true
再用 script 模块分发执行:
ansible webservers -m script -a "/tmp/kill-python-http.sh"
配合端口扫描做精准关停(进阶)
若需自动化识别“监听但无业务关联”的端口,可结合 command 模块调用 ss 或 lsof:
- 查出监听 8080 但非 nginx/httpd 进程的节点:
ansible all -m command -a "ss -tuln | grep ':8080' | grep -v 'nginx\|httpd'" - 对匹配结果的主机,再执行关停命令(需配合 when 判断,适合写在 Playbook 中)
- 注意:
lsof -i :8080更直观,但需确保被管节点已安装 lsof(可用 yum install -y lsof 预装)
防火墙层面辅助封禁(补充手段)
即使服务已停,也可用 firewalld 或 iptables 模块显式拒绝访问,双重保险:
- 批量禁止外部访问 8000 端口:
ansible webservers -m firewalld -a "port=8000/tcp permanent=yes state=absent immediate=yes" - 若用 iptables(CentOS 6 / 旧系统):
ansible webservers -m iptables -a "table=filter chain=INPUT rule='-p tcp --dport 8000 -j REJECT' state=present"

















