必须先放行established/related连接确保双向通信,再用-i插入顺序配置端口白名单(accept在drop前),nat场景需同步处理forward链,最后保存规则并验证计数增长。

要实现精确到端口的网络访问控制,核心是「先封禁、再放行、保状态、存规则」——不是简单加一条 ACCEPT 就完事,而是构建有逻辑顺序的规则链。
必须先允许已建立连接
默认情况下,iptables 不会自动放行响应包。若只写 iptables -A INPUT -s 192.168.1.100 -p tcp --dport 8080 -j ACCEPT,客户端发来的 SYN 能进来,但服务器返回的 SYN-ACK 可能被后续默认策略拦截。所以第一步应放行 RELATED/ESTABLISHED 状态:
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT- 这条规则必须放在所有自定义放行规则之前,确保双向通信畅通
按「先拒绝、后特许」顺序配置目标端口
直接追加(-A)容易被已有 ACCEPT 规则绕过。稳妥做法是:先封死目标端口所有访问,再插入(-I)白名单规则。
- 封禁全部访问:
iptables -I INPUT -p tcp --dport 8080 -j DROP - 立即放行指定 IP:
iptables -I INPUT -s 192.168.1.100 -p tcp --dport 8080 -j ACCEPT - 注意:这两条都用
-I插入,保证 ACCEPT 在 DROP 之前匹配
区分 INPUT 和 FORWARD 链(NAT 场景需额外处理)
如果服务器启用了端口转发(如 DNAT),仅改 INPUT 链不够。外部请求经 NAT 后进入 FORWARD 链,此时需同步控制:
- 检查是否启用转发:
sysctl net.ipv4.ip_forward返回 1 则需配置 FORWARD - 添加对应规则:
iptables -I FORWARD -s 192.168.1.100 -p tcp --dport 8080 -j ACCEPT - 同样配一条 DROP:
iptables -I FORWARD -p tcp --dport 8080 -j DROP
保存并验证规则生效
临时规则重启即失效,且不验证就无法确认是否命中。
- 查看带计数的规则:
iptables -L INPUT -n -v,观察 ACCEPT 行的 packets 数是否增长 - CentOS 6/7:
service iptables save;较新系统建议用iptables-save > /etc/sysconfig/iptables - 确认服务开机自启:
systemctl enable iptables(若使用传统服务)











