iptable 的报文处理动作

设置 匹配规则 后,为报文设置处理动作。

报文处理动作用下面是三个参数指定:

-j, --jump target                  # 使用指定的扩展模块处理报文,处理完成后返回
-g, --goto chain                   # 跳转到另一条规则链处理
-c, --set-counters packets bytes   # 计数器重置

报文处理动作主要是用 -j 指定,-j 也可以像 -g 一样指向另一条规则链。

另一条规则链我们把它称为子链:

  • 如果子链是通过 -j 跳转的,子链中的 return 动作会终止子链中处理,返回到父链中继续处理
  • 如果子链是通过 -g 跳转的,子链中的 return 动作会终止子链中处理,且跳过父链的后续规则

Unlike the --jump option return will not continue processing in this chain but instead in the chain that called us via --jump.

基本动作

ACCEPT    # 放行报文
DROP      # 丢弃报文
RETURN    # 返回到上一条规则链中继续处理

扩展动作

大部分处理是用扩展完成的,在 man iptables-extensions 中可以看到支持的扩展动作:

AUDIT
CHECKSUM
CLASSIFY
CLUSTERIP (IPv4-specific)
CONNMARK
CONNSECMARK
CT
DNAT
DNPT (IPv6-specific)
DSCP
ECN (IPv4-specific)
HL (IPv6-specific)
HMARK
IDLETIMER
LED
LOG
MARK
MASQUERADE
MIRROR (IPv4-specific)
NETMAP
NFLOG
NFQUEUE
NOTRACK
RATEEST
REDIRECT
REJECT (IPv6-specific)
REJECT (IPv4-specific)
SAME (IPv4-specific)
SECMARK
SET
SNAT
SNPT (IPv6-specific)
TCPMSS
TCPOPTSTRIP
TEE
TOS
TPROXY
TRACE
TTL (IPv4-specific)
ULOG (IPv4-specific)

报文重定向

REDIRECT 能够在 nat 表的 PREROUTING 和 OUTPUT 链中,将报文的目地 IP 修改为接收到这个报文的网卡的 IP,从而将报文重定向到本地的监听地址。

目标端口如果不指定则不修改,复用原始报文的目标端口:

--to-ports port[-port]   # 将目标端口修改为范围内的数值
--random                 # 为目标端口随机取值

示例,nginx 本地透明代理

# 新建一个规则链 
iptables -t nat -N LOCAL_PROXY

# 不代理 nginx 生成的报文,防止出现 nginx 代理 nginx 的死循环
iptables -t nat -A LOCAL_PROXY -m owner --uid-owner nginx -j RETURN

# 将本地生成的目标端口为 8080 的 tcp 报文,重定向到本地的 :8080 监听地址
iptables -t nat -A LOCAL_PROXY -p tcp -m tcp --dport 8080 -j REDIRECT --to-ports 8080

参考

  1. 李佶澳的博客