我的一部老手机mi5splus,我已为它换过两次屏幕了,虽然已经老了 但是仍不舍得扔掉,拿它折腾一下,记录折腾过程。

由于旧手机不支持STA AP并发模式,我使用ota网卡上网,开启热点作为AP

手机已经root,termux中部署了singbox,在inbounds中添加tproxy入站

1
2
3
4
5
6
{
"type": "tproxy",
"tag": "tproxy-in",
"listen": "127.0.0.1",
"listen_port": 1081
}

为了防止回路,在路由规则中添加本地规则 直接出站

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
"route": {
"rules": [
{
"ip_cidr": ["127.0.0.0/8"],
"outbound": "direct-out"
},
{
"ip_cidr": [
"10.0.0.0/8",
"172.16.0.0/12",
"192.168.0.0/16", // 包含了热点网段ip
"100.64.0.0/10" // 运营商级 NAT
],
"outbound": "direct-out"
},
]
}

iptables 规则设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 手机自定义规则不知道清空会有什么问题,所以没有清空原有规则,并且备份
iptables-save > iptables.v4.bak
# 偷懒只进行了ipv4设置,同样的ipv6也要设置


# 排除Termux/Sing-box 自身的出站流量,id -u
# Termux UID 必须正确!
iptables -t mangle -A OUTPUT -m owner --uid-owner $TERMUX_UID -j RETURN

# 排除本地回环地址流量 (双重保险,num 1 应该已存在,这里明确一下)
iptables -t mangle -A PREROUTING -d 127.0.0.1/32 -j RETURN

# 排除 DHCP 流量 (解决客户端无法获取 IP), 否则客户端无法获得ip 无法连接网络
# 目标端口 67 (DHCP Server)
iptables -t mangle -A PREROUTING -i wlan0 -p udp --dport 67 -j RETURN
# 源端口 68 (DHCP Client)
iptables -t mangle -A PREROUTING -i wlan0 -p udp --sport 68 -j RETURN
# 内网网段是 192.168.31.0/24。这确保远程连接流量不会被代理。
iptables -t mangle -A PREROUTING -i wlan0 -d 192.168.31.0/24 -j RETURN

# =================================================================
# TPROXY 核心重定向规则

# 1. 标记和 TPROXY TCP 流量
iptables -t mangle -A PREROUTING -i wlan0 -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 1081 --tproxy-mark 1

# 2. 标记和 TPROXY UDP 流量
iptables -t mangle -A PREROUTING -i wlan0 -p udp -j TPROXY --on-ip 127.0.0.1 --on-port 1081 --tproxy-mark 1

# =================================================================
# IP 路由配置(Root 权限执行)

# I. 开启 IP 转发 (必须开启) 同样的ipv6也要设置,这里省略了
echo 1 > /proc/sys/net/ipv4/ip_forward

# II. 添加自定义路由规则
# 1. 路由规则:将带有标记 1 的流量,查找路由表 100
ip rule add fwmark 1 table 100

# 2. 路由表 100:将所有流量都路由到本地回环接口 (lo)
ip route add local default dev lo table 100

这样就透明代理了热点中的客户端。