亦称:Linux TPROXY / IP_TRANSPARENT / iptables TPROXY / nftables tproxy
TPROXY(Transparent Proxying)是 Linux 内核自 2.6.28 起引入的高性能透明代理机制,配合 IP_TRANSPARENT 套接字选项与策略路由(Policy Routing),允许代理程序在完全不修改数据包源 IP 与目标 IP/端口的前提下拦截并接管 TCP 与 UDP 流量,是软路由、网关与透明代理客户端(如 Mihomo、sing-box、Xray)实现全流量分流的核心机制。
在早期 Linux 透明代理方案中,管理员普遍依赖 iptables nat 表的 REDIRECT 目标;但 REDIRECT 本质是目的网络地址转换(DNAT),它强行将数据包的目的 IP 改写为本机回环或接口 IP,导致代理软件必须通过 getsockopt 获取原始目的地址,且 Linux 的 conntrack 机制对 REDIRECT 处理 UDP 存在天然缺陷,无法实现稳定通畅的 UDP 透明转发。内核网络栈于 2.6.28 合入 TPROXY 补丁,彻底解决了无需地址改写即可截获全协议流量的需求。
TPROXY 的核心在于套接字级别的 IP_TRANSPARENT 标志。普通套接字只能 bind 到本机拥有的物理或虚拟网卡 IP,否则内核会抛出 EADDRNOTAVAIL 错误;而启用 IP_TRANSPARENT 选项后,代理进程创建的套接字被允许绑定到任意合法的外部目标 IP 和端口,并在收到外部重定向进来的报文时,能够无感知地与客户端完成三方握手或接收 UDP 数据报。
TPROXY 的流量截获依赖策略路由协同:首先在 iptables/nftables 的 PREROUTING 链 mangle 表中,通过 -j TPROXY 将匹配的流量导向本地代理端口,并给数据包打上自定义防火墙标记(fwmark);随后,Linux 路由系统通过 ip rule add fwmark <mark> lookup <table> 匹配标记,并查询特定路由表(该路由表配置 ip route add local 0.0.0.0/0 dev lo),通知内核将该外部 IP 报文当成本地报文向上传递至传输层套接字。
相较于 TUN 虚拟网卡方案需要在用户态与内核态之间反复拷贝全量 IP 报文,TPROXY 直接在网络层与传输层之间完成套接字重定向,具备极高的处理吞吐与较低的 CPU 消耗。特别是在处理海外 DNS 污染拦截、QUIC/HTTP3 传输以及海外联机游戏 UDP 转发场景下,TPROXY 能够完整保留原报文的 TTL 与首部属性,不会在中间路由跳数中产生 NAT 畸变。
在配置 TPROXY 时,最常见的故障是内核的反向路径过滤(rp_filter)拦截:由于截获的报文源 IP 来自外部客户端,若该接口开启了严格的反向路径校验(rp_filter = 1),内核在查表时会认为来自该接口的源 IP 无法原路返回从而直接丢弃。因此生产环境必须将涉及接口的 rp_filter 置为 0 或 2(宽松模式),确保双向流量顺利收敛。
百科词条中所有架构数据、网络线路说明与服务条款均以官方最新发布的信息为准:
https://docs.kernel.org/networking/tproxy.htmlhttps://netfilter.org/projects/iptables/files/