核心是默认拒绝、精准放行、状态保障、链路覆盖、持久验证:先设iptables -P INPUT DROP,再放行lo和ESTABLISHED/RELATED,接着按源IP+端口组合添加ACCEPT规则,NAT或Docker需同步配置FORWARD或DOCKER-USER链,最后保存并用iptables -L -n -v验证计数增长。

要对特定端口服务做访问控制加固,核心不是“加一条允许规则”,而是构建一套有顺序、有状态、可验证的防护逻辑:默认拒绝所有入向连接,只放行明确需要的流量,并确保响应包能正常返回。
先设默认策略为 DROP,再精准放行
直接在 ACCEPT 规则后追加 DROP 容易失效。正确做法是把 INPUT 链默认策略设为 DROP:
- 执行 iptables -P INPUT DROP(务必在本地终端或带外管理下操作)
- 立即放行回环接口:iptables -A INPUT -i lo -j ACCEPT
- 放行已建立连接:iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT(这条必须在开放新端口规则之前)
- 再按需添加服务端口规则,例如:iptables -A INPUT -p tcp --dport 22 -j ACCEPT(SSH)、iptables -A INPUT -p tcp --dport 80 -j ACCEPT(HTTP)
按来源和端口组合控制访问权限
单一端口开放可能带来风险,建议结合源 IP 或网段限制:
- 只允许某 IP 访问数据库端口:iptables -A INPUT -p tcp -s 10.0.0.5 --dport 3306 -j ACCEPT
- 拒绝其他所有对该端口的访问:iptables -A INPUT -p tcp --dport 3306 -j DROP
- 若需优先级更高(比如封禁恶意 IP),用 -I 插入到链首:iptables -I INPUT -s 203.0.113.99 -j DROP
区分协议与链,覆盖 NAT 和容器场景
如果服务器启用了端口转发或运行 Docker,仅改 INPUT 链不够:
- NAT 场景下,外部请求经 DNAT 后走 FORWARD 链,需同步配置:iptables -I FORWARD -p tcp --dport 8080 -s 192.168.1.0/24 -j ACCEPT
- Docker 环境应使用 DOCKER-USER 链(而非 DOCKER 链),避免重启丢失:iptables -I DOCKER-USER -s 172.16.0.0/12 -p tcp --dport 5432 -j ACCEPT
- UDP 服务(如 DNS、NTP)需单独处理:iptables -A INPUT -p udp --dport 53 -j ACCEPT
保存规则并验证是否生效
临时规则重启即失效,且不验证就无法确认控制效果:
- 查看带计数的规则:iptables -L INPUT -n -v,观察对应 ACCEPT 行 packets 是否随访问增长
- Debian/Ubuntu:iptables-save > /etc/iptables/rules.v4,并确保
iptables-persistent已启用 - RHEL/CentOS:service iptables save 或 iptables-save > /etc/sysconfig/iptables
- 测试时用不同来源 IP 尝试连接目标端口,确认白名单外请求被静默丢弃(DROP)或明确拒绝(REJECT)

















