用frp做内网穿透

  frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网IP节点的中转暴露到公网。
  通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议;
  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间;
  • 代理组间的负载均衡;
  • 端口复用,多个服务通过同一个服务端端口暴露;
  • 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作;
  • 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展;
  • 服务端和客户端 UI 页面。

  为了能够流畅的连接到内网的一个linux主机做远程开发,需要用frp做内网穿透。这里记录一下安装和部署的过程以及一些注意事项。

环境介绍

  目前,我日常使用的有三台机器:

  • 笔记本电脑
      这台笔记本运行的是windows 11操作系统,主要做日常使用,接入学校的校园网(属于10.254.21.xxx网段)。
  • 云服务器
      这个在腾讯云购买的云服务器运行的是ubuntu操作系统,主要用于部署自己的网站和运行一些自己需要的服务,具有公网IP地址。
  • 实验室台式机
      这台安置于课题组实验室的主机运行的是ubuntu操作系统,主要用于实验室同学们跑深度学习的实验,接入实验室的局域网(属于192.168.3.xxx网段)。

  现在,我需要将实验室的台式机暴露在公网中,以便于自己的笔记本能在任何网络环境下都能够连接到它实现远程开发。为了实现这一需求,我需要在具有公网IP地址的云服务器上部署frp服务做中转。整个逻辑结构如下所示:

frp安装与使用

  frp的安装与使用是参照了frp的官方文档进行的。frp采用Golang编写,支持跨平台,仅需下载对应平台的二进制文件即可执行,没有额外依赖,直接在frp的release页面中下载并解压对应系统的压缩包:

  压缩包中同时包含了frp的服务端和客户端可执行程序,frps表示服务端可执行程序,frps.ini表示服务端配置文件;frpc表示客户端可执行程序,frpc.ini表示客户端配置文件。

frp服务端

  frp服务端安装在我的腾讯云服务器上。

安装与使用

  第一步,解压压缩包:在linux使用以下命令解压压缩包

tar -zxvf frp_0.48.0_linux_XXX.tar

  第二步,编辑配置文件:修改frps.ini配置文件【请删除配置文件的注释】(更多配置项请查看官方文档或者frps_full.ini

[common]
bind_port = 7000            #frp服务端监听的端口,默认7000
token = abcdefg             #用于服务端和客户端之间的授权验证

dashboard_port = 7500       #frp管理后台的端口
dashboard_user = admin      #frp管理后台的账号和密码
dashboard_pwd = admin

log_file = ./frps.log       #frp的日志路径
log_level = info            #frp的日志等级
log_max_days = 3            #frp日志的最长保留时间

  第三步,启动frp服务:使用frps并指定配置文件启动服务

# 在frps目录下执行
./frps -c frps.ini

  第四步,开放frp服务的端口:在服务器上放开7000,7500的端口(协议类型选择TCP,如果自定义了端口,开放自己的设置端口即可)。如果服务器上安装了宝塔面板,记得也在宝塔面板中开放相应的端口。
  到此,如果没有报错,那么frp的服务端就已经正常启动了,可以通过服务器IP:7500尝试访问管理后台。

后台运行和开机自启

  请在客户端和服务端都运行起来以后再进行此步骤。
  1.如果Linux服务器上没有安装systemd,请使用对应的包管理器安装。
  2.使用编辑器创建frps.service文件

sudo vim /etc/systemd/system/frps.service

  3.编辑frps.service文件

[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /path/to/frps -c /path/to/frps.ini

[Install]
WantedBy = multi-user.target

  4.配置开机自启动

systemctl enable frps

  5.使用systemd命令管理frps

# 启动frp
systemctl start frps
# 停止frp
systemctl stop frps
# 重启frp
systemctl restart frps
# 查看frp状态
systemctl status frps

frp客户端

  frp客户端安装在课题组实验室的主机上,在linux上frp客户端的安装与使用方式与frp服务端类似。

安装与使用

  第一步,解压压缩包:在linux使用以下命令解压压缩包

tar -zxvf frp_0.48.0_linux_XXX.tar

  第二步,编辑配置文件:修改frpc.ini配置文件【请删除配置文件的注释】(更多配置项请查看官方文档或者frpc_full.ini

[common]
server_addr = 公网主机的ip地址
server_port = 7000                  #公网主机frp服务端的监听端口
token = abcdefg                     #与公网frp服务端的token相同

[ssh]                               #请注意ssh为唯一的代理名称,如果是多个用户请配置用户名,并使用用户名.ssh进行区分
type = tcp
local_ip = 127.0.0.1
local_port = 22                     #客户端主机的22端口用于ssh服务
remote_port = 7600                  #要使用远程访问客户机时使用的端口7600,即将服务器的7600端口映射到客户端主机的22端口上

  第三步,启动frp客户端程序:使用frpc并指定配置文件启动客户端

# 在frps目录下执行
./frpc -c frpc.ini

  第四步,开放frp服务端上的远程端口(客户端配置文件中的remote_port):在服务器上放开7600(协议类型选择TCP,如果有多个客户端建议直接开发一个端口区间备用)。如果服务器上安装了宝塔面板,记得也在宝塔面板中开放相应的端口。
  到此,如果没有报错,那么frp的客户端就已经正常启动了。

后台运行和开机自启

  请在客户端和服务端都运行起来以后再进行此步骤。
  1.如果Linux服务器上没有安装systemd,请使用对应的包管理器安装。
  2.使用编辑器创建frpc.service文件

sudo vim /etc/systemd/system/frpc.service

  3.编辑frpc.service文件

[Unit]
# 服务名称,可自定义
Description = frp client
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /path/to/frpc -c /path/to/frpc.ini

[Install]
WantedBy = multi-user.target

  4.配置开机自启动

systemctl enable frpc

  5.使用systemd命令管理frpc

# 启动frp
systemctl start frpc
# 停止frp
systemctl stop frpc
# 重启frp
systemctl restart frpc
# 查看frp状态
systemctl status frpc

访问内网的主机

  在其他机器上进行访问测试,比如,对我而言就是使用我的笔记本访问课题组实验室的主机:

ssh 用户名@服务器公网IP  -p 端口号

  其中用户名是客户机上的用户名,IP地址是云服务器的IP地址,端口号是客户端配置文件中remote_port项的值

windows客户端

远程桌面配置项

  windows上远程桌面穿透客户端的配置文件【请删除配置文件的注释】

[common]
server_addr = 公网主机的ip地址
server_port = 7000                  #公网主机frp服务端的监听端口
token = abcdefg                     #与公网frp服务端的token相同
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389                   #客户端主机的3389端口用于windows的远程桌面
remote_port = 7700                  #要使用远程访问客户机时使用的端口7700,即将服务器的7600端口映射到客户端主机的3389端口上

  启动内网windows主机上的frp客户端后,直接使用远程桌面工具连接公网IP:remote_port就可以连接内网的windows主机了。

静态文件配置项

  frp通过配置static_file插件可以将内网主机上的文件目录暴露在公网上以供他人访问,该配置项可以提供一个简单的基于HTTP的文件访问服务,其配置项【请删除配置文件的注释】的示例如下所示:

# 将以下配置项添加到配置文件中
[static_file]
type = tcp
local_ip = 127.0.0.1
remote_port = 7800                  #访问内网主机时使用的端口7800
plugin = static_file                #插件名称
plugin_local_path = /tmp/file       #文件目录路径
plugin_strip_prefix = static        #访问链接中的url路径
plugin_http_user = admin            #访问用户及密码
plugin_http_passwd = admin

  启动后,可以通过浏览器访问http:/x.x.x.x:7800/static/来查看目录/tmp/file中的文件,访问时会要求输入访问的用户名及密码。

将客户端程序设置为开机自启

  首先,我们需要在frpc客户端程序的目录中创建一个脚本frpcStart.bat,用于调用frpc程序:

@echo off
:home
frpc -c frpc.ini
goto home

  然后,我们再将这个脚本设置为系统开机时启动: