用 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服务端监听的端口,默认7000token = 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 serverAfter = network.target syslog.targetWants = 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
# 启动frpsystemctl start frps# 停止frpsystemctl stop frps# 重启frpsystemctl 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 = tcplocal_ip = 127.0.0.1local_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 clientAfter = network.target syslog.targetWants = 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
# 启动frpsystemctl start frpc# 停止frpsystemctl stop frpc# 重启frpsystemctl 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 = tcplocal_ip = 127.0.0.1local_port = 3389 #客户端主机的3389端口用于windows的远程桌面remote_port = 7700 #要使用远程访问客户机时使用的端口7700,即将服务器的7600端口映射到客户端主机的3389端口上
启动内网 windows 主机上的 frp 客户端后,直接使用远程桌面工具连接公网IP:remote_port
就可以连接内网的 windows 主机了。
静态文件配置项
frp 通过配置 static_file 插件可以将内网主机上的文件目录暴露在公网上以供他人访问,该配置项可以提供一个简单的基于 HTTP 的文件访问服务,其配置项【请删除配置文件的注释】的示例如下所示:
# 将以下配置项添加到配置文件中[static_file]type = tcplocal_ip = 127.0.0.1remote_port = 7800 #访问内网主机时使用的端口7800plugin = 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:homefrpc -c frpc.inigoto home
然后,我们再将这个脚本设置为系统开机时启动:
重启电脑,使自启动任务生效。