Skip to main content

TProxy透明代理

实验设备

Beryl AX (GL-MT3000)
逛淘宝时无意中发现的,问客服OpenWrt相关的问题,感觉都是遮遮掩掩的,有点烦~~~直接去京东下单,居然还比淘宝便宜了几十元!
后来才想清楚,估计是因为吸吸屁不让卖这玩意吧。于是搜索了一圈论坛,果然,固件分“拆腻子CN”版和国际版!!!
懒得去跟客户唠叨,我相信肯定有途径让客户告诉我们怎么刷国际版的系统的。经过一番搜索,找当了正确的方法:

echo "US" | dd of=/dev/mtdblock3 bs=1 seek=136
sync
reboot

仅限MT3000!!!,用在其他版本的设备上,要么没效果,要么玩坏了估计(直接dd命令写盘...有点危险)。

重启后进入web console,页面左上角没有看到“CN”字样就标识版本切换成功!

切换的原理我并没有理解,而且实验过程中发现,只要执行一次上述操作,以后刷任何版本的固件都是国际版;
国际版固件其实好像也没什么,只是web console上多了WireGuard VPN和Open VPN,既然是OpenWrt系统,都是开放的,自己安装也完全没问题我个人理解。

系统自带的稳定版是21.xx,这个版本太旧了,很多软件装不上,特别是各种翻墙插件。 官方提供了OpenWrt 24.xx版本固件,说是beta,后续会转成stable巴啦巴啦...在实验过程中,暂时没有发现beta版本出现不稳定或者崩溃情况。后续自己多留意官方版本发布,及时频繁升级就是了,反正这玩意玩的就是一个“折腾的乐趣”😄

翻墙插件

passwall应该算是OpenWrt生态中主流的翻墙套件.本项目作者还有一个passwall2,据说是增强了分流相关的功能。但是,至少我目前的需求只是实现透明代理 + 防止DNS污染。毫不犹豫的选择了passwall。

  • 要完整安装,下载ipk安装包,类似:luci-app-passwall_25.11.15-r1_all.ipk。这个安装包看着不大,实际安装的时候需要安装很多依赖,不一定能一次安装成功(OpenWrt版本问题)。其实我也不需要所有的功能和组件,而且路由器的存储本来也不宽裕...
  • 下载类似:passwall_packages_ipk_aarch64_cortex-a53.zip这样的安装包,解压缩,里面有所有组件的ipk安装包。我只安装了xray-core。暂且称作“手动安装”吧。

配置

danger

先把两个坑点列出来:

  • 先搞清楚OpenWrt设备上已经安装并生效是nftables还是iptables,虽然都是NetFilter,但用法完全不一样,不用混用!操蛋的是即便用混了,配置的时候也不会报错,结果就是各种“跑不通”!!!
  • 如果使用多级代理,代理之间的通讯协议不能用socks4/5,大部分翻墙组件的socks协议都不能正常转发UDP特别是DNS查询请求。全程使用ss或者vmess是稳妥的选择,其他协议没试过,说不好。

路由配置

ip route add local default dev lo table 100 
ip rule add fwmark 1 table 100

直接执行就可以,放在一个.sh文件中执行也没问题。记得配置的时候要首先执行这两行命令。

nftables配置

把以下内容写入到任意目录中的nft.conf文件,并赋予执行权限。

#!/usr/sbin/nft -f

flush ruleset

define RESERVED_IP = {
10.0.0.0/8,
100.64.0.0/10,
127.0.0.0/8,
169.254.0.0/16,
172.16.0.0/12,
192.0.0.0/24,
224.0.0.0/4,
240.0.0.0/4,
255.255.255.255/32,
1.2.3.4/32
}

table ip xray {
chain prerouting {
type filter hook prerouting priority mangle; policy accept;
ip daddr $RESERVED_IP return
ip daddr 192.168.0.0/16 tcp dport != 53 return
ip daddr 192.168.0.0/16 udp dport != 53 return
ip protocol tcp tproxy to 127.0.0.1:12345 meta mark set 1
ip protocol udp tproxy to 127.0.0.1:12345 meta mark set 1
}
chain output {
type route hook output priority mangle; policy accept;
ip daddr $RESERVED_IP return
ip daddr 192.168.0.0/16 tcp dport != 53 return
ip daddr 192.168.0.0/16 udp dport != 53 return
meta mark 2 return
ip protocol tcp meta mark set 1
ip protocol udp meta mark set 1
}
}
  • 1.2.3.4/32是梯子的接入地址。
  • 127.0.0.1:12345是xray的监听地址和端口。
  • meta mark 2 return中的mark 2与后续xray配置文件中的相关内容保持一致。

xray配置

{
"log": {
"loglevel": "info"
},
"inbounds": [
{
"tag": "all-in",
"listen": "0.0.0.0",
"port": 12345,
"protocol": "dokodemo-door",
"settings": {
"network": "tcp,udp",
"followRedirect": true,
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls", "quic"],
"routeOnly": false
}
},
"streamSettings": {
"sockopt": {
"tproxy": "tproxy"
}
}
},
{
"tag": "socks-in",
"listen": "0.0.0.0",
"port": 10080,
"protocol": "socks"
}
],
"outbounds": [
{
"tag": "demo-ss",
"protocol": "shadowsocks",
"settings": {
"address": "1.2.3.4",
"port": 18092,
"method": "chacha20-ietf-poly1305",
"password": "359ByKBIjo="
},
"streamSettings": {
"sockopt": {
"mark": 2
}
}
}
],
"dns": {
"servers": [
{
"address": "8.8.8.8",
"port": 53,
"outboundTag": "demo-ss"
}
]
}
}
  • socks-in仅作为测试用,不是必须。
  • demo-ss出站的"mark": 2必须与上述nftables中的设置保持一致。

OpenW配置

OpenWrt系统中通常都自带Dnsmasq服务,这个服务不能关闭或者禁用。需要做以下设置:

  • DNS Forwards:设置为海外DNS服务器地址,例如:8.8.8.8
  • 勾选Ignore resolv file,忽略来自Wan口的DNS或者其他网络接口(包括VPN网络接口)的DNS设置。

测试步骤

  • 在路由器上执行dig www.bing.comcurl ipinfo.io测试功能是否正常。
  • 客户端的网关指向OpenWrt路由器(本文直接接入GL-MT3000的Wi-Fi网络,无需手动做任何设置),执行dig www.bing.comcurl ipinfo.io测试功能是否正常。

持续实验&测试中,随时记录更新...