Featured image of post 使用Frp工具进行内网穿透

使用Frp工具进行内网穿透

设置Frp工具内网穿透,以及在MacOS / Windows守护进程。

前言

适逢 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

改个名字,方便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_userdashboard_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 页面 查看并下载最新版本。

下载完成后解压,我将这个文件夹命名为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_addrserver_porttoken这三项我们需要到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会弹出这样一条通知:

截屏2023-03-28 下午6.36.11.png

我们在其他的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 的内容:

使用Dropbox下载

<?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挂在后台运行。

使用Dropbox下载

@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误报为病毒的问题。

Reference:

Licensed under CC BY-NC-SA 4.0
Last updated on Apr 02, 2023 19:50 +0800
Supports IPv6, HTTP/3, TLS 1.3 & DNSSEC