在 Android 环境下使用双层代理,同时使用 shadowsocks 和其它VPN App:
手机 -> ss server -> VPN server -> Target
手机环境:
已 root
安装 shadowsocks-android 和任一其它 VPN App
配置:
1. 在终端(adb shell 或任一 terminal app)里以 root 用户执行命令修改路由:
ip rule add to <SS_SERVER_IP> lookup wlan0
ip rule add to <SS_SERVER_IP> lookup rmnet_data0
每次手机重新启动后都需要执行一次上面命令。
2. 将 Shadowsocks-Android 设为 NAT 模式;编辑 profile 文件,开启 per-app mode, 去掉 “bypass mode” 选项,app list 里只选中 VPN App。
3. 启动 shadowsocks 和 VPN 即可,VPN 需要工作在 tcp 模式。
How it works:
当 shadowsocks 配置为以上模式时(步骤2),只会拦截 VPN App 的 OUTPUT 流量 (以及 dns 解析请求) 并转发到本地 ss 端口。所以只有 VPN App 到 VPN Server 的流量会走 ss(VPN 的虚拟网卡流量是内核维护的,不属于 VPN App,所以不会被捕获),这样就实现了双层代理。
ivy_dsds:/ # iptables -t nat -vxnL OUTPUT Chain OUTPUT (policy ACCEPT 11095 packets, 773246 bytes) ...... 1213 79262 DNAT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 to:127.0.0.1:1133 33 1980 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 owner UID match 10124 to:127.0.0.1:8123
但是 VPN 启动后会修改路由表默认路由,所以必须保证到 ss server IP 的路由直连。这个只需要用 ip rule 添加一个自定义路由规则即可(步骤1)