likes
comments
collection
share

【折腾向】闲置手机 + 内网穿透 + caddy + rclone = ?

作者站长头像
站长
· 阅读数 1

通过 frp 内网穿透将闲置手机暴露至公网,并使用 caddy 搭建 webdav 服务,客户端使用 rclone 实现 webdav 挂载,达到类坚果云的效果。

要有公网 IP!要有公网 IP!要有公网 IP!

前置条件

  • 公网 IP 或者一台 VPS,这里我用的是阿里轻量,新加坡(没有特殊需求还是建议选国内)。
  • Android 手机

termux 配置

termux 是 Android 手机可用的终端管理器,功能强大,这里我们使用它来完成服务端(闲置手机)的配置。

首先将仓库源更换为国内速度更客观的 USTC,输入 termux-change-repo 后出现下图界面:

【折腾向】闲置手机 + 内网穿透 + caddy + rclone = ?

【折腾向】闲置手机 + 内网穿透 + caddy + rclone = ?

空格选择,回车确认。

然后更新默认的包管理器和已安装的包,防止部分包过旧无法使用,输入:

pkg update
pkg upgarde

开启存储权限,输入 termux-setup-storage 并同意权限申请,这一步是为了访问外部存储并将部分公用文件夹映射到 termux 的私有目录,所以不要手动开启 termux 的存储权限:

【折腾向】闲置手机 + 内网穿透 + caddy + rclone = ?

开启后通过 ls 命令列举根目录的文件夹会出现 storage:

【折腾向】闲置手机 + 内网穿透 + caddy + rclone = ?

安装 vim:

pkg install vim

要注意 termux 对它内置的所有文件都进行了跟踪校验,如果你的手机有 root 并在外部文件管理器对 termux 内置的文件进行了编辑,之后所有在 termux 内对该文件的操作都会报权限不足的错误。

frp 内网穿透配置

frp 是开源的反向代理工具,通过在服务器中部署 frps,在内网机器中部署 frpc 可以实现内网穿透的功能,frps 会将访问服务器的流量转发到部署了 frpc 的内网机器上。

我们下载机器 CPU 对应的版本,这里我下载 linux_arm64:

【折腾向】闲置手机 + 内网穿透 + caddy + rclone = ?

右键复制链接,在服务器中通过 wget 命令下载:

wget https://github.com/fatedier/frp/releases/download/v0.54.0/frp_0.54.0_linux_arm64.tar.gz

在闲置手机中,我们先将文件下载到 /storage/emulated/0/Download/ 目录下,此时 termux 内的 storage/downloads 下也会出现对应的文件:

【折腾向】闲置手机 + 内网穿透 + caddy + rclone = ?

通过 mv 命令移动到私有目录:

mv ~/storage/downloads/frp_0.54.0_linux_arm64.tar.gz ~/frp

【折腾向】闲置手机 + 内网穿透 + caddy + rclone = ?

两端对压缩文件进行解压:

tar -zxvf /path/to/frp

cd 到解压出来的目录中,结构应该如下:

  • LICENSE 开源协议
  • frpc 内网客户端机器使用,二进制可执行文件
  • frpc.toml 内网客户端机器使用的配置
  • frps 服务器使用,二进制可执行文件
  • frps.toml 服务器使用的配置

frps.toml 配置:

# 用于 frps 和 frpc 通信的 tcp 端口
bindPort = 7000 # 端口可以自定义,服务器防火墙需要放行对应的端口

frpc.toml 配置:

# 服务器公网 IP
serverAddr = "8.8.8.8"
# 用于 frps 和 frpc 通信的 tcp 端口,和 frps 的 bindPort 保持一致
serverPort = 7000

# 代理配置
[[proxies]]
name = "webdav"        # 自定义
type = "tcp"
localIP = "127.0.0.1"
localPort = 8888       # 本地侦听的端口
remotePort = 8888      # 服务器侦听的端口,防火墙需放行

上述的代理配置表示将访问 8.8.8.8:8888 的流量转发到 127.0.0.1:8888

使用 chmod 命令赋予执行权限:

chmod +x path/to/file

启动命令分别是:

./frps -c ./frps.toml
./frpc -c ./frpc.toml

当然也可以配置后台运行:

nohup ./frps -c ./frps.toml &
nohup ./frpc -c ./frpc.toml &

caddy 配置

caddy 是一个像 Apache、nginx 的 web 服务器,我们使用它的 webdav 模块来搭建服务。

下载 CPU 对应的二进制可执行文件:

【折腾向】闲置手机 + 内网穿透 + caddy + rclone = ?

将二进制文件移动到 termux 的私有目录中,创建需要等下用的密码:

./caddy hash-password --plaintext yourpassword

【折腾向】闲置手机 + 内网穿透 + caddy + rclone = ?

使用 touch 命令在同级目录创建 caddy 配置文件:

touch Caddyfile

使用 vim 写入以下配置:

{
  order webdav before file_server
}

:8888 # 侦听 8888 端口,frpc.toml 中对应的 localPort
basicauth {
  # 用户名 # 刚刚创建的密码 
  yuanyxh $2a$14$UUqrsAY7ckh2hIbRRq4dPu1K/M9G0K4QTp2j9NE6fvJThuhN4ucG.
}
# 根路径为 /data/data/com.termux/files/home/test 需要自己创建对应的文件夹
root * /data/data/com.termux/files/home/test

route {
  # 重写路径
  rewrite /test /test/
  # 开启 webdav,可访问 /test/ 下的文件
  webdav /test/* {
    # 访问该 webdav 服务的路径 http://8.8.8.8:8888/test
    prefix /test
  }
  # 允许在浏览器中访问
  file_server browse
}

运行 caddy:

./caddy run --config ./Caddyfile

然后就可以访问自己的 webdav 服务了,或者直接在浏览器中访问 http://公网 IP:映射端口/webdav 路径

进程保活

为了防止服务挂掉,我们需要做一层保护,可以使用 termux-services 对我们运行的服务进行守护,做到进程拉起的功能。

安装 termux-services:

pkg install termux-services

创建对应服务的目录:

mkdir -p $PREFIX/var/service/frp/log
mkdir -p $PREFIX/var/service/caddy/log

链接到 termux-services:

ln -sf $PREFIX/share/termux-services/svlogger $PREFIX/var/service/frp/log/run
ln -sf $PREFIX/share/termux-services/svlogger $PREFIX/var/service/caddy/log/run

然后在 $PREFIX/var/service/<pkg>/run 文件中写入启动服务的命令:

# frp
#!/data/data/com.termux/files/usr/bin/sh
path/to/frpc -c path/to/frpc.toml

# caddy
#!/data/data/com.termux.files/usr/bin/sh
path/to/caddy run --config path/to/Caddyfile

最后启动对应的服务:

sv up frp
sv up caddy

rclone 挂载本地文件夹

rclone 是一个用于管理云存储上的文件的命令行程序,我们用它来挂载 webdav 服务到本地。

下载需要的可执行文件:

【折腾向】闲置手机 + 内网穿透 + caddy + rclone = ?

运行:

path/to/rclone config --config=rclone.conf

根据提示输入自己的 webdav 服务器信息,然后就会在 rclone 的同级目录下创建一个 rclone.conf 的配置文件。

继续输入以下命令执行挂载:

path/to/rclone mount test: E:\test --cache-dir %cd%\temp --log-file %cd%\logs\log.txt --allow-other --vfs-cache-mode full --vfs-cache-max-age 72h --vfs-cache-poll-interval 10m  --allow-non-empty

参数:

  • test: E:\test
    • test 是上一步中你创建 webdav 服务时输入的别名,test: 表示 webdav 远程根目录
    • E:\test 是挂载到的本地路径
  • --cache-dir %cd%\temp
    • --cache-dir 是已加载文件的缓存目录
    • %cd%\temp 中的 %cd% 表示程序运行所在目录
  • --log-file %cd%\logs\log.txt
    • --log-file 输出的日志文件
  • --allow-other:允许除 rclone 的其他进程访问
  • --vfs-cache-mode full:vfs 缓存模式,读取文件时进行缓存
  • --vfs-cache-max-age 72h:设置文件缓存允许的最大时间
  • --vfs-cache-poll-interval 3m:轮询检查文件是否有更改
  • --allow-non-empty:允许在非空目录上挂载,windows 中不支持

通过这些设置,只要没有大文件,基本上可以像访问本地文件一样访问 webdav 服务器中的文件了。

最后我们可以通过 vbs 脚本无感知的运行 rclone:

# rclone.vbs
CreateObject("WScript.Shell").Run "cmd /c %cd%\rclone.bat",0
# rclone.bat
rclone.exe mount test: E:\test --cache-dir %cd%\temp --log-file %cd%\logs\log.txt --allow-other --vfs-cache-max-age 72h --vfs-cache-poll-interval 10m --vfs-cache-mode full --allow-non-empty

将 rclone.vbs 的快捷方式放到 C:\Users\[username]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 就可以实现开机启动(windows 端)。

扩展

ssh 登录手机

termux 下载 openssh,生成 key ssh-keygen -A,运行 sshd

frpc.toml 添加代理

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8022  # termux 中的 openssh 默认侦听 8022 端口
remotePort = 8044 # 服务器放行 8044 端口

查看用户 whoami,设置密码 passwd,也可以添加私钥,然后用公钥访问。

私有 git 仓库

termux 安装 git,pkg install git,初始化裸仓库 git init --bare

远端 clone 仓库, git clone ssh://username@ip:port/path/to/git

也可以使用 termux 中的 gitea 包来快速搭建完善的私有 git 服务。

远程桌面

电脑开启允许远程协助,并指定允许远程协助的本地用户(需要设置密码),同时运行 frpc 穿透到公网,配置如下:

serverAddr = "8.8.8.8"
serverPort = 7000

# 代理配置
[[proxies]]
name = "remote_desktop"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389       # windows 远程桌面默认侦听的端口是 3389
remotePort = 9833      # 服务器侦听的端口,防火墙需放行

将电脑锁屏(win + L),在另一台客户端中使用远程桌面连接

【折腾向】闲置手机 + 内网穿透 + caddy + rclone = ?

注意:电脑不能进入休眠状态。