frp实现内网访问

轻松访问内网应用

frp实现内网访问
Photo by Patrick Hendry / Unsplash

一、什么是frp?

FRP(Fast Reverse Proxy)是一款开源的高性能反向代理工具,通常用于将内网服务和应用暴露到外网,比如让本地的 Web 服务器、SSH 远程管理、远程桌面等服务能够被外网访问。

官网
GitHub

1.1 frp的工作原理

frp由两部分组成,通过服务端(frps)和客户端(frpc),将内网中的服务通过公网暴露出来。

  • frps(frp server): 运行在拥有公网IP的服务器上(例如云服务器),负责转发流量。
  • frpc(frp client): 运行在内网机器上,保持与frps的长连接,将本地服务映射到公网。

二、配置

环境:

  • 公网服务器A
    操作系统:Ubuntu 24.04.2 LTS
    公网IP:106.119.xxx.xxx
  • 内网服务器B
    操作系统:Ubuntu 22.04.3 LTS

现计划将内网服务器的应用(占用端口为3199)可通过公网IP访问。

2.1 下载frp文件

GitHub中下载文件,包含了frp的服务端和客户端以及配置文件模版,将文件分别上传到服务器A和B上,并解压frp压缩包。

tar -zxvf frp_0.61.2_linux_amd64.tar.gz

2.2 服务端配置

2.2.1 编辑配置文件

进入到公网服务器A的frp解压目录,并打开配置文件frps.toml

cd frp_0.61.2_linux_amd64
vim frps.toml

将文件内容修改为如下:

# frp服务端监听端口,默认为7000,建议修改端口
bindPort = 7000

[auth]
# 鉴权方式为token,添加鉴权避免被他人使用
method = "token"
# 客户端需要设置相同的值才能鉴权通过,越复杂越好
token = "U9s$ak1"

# 服务端Dashboard配置
[webServer]
# 默认为 127.0.0.1,如果需要公网访问,需要修改为 0.0.0.0。
addr = "0.0.0.0"
# webServer监听端口,必填
port = 3900
# dashboard 用户名密码,可选,默认为空
user = "admin"
password = "9I8du*a"

2.2.2 测试frps服务是否正常

前台启动frps服务

./frps -c frps.toml

日志中如有frps started successfully,说明服务端启动成功。

2025-03-27 17:01:58.622 [I] [frps/root.go:105] frps uses config file: frps.toml
2025-03-27 17:01:59.080 [I] [server/service.go:237] frps tcp listen on 0.0.0.0:7000
2025-03-27 17:01:59.082 [I] [frps/root.go:114] frps started successfully
2025-03-27 17:01:59.082 [I] [server/service.go:351] dashboard listen on 0.0.0.0:3900

在浏览器中输入公网服务器IP:webServer监听端口,查看是否可以跳转到frps Dashboard页面。

PS:如果访问失败,如使用云服务器,请在云服务器管理平台检查是否放行frps服务端监听端口webServer监听端口

2.2.2 使用systemd来管理frps服务

/etc/systemd/system目录下创建frps.service文件。

sudo vim /etc/systemd/system/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.toml

[Install]
WantedBy = multi-user.target

使用systemd命令管理frps服务

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

设置frps开机自启动

sudo systemctl enable frps

2.3 客户端配置

2.3.1 编辑配置文件

进入到内网服务器B的frp解压目录,并打开配置文件frpc.toml

cd frp_0.61.2_linux_amd64
vim frpc.toml

将文件内容修改为如下:

# frp服务端IP
serverAddr = "公网服务器A的IP"
# frp服务端监听端口,默认为7000
serverPort = 7000

[auth]
method = "token"
# 鉴权token,需和服务端配置相同
token = "U9s$ak1"

[[proxies]]
name = "test-tcp"
# 配置tcp服务
type = "tcp"
localIP = "127.0.0.1"
# 待映射应用的端口号
localPort = 3199
# 映射到公网的端口号
remotePort = 8080

2.3.2 测试frpc服务是否正常

前台启动frpc服务

./frpc -c frpc.toml

日志中如有start proxy success,说明客户端启动成功,并连上服务端。

2025-03-27 17:18:12.888 [I] [sub/root.go:142] start frpc service for config file [frpc.toml]
2025-03-27 17:18:12.888 [I] [client/service.go:295] try to connect to server...
2025-03-27 17:18:13.258 [I] [client/service.go:287] [26ebbfc7106156c6] login to server success, get run id [26ebbfc7106156c6]
2025-03-27 17:18:13.258 [I] [proxy/proxy_manager.go:173] [26ebbfc7106156c6] proxy added: [test-tcp]
2025-03-27 17:18:13.882 [I] [client/control.go:168] [26ebbfc7106156c6] [test-tcp] start proxy success

如服务端部署在云服务器上,请放行remotePort中设置的端口。

现通过公网服务器A IP:8080,即可通过tcp访问到内网服务器B中3199端口的服务。