数字营销 · Web开发 · 基础设施

利用FRP进行内网穿透

从 IPv4 地址不足和 NAT 环境出发,介绍 FRP 内网穿透的基本原理,并通过服务端和客户端配置,实现公网服务器到内网服务的端口转发。

随着全球 IPv4 地址资源的进一步枯竭以及联网设备数量不断增长,越来越多的运营商在给用户分配 IP 地址时,不再直接提供公网 IPv4,而是使用运营商级 NAT 等方式提供内网地址。

如果希望从公网直接访问内网设备,通常需要额外的公网地址或者其它网络穿透方案,而向运营商申请固定公网 IP 往往成本较高,因此内网穿透技术逐渐得到广泛应用。

现在市面上有很多内网穿透软件和服务,包括花生壳、Ngrok 等。本文主要介绍使用 FRP 进行内网穿透。

前期准备

首先需要准备两台设备:

  1. 一台拥有公网 IP 的服务器:Windows 或 Linux 均可。国内可以购买云服务器。这台服务器主要负责接收公网请求并进行流量转发,因此通常不需要太高的配置。如果对速度有要求,可以选择带宽较大的服务器或者按流量计费的方案。
  2. 一台内网服务器:Windows 或 Linux 均可。如果设备需要长期运行,可以考虑使用树莓派等低功耗设备。

FRP工作模式

FRP 包含服务端和客户端两个部分。

服务端程序 frps 安装在拥有公网 IP 的服务器上,负责接收外部请求;客户端程序 frpc 安装在内网设备上,负责连接 FRP 服务端,并将公网请求转发到内网指定的服务。

整个过程可以简单理解为:

公网用户

公网服务器 frps

FRP 隧道

内网服务器 frpc

本地服务

开始配置

首先根据操作系统,从 FRP 官方 Release 页面下载对应版本:

https://github.com/fatedier/frp/releases

下载完成之后,分别把 FRP 程序放到公网服务器和内网服务器上。

安装包中主要包含两个程序:

frps / frps.exe    服务端
frpc / frpc.exe 客户端

分别将它们放到公网服务器和内网服务器上。

配置服务器

编辑服务器端配置文件 frps.ini

# 服务端配置
[common]

# 服务端监听地址
bind_addr = 0.0.0.0
bind_port = 7000

# 客户端与服务端通信口令
auth_token = 12345

# UDP 监听端口,可选
bind_udp_port = 7001

# HTTP 管理面板,可选
# 如果开启,不要使用弱密码
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin

# 日志配置
log_file = ./frps.log
log_level = info
log_max_days = 3

# 允许服务端监听的端口范围
allow_ports = 80,2000-3000,3001,3003,4000-50000

# 每个客户端允许使用的远程端口数量
max_ports_per_client = 0

# TCP 多路复用
tcp_mux = true

配置完成后,可以直接运行:

./frps -c ./frps.ini

如果服务端正常启动,就会开始监听 7000 端口,等待客户端连接。

需要注意的是,70007500 以及后续实际使用的远程端口,都需要在服务器防火墙和云服务商安全组中放行。

配置客户端

然后配置内网服务器上的 frpc.ini

[common]

# 服务端地址、端口和认证口令
server_addr = 你的公网服务器IP
server_port = 7000
auth_token = 12345

# 开始配置服务
[server1]

# 服务类型
type = tcp

# 本地服务地址
local_ip = 127.0.0.1

# 本地服务端口
local_port = 1234

# 公网服务器映射端口
remote_port = 2000

这里假设内网服务器上的某个服务运行在 127.0.0.1:1234

配置完成后运行:

./frpc -c ./frpc.ini

客户端会主动连接公网服务器,然后将配置发送给 frps

之后,当公网用户访问:

公网服务器IP:2000

请求就会通过 FRP 隧道转发到:

127.0.0.1:1234

这样就实现了最基本的内网穿透和端口转发

整个过程可以理解为:

用户访问
公网服务器:2000

frps

FRP 隧道

frpc

内网服务器:1234

其它配置

FRP 不仅支持 TCP,还支持 UDP、HTTP、HTTPS 等类型的代理,可以根据实际需求配置不同的服务。

例如,type = tcp 适合普通 TCP 服务;如果希望把一个 Web 服务暴露到公网,也可以根据 FRP 的版本和配置方式使用 HTTP/HTTPS 代理。

FRP 的一个重要特点就是:内网客户端只需要主动连接公网服务器,因此不要求公网服务器能够主动连接内网设备。

这也是它能够在 NAT 和防火墙环境下工作的原因。

注意事项

  1. 某些运营商或网络环境可能会限制特定端口的使用,因此实际部署时需要根据当地网络情况选择端口。
  2. 如果你的宽带已经提供可直接使用的 IPv6,并且访问方也具备 IPv6 能力,那么很多情况下可以直接使用 IPv6,而不需要额外进行内网穿透。
  3. FRP 本身只是网络转发工具,实际暴露到公网的服务需要做好认证、访问控制和安全防护。
  4. 请勿将内网穿透用于违反法律法规或网络服务商规定的用途。

从原理上看,FRP 做的事情其实并不复杂:公网服务器负责提供一个外部可访问的入口,内网客户端主动建立一条长期连接,公网请求再通过这条连接转发到内网服务。

网络配置

评论0

欢迎分享你的看法,也欢迎补充不同的实践经验。