admin管理员组

文章数量:1646328

目前分享vpn连接的方法主要是软路由(操作系统主要是OpenWrt),或硬路由如华硕梅林魔改系统。局限在于一是成本高,二是受限于vpn客户端软件,有些vpn没有对应操作系统的客户端app,或者有连接设备数量限制。

本文介绍一种将安卓手机改造成软路由的方法。只需要一台root过的安卓手机和一个脚本就可以运行起来。具体步骤如下:

1. 准备一台有root权限的安卓手机,建议系统版本Android 13以上

2. 安装termux,参考:Termux——安装配置_termux安装-CSDN博客

3. 准备脚本proxy.sh 内容如下:

#!/system/bin/sh

dev='wlan0'    # 手机物理网卡名称,默认无线网卡是wlan0,若开启ap模式,可能是wlan1或ap0之类,可以通过`ifconfig`命令查看
interval=5     # 检测网络状态间隔(秒)
pref=18000     # 路由策略优先级

# 获取vpn虚拟网卡名称,多数情况下是tun0 可以通过`ifconfig`命令查看
tun=$(ifconfig 2>/dev/null | grep -o -w -E '^tun[0-9]+' || echo "tun0")

# 记录本服务进程号文件
pidfile="/data/data/com.termux/files/usr/var/run/proxy.pid"
# log文件,可以根据自己需要修改
logfile="/sdcard/Logs/proxy.log"
# redirect output to logfile
exec >> $logfile
exec 2>&1

# 杀死已有的运行实例
function kill_old_process() {
    test -f "$pidfile" || return
    local pid=$(cat "$pidfile")
    test -z "$pid" -o $pid -le 1 && return
    local pgid=$(ps -o pgid= -p "$pid")
    [ "$pid" == "$pgid" ] && pid="-$pid"    # kill process group
    kill -- "$pid" 2>/dev/null || return   # pidfile exists but process not
    for i in `seq 10`; do
        sleep 1
        test -f "$pidfile" || return
        kill -- "$pid" 2>/dev/null || return
    done
    sleep 1
    kill -9 "$pid" 2>/dev/null
}
export -f kill_old_process

# 日志输出
function LOG() {
    local NOW_DATE_STD=$(date +"%Y-%m-%d %H:%M:%S")
    echo -e "[$NOW_DATE_STD] $@" >&2
}
export -f LOG

# 确保唯一实例运行
kill_old_process

case $1 in
    -k)
        exit 0  # only kill old instance
        ;;
esac

echo "$$" > $pidfile

# 开启IP转发功能
sysctl -w net.ipv4.ip_forward=1

# 清除filter表转发链规则
iptables -F FORWARD

# 添加NAT转换,部分第三方VPN需要此设置否则无法上网,若要关闭请注释掉
iptables -t nat -A POSTROUTING -o $tun -j MASQUERADE

# 添加路由策略
ip rule add from all table main pref $pref
ip rule add from all iif $dev table $tun pref $(expr $pref - 1)

LOG "Proxy server $$ started on ${dev} -> ${tun}."

# 程序退出时自动清理并恢复原始配置
function terminate() {
    sysctl -w net.ipv4.ip_forward=0
    ip rule delete from all table main pref $pref
    ip rule delete from all iif $dev table $tun pref $(expr $pref - 1)
    iptables -t nat -D POSTROUTING -o $tun -j MASQUERADE
    iptables -F FORWARD
    rm -f $pidfile
    pkill -9 -P $$
    LOG "Proxy server $$ terminated."
}
trap "" SIGPIPE   # SIGPIPE when caller die
trap "terminate; trap - EXIT; exit" EXIT SIGINT SIGHUP SIGQUIT SIGABRT SIGTERM SIGSTOP

contain="from all iif $dev lookup $tun"
while true; do
    if [[ $(ip rule) != *$contain* ]]; then
        if [[ $(ip ad | grep 'state UP') != *$dev* ]]; then
            LOG "dev has been lost."
        else
            ip rule delete from all iif $dev table $tun pref $(expr $pref - 1)
            ip rule add from all iif $dev table $tun pref $(expr $pref - 1)
            LOG "network changed, reset the routing policy."
        fi
    fi
    sleep $interval
done

4. 测试运行

由于本脚本中用到了一些termux的工具,而且在android系统中同一个工具有系统原生版和termux版,如ps命令,往往termux版功能更多,因此我们先要设置PATH路径让termux路径优先于系统路径,具体如下:

# 进入termux root模式
su -M
# 设置路径
export PATH=/data/data/com.termux/files/usr/bin:$PATH
# 启动脚本
bash ./proxy.sh

5 其他设备设置

将其他设备(这里以Mac举例)和软路由手机练到同一个局域网,打开网络设置,将ip地址由动态分配dhcp改成静态指定static,将网关设置成手机的ip,特别注意DNS要设置成全球公共的,这里设置成谷歌的8.8.8.8和8.8.4.4,如图所示:

到此就大功告成,在浏览器输入要去的url看看能否连上。

这个方法的好处是客户端配置非常简单,几乎任何一种os都支持静态ip配置和dns设定。

而且对客户端而言是无感知的全局代理,不像一些软件只对浏览器起作用。

6. 将proxy服务加入supervisor托管

在我之前的文章中提到过termux安装supervisor,参考: Termux安装supervisor任务管理器-CSDN博客

在 /data/data/com.termux/files/usr/etc/supervisor/conf.d 目录下建立proxy.conf文件,内容如下:

[program:proxy]
command=/data/data/com.termux/files/usr/bin/bash /sdcard/usr/bin/proxy.sh
autostart=false
autorestart=true
stdout_logfile=/data/data/com.termux/files/usr/var/log/supervisor/%(program_name)s.log
stdout_logfile_maxbytes=10MB
redirect_stderr=true
stopasgroup=true
killasgroup=true

然后执行 `supervisorctl update all` 使supervisor配置生效

再执行 `supervisorctl status` 检查服务是否已经启动。

7. 建立快捷命令

为了方便快捷启停proxy服务,可以通过添加命令alias,编辑 ${HOME}/.bashrc, 在里面添加

alias proxy0="supervisorctl stop proxy"
alias proxy1="supervisorctl restart proxy"
alias proxylog='tail -n 100 -f /sdcard/Logs/proxy.log'

之后可以通过 proxy0 proxy1 快捷启停服务。通过 proxylog 命令查看运行状态

本文标签: 变身路由设备手机vpn