前言
适逢 Surge Mac 5 新增内网穿透工具 Surge Ponte,我为什么要反其道而行之,在Mac上折腾 Frp呢?
Surge Ponte
在大多数用户侧均使用UDP代理转发的形式实现内网穿透,实际体验下来与Frp的速度相差不少。- 我曾经做过一次不那么严谨的测试:在局域网外分别通过 Ponte 与 Frp 访问 Surge的
Remote Controller
,从Surge主界面进入到Recent Requests
内,Ponte用时7秒,而 Frp仅仅2秒。由于不是那么严谨,我只能大概估计动画、代理服务器到我本地的RTT、以及我的手速等影响因素。 - 由于Cloudflare Pages对视频流托管的限制,我将这段视频发到了我的 Telegram频道。
接下来,让我们开始吧!
准备
你需要拥有一台有公网IP的服务器,我这里使用腾讯云作为Frps客户端。
-
这台服务器到你地区的延迟越低越好,带宽不应小于
5Mbps
。 -
下文所指的Frps(Server)指的是服务端,而Frpc(Client)则为客户端。
你还需要一些Linux基础命令,以及最基本的对MacOS的熟悉。
搭建 Frps
下载、安装
使用SSH连接远程服务器。可以输入以下命令来查看系统架构:
arch
查看结果,如果是X86_64
即可选择amd64
。
执行以下命令下载并解压Frp:
wget https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_linux_amd64.tar.gz
tar -zxvf frp_0.48.0_linux_amd64.tar.gz
- 注:这里的
frp_0.48.0
为发稿前的最新版本,请前往 Release 页面 查看并下载最新版本。
改个名字,方便cd:
cp -r frp_0.48.0_linux_amd64 frps
cd frps
如果正确,/frps 内的文件树应该是这样子的:
root@ubuntu:~# tree frps
frps
├── LICENSE
├── frpc
├── frpc.ini
├── frpc_full.ini
├── frps
├── frps.ini
└── frps_full.ini
这里多余了frpc的相关文件,我们可以将其删去:
rm frpc frpc.ini frpc_full.ini LICENSE
接着,使用你喜欢的方式修改 frps.ini
文件,这个文件为frps的配置文件,应有如下格式:
[common]
bind_addr = 0.0.0.0
bind_port = 37000
token = [RANDOM_PASSWORD]
dashboard_addr = 0.0.0.0
dashboard_port = 37500
dashboard_user = admin
dashboard_pwd = admin
bind_port
表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。token
是用于客户端和服务端连接鉴权的密钥,请务必修改为**随机强字符,**以减少爆破风险。dashboard_port
是frps控制面板的端口,如果使用该配置请访问IP:37500
查看控制面板。dashboard_user
和dashboard_pwd
为访问控制面板时的登录用户名和密码,设置成自己喜欢的。
编辑完成之后记得保存。
输入以下命令启动frps:
./frps -c frps.ini
如果一切配置正确,屏幕上会显示:
1970/01/01 23:59:59 [I] [service.go:130] frps tcp listen on 0.0.0.0:37000
1970/01/01 23:59:59 [I] [service.go:193] https service listen on 0.0.0.0:10443
1970/01/01 23:59:59 [I] [service.go:216] Dashboard listen on 0.0.0.0:37500
1970/01/01 23:59:59 [I] [root.go:210] Start frps success
现在在浏览器访问 IP:37500
即可打开控制面板。
守护进程
我们使用nohup
守护frps进程。这个工具可以帮助我们在系统重启时自动运行frps程序。
我们使用Ctrl + C
结束当前的进程 然后输入:
nohup ./frps -c frps.ini &
如果看到输出结果为:
nohup: ignoring input and appending output to 'nohup.out'
则成功,可以按Ctrl + C
退出。
可以刷新下frps面板,看看是否能继续访问。或者使用jobs
命令:
[1]+ Running nohup ./frps -c frps.ini &
如果输出的是以上结果,则表示frps搭建成功。
搭建Frpc
MacOS
我们仍需要下载Frp的可执行文件,不同于Linux,我们可以在MacOS上前往 Release 页面 查看并下载最新版本。
- frp_0.48.0_darwin_amd64.tar.gz 适用于搭载 Intel 芯片的 Mac 设备。
- frp_0.48.0_darwin_arm64.tar.gz 适用于搭载 Apple Silicon(M1/M2) 芯片的 Mac 设备。
下载完成后解压,我将这个文件夹命名为frpc
且移动到了~/users/$(whoami)
目录下。
然后删除与frps有关的文件:
rm frps frps.ini frps_full.ini LICENSE
之后就可以编辑frpc.ini
配置文件了。
[common]
server_addr =
server_port =
token =
log_level = info
log_max_days = 3
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin
[Surge-SnellServer]
type = tcp
local_ip =127.0.0.1
local_port = 6160
remote_port = 7001
[Surge-RemoteController]
type = tcp
local_ip =127.0.0.1
local_port = 6170
remote_port = 6170
server_addr
、server_port
、token
这三项我们需要到frps.ini
中寻找答案。- 分别填你服务器的地址、端口、以及设置的token。
我开放了两个端口。以Surge-SnellServer
为例 ,这会将我内网中的 6160端口转发给远端的7001端口,也就是说,我直接访问IP:7001
即可通过Snell加密协议连回家中。
我们需要在Surge for Mac的配置文件中编辑:
[Snell Server]
interface = 0.0.0.0
port = 6160
psk = {RAMDOM_PASSWORD}
obfs = off
psk =
也应填写随机字符串。
如果成功,Surge for Mac会弹出这样一条通知:
我们在其他的Surge设备上添加代理:
[Proxy]
Home = snell, YOUR_IP, 7001, psk={psk}, test-url=http://wifi.vivo.com.cn/generate_204
- 注意:这里的端口号请填写
frpc.ini
中的remote_port
。
这样就会将Surge for Mac作为Snell的代理服务端,然后通过frp服务中转到公网上面。我们连接这个Snell代理之后,就可以连接 192.168.*.*
或者Macbook.local
之类的的内网设备了。
都配置好后,我们可以执行 ./frpc -c frpc.ini
来观察是否可以成功启动服务。
讲了这么多,如何在MacOS守护frp进程呢?
守护进程
我们需要前往 设置
→ 用户与群组
中将自动以此身份登录
开启。frpc则需要进一步地通过在launchd
下编写.plist启动文件实现开机自启。
我们需要在 ~/Library/LaunchAgents
目录下创建frpc.plist
文件。这个过程可能需要root权限。由于MacOS系统自带的权限混乱问题,想要编辑这个目录下的文件还是有些难度的。我们可以在SSH下通过vim
编辑,也可以直接下载我提供的文件,编辑后再拖入文件夹。
~/Library/LaunchAgents
在Finder里面是被隐藏的,我们需要快捷键Command + Shift + G
进入该目录。请千万不要忘记前面的**「~」**。- 如果还遇到了权限问题,我们可以使用以下命令给这个文件赋权:
chmod +x /path/to/frpc.list
需要注意的是,赋予权限可能会导致文件被意外修改或删除。因此,只有在非常必要的情况下才应该赋予权限。在使用时,需谨慎操作。
以下为frpc.plist
的内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
<key>Label</key>
<string>frpc</string>
<key>ProgramArguments</key>
<array>
<string>/Users/$(whoami)/frpc/frpc</string>
<string>-c</string>
<string>/Users/$(whoami)/frpc/frpc.ini</string>
</array>
<key>KeepAlive</key>
<true/>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
- 注意:这个配置文件中默认将frp的目录放在了
/Users/$(whoami)/frpc
下,请核对并修改为你自己的目录。
最后,在终端输入下面的两段命令给frpc.plist
赋予权限,并加载配置到系统使配置生效。
sudo chown root ~/Library/LaunchAgents/frpc.plist
sudo launchctl load -w ~/Library/LaunchAgents/frpc.plist
如果不想开机自启,只需要输入下面的命令即可。
sudo launchctl unload -w ~/Library/LaunchAgents/frpc.plist
Windows
同样地,可以根据客户端的不同前往Release 页面 选择不同的版本进行下载,Windows下载和解压等步骤不再描述。
本文将 /frpc
放在C盘根目录下。
使用命令提示符或Powershell执行:
cd C:\frpc
./frpc -c frpc.ini
可以观察到frp程序已成功运行。
守护进程
我们使用一个批处理文件frpc.bat
将frpc挂在后台运行。
@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
REM
cd C:\frpc
frpc -c frpc.ini
exit
- 注意:这个配置文件中默认将frp的目录放在了
C:\frpc
下,请核对并修改为你自己的目录。
如果需要开机启动,将frpc.bat
丢到Windows的开机启动文件夹即可。
强烈建议你在使用frp直接测试内网穿透前,先在局域网内测试好相关功能的正常使用,并配置好可能会影响的Windows防火墙等内容,在内网调试通过后再使用frp进行内网穿透测试。
- 这个 issue 报告了 Windows Defender 将frp误报为病毒的问题。