iptables 参考

Hook#

  • 本地流入 PREROUTING -> INPUT
  • 外部流量 PREROUTING -> FORWARD -> POSTROUTING
  • 本地发出 OUTPUT -> POSTROUTING

內建目标#

  • RETURN - 从 chain 返回
  • ACCEPT - 退出 chain,退出当前 table
  • DROP - 立即丢弃包
  • QUEUE
  • REJECT - 返回拒绝包 - 存在于 INPUT, FORWARD, OUTPUT
  • DANT - nat 表的 PREROUTING, OUTPUT
  • SNAT - nat 表的 POSTROUTING
  • LOG
    • iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
  • ULOG - 多播到 netlink socket,应用可以订阅进行处理
  • MARK - mangle 表
  • MASQUERADE - 类似于 SNAT,但用于 outbound 接口,IP 可能会变
  • REDIRECT - nat 表的 PREROUTING, OUTPUT - 重定向包、流到机器
  • NOTRACK - raw 表 - 用于关闭连接跟踪 - 不被 iptables/netfilter 处理

连接状态#

  • NEW
    • 包未关联连接 - 第一个未关联包不会认为是 INVALID
    • 会创建新的连接
  • ESTABLISHED
    • 包已关联连接 - 从 NEW 关联连接
    • TCP 当返回 SYN/ACK 时
    • UDP/ICMP 当 src 和 dst 交换时
  • RELATED
    • 包未关联已有连接但关联了系统中被标记为 RELATED 的连接
    • 会创建新的连接或 ICMP 错误
    • 例如 FTP 双端口
  • INVALID - 无法识别、内存溢出、ICMP 错误、无法路由
  • UNTRACKED - 在 raw 中使用 NOTRACK
  • SNAT - 虚拟状态,确保后续 恢复 响应包 源地址
  • DNAT - 虚拟状态,确保后续 恢复 响应包 目标地址

常用匹配模块#

  • -m/--match 指定模块
  • connmark
  • conntrack
  • ipvs
  • mark
  • redirect

A Deep Dive into Iptables and Netfilter Architecture#

  • A Deep Dive into Iptables and Netfilter Architecture
  • 5 个 Hook
    • NF_IP_PRE_ROUTING - PREROUTING
      • 进入网络栈
      • 先于路由决策
    • NF_IP_LOCAL_IN - INPUT
      • 如果包被路由到本地
    • NF_IP_FORWARD - FORWARD
      • 如果包被路由到其他主机
    • NF_IP_LOCAL_OUT - OUTPUT
      • 本地发起流量
    • NF_IP_POST_ROUTING - POSTROUTING
      • 本地发起流量或转发流量
      • 在被发送之前
  • 使用表来组织规则 - 通过规则返回的决策类型进行表划分
    • filter - 过滤包
    • nat - 地址转换
    • mangle - 修改包
    • raw - 用于 opt-out 包跟踪
    • security - 用于设置 SELinux 上下文 mark
  • chain - 规则链 - 控制包规则求值的路径
Tables↓/Chains→PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING
(routing decision)
raw
(connection tracking enabled)
mangle
nat (DNAT)
(routing decision)
filter
security
nat (SNAT)
  • 到本地的包 PREROUTING -> INPUT
  • 到其他主机 PREROUTING -> FORWARD -> POSTROUTING
  • 本地发出包 OUTPUT -> POSTROUTING