frp内网穿透的配置使用

之前介绍过通过ipv6访问内网服务,如果能配置成功,那是最好了;如果无法配置成功(原因可能有多种,光猫,路由器,运营商等等),可以尝试使用内网穿透的方式将内网服务暴露到公网。

所谓内网穿透,其实就是在访问内网服务时通过具有公网IP的服务将流量转发给内网服务。公网服务怎么找到内网服务呢?也很简单,事先安装好软件(内网穿透软件),绑定好。

graph LR A((用户))-->B[公网服务
内网穿透软件服务端] B<--长链接-->C[内网服务
内网穿透软件客户端]

内网穿透软件的服务端和客户端会建立长链接,这样无论用户什么时候访问公网服务,都可以及时转发给内网服务。

原理看着很简单,但是实现起来考虑的东西还是很多的。不过我们也不用自己实现,已经有很多优秀的内网穿透软件了,比如frp

frp 是一款非常优秀的开源内网穿透软件,它支持多种协议,多种平台;截止今天(2025/04/14),github上面的star数已经达到了92.6k,还在不断增长。

其架构如下:

frp架构

下面就介绍下如何配置使用frp

准备工作及实现目标

准备:

  • 一台具有公网ip的服务器(下面简称S,系统以Ubuntu为例)
  • 一台局域网环境下的电脑(下面简称C,系统以Ubuntu为例)

目标:

  • 在移动网络环境下通过域名访问C上面的web服务

question 为什么都有公网ip的服务器了,还要用内网穿透呢?

原因可以有多种,比如:自己的家庭服务器配置更好,硬盘空间更大,数据可控度更高,价格更便宜等等。

下载安装

可以直接到frp的发布页(或网盘下载)根据自己的系统下载对应的文件,解压后,会有多个文件,其中包含frpsfrpc,分别对应服务端和客户端。

文件列表

服务端安装

登录服务器S,将下载好的frpsfrps.toml文件上传到服务器上,执行以下命令

chmod +x frps
./frps -c frps.toml

frps启动

这样一个简单的frp服务就启动了。

注意 frps服务端默认监听端口7000,要确保7000端口开放了。除了服务器防火墙,有些服务器可能需要在控制面板修改安全策略放行端口。如果你修改了frps.toml里面的bindPort配置项,记得放行对应的端口。

客户端安装

在电脑C上运行frpc

./frpc -c frpc.toml

frpc启动

可以看到frpc已经成功连接到frps了。

配置自定义域名访问web服务

服务器S修改frps.toml文件

上面启动frps时,只配置了监听端口,添加如下配置,支持http协议代理

vhostHTTPPort = 8888

保存后,重启frps服务

局域网电脑C修改frpc.toml文件

修改frpc.toml文件,添加如下内容

[[proxies]]
name = "web1"
type = "http"
localIP = "127.0.0.1"
localPort = 12345 # web1监听端口
customDomains = ["web1.12358134.xyz"] 

[[proxies]]
name = "web2"
type = "http"
localIP = "127.0.0.1"
localPort = 12346 # web2监听端口
customDomains = ["web2.12358134.xyz"] 

保存后,重启frpc服务

局域网电脑C启动web服务

frp服务端,客户端都配置好了,现在我们在局域网电脑C上启动两个简单的web服务,分别监听1234512346端口

package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("web1,port 12345"))
	})
	fmt.Println("Server listening on :12345")
	if err := http.ListenAndServe(":12345", nil); err != nil {
		panic(err)
	}
}

使用go run命令启动后,修改监听端口和输出内容,另开一个终端再次运行go run启动另一个web服务。

修改DNS记录

frp配置好了,也在内网电脑C上启动了两个简单的web服务,现在我们需要修改DNS记录,将自定义域名解析到服务器S的公网IP上。大家可以到自己的域名服务商控制面板修改,这里就不再赘述了。配置好以后就可以用域名访问了。

在服务器S上配置caddy反向代理

caddy的使用方法参考我的另一篇文章caddy反向代理Caddyfile添加如下配置

web1.12358134.xyz {
	reverse_proxy 127.0.0.1:8888
}

web2.12358134.xyz {
	reverse_proxy 127.0.0.1:8888
}

保存后,重启caddy服务。

注意 frps代理http服务的端口是可以复用的,所以上面caddy配置,虽然域名不同,但是都是代理的frps监听的8888端口。

访问测试

现在,我们通过域名访问web1web2服务,效果如下:

web1访问测试

web2访问测试

将frp配置成服务运行

上面我们在操作的时候,是直接将frpsfrpc在命令行启动的,这种方式启动后,不能关闭终端,否则frp的进程也被关闭了。为了让frp服务一直运行,我们可以将frpsfrpc 配置成服务运行。每个系统的配置方式都不同,而且配置服务并不针对特定的软件,这里就不展开了,大家可以根据自己的系统去配置。

配置web管理界面

frp不论服务端还是客户端,都可以配置web管理界面。二者配置类似,下面我们就以服务端为例,简单介绍下。

修改frps.toml文件,添加如下配置

[webServer]
addr = "127.0.0.1" # 监听本地,后面用caddy反代
port = 7500
# dashboard 用户名密码,可选,默认为空,如果要暴露到公网,最好配置下
user = "admins"
password = "admins"

保存后,重启frps服务

后面就是 添加DNS解析记录->配置caddy反向代理 二连,可以参考上面步骤,这里不再赘述。

配置好后,就可以通过配置的域名访问web管理界面了。

frp web管理页

总结

至此,frp的简单使用就介绍完了,更多功能请参考官方文档。另外需要注意的是,由于流量(非P2P流量)需要经过frps中转,所以带宽会受限于具有公网IP服务器的带宽。

相关链接: