【Linux网络·加餐】frp内网穿透


🎬 个人主页艾莉丝努力练剑

专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享
⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平

🎬 艾莉丝的简介:


文章目录

  • 1 ~> 整体实验拓扑
  • 2 ~> 模块 1:frp 基础预备工作
    • 2.1 内网穿透底层原理
      • 2.1.1 NAT 核心痛点
      • 2.1.2 frp 穿透逻辑
      • 2.1.3 拓扑分层定义
    • 2.2 实验硬件 & 软件环境清单
      • 2.2.1 硬件设备
      • 2.2.2 网络配置要求(审计修正:虚拟机网络模式最优解)
      • 2.2.3 frp 软件获取规范
      • 2.2.4 frp 压缩包目录文件说明
  • 3 ~> 模块 2:frp 部署环境搭建(完整实操流程)
    • 3.1 文件传输:Windows → Linux 两种方案
      • 3.1.1 方案 1:Xshell rz 上传(云服务器专用)
      • 3.1.2 方案 2:Windows CMD scp 直传虚拟机(文档重点方案)
    • 3.2 云服务器 frps 配置与启动
      • 3.2.1 frps.toml 最简配置
      • 3.2.2 frps 启动命令(强制 - c 指定配置文件,易错审计点)
      • 3.2.3 端口监听校验
    • 3.3 内网虚拟机 frpc 配置(多代理支持)
      • 3.3.1 frpc.toml 全局基础配置
      • 3.3.2 TCP 代理配置语法(`[[proxies]] `固定数组块,支持多服务叠加)
        • 代理 1:SSH 服务映射(本地 22 端口 → 云 8081 端口)
        • 代理 2:Nginx Web 服务映射(本地 80 端口 → 云 8082 端口)
      • 3.3.3 frpc 启动 & 后台守护命令
      • 3.3.4 虚拟机本地服务前置准备
  • 4 ~> 模块 3:两大服务远程穿透实测验证
    • 4.1 场景 1:外网 Xshell 远程 SSH 登录内网虚拟机
      • 4.1.1 访问参数
      • 4.1.2 验证现象
    • 4.2 场景 2:外网浏览器访问内网 Nginx 网页
      • 4.2.1 访问地址
      • 4.2.2 验证逻辑
  • 5 ~> 模块 4:纠错点总结
  • 6 ~> 模块 5:思维导图
  • 7 ~> 模块 6 实验总结核心结论
  • 结尾

1 ~> 整体实验拓扑

整体实验拓扑:公网云服务器 (frps 服务端) + 本地 Ubuntu 虚拟机 (frpc 客户端),实现 SSH、Nginx 两类 TCP 服务外网暴露。


2 ~> 模块 1:frp 基础预备工作

2.1 内网穿透底层原理

2.1.1 NAT 核心痛点

家庭 / 校园 / 办公设备处于局域网,运营商路由器做 NAT 地址转换,公网无法主动发起连接访问内网设备;内网设备可主动向外建立 TCP 长连接。

2.1.2 frp 穿透逻辑

  1. 内网 frpc 主动与公网云服务器 frps 建立永久 TCP 长连接;
  2. frps 接收外网访问流量,通过已建立的长连接转发至 frpc;
  3. frpc 将流量转发至本机本地服务端口(SSH 22 / Nginx 80);
  4. 服务响应沿原链路原路返回外网访问端。

2.1.3 拓扑分层定义

  • 服务端(frps):部署公网云服务器,对外提供中转通信端口,映射内网服务暴露端口;
  • 客户端(frpc):部署内网 Linux 设备,主动连接 frps,绑定本地服务;
  • 访问端:任意外网设备(Xshell、浏览器),访问云服务器映射端口。

2.2 实验硬件 & 软件环境清单

2.2.1 硬件设备

  1. 公网云服务器(任意 Linux 发行版):运行 frps;
  2. Windows 宿主机 + VMware Workstation 17 Player(免费版);
  3. 内网虚拟机:Ubuntu 22.04 AMD64(运行 frpc、sshd、nginx)。

2.2.2 网络配置要求(审计修正:虚拟机网络模式最优解)

  • 虚拟机网卡:NAT 模式,Windows 虚拟网卡充当小型路由器,宿主机与虚拟机双向互通、均可联网;
  • 连通校验命令:
# 虚拟机测试外网连通ping-c1www.baidu.com# Windows CMD ping虚拟机IPping192.168.204.128# 虚拟机ping Windows虚拟网关IPping192.168.100.18

2.2.3 frp 软件获取规范

  1. 版本:v0.58.1,官方 Release 地址:https://github.com/fatedier/frp/releases/tag/v0.58.1
  2. 安装包选择(重点易错点):
    1. 云服务器、Ubuntu 虚拟机均选用:frp_0.58.1_linux_amd64.tar.gz
    2. 禁止 arm 版本,区分 CPU 架构;
  3. Github 加速工具:Watt Toolkit,开启 Github 加速解决下载超时。

2.2.4 frp 压缩包目录文件说明

解压后固定二进制文件:

  • frps:服务端可执行程序(云服务器使用)
  • frps.toml:frps 配套配置文件
  • frpc:客户端可执行程序(内网虚拟机使用)
  • frpc.toml:frpc 配套配置文件
  • LICENSE:开源协议文件,无需修改

3 ~> 模块 2:frp 部署环境搭建(完整实操流程)

3.1 文件传输:Windows → Linux 两种方案

3.1.1 方案 1:Xshell rz 上传(云服务器专用)

# 云服务器创建frp目录mkdir~/frp&&cd~/frp# 唤起文件上传弹窗rz-E# 解压frp安装包tarxzf frp_0.58.1_linux_amd64.tar.gzcdfrp_0.58.1_linux_amd64

3.1.2 方案 2:Windows CMD scp 直传虚拟机(文档重点方案)

# Windows桌面目录执行,格式 scp 本地包 用户名@虚拟机IP:目标目录 scp frp_0.58.1_linux_amd64.tar.gz whb@192.168.204.128:/home/whb/frp

3.2 云服务器 frps 配置与启动

3.2.1 frps.toml 最简配置

# frps服务端监听端口:frpc客户端连接专用端口 bindPort = 8888

3.2.2 frps 启动命令(强制 - c 指定配置文件,易错审计点)

  1. 错误启动方式:./frps,会加载默认 7000 端口,忽略自定义 toml;
  2. 标准前台启动:
./frps-c./frps.toml
  1. 后台守护进程(生产推荐,无日志输出):
nohup./frps-c./frps.toml&>/dev/null&
  • nohup:脱离终端持续运行;
  • &> /dev/null:标准输出 + 错误输出全部丢弃(黑洞设备);
  • 末尾&:放入后台作业。

3.2.3 端口监听校验

# 查看frps监听端口,需sudo完整显示进程名sudonetstat-nltp

预期输出:tcp6 0 0 :::8888 LISTEN ./frps

3.3 内网虚拟机 frpc 配置(多代理支持)

3.3.1 frpc.toml 全局基础配置

# 公网云服务器公网IP serverAddr = "8.137.19.140" # frps服务端bindPort,必须和云服务器配置一致 serverPort = 8888

3.3.2 TCP 代理配置语法([[proxies]]固定数组块,支持多服务叠加)

代理 1:SSH 服务映射(本地 22 端口 → 云 8081 端口)
[[proxies]] name = "ssh-service" # 代理唯一标识,自定义 type = "tcp" # 流量类型:TCP转发 localIP = "127.0.0.1" # 本地服务监听地址 localPort = 22 # 内网sshd端口 remotePort = 8081 # 云服务器对外暴露访问端口
代理 2:Nginx Web 服务映射(本地 80 端口 → 云 8082 端口)
[[proxies]] name = "http-service" type = "tcp" localIP = "127.0.0.1" localPort = 80 remotePort = 8082

审计关键概念区分(文档易混淆点):

  1. serverPort=8888frpc 与 frps 通信通道端口,仅客户端连接使用,外网用户不访问;
  2. remotePort外网用户访问端口,一个代理对应一个独立端口。

3.3.3 frpc 启动 & 后台守护命令

前台测试:

./frpc-c./frpc.toml

后台常驻:

nohup./frpc-c./frpc.toml&>/dev/null&

3.3.4 虚拟机本地服务前置准备

  1. SSH 服务 sshd(Ubuntu 默认预装)
# 校验22端口监听sudonetstat-nltp|grepsshd# 未安装则执行sudoaptinstallopenssh-server
  1. Nginx Web 服务部署
# 安装nginxsudoaptinstall-ynginx# 启动服务sudonginx# 校验80端口sudonetstat-nltp|grepnginx# 修改默认首页(验证穿透效果)sudovim/var/www/html/index.nginx-debian.html

4 ~> 模块 3:两大服务远程穿透实测验证

4.1 场景 1:外网 Xshell 远程 SSH 登录内网虚拟机

4.1.1 访问参数

  • 主机 IP:云服务器公网 IP8.137.19.140
  • 端口:8081(frpc ssh 代理 remotePort)
  • 登录账号:虚拟机本地用户名 whb + 虚拟机密码

4.1.2 验证现象

  1. 登录成功后执行ls ~/Desktop,在远端可查看、创建、删除虚拟机桌面文件;
  2. 虚拟机本地桌面同步生成文件,证明流量完整穿透至内网。

4.2 场景 2:外网浏览器访问内网 Nginx 网页

4.2.1 访问地址

http://8.137.19.140:8082

4.2.2 验证逻辑

  1. 修改虚拟机本地 nginx 首页 HTML,添加自定义文本;
  2. 外网浏览器刷新页面,展示修改后的内容;
  3. 关闭虚拟机 frpc 进程,网页直接无法访问,链路断开验证。

5 ~> 模块 4:纠错点总结

  1. 配置文件启动参数错误
    1. 错误:./frps/./frpc,不携带-c,加载默认配置;
    2. 标准:必须-c ./xxx.toml指定自定义配置文件。
  2. 端口概念混淆(文档核心模糊点)
    1. serverPort (8888):客户端与服务端通信隧道端口;
    2. remotePort (8081/8082):外网用户访问业务端口,二者无关联。
  3. 文件传输文件名空格故障Windows 桌面安装包名称含空格时,scp 命令识别失败,需重命名删除空格。
  4. 虚拟机网络模式选择桥接模式容易获取局域网冲突 IP,NAT 模式为实验最优,宿主机与虚拟机双向互通。
  5. 后台进程丢失问题直接前台运行 frp,关闭终端会终止进程;生产必须搭配nohup + &后台常驻。
  6. 云服务器防火墙放行实验遗漏关键前置:云服务器安全组 / 防火墙需放行 8888、8081、8082 全部端口,否则外网无法连通。

6 ~> 模块 5:思维导图

外网访问端(Xshell/浏览器)↓ TCP请求 云IP:remotePort(8081/8082)公网云服务器 frps(监听8888+业务remotePort)↓ 预建立长连接隧道(8888通道) 内网虚拟机 frpc(持续保活连接) ↓ 本地端口转发 虚拟机本地服务 ├─ sshd:22端口 └─ nginx:80端口 服务响应原路反向回传至外网访问端

7 ~> 模块 6 实验总结核心结论

  1. frp 依靠内网设备主动建立长连接,突破 NAT 单向访问限制,实现内网服务公网暴露;
  2. 单 frpc 客户端支持多组[[proxies]]配置,同时转发 SSH、Web 等多个 TCP 服务;
  3. 区分隧道通信端口 (serverPort) 与业务暴露端口 (remotePort) 是配置不报错的核心;
  4. nohup &方案实现 frp 服务后台守护,脱离终端长期运行;
  5. 所有访问流量中转节点为云服务器,实际业务运行在内网本地设备。

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!

艾莉丝努力练剑

C/C++ & Linux 底层探索者 | 一个正在努力练剑的技术博主

👀【关注】跟随我一起深耕技术领域,见证每一次成长。
❤️【点赞】让优质内容被更多人看见,让知识传递更有力量。
【收藏】把核心知识点存好,在需要时随时查、随时用。
💬【评论】分享你的经验或疑问,评论区一起交流避坑!

不要忘记给博主“一键四连”哦!

“今日练剑达成!”

“技术之路难免有困惑,但同行的人会让前进更有方向。”

结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!

往期回顾

【Linux网络·加餐】frp内网穿透结构化 - 手写部署并测试内网穿透

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡
૮₍ ˶ ˊ ᴥ ˋ˶₎ა