October 11, 2022
By: Kevin

FRP代理访问内网服务

在日常开发和运维中, 有时需要将内网服务暴露到公网, 例如测试环境的 HTTP 服务需要远程访问. 由于内网服务通常没有公网 IP, 无法直接被外网访问, 这时候可以借助 FRP(Fast Reverse Proxy) 工具来实现内网穿透.

本文将详细介绍如何使用 FRP, 将本地的 HTTP 服务通过公网主机映射出去, 并针对没有域名的情况提供两种配置方案.

什么是 FRP?

FRP 是一个高性能的反向代理工具, 可以帮助内网的服务暴露到公网. 它由两部分组成:

  • frps(服务端): 运行在公网主机, 用于接收和转发外部请求.
  • frpc(客户端): 运行在内网主机, 与 frps 建立连接, 并将内网服务映射到公网.

FRP 的基本架构

FRP 的典型工作流程如下:

  1. 在公网主机上运行 frps, 监听外部访问请求.
  2. 在内网主机上运行 frpc, 将本地服务(如 HTTP 服务)与 frps 建立隧道连接.
  3. 外部用户通过访问公网主机的指定端口或域名, 间接访问内网服务.

示例场景

  • 内网服务: 运行在内网主机 127.0.0.1:8001 的 HTTP 服务.
  • 公网主机: IP 为 47.105.119.64, 没有绑定域名.
  • 目标: 将内网 HTTP 服务映射到公网, 使外部用户可以通过公网主机访问.

配置步骤

1. 准备工作

  1. 下载 FRPFRP 官方 GitHub Releases 下载最新版 FRP, 并解压到本地.

  2. 网络要求

    • 公网主机必须有一个固定 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. 常见问题与排查

  1. 无法访问服务

    • 确认公网主机的防火墙已开放 7001 和暴露的服务端口(如 8080).
    • 检查内网服务是否正常运行并监听 127.0.0.1:8001.
  2. 端口冲突

    • 确保 vhostHTTPPortremotePort 没有被其他服务占用.
  3. no route found 错误

    • 使用 HTTP 类型代理时, 确保 vhostHTTPPort 正确设置, 且客户端配置中没有遗留 customDomains.

总结

通过 FRP, 我们可以轻松将内网服务映射到公网, 无论是否有域名, 都能实现高效的内网穿透. 本文提供了两种配置方案:

  1. 使用 TCP 类型代理, 直接通过 IP 和端口访问.
  2. 使用 HTTP 类型代理, 结合 vhostHTTPPort 实现标准 HTTP 流量转发.
Tags: tools tcp