使用 frp 实现内网穿透,把闲置的 mac mini 用起来
我有一台 mac mini m2,本来是放在办公室用的,但发现还是带笔记本更方便,所以就闲置了。
家里已经有了群晖 nas,所以暂时也没有用途了。
这两年 AI 很火,就琢磨着可以搞个相关的小服务放在 mac mini 上跑,然后对外提供接口,这就需要打通网络。
调研了一番,还是选择了以前用过的 frp。
环境准备
客户端是我的 mac mini,系统是最新版的 macOS 15.4。
服务端是我的阿里云 ECS,系统是 ubuntu 22.04。
下载好 frp,目前最新的版本是 v0.62.0
。
服务端下载 frp_0.62.0_linux_amd64.tar.gz,解压后放到 /opt/frp
目录。
客户端下载 frp_0.62.0_darwin_arm64.tar.gz,解压后放到 /Users/tony/apps/frp
目录。
配置文件
发现这个版本的配置文件已经改用 toml
格式了,这是要准备拥抱 Rust 吗?
需要注意的是,如果 frp 版本差异比较大,可能配置文件的参数会略有不同。
服务端配置文件 frps.toml
内容如下:
bindPort = 7000
auth.method = "token"
auth.token = "xxxxxxxx"
webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "dashuser"
webServer.password = "xxxxxxx"
端口默认 7000,可以随便改。主要是加了 auth 相关的两个参数,token 用于客户端连接时的交验,否则谁都能随便用了。
webServer 是提供了一个 web 端的界面,用于服务的可视化管理。
客户端配置文件 frpc.toml
内容如下:
serverAddr = "服务器IP"
serverPort = 7000
auth.token = "xxxxxxxx"
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 2022
服务器地址端口根据你的情况改一下,下面的 [[proxies]]
是代理服务,我这里先配置了一个 ssh,注意这的 remotePort
参数,是指映射到远程服务器的端口(我先随便搞了个 2022 端口)。
配置好后就可以启动了。
服务端启动:
./frps -c ./frps.toml
客户端启动:
./frpc -c ./frpc.toml
然后如果没问题,就可以使用 ssh username@服务器IP -p 2022
来登录 mac mini 了。
上面把 frp 的客户端服务器端模式跑通了,下面就要配置自动化的服务了。
如果服务器重启了,或者家里断电了,frp 就断了,所以我门需要将 frp 配置成系统服务,让其自动启动。
ubuntu 下的 frps 服务配置
创建一个配置文件 /etc/systemd/system/frps.service
,内容如下:
[Unit]
Description=FRP Server Service
After=network.target
[Service]
Type=simple
ExecStart=/opt/frp/frps -c /opt/frp/frps.toml
Restart=always
RestartSec=5s
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
注意这里的 /opt/frp/frps -c /opt/frp/frps.toml
需要根据你的路径修改一下。
保存后,执行:
sudo systemctl daemon-reexec # 重载 systemd 主进程(保险起见)
sudo systemctl daemon-reload # 重载服务配置
sudo systemctl enable frps # 开机自启
sudo systemctl start frps # 启动服务
这样就可以查看 frps 的服务状态了:
sudo systemctl status frps
查看日志:
journalctl -u frps -f
mac mini(macOS)的开启自启配置
创建文件 ~/Library/LaunchAgents/com.frpc.client.plist
,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.frpc.client</string>
<key>ProgramArguments</key>
<array>
<string>/Users/tony/apps/frp_0.62.0_darwin_arm64/frpc</string>
<string>-c</string>
<string>/Users/tony/apps/frp_0.62.0_darwin_arm64/frpc.toml</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/frpc.log</string>
<key>StandardErrorPath</key>
<string>/tmp/frpc.err</string>
</dict>
</plist>
注意这里面的路径同样需要根据你具体的情况修改。
保存后加载服务并启动:
launchctl load ~/Library/LaunchAgents/com.frpc.client.plist
之后你每次登录系统,frpc 会自动启动,如果它崩溃了,也会被自动重启。
如果你修改了这个配置,需要重新加载:
launchctl unload ~/Library/LaunchAgents/com.frpc.client.plist
launchctl load ~/Library/LaunchAgents/com.frpc.client.plist
查看当前状态:
launchctl list | grep frpc
查看日志:
tail -f /tmp/frpc.log
tail -f /tmp/frpc.err
好了,你可以使用 pkill frpc
命令杀掉 frpc 的进程测试是否 work 了。