亦称:iptables REDIRECT / NAT REDIRECT / 端口重定向 / PREROUTING REDIRECT
REDIRECT 是 Linux netfilter 架构下 nat 表中的经典目标动作,通过在 PREROUTING 链或 OUTPUT 链中修改数据包的目标 IP 地址为本机接口 IP 并重写目标端口,将途经主机的流量强制导向本地代理监听端口。由于其基于 NAT 实现且不支持 UDP,常用于早期的轻量 TCP 透明代理。
iptables 的 REDIRECT 动作是 DNAT(目的网络地址转换)的一种特化形式:当数据包流经 PREROUTING 链时,若规则命中 -j REDIRECT --to-ports <端口>,内核会将该数据包的目的 IP 替换为数据包流入网卡的当前 IP 地址(若是本机产生的 OUTPUT 流量则替换为 127.0.0.1),同时重写目的端口。客户端无需显式配置代理协议,直接发起普通连接即可被网关截获。
由于数据包的目的地址被内核改写为代理监听端口,代理程序在 accept() 接收连接后,无法直接从 socket 的目标地址得知客户端原本想访问的目标服务器。为此,Linux 内核在 netfilter conntrack 中维护了 NAT 转换映射,代理程序必须调用 getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, &dest, &len)(IPv6 下为 IP6T_SO_ORIGINAL_DST)反查 conntrack 表项,提取出客户端原始发起的真实 IP 与端口。
REDIRECT 最大的局限在于对 UDP 的支持极其受限:TCP 拥有严格的 SYN/ACK 握手生命周期与确定的连接元组,而 UDP 是无连接的数据报。虽然 netfilter 会为 UDP 建立临时的 conntrack 关联,但普通 socket 无法通过类似 SO_ORIGINAL_DST 的手段可靠区分多条 UDP 独立流的上下文,因此 REDIRECT 在现代翻墙方案中无法用于代理游戏加速、QUIC 协议或 DNS 查询,已被 TPROXY 与 TUN 模式取代。
在仅需透明代理 TCP 流量(如 HTTP/HTTPS 基础爬虫或简单分流)且不想折腾复杂策略路由的场景下,REDIRECT 规则配置最为精简,只需一条 iptables 规则即可生效。但对于全功能翻墙客户端(如 Mihomo、sing-box),需要兼顾 UDP、弱网优化与 IPv6 双栈,TPROXY 或 TUN 虚拟网卡通常是更通用、无侵入的首选方案。
百科词条中所有架构数据、网络线路说明与服务条款均以官方最新发布的信息为准:
https://netfilter.org/documentation/HOWTO/NAT-HOWTO-6.htmlhttps://man7.org/linux/man-pages/man7/ip.7.html