透明代理探索之TProxy - kernel panic

透明代理探索之TProxy

去年我写过一篇文,大概是用NAT的方式将树莓派作为无墙网关
REDIRECT方式转发数据给V2Ray
事实上这种方式通俗易懂,但是不能够支持UDP流量,这是因为这种方式拿不到UDP的目的地址,所以参考官方手册加之实践整理出如下原因,并简要学习TProxy的配置方法。

REDIRECT不支持UDP流量的原因

在配置过程中,有这样一条命令:

iptables -A V2RAY -s 192.168.2.0/24 -p tcp -j REDIRECT --to-ports 8081

一个流入本机的数据包,原地址匹配到了192.168.2.0/24,则包头的目标地址被改成本机(其实所谓REDIRECT可以被认为是特殊的DNAT),那么它的目标地址改了,V2Ray怎么知道它原先的目的地址呢?
实际上,套接字提供了一个选项SO_ORIGINAL_DST,netfilter会把原始目的地址放在套接字的SO_ORIGINAL_DST属性里面,那么就可以很轻松的拿到原目的地址做转发了。
而 UDP 不是面向连接的,因此从 socket 里拿不到目的地址。

TProxy简介

简要说就是它不像REDIRECT一样会改变包头的目的地址,且支持UDP TCP。我个人理解就是通过调整本地路由和对数据包做标记来实现引流到代理软件的,具体可以去看各大佬的介绍吧

配置TProxy

在官方文档新 V2Ray 白话文指南中,作者给出了样例代码
但并未对各个命令做详细的解释,我将按我的理解梳理一遍,时间关系仅分析代理局域网部分。

# 设置策略路由
ip rule add fwmark 1 table 100 
ip route add local 0.0.0.0/0 dev lo table 100
  1. 对带有标记为1的数据,使用路由表100。
  2. 路由表100中,所有的地址均为 local。
# 代理局域网设备
iptables -t mangle -N V2RAY
iptables -t mangle -A V2RAY -d 127.0.0.1/32 -j RETURN
iptables -t mangle -A V2RAY -d 224.0.0.0/4 -j RETURN 
iptables -t mangle -A V2RAY -d 255.255.255.255/32 -j RETURN 
iptables -t mangle -A V2RAY -d 192.168.0.0/16 -p tcp -j RETURN # 直连局域网,避免 V2Ray 无法启动时无法连网关的 SSH,如果你配置的是其他网段(如 10.x.x.x 等),则修改成自己的
iptables -t mangle -A V2RAY -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN # 直连局域网,53 端口除外(因为要使用 V2Ray 的 DNS)
iptables -t mangle -A V2RAY -j RETURN -m mark --mark 0xff    # 直连 SO_MARK 为 0xff 的流量(0xff 是 16 进制数,数值上等同与上面V2Ray 配置的 255),此规则目的是解决v2ray占用大量CPU(https://github.com/v2ray/v2ray-core/issues/2621)
iptables -t mangle -A V2RAY -p udp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1 # 给 UDP 打标记 1,转发至 12345 端口
iptables -t mangle -A V2RAY -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1 # 给 TCP 打标记 1,转发至 12345 端口
iptables -t mangle -A PREROUTING -j V2RAY # 应用规则

代理局域网设备做了几件事:

  1. 将几个特殊地址返回,不经由V2Ray处理
  2. 对于来自局域网的地址也返回,不经由V2Ray处理
  3. 将UDP 53端口的DNS流量引入V2Ray
  4. 带有255标记的数据包,不再经由V2Ray处理,因为已经处理过了
  5. 将UDP和TCP流量打上标记1后引入V2Ray

V2Ray配置文件的要点

  1. Dokodemo-door 是用来接收透明代理的入站协议,followRedirect 项须为 true 以及 sockopt.tproxy 项须为 tproxy,建议开启 snifing,否则路由无法匹配域名;
  2. 在 dokodemo inbound 和所有的 outbound 加一个 255 的 mark,这个 mark 与下文 iptables 命令中 iptables -t mangle -A V2RAY_MASK -j RETURN -m mark --mark 0xff 配合,以直连 V2Ray 发出的流量。
    具体配置建议参考官方手册。

效果

配置完成后的iptables条目:
QQ截图20220127195656.png
V2Ray运行日志:可以看到流量类型分为[dns-out]、[proxy]、[direct]三类,这是因为开启了snifing
QQ截图20220127195556.png
简要测速
测速
落地服务器在日本东京,直连测速在80Mbps左右

添加新评论

电子邮件地址不会被公开,评论内容可能需要管理员审核后显示。