之前介绍过通过ipv6访问内网服务,如果能配置成功,那是最好了;如果无法配置成功(原因可能有多种,光猫,路由器,运营商等等),可以尝试使用内网穿透的方式将内网服务暴露到公网。
所谓内网穿透,其实就是在访问内网服务时通过具有公网IP的服务将流量转发给内网服务。公网服务怎么找到内网服务呢?也很简单,事先安装好软件(内网穿透软件),绑定好。
内网穿透软件服务端] B<--长链接-->C[内网服务
内网穿透软件客户端]
内网穿透软件的服务端和客户端会建立长链接,这样无论用户什么时候访问公网服务,都可以及时转发给内网服务。
原理看着很简单,但是实现起来考虑的东西还是很多的。不过我们也不用自己实现,已经有很多优秀的内网穿透软件了,比如frp。
frp 是一款非常优秀的开源内网穿透软件,它支持多种协议,多种平台;截止今天(2025/04/14),github上面的star数已经达到了92.6k,还在不断增长。
其架构如下:
下面就介绍下如何配置使用frp。
准备工作及实现目标
准备:
- 一台具有公网ip的服务器(下面简称S,系统以Ubuntu为例)
- 一台局域网环境下的电脑(下面简称C,系统以Ubuntu为例)
目标:
- 在移动网络环境下通过域名访问C上面的web服务
为什么都有公网ip的服务器了,还要用内网穿透呢?
原因可以有多种,比如:自己的家庭服务器配置更好,硬盘空间更大,数据可控度更高,价格更便宜等等。
下载安装
可以直接到frp的发布页(或网盘下载)根据自己的系统下载对应的文件,解压后,会有多个文件,其中包含frps
和frpc
,分别对应服务端和客户端。
服务端安装
登录服务器S,将下载好的frps
和frps.toml
文件上传到服务器上,执行以下命令
chmod +x frps
./frps -c frps.toml
这样一个简单的frp
服务就启动了。
![]()
frps
服务端默认监听端口7000
,要确保7000端口开放了。除了服务器防火墙,有些服务器可能需要在控制面板修改安全策略放行端口。如果你修改了frps.toml
里面的bindPort
配置项,记得放行对应的端口。
客户端安装
在电脑C上运行frpc
./frpc -c frpc.toml
可以看到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服务
,分别监听12345
和12346
端口
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端口。
访问测试
现在,我们通过域名访问web1
和web2
服务,效果如下:
将frp配置成服务运行
上面我们在操作的时候,是直接将frps
和frpc
在命令行启动的,这种方式启动后,不能关闭终端,否则frp
的进程也被关闭了。为了让frp
服务一直运行,我们可以将frps
和frpc
配置成服务运行。每个系统的配置方式都不同,而且配置服务并不针对特定的软件,这里就不展开了,大家可以根据自己的系统去配置。
配置web管理界面
frp
不论服务端还是客户端,都可以配置web管理界面。二者配置类似,下面我们就以服务端为例,简单介绍下。
修改frps.toml
文件,添加如下配置
[webServer]
addr = "127.0.0.1" # 监听本地,后面用caddy反代
port = 7500
# dashboard 用户名密码,可选,默认为空,如果要暴露到公网,最好配置下
user = "admins"
password = "admins"
保存后,重启frps
服务
后面就是 添加DNS解析记录->配置caddy反向代理
二连,可以参考上面步骤,这里不再赘述。
配置好后,就可以通过配置的域名访问web管理界面了。
总结
至此,frp
的简单使用就介绍完了,更多功能请参考官方文档。另外需要注意的是,由于流量(非P2P流量)需要经过frps
中转,所以带宽会受限于具有公网IP服务器的带宽。
相关链接: