October 11, 2022
By: Kevin
FRP代理访问内网服务
在日常开发和运维中, 有时需要将内网服务暴露到公网, 例如测试环境的 HTTP 服务需要远程访问. 由于内网服务通常没有公网 IP, 无法直接被外网访问, 这时候可以借助 FRP(Fast Reverse Proxy) 工具来实现内网穿透.
本文将详细介绍如何使用 FRP, 将本地的 HTTP 服务通过公网主机映射出去, 并针对没有域名的情况提供两种配置方案.
什么是 FRP?
FRP 是一个高性能的反向代理工具, 可以帮助内网的服务暴露到公网. 它由两部分组成:
frps(服务端): 运行在公网主机, 用于接收和转发外部请求.frpc(客户端): 运行在内网主机, 与frps建立连接, 并将内网服务映射到公网.
FRP 的基本架构
FRP 的典型工作流程如下:
- 在公网主机上运行
frps, 监听外部访问请求. - 在内网主机上运行
frpc, 将本地服务(如 HTTP 服务)与frps建立隧道连接. - 外部用户通过访问公网主机的指定端口或域名, 间接访问内网服务.
示例场景
- 内网服务: 运行在内网主机
127.0.0.1:8001的 HTTP 服务. - 公网主机: IP 为
47.105.119.64, 没有绑定域名. - 目标: 将内网 HTTP 服务映射到公网, 使外部用户可以通过公网主机访问.
配置步骤
1. 准备工作
下载 FRP 从 FRP 官方 GitHub Releases 下载最新版 FRP, 并解压到本地.
网络要求
- 公网主机必须有一个固定 IP, 且开放必要的端口(如 7001).
- 内网服务必须正常运行, 并且可在本地访问.
2. 在公网主机上配置 frps
编辑 frps.toml
[common]
bindPort = 7001 # frpc 和 frps 通信的端口
启动 frps
在公网主机运行以下命令启动服务端:
./frps -c frps.toml
3. 在内网主机上配置 frpc
场景 1: 通过 TCP 类型代理映射服务
如果公网主机没有域名, 可以使用 TCP 类型代理 将服务映射到指定的公网端口.
编辑 frpc.toml
serverAddr = "47.105.119.64" # 公网主机 IP
serverPort = 7001 # frps 的通信端口
[[proxies]]
name = "http-tcp"
type = "tcp" # TCP 类型代理
localIP = "127.0.0.1" # 内网 HTTP 服务地址
localPort = 8001 # 内网 HTTP 服务端口
remotePort = 8080 # 公网暴露的端口
启动 frpc
在内网主机运行以下命令启动客户端:
./frpc -c frpc.toml
测试访问
外部用户可以通过以下地址访问内网 HTTP 服务:
http://47.105.119.64:8080
4. 如果需要 HTTP 类型代理
如果需要使用 HTTP 类型代理(支持标准 HTTP 协议), 可以通过 vhostHTTPPort 指定一个非标准端口.
编辑 frps.toml
[common]
bindPort = 7001 # frpc 和 frps 通信的端口
vhostHTTPPort = 8080 # 公网 HTTP 服务监听的端口
编辑 frpc.toml
serverAddr = "47.105.119.64" # 公网主机 IP
serverPort = 7001 # frps 的通信端口
[[proxies]]
name = "http-service"
type = "http" # HTTP 类型代理
localIP = "127.0.0.1" # 内网 HTTP 服务地址
localPort = 8001 # 内网 HTTP 服务端口
启动 frpc
./frpc -c frpc.toml
测试访问
外部用户可以通过以下地址访问内网 HTTP 服务:
http://47.105.119.64:8080
5. 配置对比
| 类型 | 优点 | 缺点 |
|---|---|---|
| TCP 类型代理 | 简单直观, 不依赖域名或额外配置 | 每个服务需要占用一个端口 |
| HTTP 类型代理 | 支持标准 HTTP 流量, 易于与浏览器集成 | 需要正确配置 vhostHTTPPort 和域名支持 |
6. 常见问题与排查
无法访问服务
- 确认公网主机的防火墙已开放
7001和暴露的服务端口(如8080). - 检查内网服务是否正常运行并监听
127.0.0.1:8001.
- 确认公网主机的防火墙已开放
端口冲突
- 确保
vhostHTTPPort和remotePort没有被其他服务占用.
- 确保
no route found错误- 使用 HTTP 类型代理时, 确保
vhostHTTPPort正确设置, 且客户端配置中没有遗留customDomains.
- 使用 HTTP 类型代理时, 确保
总结
通过 FRP, 我们可以轻松将内网服务映射到公网, 无论是否有域名, 都能实现高效的内网穿透. 本文提供了两种配置方案:
- 使用 TCP 类型代理, 直接通过 IP 和端口访问.
- 使用 HTTP 类型代理, 结合
vhostHTTPPort实现标准 HTTP 流量转发.