使用frp进行内网穿透

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

从公网访问内网是一件很难的事情,之前使用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目录下,运行以下命令

1
2
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,将其改为以下内容

1
2
3
4
5
6
7
8
9
[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可以自行设置,编辑完保存即可

  • bind_port:客户端和服务端连接的端口,这个端口号之后再配置客户端的时候会用到
  • dashboard_port:服务器端仪表盘的端口,若使用7500端口,在配置完成服务启动后通过浏览器访问x.x.x.x:7550(x.x.x.x是VPS外网服务器的IP),查看frp的运行信息
  • token:客户端和服务端连接的口令,自行设置即可
  • dashboard_user和dashboard_pwd:打开仪表板页面登陆的用户名和密码,自行设置即可
  • vhost_http_port和vhost_https_port:反向代理http主机时使用,本文不涉及http协议,可删除

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

1
2
3
4
5
6
7
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文件进行编译,如下

1
2
3
4
5
6
7
8
9
10
[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
  • server_addr:公网VPS的ip地址
  • server_port:建立连接的服务器端口,填入与VPS端frps.ini中相同的端口号,这里和上面一样设为7000
  • token:在服务器上设置的连接口令,直接copy过来即可
  • local_ip:本地ip,默认为127.0.0.1,在本例中就是访问实验室的windows电脑,但是我想访问内网服务器,所以这里对其进行更改,填写为windows电脑可以访问的内网服务器的ip地址
  • local_port:内网服务器的访问端口,默认为22
  • remote_port:远程端口,就是我将内网服务器端口,也就是这里的22映射到VPS的端口

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

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

1
2
3
4
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的后台运行

1
2
3
4
nohup ./frps -c frps.ini &

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

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

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

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

1
2
3
4
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,复制粘贴以下内容

1
2
3
4
5
6
7
8
@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进行内网穿透测试