作者:真理往往是废话 | 来源:互联网 | 2023-05-24 12:09
简介
我们常常会有远程访问服务器的需求,然而我们的服务器虽然能够访问外网(如百度等网站),但是却没有公网IP,这就是说,我们是无法在非局域网内部访问服务器的,因此内网穿透就成了一个需求。frp则提供了一种优雅的内网穿透方案,它是一个高性能反向代理应用,支持UDP和TCP协议,当需要将内网的一些服务(如ssh、tensorboard、web等服务)转发出来在自己电脑上随时访问的时候,frp是一个很不错的选择,因为它几乎不需要对需要穿透的服务器的防火墙进行配置。
优势
不同于Teamviewer或者向日葵这种图形界面的穿透工具,frp不访问图像界面从而对带宽的需求比较小,因此也不容易出现卡顿等情况。而且,一旦服务器出现断网情况时,frp会在网络恢复后自动重连,若将其注册为系统服务并设置开机自启,那么将永远不会掉线。相比于一些内网穿透服务,frp配置简单,可选加密,公网IP服务器只做解析,实际数据不经过它,因此是非常安全的。
服务端配置
这里的服务端指的是一台拥有公网IP的服务器(可在阿里云等购买学生机,配置足够,也不贵),这也是frp部署的必要设备。我们要进行内网穿透的服务器(如实验室的GPU主机)在frp服务中,称为客户端。
首先,通过官方仓库下载服务软件包,由于我这边的客户端和服务端都是Linux系统(一般都是这个情况),我这边两边都通过下载链接下载程序包(你也可以本地下载后拷贝或者上传过去)。
下面,我们首先讲解服务端的配置,通过tar -xzvf frp_0.35.1_linux_amd64.tar.gz
命令解压frp服务程序包,然后进入解压后的目录中,会看到如下图所示的文件结构,其中有两个绿色的frpc
和frps
为客户端和服务端的可执行文件,frpc.ini
和frps.ini
则为对应的配置文件,其余文件不需要太过在意。
首先编辑frps.ini
这个服务端配置文件(命令为vim frps.ini
),修改为如下内容。
[common]
# 这个绑定端口表示的是frp客户端访问frp服务端的端口,客户端配置文件中要和它一致
bind_port = 10000
# frp服务的管理页面端口
dashboard_port = 7500
# frp服务管理员账号
dashboard_user = root
# frp服务管理员密码
dashboard_pwd = admin
上述就是服务端的配置文件,各项的含义已经进行了详细备注,还需要注意的是,如果你使用的是阿里云、腾讯云之类的云主机,其实默认是开启了防火墙(或者安全组)的,配置文件中涉及的端口是无法访问的,这也之后配置的frp客户端是无法和frp服务端建立通讯的,因此需要需要在安全组中添加相应的TCP规则。
此时,我们就可以通过nohup ./frps -c frps.ini >/dev/null 2>&1 &
来开启frp服务并放到后台运行了,当然也可以用screen新建会话执行./frps -c frps.ini
然后保存会话即可,我这里使用的是screen会话的方式,具体操作流程和输出结果如下。
screen -S frp
./frps -c frps.ini
Ctrl A + D离开会话
此时,服务端的配置其实已经完成了,如果你想要验证服务端的配置是否成功,可以在自己的电脑上通过公网服务器ip:7500
并使用上面配置的管理员账户和密码登录,看到如下界面,代表frp服务端的配置是没有问题的。
客户端配置
同样的,客户端机器也下载同一版本的和操作系统适配的frp程序包,我这里用的和上面服务端用的是一致的,因为都是64位Linux系统。
解压进入解压得到的目录中,编辑frpc.ini
配置文件(命令为vim frpc.ini
),首先的common项为与服务端建立连接的必选项,后面每个中括号及其下面的内容为一个转发配置,包括中括号括着的配置名(随意)、连接类型(type = tcp
默认不写为tcp)、本机ip(local_ip = 127.0.0.1
即可)、需要进行转发的服务使用的端口(如ssh服务则配置local_port = 22
)以及服务端上对应的访问端口(remote_port = 2022
,使用公网ip+这个端口即可访问内网主机的服务,前提这个端口在公网服务器上要没有使用,显然22端口肯定是使用的,所以这里改为2022)。
由于我这里只需要转发ssh服务、tensorboard服务和web服务,所以配置如下。这里需要补充说明的是,转发的服务务必保证开启才能通过公网ip访问到。
[common]
# 必填项,为服务端frp所在服务器的公网ip和其对应的bind_port
server_addr = 填公网ip
server_port = 10000# 下面每个中括号及其下面的项为一个端口转发配置# 第一个,转发22端口的ssh服务,命名为amax-ssh,命名随意
[amax-ssh]
# 连接类型
type = tcp
# 本机ip
local_ip = 127.0.0.1
# 本机服务端口
local_port = 22
# 服务端对应端口
remote_port = 2022[amax-tensorboard]
local_ip = 127.0.0.1
local_port = 6006
remote_port = 6006[amax-web]
local_ip = 127.0.0.1
local_port = 80
remote_port = 8000
修改配置完成后,通过nohup ./frpc -c frpc.ini >/dev/null 2>&1 &
后台开启服务或者类似上面新开screen会话的方式后台开启服务,结果如下图。
此时通过公网ip加上2022端口
就能远程连接内网服务器了,需要注意输入正确的内网服务器的账号和密码即可,相应的tensorboard也可以通过浏览器输入公网ip:6006
访问,得到如下结果。
自动启动配置
由于服务器的重启会导致后台进程丢失,因此需要重新开启frp服务端和客户端,着显然是很不稳定的,因此可以将其注册为系统服务,重启后自动启动即可,由于客户端和服务端配置类似,我这里就以客户端为例。
首先,注册系统服务frpc,命令为vim /lib/systemd/system/frpc.service
,此处包括下面的配置都需要管理员权限。
在其中填写下面的内容,注册服务,写完后保存并退出。
[Unit]
Description=frpc service
After=network.target network-online.target syslog.target
Wants=network.target network-online.target[Service]
Type=simple# 此处需要修改为你的开启frpc服务的命令,下面知识我的例子
ExecStart=/root/frp_0.35.1_linux_amd64/frpc -c /root/frp_0.35.1_linux_amd64/frpc.ini[Install]
WantedBy=multi-user.target
此时通过systemctl start frpc
来开启服务,并通过systemctl enable frpc
来配置服务开机自启,此时就可以保证重启后frp服务不会丢失了。
总结
本文讲解了如何通过公网主机部署frp服务进行内网穿透,它可以方便地进行内网服务地转发。如果我的文章对你有所帮助,欢迎点赞收藏评论一键三连,你的支持是我不懈创作的动力。