公司动态

【Linux网络加餐】手动部署:SSH 与 Web 服务实战 + 底层原理全解析

📅 2026/8/22 13:30:54
【Linux网络加餐】手动部署:SSH 与 Web 服务实战 + 底层原理全解析
草莓熊Lotso个人主页❄️个人专栏:《C知识分享》 《Linux 入门到实践零基础也能懂》✨生活是默默的坚持毅力是永久的享受 博主简介文章目录前言一. frp 内网穿透核心原理1.1 核心角色1.2 两类关键端口1.3 流量转发流程二. 环境准备2.1 所需设备2.2 安装包下载2.3 文件上传与解压三. 实战一SSH 服务内网穿透3.1 服务端配置与启动3.2 客户端配置与启动3.3 公网远程连接验证四. 实战二Nginx Web 服务内网穿透4.1 内网部署 Nginx4.2 新增 Web 代理配置4.3 浏览器访问验证五. 后台守护运行六. 核心实现逻辑浅析6.1 服务端核心流程6.2 客户端核心流程结尾前言相信很多做开发的朋友都有过这种经历本地写了个 Web 项目想给朋友演示或者需要远程连接家里实验室的 Linux 机器却因为没有公网 IP 一筹莫展。内网穿透就是解决这个问题的核心技术而 frp 凭借轻量、高性能、配置灵活的优势成为了绝大多数人的选择。网上一键部署的教程很多但大多是 “复制粘贴完事”很少讲清楚背后的原理出了问题也无从排查。今天我们就从零开始手动完成 frp 的服务端与客户端部署实现 SSH 远程登录和 Nginx Web 服务穿透两个经典场景再从网络编程的角度拆解它的实现逻辑帮你彻底搞懂内网穿透到底是怎么一回事。一. frp 内网穿透核心原理frp 采用经典的C/S客户端 / 服务端架构核心思路是 “反向连接”—— 利用内网机器主动向外发起连接的能力绕开 “外部无法主动访问内网” 的限制。1.1 核心角色frps服务端部署在拥有公网 IP 的云服务器上负责接收客户端连接、对外暴露代理端口、转发流量。frpc客户端部署在内网机器上主动连接公网服务端把本地服务的流量转发到公网。1.2 两类关键端口很多新手容易混淆端口作用这里先明确区分通信端口bindPort服务端专门用来和客户端建立控制长连接的端口比如后文配置的 8888。这个端口只用于客户端和服务端之间传输控制指令外部用户不需要使用。代理端口remotePort服务端对外暴露的业务端口每一个内网服务对应一个独立的代理端口。外部用户访问「公网 IP remotePort」就等价于访问内网机器的对应服务。1.3 流量转发流程以 SSH 穿透为例完整的流量路径如下外部SSH客户端 - 公网服务器:8081(remotePort) - frps服务端 - 控制长连接(8888) - frpc客户端 - 内网机器:22(SSH服务)响应数据则沿原路返回最终实现公网访问内网服务的效果。二. 环境准备正式部署前我们先把两端的环境和安装包准备妥当。2.1 所需设备公网云服务器任意厂商的 Linux 服务器均可必须有公网 IP本文以 Ubuntu 系统为例。内网机器本文用 VMware 虚拟机Ubuntu 系统演示也可以是本地物理机、树莓派等设备只要能正常访问公网即可。小提示虚拟机推荐使用 NAT 网络模式此时 Windows 主机构成虚拟局域网虚拟机可以正常访问外网满足 frp 客户端的网络要求。2.2 安装包下载frp 的官方仓库为fatedier/frp本文使用v0.58.1版本。下载时必须匹配系统和 CPU 架构x86 架构的 Linux 服务器和虚拟机都选择 frp_0.58.1_linux_amd64.tar.gz不要误选 arm 版本。如果 GitHub 下载速度较慢可以借助 Watt Toolkit 等工具加速下载。2.3 文件上传与解压下载完成后将安装包分别上传到公网服务器和内网虚拟机中常用的传输方式有 rz 命令、scp 命令等# 示例Windows通过scp传输到虚拟机scpfrp_0.58.1_linux_amd64.tar.gz 用户名虚拟机IP:/目标目录上传完成后在两端分别执行解压tarxzf frp_0.58.1_linux_amd64.tar.gzcdfrp_0.58.1_linux_amd64解压后的核心文件frps服务端可执行程序frps.toml服务端配置文件frpc客户端可执行程序frpc.toml客户端配置文件注意v0.58.1 版本默认使用 toml 格式的配置文件不要沿用旧版本的 ini 文件名否则会出现open ./frpc.ini: no such file or directory的报错。三. 实战一SSH 服务内网穿透我们第一个实战场景是把内网机器的 22 号 SSH 端口映射到公网实现公网直接远程登录内网机器。3.1 服务端配置与启动公网服务器的配置非常简洁只需要指定通信端口即可。编辑frps.tomlbindPort 8888这里有一个高频踩坑点启动时必须通过-c参数指定配置文件否则程序会使用默认参数默认端口 7000修改的配置不会生效。错误启动方式使用默认端口./frps正确启动方式./frps-c./frps.toml启动成功后控制台会输出关键日志frps tcp listen on 0.0.0.0:8888 frps started successfully我们可以用 netstat 命令验证端口监听状态netstat-nltp能看到 8888 端口处于 LISTEN 状态进程为 frps说明服务端启动正常。重要提醒云服务器的安全组、系统防火墙必须放开 8888 端口以及后续所有用到的代理端口否则客户端会连接失败。3.2 客户端配置与启动在内网虚拟机上编辑frpc.toml配置服务端地址和 SSH 代理规则# 公网服务器的IP地址 serverAddr 你的公网服务器IP # 与服务端bindPort保持一致 serverPort 8888 # SSH代理规则 [[proxies]] name ssh-service type tcp localIP 127.0.0.1 localPort 22 remotePort 8081参数说明name代理的自定义名称同一客户端下不能重复type代理协议类型SSH 使用 TCP 协议localIPlocalPort内网 SSH 服务的地址和端口本地服务填 127.0.0.1 即可remotePort公网服务器对外暴露的端口外部通过此端口访问 SSH配置完成后启动客户端./frpc-c./frpc.toml启动成功后日志会依次输出login to server success与服务端建立控制连接成功proxy added: [ssh-service]代理规则注册成功start proxy successSSH 代理正式生效此时回到公网服务器查看端口会发现 frps 进程新增了 8081 端口的监听这就是对外提供 SSH 访问的代理端口。3.3 公网远程连接验证打开 Xshell 等 SSH 工具新建连接主机公网服务器 IP端口8081注意不是默认的 22 端口连接成功后登录系统查看主机名、用户目录、文件结构就能确认登录的正是内网虚拟机。我们可以正常执行命令、创建删除文件和本地操作完全一致。四. 实战二Nginx Web 服务内网穿透第二个场景我们在内网部署 Nginx Web 服务并将其映射到公网实现浏览器直接访问内网网页。4.1 内网部署 Nginx先在内网虚拟机上安装并启动 Nginx# Ubuntu/Debian 系统sudoaptinstall-ynginx# CentOS 系统# sudo yum install nginx启动 Nginx 服务sudonginx验证 80 端口监听状态sudonetstat-nltp看到 80 端口处于 LISTEN 状态说明 Nginx 启动成功。4.2 新增 Web 代理配置frp 支持一个客户端同时配置多个代理我们不需要删除已有的 SSH 配置直接在frpc.toml中追加 Nginx 的代理规则# Nginx Web代理规则 [[proxies]] name http-service type tcp localIP 127.0.0.1 localPort 80 remotePort 8082修改完成后重启 frpc 客户端。启动成功后公网服务器上会新增 8082 端口的监听。此时 frps 一共监听三个端口8888控制通信、8081SSH 代理、8082Web 代理。4.3 浏览器访问验证打开浏览器访问http://你的公网IP:8082即可看到 Nginx 的默认欢迎页面。为了确认访问的确实是内网的 Nginx 服务我们可以修改内网的首页文件sudovim/var/www/html/index.nginx-debian.html在页面中加入一行自定义内容比如phello world, hello bit/p保存后刷新浏览器页面会同步更新。如果关闭 frpc 客户端浏览器会立即无法访问重新启动客户端后访问恢复由此可以验证穿透的生效逻辑。五. 后台守护运行前面的启动方式都是前台运行终端关闭后程序就会停止。实际使用中我们需要让 frp 在后台持续运行这里用nohup命令实现后台守护。服务端后台启动命令nohup./frps-c./frps.toml/dev/null客户端后台启动命令nohup./frpc-c./frpc.toml/dev/null命令拆解nohup让程序忽略终端挂起信号终端关闭后继续运行 /dev/null将标准输出和标准错误全部重定向到/dev/null。/dev/null是 Linux 中的特殊设备文件写入的内容会被直接丢弃作用是屏蔽所有日志输出避免生成大量日志文件末尾的让命令在后台执行启动后可以通过ps aux | grep frp查看进程确认程序在后台正常运行。六. 核心实现逻辑浅析frp 是基于 Go 语言开发的项目但底层的网络编程逻辑和经典 TCP C/S 模型完全相通。我们从 TCP 代理的角度拆解核心流程帮大家理解底层的工作机制。6.1 服务端核心流程监听控制端口服务端启动后创建 TCP 套接字绑定bindPort并进入监听状态等待客户端主动连接。对应日志中的frps tcp listen on 0.0.0.0:8888。建立控制连接客户端连接上来后服务端通过 accept 得到一条持久的控制连接用于传输代理注册、连接通知等控制指令。创建代理监听收到客户端的代理注册请求后服务端为每个代理创建独立的套接字绑定对应的remotePort并开始监听外部请求。流量转发调度当外部用户连接代理端口时服务端通过控制连接通知客户端客户端连接本地服务后服务端负责在外部连接和客户端连接之间做双向数据拷贝完成流量透传。6.2 客户端核心流程主动建立连接客户端启动后根据配置的serverAddr和serverPort主动向公网服务端发起连接完成版本校验与登录。注册代理规则控制连接建立成功后客户端将本地所有代理规则发送给服务端完成注册。响应转发请求收到服务端的新连接通知后客户端主动连接本地的目标服务随后配合服务端完成双向的数据转发。本质上frp 就是利用一条客户端主动发起的长连接反向代理多个端口的 TCP 流量巧妙地绕开了内网无法被外部主动访问的限制。理解了 TCP 代理的逻辑再去学习 HTTP 域名代理、HTTPS、UDP 等高级功能都会事半功倍。再来看看真实的远程测试核心考点与常见坑点总结架构角色区分frps 部署在公网服务器frpc 部署在内网机器二者角色不能颠倒。端口作用区分bindPort服务端与客户端的通信端口客户端serverPort必须与其一致remotePort公网对外暴露的业务端口每个代理唯一不能冲突localPort内网服务的实际监听端口配置文件易错点启动必须加-c参数指定配置文件否则使用默认参数v0.58.1 及以上版本配置文件为 toml 格式不要误用 ini 后缀。网络排查优先级连接失败时优先检查云服务器安全组、系统防火墙是否放开了所有用到的端口。多代理特性一个客户端可以配置多组[[proxies]]同时映射多个不同的内网服务。后台运行原理理解 nohup、重定向、的各自作用以及/dev/null设备的含义。结尾 我是草莓熊 Lotso若这篇技术干货帮你打通了学习中的卡点 【关注】跟我一起深耕技术领域从基础到进阶见证每一次成长 ❤️ 【点赞】让优质内容被更多人看见让知识传递更有力量 ⭐ 【收藏】把核心知识点、实战技巧存好需要时直接查、随时用 【评论】分享你的经验或疑问比如曾踩过的技术坑一起交流避坑 ️ 【投票】用你的选择助力社区内容方向告诉大家哪个技术点最该重点拆解 技术之路难免有困惑但同行的人会让前进更有方向愿我们都能在自己专注的领域里一步步靠近心中的技术目标结语手动完整部署一遍 frp最大的价值从来不是得到一个能用的穿透工具而是真正搞懂 “内网穿透” 背后的网络逻辑 —— 它没有什么黑魔法本质就是反向代理 流量转发。很多时候我们依赖一键脚本、可视化面板确实提升了效率但也跳过了最核心的原理细节遇到问题就只能束手无策。从手动部署入手搞懂每一个配置项的含义、每一步流量的走向再去使用高级功能或者排查问题都会轻松很多。后续大家还可以继续探索 frp 的高级玩法比如按域名分流的 HTTP 代理、HTTPS 证书配置、端口复用、负载均衡等等底层逻辑都是相通的。✨把这些内容吃透超牛的放松下吧✨ʕ˘ᴥ˘ʔづきらど