CentOS封端口批量脚本:一次关闭高危端口30个,懒人也能秒锁攻击面
CentOS封端口批量脚本:一次关闭高危端口30个

服务器刚上线三天,扫描日志里就冒出上千条爆破记录?别慌,问题多半出在默认敞开的端口上。把高危端口一次性批量关死,比事后补漏洞省事一百倍。下面这份CentOS封端口批量脚本,亲测五分钟搞定,一次关闭30个高危端口,复制就能用。
为什么必须批量封端口
手工敲iptables,一条一条写,眼睛看花还容易漏。黑客只要扫到一条漏网之鱼,整个机器就沦为矿机或肉鸡。批量脚本的好处:统一策略、零遗漏、可回滚。一次执行,永久生效,再不怕凌晨被短信叫醒。
30个高危端口清单
先给名单,做到心里有数:TCP 17, 19, 23, 37, 111, 135, 139, 445, 514, 593, 873, 1194, 1433, 1521, 1723, 2049, 2121, 3306, 3389, 5432, 5900, 5984, 6379, 7001, 8022, 8080, 9200, 9300, 11211, 27017。这些端口对应旧版服务、默认口令、未授权访问,每一条都曾让运维背过锅。
脚本思路:iptables + 循环 + 持久化

纯iptables规则重启会丢,所以用脚本一次性写入后,再调用service save把规则写进/etc/sysconfig/iptables。思路分三步:循环读端口、iptables -A INPUT 拒绝、保存重启。全程不用第三方工具,CentOS 7/8/Stream通用。
完整脚本奉上
打开vim /root/deny高危端口.sh,贴入下面内容,给执行权限chmod +x,跑一遍./deny高危端口.sh即可。
#!/bin/bash
定义高危端口列表
PORT_LIST="17 19 23 37 111 135 139 445 514 593 873 1194 1433 1521 1723 2049 2121 3306 3389 5432 5900 5984 6379 7001 8022 8080 9200 9300 11211 27017"
清空现有INPUT链,避免重复(生产环境可注释)
iptables -F INPUT
for port in $PORT_LIST; do
iptables -A INPUT -p tcp --dport $port -j DROP
echo "已屏蔽TCP $port"
done
保存规则
service iptables save
systemctl restart iptables
echo "高危端口全部关闭,规则已持久化"
防火墙冲突?firewalld方案也给你
部分镜像默认firewalld,可直接用firewall-cmd批量封:
for port in 17 19 23 37 111 135 139 445 514 593 873 1194 1433 1521 1723 2049 2121 3306 3389 5432 5900 5984 6379 7001 8022 8080 9200 9300 11211 27017; do
firewall-cmd --permanent --add-port=$port/tcp --set-target=DROP
done
firewall-cmd --reload
两条命令,效果一样,重启不丢。
验证是否生效
开另一个窗口执行nmap -sT 本机IP -p 3306,3389,看到state为filtered即成功。也可tail -f /var/log/messages,若出现IN=eth0 DPT=3306 DROP,说明黑客已被拒之门外。
误封业务端口如何回滚
脚本里提前写个备份函数:iptables-save > /root/iptables.bak,回滚时iptables-restore < /root/iptables.bak,秒级恢复,不怕手滑。
懒人定时任务
把脚本丢进crontab,每周一凌晨跑一次,防止新装软件又开高危端口。一行搞定:0 3 1 /root/deny高危端口.sh >/dev/null 2>&1
常见坑提醒
1. 云主机还要在控制台安全组再关一次,双层防护才安心。
2. 如果装了Docker,链会被重写,记得把脚本加在DOCKER-USER链里。
3. SELinux不会拦截端口,但别关,它跟防火墙是两码事。
端口不封,黑客自来;脚本跑完,安心睡大觉。把上面内容复制走,五分钟给CentOS穿上防弹衣,比你刷手机还快。

