我在内网中有很棒的服务资源,但是没有固定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服务推向公网。
假定在内网服务器中有一个web服务,监听端口号:8080;公网服务器IP地址为:123.123.123.123。下图描述了实现内网穿透的主要步骤:
- 在具有公网 IP 的公网服务器上部署 frps
部署 frps 并编辑 frps.toml 文件。以下是简化的配置,其中设置了 frp 服务器用于接收客户端连接的端口:
bindPort = 7000
- 在需要被访问的内网服务器上部署 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 监听的端口,访问此端口的流量将被转发到内网服务的地址和端口。
- 启动 frps 和 frpc
公网服务器需要打开端口 7000 和 6666。
- 用户访问内网机器
用户使用网址:http://123.123.123.123:6666 即可使用 myWebServer 了,frps将用户访问公网服务器端口 6666 的流量转发到了内网服务器的端口: 8080 。
下图直观的展示了主要过程:
如果要通过域名访问内网服务器的web服务,可参见:通过自定义域名访问内网的 Web 服务
🪐祝好运🪐