Linux系统如何配置透明代理 使用TPROXY实现流量无感拦截

酷磊君_6487

酷磊君_6487

2026-04-24

332人浏览

原创

tproxy必须配合iptables的tproxy target使用,因其仅为内核转发机制,不自动劫持流量;需通过mangle表prerouting链显式标记并重定向至本地透明代理端口,且代理须启用ip_transparent选项。

linux系统如何配置透明代理 使用tproxy实现流量无感拦截

TPROXY 为什么必须配合 iptables 的 REDIRECT 或 TPROXY target 使用

TPROXY 本身不是代理程序,而是一个内核机制,用于将流量“无连接地”转发到本地监听的透明代理(如 haproxy、privoxy 或自研服务)。它不修改数据包目标 IP 和端口,而是保留原始目的地址,让应用层能读取到真实目标 —— 这正是透明代理的核心前提。但内核不会自动把流量送过去,必须靠 iptables 在 mangle 表中用 TPROXY target 显式标记并重定向到指定端口。

常见错误是只配了用户态代理监听 0.0.0.0:12345,却忘了加 iptables 规则,结果流量根本没进代理;或者误用 REDIRECT(会改写 dst port,丢失原始目的端口),导致代理无法做基于目标域名或端口的策略分流。

  • TPROXY 只支持 IPv4 的 mangle 表 PREROUTING 链,且要求 socket 绑定时使用 IP_TRANSPARENT 选项
  • 代理进程必须以 root 或 CAP_NET_RAW 权限运行,否则无法 bind 到非本机 IP 或启用透明 socket
  • 若需处理 IPv6,得用 ip6tables + TPROXY,规则结构类似但不能混用

iptables 规则怎么写才不丢包、不绕过

典型漏配点:只对 PREROUTING 做 TPROXY,却没关掉 rp_filter(反向路径过滤),导致回包被内核丢弃。TPROXY 流量的响应路径和请求路径不一致(请求进 eth0,响应可能从 lo 出),必须禁用严格模式。

正确最小集如下(假设代理监听在 127.0.0.1:1080,目标端口为 80/443):

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter

iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -m socket -j ACCEPT
iptables -t mangle -A DIVERT -j TPROXY --tproxy-mark 0x1/0x1 --on-port 1080 --on-ip 127.0.0.1

关键点:

  • -m socket 是核心:它匹配已建立连接或本地监听 socket 的包,避免对非目标流量误操作
  • --tproxy-mark 需与后续路由规则配合,若只做本地透明代理,可简化为 --on-port 直接指定
  • 务必确认 net.ipv4.conf.all.route_localnet = 1,否则发往 127.0.0.1 的 TPROXY 包会被丢弃

用户态代理如何正确启用 IP_TRANSPARENT 支持

不是所有代理软件默认支持 TPROXY。比如 nginx 需要编译时加 --with-stream_ssl_preread_module 并配置 transparent 参数;haproxy 要求 1.5+ 且 backend listen 必须带 transparent,同时启动时加 -d 或确保 ulimit -n 足够。

aperture: the L402 aware reverse proxy
aperture: the L402 aware reverse proxy

安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。

下载

以 haproxy 为例,关键配置段:

frontend transparent_https
    bind 127.0.0.1:1080 ssl alpn h2,http/1.1
    mode tcp
    option tcp-check
    tcp-request connection set-var(req.dst_ip) req.dst_ip
    tcp-request connection set-var(req.dst_port) req.dst_port
    use_backend https_servers if { req.dst_port 443 }

backend https_servers
    mode tcp
    option ssl-hello-chk
    server gateway 192.168.1.100:443 transparent

注意:transparent 必须出现在 bind 和 server 行,且整个链路(包括 upstream)都要支持透传,否则代理拿到的是 127.0.0.1:1080 而非原始目标。

  • Go 程序用 net.ListenTCP 时,需在 ListenConfig.Control 中调用 setsockopt(fd, SOL_IP, IP_TRANSPARENT, 1)
  • Python 的 socket 模块不直接暴露该选项,得用 ctypes 或 socket.ioctl 手动设置 IP_TRANSPARENT
  • 若代理日志里看到全是 127.0.0.1,基本是没开 transparent 或没设 IP_TRANSPARENT

为什么 DNS 查询经常被忽略,导致 HTTPS SNI 识别失败

TPROXY 只作用于 TCP/UDP 数据包,DNS 查询(尤其 UDP 53)若走普通路由,代理就收不到原始域名,无法做基于域名的策略(如直连国内站、代理境外站)。更麻烦的是,现代浏览器常通过 HTTPS DNS(DoH)或 QUIC 绕过系统 DNS,进一步削弱透明性。

可行解法有限,且都有代价:

  • 用 iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 5353 强制本机 DNS 查询走本地 DNS 代理(如 dnsmasq 或 coredns),再由其转发并记录域名
  • 对 DoH 流量,只能靠 TPROXY 拦截 443 端口后,在代理中解析 TLS ClientHello 的 SNI 字段 —— 但这要求代理支持 TLS 解析且不破坏证书链
  • 完全放弃 DNS 透明,改用 PAC 或系统级代理设置,换取确定性

真正难的从来不是拦截,而是拦截之后怎么不失真地还原意图。SNI 可读,ALPN 不一定;QUIC 加密更彻底,目前没有标准方式在内核层提取目标域名。这类边界问题,往往得在架构层面接受妥协。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux proxy linux系统

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4170

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3533

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2753

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6750

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

6402

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

3693

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

3185

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

3419

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

297

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习