返回博客

通过TPROXY在OpenWrt路由器上设置透明代理:全网配置指南

通过在OpenWrt上使用TPROXY设置透明代理,可以将网络中的所有流量通过代理服务器传输,而无需在每个设备上手动配置。

📅2026年6月6日
```html

如果您希望整个网络的流量通过代理——而无需在每台笔记本电脑、智能手机或服务器上手动配置——那么通过 TPROXY 在 OpenWrt 路由器上设置透明代理正是您所需要的。在本指南中,我们将详细介绍完整的配置:从安装所需的软件包到 iptables 规则和工作检查。

什么是 TPROXY 及其用途

TPROXY(透明代理)是 Linux 内核的一种机制,允许在不更改数据包的目标 IP 地址的情况下拦截 TCP 和 UDP 流量。与经典的 NAT 重定向(REDIRECT)不同,TPROXY 保留原始接收者的地址,这对代理客户端的正常工作至关重要:它“看到”设备在网络中试图连接的确切位置。

这在实践中有什么用呢?想象一下:您有一个办公室或家庭实验室,里面有数十台设备——计算机、智能手机、物联网设备、测试虚拟机。在每台设备上手动配置代理需要花费数小时的工作时间,并且在更换代理服务器时会不断头疼。路由器上的透明代理集中解决了这个问题:整个网络的流量自动通过代理,而设备对此毫不知情。

在 OpenWrt 上使用 TPROXY 的典型应用场景:

  • 通过驻留或移动代理路由所有流量以绕过地理限制
  • 在企业网络中集中监控和过滤流量
  • 通过代理从不同地区测试应用程序,而无需更改客户端机器上的设置
  • 为连接到路由器的所有设备自动更改 IP
  • 通过单一网关与反检测浏览器(Dolphin Anty、AdsPower、GoLogin)一起工作

TPROXY 相对于普通的 REDIRECT 的关键优势:支持 UDP。这对于现代协议(QUIC、DNS over UDP、游戏流量)至关重要,而 REDIRECT 根本无法正确处理。

OpenWrt 中透明代理的工作原理

OpenWrt 上 TPROXY 的工作流程如下:

  1. 网络中的设备向外部 IP 地址发送数据包(例如,93.184.216.34:443)。
  2. 路由器通过 iptables TPROXY 规则在 PREROUTING 链中拦截数据包——在做出路由决策之前。
  3. 数据包被标记为特殊的 fwmark,并被重定向到代理客户端的本地套接字(例如,端口 7893)。
  4. 代理客户端(redsocks、Xray、sing-box)通过 IP_TRANSPARENT 机制“看到”原始目标地址,并通过远程代理服务器建立连接。
  5. 响应返回给设备——透明的,没有任何客户端侧的更改。

💡 重要提示

TPROXY 仅在 PREROUTING 链中工作 mangle 表。这意味着仅拦截来自网络设备的传输流量,而不是路由器本身的流量。要拦截路由器的流量,需要通过 OUTPUT 和通过 loopback 的路由进行额外配置。

要求:路由器、固件、软件包

在开始配置之前,请确保您的配置符合最低要求。

路由器要求

参数 最低要求 推荐
RAM 64 MB 256 MB 及以上
Flash / 存储 16 MB 128 MB 及以上
CPU 架构 MIPS, ARM ARM Cortex-A7/A53 及以上
OpenWrt 版本 21.02 23.05 或快照
Linux 内核 5.4 带 TPROXY 5.15 / 6.1

在此任务中表现良好的型号包括:GL.iNet GL-MT6000 (Flint 2)Xiaomi AX3000TBanana Pi BPi-R3Raspberry Pi 4(搭载 OpenWrt),以及任何具有足够 RAM 的 x86 路由器。

检查内核对 TPROXY 的支持

通过 SSH 连接到路由器并执行:

zcat /proc/config.gz | grep TPROXY

您应该看到 CONFIG_NETFILTER_XT_TARGET_TPROXY=y=m。如果输出为空——则内核不支持 TPROXY,需要重新编译或更换固件。

安装所需的软件包

在 OpenWrt 上运行 TPROXY 需要几个软件包。通过 SSH 连接并更新软件包列表:

opkg update

安装所需的组件:

# TPROXY 的内核模块
opkg install kmod-nft-tproxy

# 如果使用 iptables(旧堆栈)
opkg install iptables-mod-tproxy

# ip rule / ip route 工具
opkg install ip-full

# 额外用于处理 fwmark
opkg install kmod-ipt-tproxy

根据所选的代理客户端,安装以下软件包之一:

代理客户端 OpenWrt 软件包 TPROXY 支持
redsocks redsocks TCP(通过 redsocks2 的 UDP)
Xray-core xray-core TCP + UDP(原生支持)
sing-box sing-box TCP + UDP(原生支持)
mihomo(Clash Meta) mihomo TCP + UDP(原生支持)

对于大多数任务,我们推荐 sing-boxmihomo——它们原生支持 TPROXY,包括 UDP,并且具有方便的配置格式。

配置 iptables 和 ip rule 规则

这是关键步骤。我们需要做三件事:标记所需的数据包 fwmark,配置特殊的路由表,并在 iptables 中添加 TPROXY 规则。

步骤 1:创建路由表

# 添加特殊路由:标记的数据包进入 loopback
ip rule add fwmark 1 table 100
ip route add local default dev lo table 100

这告诉内核:“所有标记为 fwmark=1 的数据包被视为本地的,并发送到 loopback。”这正是代理客户端能够通过其套接字接收它们的方式。

步骤 2:iptables 规则(mangle/PREROUTING)

# 创建 TPROXY 的链
iptables -t mangle -N TPROXY_RULES

# 排除本地地址(不代理它们)
iptables -t mangle -A TPROXY_RULES -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A TPROXY_RULES -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A TPROXY_RULES -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A TPROXY_RULES -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A TPROXY_RULES -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A TPROXY_RULES -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A TPROXY_RULES -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A TPROXY_RULES -d 240.0.0.0/4 -j RETURN

# 将 TCP 重定向到代理客户端的端口(7893)
iptables -t mangle -A TPROXY_RULES -p tcp \
  -j TPROXY --on-port 7893 --on-ip 127.0.0.1 --tproxy-mark 1

# 将 UDP 重定向到代理客户端的端口(7893)
iptables -t mangle -A TPROXY_RULES -p udp \
  -j TPROXY --on-port 7893 --on-ip 127.0.0.1 --tproxy-mark 1

# 将链应用于传输流量
iptables -t mangle -A PREROUTING -j TPROXY_RULES

📌 端口 7893

端口 7893 是代理客户端(sing-box、mihomo、Xray)在 tproxy 模式下监听的端口。确保它与您的客户端设置相匹配。

步骤 3:在重启时保存规则

/etc/init.d/tproxy 中创建自启动脚本,或将命令添加到 /etc/rc.local。对于使用 nftables 的 OpenWrt 23.05,请使用 nft 语法中的类似规则:

nft add table ip tproxy_table
nft add chain ip tproxy_table prerouting \
  '{ type filter hook prerouting priority mangle; policy accept; }'
nft add rule ip tproxy_table prerouting \
  ip daddr { 10.0.0.0/8, 127.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 } return
nft add rule ip tproxy_table prerouting \
  tcp tproxy to 127.0.0.1:7893 meta mark set 1
nft add rule ip tproxy_table prerouting \
  udp tproxy to 127.0.0.1:7893 meta mark set 1

代理客户端配置:redsocks、Xray、sing-box

路由器上的代理客户端是一个程序,它接收被拦截的流量并通过远程代理服务器发送。我们来看看最流行选项的配置。

选项 1:redsocks(简单,仅 TCP)

适用于基本的 SOCKS5 代理任务。配置文件 /etc/redsocks.conf

base {
    log_debug = off;
    log_info = on;
    log = "file:/var/log/redsocks.log";
    daemon = on;
    redirector = tproxy;
}

redsocks {
    local_ip = 127.0.0.1;
    local_port = 7893;

    // 您的 SOCKS5 代理地址
    ip = 185.220.101.50;
    port = 1080;
    type = socks5;

    // 如果代理需要身份验证:
    login = "your_login";
    password = "your_password";
}

选项 2:sing-box(推荐——TCP + UDP)

sing-box 原生支持 TPROXY,并且与大多数类型的代理(SOCKS5、HTTP、Shadowsocks、VLESS、Trojan)兼容。配置示例 /etc/sing-box/config.json

{
  "inbounds": [
    {
      "type": "tproxy",
      "listen": "127.0.0.1",
      "listen_port": 7893,
      "tcp_fast_open": false,
      "udp_fragment": true,
      "sniff": true
    }
  ],
  "outbounds": [
    {
      "type": "socks",
      "tag": "proxy-out",
      "server": "185.220.101.50",
      "server_port": 1080,
      "version": "5",
      "username": "your_login",
      "password": "your_password"
    },
    {
      "type": "direct",
      "tag": "direct"
    }
  ],
  "route": {
    "rules": [
      {
        "geoip": ["private"],
        "outbound": "direct"
      }
    ],
    "final": "proxy-out"
  }
}

启动 sing-box 并添加到自启动:

/etc/init.d/sing-box enable
/etc/init.d/sing-box start

选项 3:mihomo / Clash Meta

mihomo 是 Clash 的一个分支,具有扩展功能。在 tproxy-port 部分指定要拦截的端口:

mixed-port: 7890
tproxy-port: 7893
allow-lan: false
mode: rule
log-level: info

proxies:
  - name: "my-socks5"
    type: socks5
    server: 185.220.101.50
    port: 1080
    username: your_login
    password: your_password
    udp: true

proxy-groups:
  - name: "PROXY"
    type: select
    proxies:
      - my-socks5

rules:
  - IP-CIDR,192.168.0.0/16,DIRECT
  - IP-CIDR,10.0.0.0/8,DIRECT
  - MATCH,PROXY

防止 DNS 泄漏

没有正确配置 DNS 的透明代理是一个严重的漏洞。如果 DNS 查询直接通过提供商而不是通过代理发送,实际位置将被泄露,尽管 IP 被更改。这对于需要匿名性或地理伪装的任务至关重要。

方法 1:通过 TPROXY 拦截 DNS

添加规则以拦截 UDP 流量到端口 53:

# 拦截来自网络设备的 DNS 查询
iptables -t mangle -A TPROXY_RULES -p udp --dport 53 \
  -j TPROXY --on-port 7893 --on-ip 127.0.0.1 --tproxy-mark 1

方法 2:通过 sing-box / mihomo 处理 DNS

sing-box 和 mihomo 可以自行处理 DNS 查询并通过代理发送。在 sing-box 的配置中添加 DNS 部分:

"dns": {
  "servers": [
    {
      "tag": "remote",
      "address": "8.8.8.8",
      "detour": "proxy-out"
    },
    {
      "tag": "local",
      "address": "192.168.1.1",
      "detour": "direct"
    }
  ],
  "rules": [
    {
      "geoip": ["private"],
      "server": "local"
    }
  ],
  "final": "remote",
  "independent_cache": true
}

方法 3:通过代理转发的 dnsmasq

如果您不使用 sing-box/mihomo,请配置 dnsmasq(OpenWrt 的标准 DNS 服务器),使其将请求转发到加密的 DNS 服务器。在 /etc/dnsmasq.conf 文件中:

# 禁用使用提供商的 DNS
no-resolv

# 通过本地解析器使用 DoH/DoT
server=127.0.0.1#5335

# 禁止设备直接使用外部 DNS
# (iptables 规则以阻止直接 DNS 查询)
# iptables -t nat -A PREROUTING -p udp --dport 53 ! -d 192.168.1.1 -j DNAT --to 192.168.1.1

检查和调试

配置后,请务必检查透明代理的工作是否正常。以下是逐步检查清单。

步骤 1:检查 iptables 规则

# 查看 TPROXY_RULES 链
iptables -t mangle -L TPROXY_RULES -v -n

# 检查路由表 100
ip rule show
ip route show table 100

步骤 2:检查代理客户端是否在监听端口

ss -tlnp | grep 7893
# 或者
netstat -tlnp | grep 7893

您应该看到 sing-box、mihomo 或 redsocks 进程在 127.0.0.1:7893 上监听。

步骤 3:检查客户端设备的 IP

从网络中的任何设备连接到路由器,并在浏览器中打开 ifconfig.me2ip.ru。显示的 IP 应与您的代理服务器的 IP 相同,而不是您互联网提供商的真实 IP。

步骤 4:检查 DNS 泄漏

访问 dnsleaktest.com 并执行扩展测试。结果中的 DNS 服务器应属于您的代理提供商或所选的 DoH 服务器,而不是您的互联网提供商。

常见问题及解决方案

症状 原因 解决方案
互联网完全无法使用 代理客户端未启动 检查服务状态,查看客户端日志
IP 不变 iptables 规则未应用 检查 iptables -t mangle -L -v
UDP 无法使用 redsocks 不支持 UDP 切换到 sing-box 或 mihomo
路由循环 代理客户端的流量也被拦截 将代理客户端的 UID 或 cgroup 排除在规则之外
TPROXY 目标错误 内核模块未加载 modprobe xt_TPROXY

哪种类型的代理适合 TPROXY 在 OpenWrt 上使用

选择代理类型对结果有重大影响。并非所有选项都适合在路由器上使用透明代理——重要的是要考虑协议、连接的稳定性和任务。

SOCKS5 代理

TPROXY 的最通用选项。支持 TCP 和 UDP(使用 sing-box/mihomo 时)。适用于大多数任务:绕过地理限制、为整个网络更改 IP、与市场平台合作。 数据中心代理 以 SOCKS5 格式提供高速度和稳定性——如果优先考虑速度而不是伪装成真实用户,这是最佳选择。

住宅代理

住宅代理 使用真实家庭用户的 IP 地址。通过路由器上的 TPROXY 进行路由时,这意味着您网络中的所有流量将看起来像来自所需国家的普通家庭互联网用户的流量。非常适合:

  • 监控海外市场(亚马逊、eBay、Zalando)的价格
  • 从不同地区测试广告
  • 与积极阻止数据中心 IP 的平台合作
  • 需要最大程度伪装成真实用户的任务

移动代理

移动代理 通过移动运营商的 IP(4G/5G)工作。它们在平台方面具有最高的信任度——Facebook、Instagram、TikTok 很少阻止移动 IP,因为一个地址后面可能有成千上万的真实用户。通过路由器上的 TPROXY 使用时,您网络中的所有流量都将获得移动 IP,这对以下任务至关重要:

  • 通过 Facebook Ads 和 TikTok Ads 进行流量套利
  • 社交媒体账户的养成
  • 通过单一网关与反检测浏览器(Dolphin Anty、AdsPower、GoLogin)一起工作
代理类型 速度 平台信任度 最佳场景
数据中心 ⚡ 高速 ★★☆☆☆ 解析、价格监控
住宅 ⚡⚡ 中速 ★★★★☆ 地理测试、电子商务
移动 ⚡ 中速 ★★★★★ 社交媒体、流量套利

结论

通过 TPROXY 在 OpenWrt 上设置透明代理是一个强大的工具,用于集中管理整个网络的流量。该方法的主要优点是:无需在每个设备上单独配置代理,支持 TCP 和 UDP 流量,并且配置灵活可扩展,适用于从家庭使用到企业基础设施的各种任务。

我们讨论的关键步骤包括:检查 OpenWrt 内核对 TPROXY 的支持、安装所需的软件包、配置带有正确 fwmark 的 iptables/nftables 规则、代理客户端(redsocks、sing-box 或 mihomo)的配置以及防止 DNS 泄漏。每个步骤都很重要——跳过任何一步都可能导致不正常工作或真实 IP 泄漏。

如果您的任务是通过代理路由整个网络的流量,并获得平台(Facebook、Instagram、TikTok、海外市场)的最大信任度,我们建议使用 住宅代理——它们提供来自所需国家的真实家庭 IP,并在通过路由器上的透明代理工作时,最小化被阻止的风险。

```