原文链接,本文在原文的基础上进行了修改
从公网访问内网是一件很难的事情,之前使用autossh来进行端口转发,但是这需要用户对内网的电脑有一定的root权限才能够开启(因为需要root权限来安装各种适配包),而使用frp进行内网穿透,只需要获取内网的登录权限即可,不需要对内网服务器有任何的root权限
目的:本文目的是通过外网来访问内网,首先我有一台内网服务器,有一台在实验室可以访问内网的台式机,还有一台公网服务器(在阿里云等购买)。现在的目的是我想在其他地方访问内网服务器
1. frp是什么
frp是一个反向代理软件,体积轻量但功能强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTP、TCP、UDP等众多协议。我们今天仅讨论TCP和UDP相关的内容。
2. 准备工作
- 内网服务器(想要访问的设备)
- 公网服务器(VPS)
- 别的地方可以访问内网的台式机(这个也可以没有?我没试过,但可以尝试)
- 我的移动电脑
注意:frp的原理是利用服务端(即公网服务器VPS)进行转发,因此VPS的速度直接决定了之后连接的质量
3. 公网服务器设置
frp下载地址:https://github.com/fatedier/frp/releases
首先ssh连接到VPS之后运行下面命令来查看处理器架构,根据不同架构下载相应版本的frp
这里是X86_64架构,因此选择amd64版本下载,最好将其放在自己的home目录下,运行以下命令
1 | tar -zxvf frp_0.48.0_linux_amd64.tar.gz |
解压文件并重新命令为frp,cd frp进入目录,然后ls -a查看一下文件
其中frps和frps.ini(以s结果代表server)分别是服务端程序和服务端配置文件,frpc和frpc.ini(以c结尾代表client)分别是客户端程序和客户端配置文件
由于我们目前在配置服务端,所以可以删除客户端的两个文件frpc和frpc.ini,也可以保留
下面修改服务器端配置文件vim frps.ini,将其改为以下内容
1 | [common] |
端口可以使用默认值,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 | root@iZuf67mlx4ftb5vohxeobnZ:/home/admin/frp# ./frps -c frps.ini |
此时访问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 | [common] |
- 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 | C:\frp>frpc -c frpc.ini |
此时连接就建立了,在自己笔记本上输入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 | nohup ./frps -c frps.ini & |
输出上述命令的时候就是正常运行了,在终端输入jobs可以看到还在运行
1 | root@iZuf67mlx4ftb5vohxeobnZ:/home/admin/frp# jobs |
此时可以放心的关上终端了,如果要关闭这个nohup进程,运行如下命令找到进程PID,使用kill -9 PID即可
1 | root@iZuf67mlx4ftb5vohxeobnZ:/home/admin/frp# ps -aux | grep frp |
5.2 设置window端自动运行
同理,如果我们在windows端关闭终端,frp连接就停止了,而且有一个命令行窗口也很影响美观,这里使用一个文件将其在后台运行
在任何一个地方新建一个文本文件,并将其命名为frpc.bat,复制粘贴以下内容
1 | @echo off |
将cd后的路径更改为你的frpc实际存放的目录,至此就大功告成了!
之后直接运行这个 .bat 文件即可启动frpc并隐藏窗口(可在任务管理器中退出)。
至于开机启动,把这个 .bat 文件直接扔进Windows的开机启动文件夹就好了 😃
至此,客户端配置完成,之后就是你自己根据需要在frpc.ini后追加规则即可。
强烈建议你在使用frp直接测试内网穿透前,先在局域网内测试好相关功能的正常使用,并配置好可能会影响的Windows防火墙等内容,在内网调试通过后再使用frp进行内网穿透测试