跳到主要内容

FRP实现内网穿透教程

· 阅读需 10 分钟
Kevin2li
PDF Guru Anki开发者

一、前言

1. 什么是内网穿透?

在日常生活和工作中,我们常常需要访问位于家庭或公司内网的设备(如NAS、监控摄像头、本地服务器等),或对外暴露本地的开发环境(如网站、API服务)。然而,由于大多数网络环境处于NAT(网络地址转换)或防火墙的保护下,外网设备无法直接访问内网资源——这就是典型的“内外网隔离”问题。

内网穿透(NAT穿透) 技术应运而生。它通过建立一条从内网到公网服务器的“隧道”,将内网服务的端口映射到公网,使得外网用户可以通过访问公网地址间接访问内网资源。简单来说,就像为你的内网设备安装了一个“虚拟公网IP”,彻底打破网络边界限制。

2. 为什么选择FRP?

在众多内网穿透工具中,FRP(Fast Reverse Proxy) 凭借以下优势脱颖而出:

  • 开源免费:基于MIT协议,代码透明可定制,无商业限制。
  • 跨平台支持:服务端和客户端均支持Windows、Linux、macOS,甚至树莓派等ARM设备。
  • 配置灵活:支持TCP/UDP端口映射、HTTP/HTTPS反向代理、流量加密等功能,覆盖99%的穿透需求。
  • 轻量高效:单文件部署,内存占用低,对老旧设备友好。
  • 社区活跃:GitHub 9万+ Star,中文文档完善,问题解决成本低。

与同类工具(如Ngrok)相比,FRP无需依赖第三方服务器,完全自主可控,尤其适合对隐私和稳定性要求较高的场景。

3. 适用场景

FRP的典型应用场景包括但不限于:

  • 🌐 远程办公:在家访问公司内网的OA系统、数据库或开发环境。
  • 🖥️ 设备远程控制:通过SSH或远程桌面管理内网服务器/NAS。
  • 🚀 本地开发调试:将本地的Web服务(如微信小程序后端)暴露至公网测试。
  • 📡 物联网设备管理:远程访问家庭路由器、智能家居设备的控制界面。
  • 🛡️ 安全内网互通:通过加密隧道连接多地私有网络,替代传统VPN。

无论你是开发者、运维工程师,还是普通用户,只需一台公网服务器,即可用FRP轻松实现“内外网无界访问”。接下来,我们将从零开始一步步完成FRP的部署与实战配置。

二、前置条件

在开始配置FRP之前,请确保满足以下基础条件:

  • ✅ 公网服务器(服务端必备)

    • 最低配置要求:1核CPU / 1GB内存 (轻量级穿透足够)
    • 推荐选择腾讯云轻量服务器阿里云ECS 或海外VPS(如BandwagonHost)
    • 操作系统:建议使用Linux(Ubuntu/CentOS),本教程以 Ubuntu 22.04 为例
  • ✅ 内网客户端设备(被穿透的目标机器)

    • 设备类型:可以是Windows PC、Mac、Linux主机、树莓派、NAS等
    • 示例场景
      • 家中的Windows电脑(需远程桌面)
      • 本地开发机的Web服务(如localhost:3000)
      • 内网摄像头的监控端口
  • 🌐 网络要求

    • 客户端设备需能访问互联网(无需公网IP)
    • 服务器必须开放 7000端口(FRP默认通信端口) 及后续映射的业务端口

三、FRP核心概念

1. 服务端(frps)与客户端(frpc)的关系

FRP采用客户端-服务端架构(C/S),两者分工明确:

  • 服务端(frps):部署在公网服务器上,负责接收外部的访问请求,并通过预先建立的隧道将流量转发到对应的客户端。

    • 核心作用:流量中转枢纽,管理所有客户端连接。
    • 典型配置:绑定端口(如7000)监听客户端连接。
  • 客户端(frpc):运行在内网设备上,主动向服务端发起连接,并声明需要暴露的本地服务(如SSH、Web服务)。

    • 核心作用:内网服务代理,将本地端口映射到公网。
    • 典型配置:指定服务端IP、端口及本地服务规则。

协作流程示例

  1. 客户端(frpc)与服务端(frps)建立控制通道(默认端口7000)。
  2. 当用户访问公网服务器的某个端口(如8080)时,服务端将请求通过隧道转发给客户端。
  3. 客户端将请求传递给内网服务(如本地的localhost:3000)。

👉 类比理解:服务端像“接线员”,客户端像“分机号”,外网用户拨打总机号(公网IP+端口)即可转接到内网设备。

2. 核心概念关系图

外网用户 → 访问公网IP:Port → frps(服务端) → 隧道 → frpc(客户端) → 内网服务  
  • 关键点
    • 客户端始终主动连接服务端,适合NAT穿透。
    • 服务端不存储业务数据,仅负责流量转发。

四、安装与配置

说明

简单起见,本教程使用Docker来进行frp的安装与配置,可参考Install Docker Engine on Ubuntu教程进行Docker的安装。

服务端配置(Linux示例)

  1. 编写配置文件

创建/etc/frp/frps.toml配置文件,文件内容如下:

/etc/frp/frps.toml
bindPort = 7000

该文件中指定了frp客户端与服务端通信的端口,默认为7000。

  1. 防火墙放行端口

为了确保客户端和服务端能顺利建立连接,需要将云服务器的安全组和防火墙中将上一步骤指定的端口放行。

以下是阿里云服务中中"安全组"中放行端口的示例:

补充说明

如果你的服务器有另外安装防火墙服务,同样需要放行端口。以firewalld防火墙服务为例:

# 查看当前防火墙配置
sudo firewall-cmd --list-all

# 添加放行端口
sudo firewall-cmd --zone=public --permanent --add-port 7000/tcp
sudo firewall-cmd --reload
  1. 启动容器

编写docker-compose.yaml文件,内容如下:

docker-compose.yaml
services:
frps:
image: snowdreamtech/frps
container_name: frps
restart: unless-stopped
network_mode: host
ports:
- "7000:7000"
volumes:
- "/etc/frp/frps.toml:/etc/frp/frps.toml"

在与docker-compose.yaml同级目录下执行命令:

# 启动容器
docker compose up -d

使用下面命令查看容器日志:

# 查看容器日志
docker compose logs

出现类似下面提示,表示启动成功。

客户端配置(Linux示例)

  1. 编写配置文件

创建/etc/frp/frpc.toml配置文件,文件内容如下:

/etc/frp/frpc.toml
serverAddr = "1.2.3.4" # 替换为自己服务器公网ip
serverPort = 7000

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 22


[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 8080

以上配置文件演示了ssh服务和web服务的端口转发。用户可以根据需要自行修改和添加更多配置。

  1. 启动容器

编写docker-compose.yaml文件,内容如下:

~/frpc/docker-compose.yaml
services:
frpc:
image: snowdreamtech/frpc
container_name: frpc
restart: unless-stopped
network_mode: host
volumes:
- "/etc/frp/frpc.toml:/etc/frp/frpc.toml"

在与docker-compose.yaml同级目录下执行命令:

# 启动容器
docker compose up -d

使用下面命令查看容器日志:

# 查看容器日志
docker compose logs

出现类似下面提示,表示启动成功。

这样,内网穿透的步骤就完成了,如果你配置无误的话,现在就可以直接在外部网络环境下访问内网的服务。