最优解是“默认拒绝+显式放行”:先设iptables默认策略为drop,再仅放行ssh、web等必需端口,并允许回环与已建立连接,最后保存规则确保持久化。

直接封禁未使用的端口不是最优解,关键在于“默认拒绝 + 显式放行”——先堵死所有入口,再只开必需的端口。这是生产环境最稳妥的加固逻辑。
一、确认当前开放端口和服务
关端口前必须知道哪些端口真正在用:
- 查监听中的 TCP/UDP 端口:
ss -tuln(比 netstat 更快更现代) - 查对应进程:
ss -tulnp | grep ':端口号'(需 root 权限才显示 PID 和程序名) - 重点核对:22(SSH)、80/443(Web)、53(DNS)、25/465/587(邮件)、自定义服务端口等
- 发现未知监听端口?用
lsof -i :端口号或ps aux | grep PID追查来源
二、实施“白名单式”防火墙策略
不逐条删端口,而是重置策略为“全拒”,再精准放行:
- 设置默认策略为 DROP:
iptables -P INPUT DROPiptables -P FORWARD DROPiptables -P OUTPUT DROP - 允许本机回环通信(必须):
iptables -A INPUT -i lo -j ACCEPTiptables -A OUTPUT -o lo -j ACCEPT - 允许已建立连接的返回流量(保障 SSH 不掉线):
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT - 放行 SSH(示例,按实际端口调整):
iptables -A INPUT -p tcp --dport 22 -j ACCEPT - 如需 Web 访问:
iptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -A INPUT -p tcp --dport 443 -j ACCEPT
三、封禁高危或冗余端口(补充加固)
在白名单基础上,额外拦截常见攻击入口:
- 禁止外部访问数据库端口(如 MySQL 3306):
iptables -A INPUT -p tcp --dport 3306 -s 0.0.0.0/0 -j DROP - 限制某 IP 段访问管理端口:
iptables -I INPUT -p tcp --dport 22 -s 192.168.100.0/24 -j ACCEPTiptables -A INPUT -p tcp --dport 22 -j DROP(先允后拒,实现源白名单) - 屏蔽扫描行为(可选):
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP(空标志包)iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP(XMAS 扫描)
四、保存规则并验证持久性
重启后规则会丢失,必须显式保存:
- Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4
确保iptables-persistent已安装并启用 - RHEL/CentOS 7+:
service iptables save(若使用传统 iptables 服务)
或用iptables-save > /etc/sysconfig/iptables并确保iptables服务已启用 - 验证是否生效:
iptables -L -n -v查看计数器是否增长
从外网用telnet 服务器IP 端口或nmap -sT 服务器IP测试封禁效果
真正安全的边界不是靠“关掉几个端口”,而是建立可审计、可预测、最小权限的通信模型。每加一条 ACCEPT 规则,都要能回答“为什么必须开”和“谁需要访问”。











