我在内网中有很棒的服务资源,但是没有固定IP,如何能够在公网使用呢?

要解决这种问题,内网穿透工具 frp(Fast Reverse Proxy) 是一个很棒的选择:既然外网不能访问内网,那么就主动从内网打通到外网的通道!
基本的原理是:

  • 前提条件
    • 要有一台有公网地址的服务器【配置可以比较低】,内网服务器可以连接到这台公网服务器
    • 内网服务器安装frp客户端:frpc,公网服务器安装frp服务端:frps
  • 建立 “长连接”—— 打通内网到公网的 “通道”
    • 内网设备启动 frpc 客户端,并加载配置文件(配置中包含 frps 的公网 IP、端口、认证信息等)。
    • frpc 主动向公网的 frps 发起 TCP 长连接(默认用 8000 端口,可自定义),并维持这个连接(通过心跳机制防止断开)。

这一步是穿透的关键:由于内网设备没有公网 IP,公网无法主动 “找到” 内网设备,因此必须由内网的 frpc “主动出击”,与公网的 frps 建立连接,形成一条稳定的 “数据通道”。
内网设备无法被公网访问的根本原因,是路由器的 NAT(网络地址转换)机制会隐藏内网 IP。frp 通过 “frpc 主动连接 frps” 的方式,让路由器将 frpc 与 frps 的连接加入 “NAT 映射表”,后续 frps 向 frpc 发送的数据(公网请求),会被路由器正确转发到内网的 frpc,从而实现 “穿透” NAT 的效果。

本文通过一个具体的例子来展示如何使用内网穿透工具frp将内网的web服务推向公网。

frp下载地址


假定在内网服务器中有一个web服务,监听端口号:8080;公网服务器IP地址为:123.123.123.123。下图描述了实现内网穿透的主要步骤:

  1. 在具有公网 IP 的公网服务器上部署 frps

部署 frps 并编辑 frps.toml 文件。以下是简化的配置,其中设置了 frp 服务器用于接收客户端连接的端口:

bindPort = 7000
  1. 在需要被访问的内网服务器上部署 frpc

部署 frpc 并编辑 frpc.toml 文件,以下是示例配置:

serverAddr = "123.123.123.123"  # frps 的IP
serverPort = 7000   # frps的bindPort,连接它可以打开通道

[[proxies]]
name = "myWebServer"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080    # 本地web服务监听的端口号
remotePort = 6666   # 在公网上暴漏的端口号
  • localIP 和 localPort 配置为需要从公网访问的内网服务的地址和端口
  • remotePort 表示在 frps 监听的端口,访问此端口的流量将被转发到内网服务的地址和端口。
  1. 启动 frps 和 frpc

公网服务器需要打开端口 7000 和 6666。

  1. 用户访问内网机器

用户使用网址:http://123.123.123.123:6666 即可使用 myWebServer 了,frps将用户访问公网服务器端口 6666 的流量转发到了内网服务器的端口: 8080 。

下图直观的展示了主要过程:

frp实现过程

如果要通过域名访问内网服务器的web服务,可参见:通过自定义域名访问内网的 Web 服务


🪐祝好运🪐