使用 frp 进行内网穿透
utils
本文字数:3.1k 字 | 阅读时长 ≈ 13 min

使用 frp 进行内网穿透

utils
本文字数:3.1k 字 | 阅读时长 ≈ 13 min

原文链接,本文在原文的基础上进行了修改

从公网访问内网是一件很难的事情,之前使用 autossh 来进行端口转发,但是这需要用户对内网的电脑有一定的 root 权限才能够开启(因为需要 root 权限来安装各种适配包),而使用 frp 进行内网穿透,只需要获取内网的登录权限即可,不需要对内网服务器有任何的 root 权限

目的:本文目的是通过外网来访问内网,首先我有一台内网服务器,有一台在实验室可以访问内网的台式机,还有一台公网服务器(在阿里云等购买)。现在的目的是我想在其他地方访问内网服务器

1. frp 是什么

frp 是一个反向代理软件,体积轻量但功能强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持 HTTP、TCP、UDP 等众多协议。我们今天仅讨论 TCP 和 UDP 相关的内容。

2. 准备工作

  1. 内网服务器(想要访问的设备)
  2. 公网服务器(VPS)
  3. 别的地方可以访问内网的台式机(这个也可以没有?我没试过,但可以尝试)
  4. 我的移动电脑

注意:frp 的原理是利用服务端(即公网服务器 VPS)进行转发,因此 VPS 的速度直接决定了之后连接的质量

3. 公网服务器设置

frp 下载地址:https://github.com/fatedier/frp/releases

首先 ssh 连接到 VPS 之后运行下面命令来查看处理器架构,根据不同架构下载相应版本的 frp

这里是 X86_64 架构,因此选择 amd64 版本下载,最好将其放在自己的 home 目录下,运行以下命令

tar -zxvf frp_0.48.0_linux_amd64.tar.gz
mv frp_0.48.0_linux_amd64 frp

解压文件并重新命令为 frp,cd frp 进入目录,然后 ls -a 查看一下文件

其中 frps 和 frps.ini(以 s 结果代表 server)分别是服务端程序和服务端配置文件,frpc 和 frpc.ini(以 c 结尾代表 client)分别是客户端程序和客户端配置文件

由于我们目前在配置服务端,所以可以删除客户端的两个文件 frpc 和 frpc.ini,也可以保留

下面修改服务器端配置文件 vim frps.ini,将其改为以下内容

[common]
bind_port = 7000
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443
~                               

端口可以使用默认值,token,user,pwd 可以自行设置,编辑完保存即可

保存完后执行下面命令运行 frp,./frps -c frps.ini,终端输出以下命令表示运行成功

root@iZuf67mlx4ftb5vohxeobnZ:/home/admin/frp# ./frps -c frps.ini 
2023/04/20 21:24:50 [I] [root.go:206] frps uses config file: frps.ini
2023/04/20 21:24:50 [I] [service.go:200] frps tcp listen on 0.0.0.0:7000
2023/04/20 21:24:50 [I] [service.go:261] http service listen on 0.0.0.0:10080
2023/04/20 21:24:50 [I] [service.go:276] https service listen on 0.0.0.0:10443
2023/04/20 21:24:50 [I] [service.go:317] Dashboard listen on 0.0.0.0:7500
2023/04/20 21:24:50 [I] [root.go:215] frps started successfully

此时访问 x.x.x.x:7500 并使用自己设置的用户名和密码登录即可看到仪表盘界面了

注意这里我的终端无法显示浏览器,所以我通过端口转发,转发到我笔记本来进行查看,在笔记本终端上运行 ssh username@x.x.x.x -L 127.0.0.1:8888:127.0.0.1:7500,其中 username 是公网用户名,x.x.x.x 是公网 ip,8888 是本地端口,7500 是公网端口

此时会进入到 VPS 服务器界面,这说明已经将公网的 7500 端口映射到本地 8888,此时在笔记本浏览器上输入 http://127.0.0.1:8888,然后输入刚才设置的用户名和密码,既可以得到如下界面,这就是 frp 的仪表盘

4. 实验室电脑设置

实验室的电脑可以登录内网,所以我们需要建立 VPS 服务器和实验室电脑的连接,这样我们就可以通过VPS-访问实验室电脑-访问内网了(或许也可以直接用 VPS 访问内网 TuT,应该是可以的,下次有需求在设置)

实验室电脑在这里是客户端,frp 的客户端就是我们想要真正进行访问的那台设备,大多数情况下应该会是一台 Windows 主机,因而本文使用 Windows 主机做例子;Linux 配置方法类似,不再赘述。

同样的选择相应的 window 版本的 frp 程序下载,这里下载的是 frp_0.48.0_windows_amd64.zip,将其解压放在 C 盘根目录下,并重新命名为 frp,因为这里是客户端,所以可以删除 frps 和 frps.ini 文件

对 frpc.ini 文件进行编译,如下

[common]
server_addr = x.x.x.x
server_port = 7000
token = 12345678

[ssh]
type = tcp
local_ip = x.x.x.x
local_port = 22
remote_port = 6000

注意这里要将 VPS 公网服务器的端口全打开,否则在 windows 端与 VPS 连接的时候会出问题,如下,将 1 到 65525 所有端口进行开放

开放后进入 c 盘的 frp 文件夹,运行以下命令 frpc -c frpc.ini,此时终端输出以下内容表示连接成功了,如果不打开 VPS 端口,可能会出现错误

C:\frp>frpc -c frpc.ini
2023/04/20 21:45:09 [I] [service.go:299] [ce623fe431338447] login to server success, get run id [ce623fe431338447], server udp port [0]
2023/04/20 21:45:09 [I] [proxy_manager.go:142] [ce623fe431338447] proxy added: [ssh]
2023/04/20 21:45:09 [I] [control.go:172] [ce623fe431338447] [ssh] start proxy success

此时连接就建立了,在自己笔记本上输入 ssh -p 6000 username@x.x.x.x,即可登录,其中 6000 是上面在 window 处设置的 remote_port,username 是内网账号名,x.x.x.x 是外网的 ip

5. 设置服务器和客户端自动运行

5.1 设置服务器自动运行

在服务器端,如果 ctrl+c 关掉命令之后,就断掉了,这里使用 nohup 命令让其在 VPS 的后台运行

nohup ./frps -c frps.ini &

# 输出
# nohup: ignoring input and appending output to 'nohup.out'

输出上述命令的时候就是正常运行了,在终端输入 jobs 可以看到还在运行

root@iZuf67mlx4ftb5vohxeobnZ:/home/admin/frp# jobs
[1]+  Running                 nohup ./frps -c frps.ini &

此时可以放心的关上终端了,如果要关闭这个 nohup 进程,运行如下命令找到进程 PID,使用 kill -9 PID 即可

root@iZuf67mlx4ftb5vohxeobnZ:/home/admin/frp# ps -aux | grep frp
root      263426  0.0  0.4 719916 19080 pts/3    Sl   21:52   0:00 ./frps -c frps.ini
root      263440  0.0  0.0   9032   740 pts/3    R+   21:58   0:00 grep --color=auto frp
root@iZuf67mlx4ftb5vohxeobnZ:/home/admin/frp# 

5.2 设置 window 端自动运行

同理,如果我们在 windows 端关闭终端,frp 连接就停止了,而且有一个命令行窗口也很影响美观,这里使用一个文件将其在后台运行

在任何一个地方新建一个文本文件,并将其命名为 frpc.bat,复制粘贴以下内容

@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
REM
cd C:\frp
frpc -c frpc.ini
exit

将 cd 后的路径更改为你的 frpc 实际存放的目录,至此就大功告成了!

之后直接运行这个 .bat 文件即可启动 frpc 并隐藏窗口(可在任务管理器中退出)。
至于开机启动,把这个 .bat 文件直接扔进 Windows 的开机启动文件夹就好了 😃
至此,客户端配置完成,之后就是你自己根据需要在 frpc.ini 后追加规则即可。
强烈建议你在使用 frp 直接测试内网穿透前,先在局域网内测试好相关功能的正常使用,并配置好可能会影响的 Windows 防火墙等内容,在内网调试通过后再使用 frp 进行内网穿透测试

6. 进阶用法,给服务器设置代理

写这部分的时候已经将前面设置好了,等我再次使用 frp 的时候,我发现 frp 已经更新到0.58.1版本了,设置也稍有不同,但是大同小异

这次我的目的是给 VPS 走本地代理:现在我的 VPS 无法访问 Google,本地用 clash 的 7890 端口可以访问 Google,我的目的是让 VPS 走本地的 Clash 端口访问 Google

同样的,我们下载 frp_0.58.1_linux_amd64.tar.gzfrp_0.58.1_windows_amd64.zip 在 VPS 和本地,并且解压,此时文件目录如下所示,可以发现和之前不一样了!

(base) root@iZuf67mlx4ftb5vohxeobnZ:~/frp# ls
frpc  frpc.toml  frps  frps.toml  LICENSE
  1. VPS 端:配置 frpcs.toml
# frpcs.toml
bindPort = 7000

然后在命令行运行即可

(base) root@iZuf67mlx4ftb5vohxeobnZ:~/frp# ./frps -c frps.toml 
2024-06-17 10:58:49.673 [I] [frps/root.go:105] frps uses config file: frps.toml
2024-06-17 10:58:49.888 [I] [server/service.go:237] frps tcp listen on 0.0.0.0:7000
2024-06-17 10:58:49.888 [I] [frps/root.go:114] frps started successfully
  1. 客户端:配置 frpc.toml
serverAddr = "47.100.8.18"  # your vps ip
serverPort = 7000

[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 7890  # clash port
remotePort = 6000

然后在命令行执行下面命令即可,注意需要在 VPS 端打开 6000 和 7000 端口,否则客户端无法连接

C:\Users\Administrator\Downloads\frp_0.58.1_windows_amd64>frpc -c frpc.toml
2024-06-17 11:03:25.239 [I] [sub/root.go:142] start frpc service for config file [frpc.toml]
2024-06-17 11:03:25.250 [I] [client/service.go:294] try to connect to server...
2024-06-17 11:03:25.310 [I] [client/service.go:286] [6ca3dc1df696ae48] login to server success, get run id [6ca3dc1df696ae48]
2024-06-17 11:03:25.310 [I] [proxy/proxy_manager.go:173] [6ca3dc1df696ae48] proxy added: [test-tcp]
2024-06-17 11:03:25.326 [I] [client/control.go:168] [6ca3dc1df696ae48] [test-tcp] start proxy success
  1. 在 VPS 端进行代理:此时在 VPS 端设置代理就可以访问 Google 了,由于我们远程端口是 6000,所以这里在命令执行
export http_proxy="http://127.0.0.1:6000"
export https_proxy="http://127.0.0.1:6000"

然后 ping 一下 google,发现可以访问了

(base) root@iZuf67mlx4ftb5vohxeobnZ:/blog/hexo-blog/blog.git# curl -I https://www.google.com
HTTP/1.1 200 Connection established

HTTP/2 200 
content-type: text/html; charset=ISO-8859-1
content-security-policy-report-only: object-src 'none';base-uri 'self';script-src 'nonce-Zx4TLZrPRj7nzEUzOwpDZg' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp
p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info."
date: Mon, 17 Jun 2024 03:13:30 GMT
server: gws
x-xss-protection: 0
x-frame-options: SAMEORIGIN
expires: Mon, 17 Jun 2024 03:13:30 GMT
cache-control: private
set-cookie: 1P_JAR=2024-06-17-03; expires=Wed, 17-Jul-2024 03:13:30 GMT; path=/; domain=.google.com; Secure
set-cookie: AEC=AQTF6HwL10_4oIKZCSjgbC1-SJMEUSnE8tEZRosweWUQIZcTz8k9_D_7O2g; expires=Sat, 14-Dec-2024 03:13:30 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax
set-cookie: NID=515=w9wZroRgyZjR-HQK8Ma73kRMHPd59LB2b-G2CG0TKvSv9gNhkYEU50SaFumOpnOdC9GXX1I5KRAiuxuJVY91ogqFTzF6JCYKk7Grd6-Z4FT4o5ghxHXyB4BL4IjF3ncSKOm-kTibVdmXkAkP9sVP_DoFfr_-_XHRttObqNeAEus; expires=Tue, 17-Dec-2024 03:13:30 GMT; path=/; domain=.google.com; HttpOnly
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
10月 30, 2021