默认拒绝所有入站连接,再显式放行业务端口(如80、443、22等),同时允许lo、established/related及可选icmp;设置input/forward默认策略为drop,保存并验证规则。

要通过 iptables 实现“仅允许业务端口访问”,核心是:默认拒绝所有入站连接,再显式放行你真正需要的端口(如 80、443、22 等),同时保留本地回环和已建立连接的流量。关键不是“加白名单”,而是构建一条安全、可维护的入站规则链。
设置默认策略为 DROP
这是整个策略的基础。不设默认拒绝,任何漏掉的规则都可能成为入口。
- 执行:iptables -P INPUT DROP(注意:先确保已有 SSH 规则或留有应急通道,否则可能锁死)
- 同理设置:iptables -P FORWARD DROP(若非网关/转发设备,通常无需处理)
- 切勿跳过这步直接加 ALLOW 规则——否则旧规则仍生效,新策略形同虚设
放行必要基础流量
在 DROP 之前,必须优先允许三类不可少的流量,否则系统将无法正常响应:
- 本地回环(lo):iptables -A INPUT -i lo -j ACCEPT
- 已建立和相关连接(保障响应合法请求):iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT(新版内核建议用 conntrack 替代 state,如:-m conntrack --ctstate ESTABLISHED,RELATED)
- ICMP(可选但推荐):便于诊断,例如只允许可信网段 ping:iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT
按需开放业务端口
只写明确需要对外提供服务的端口,避免使用端口范围(如 3000:5000),防止误放行未审计服务。
- Web 服务:iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- HTTPS:iptables -A INPUT -p tcp --dport 443 -j ACCEPT
- SSH(强烈建议限制来源 IP):iptables -A INPUT -s 203.0.113.45 -p tcp --dport 22 -j ACCEPT
- 数据库(如仅内网访问):iptables -A INPUT -s 10.0.2.0/24 -p tcp --dport 3306 -j ACCEPT
- 若需 UDP 端口(如 DNS、NTP),同样用 -p udp 显式声明,不混用
保存与验证规则
iptables 规则重启后丢失,必须持久化;同时要确认规则顺序和效果是否符合预期。
- 查看当前规则(带编号,便于管理):iptables -L INPUT --line-numbers -n
- 检查是否有冲突或冗余规则(如重复开放 22 端口、旧规则未删除)
- 保存规则(不同系统命令不同):
• CentOS/RHEL 6:service iptables save
• CentOS/RHEL 7+ 或 Ubuntu(使用 netfilter-persistent):iptables-save > /etc/iptables/rules.v4
• 推荐搭配 iptables-restore 测试配置文件再加载 - 从外部扫描验证:nmap -sT -p 22,80,443,3306 your-server-ip,应仅返回开放的业务端口










