iptables策略需按数据包流向设计逻辑路径,核心是表链匹配顺序、规则先后关系与动作语义精准配合:filter表input链用于访问控制,nat表prerouting链处理dnat,raw表prerouting链跳过连接跟踪;input链规则须按“回环→响应→服务→兜底drop”顺序排列;匹配条件应具体(如精确端口、网段、协议、状态);操作后须查(-nl --line-numbers)、调(-d或-f)、存(iptables-save)三步闭环。

iptables 策略编写不是堆砌命令,而是按数据包流向设计逻辑路径。核心在于表链匹配顺序、规则先后关系和动作语义的精准配合——写错位置或放错表,规则就等于没写。
明确目标表与链,避免规则“隐身”
规则只在对应表的特定链上生效,跨表操作无效:
- 日常访问控制(如放行 SSH、拒绝恶意 IP)必须用 filter 表 + INPUT 链;写进 nat 或 mangle 表,iptables 会忽略
- DNAT(公网端口映射到内网)只能在 nat 表的 PREROUTING 链 设置;放错到 INPUT 或 OUTPUT 就无法完成地址转换
- 需要跳过连接跟踪(比如 UDP 高频服务)才用 raw 表 + PREROUTING 链,普通防护无需涉及
INPUT 链规则顺序:三步筑基,一步兜底
INPUT 是主机防护主战场,规则必须严格按执行优先级排列:
- 先保回环:iptables -A INPUT -i lo -j ACCEPT(本地进程通信不能被拦)
- 再通响应:iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT(确保已建立连接的返回包畅通)
- 后开服务:如 iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT(按业务需求逐条放开,来源越精确越好)
- 最后拒入:iptables -A INPUT -j DROP(必须放在末尾,否则前面规则全失效)
精准匹配条件,少用模糊范围
匹配越具体,策略越安全。避免无差别放行:
- 端口限制:用 --dport 22 而非 --dport 22:23,除非真需连续端口
- IP 来源:优先指定网段(-s 192.168.5.0/24),慎用 -s 0.0.0.0/0(即任意地址)
- 协议限定:SSH 必须加 -p tcp,防止 UDP 冒充;ICMP 检测用 --icmp-type echo-request,不放行所有 ICMP 类型
- 状态判断:用 --ctstate NEW 匹配新连接请求,配合 ESTABLISHED 实现双向可控
操作闭环:查、调、存,三步缺一不可
临时规则重启即丢,漏掉保存等于白配:
- 查现状:iptables -nL --line-numbers(带行号,方便定位)
- 删误配:iptables -D INPUT 3(删除第 3 条)或 iptables -F INPUT(清空整链,慎用)
- 存持久:iptables-save > /etc/sysconfig/iptables(CentOS/RHEL)或 iptables-save > /etc/iptables/rules.v4(Debian/Ubuntu)
- 额外提醒:改完建议用 iptables -P INPUT ACCEPT 临时放宽策略测试连通性,确认无误再设为 DROP











