Linux 学习笔记(五十四):内网穿透实战——用 frp 让外网访问你的私人电脑

📌 核心结论(TL;DR):

  1. 内网穿透背景:由于 NAT 技术的存在,外部网络无法主动连接内网的私有 IP。

  2. 核心思路:利用一台拥有公网 IP 的服务器作为中转站。

  3. frp 架构 :由运行在公网的 frps 和运行在内网的 frpc 组成。内网主动连接公网建立隧道。

  4. 配置逻辑 :客户端通过配置 localPort 和 remotePort,将公网端口与内网服务绑定。

一、 为什么需要内网穿透?

在 IPv4 地址枯竭的今天,家庭宽带和公司网络通常都在 NAT 路由器之后,使用私有 IP(如 192.168.x.x)。如果你想在家里搭建一个 Web 服务器供外网访问,或者想在公司远程 SSH 连接家里的电脑,外网是无法直接找到你的。这就是内网穿透要解决的问题。

二、 frp 工作原理

frp 是一款高性能的反向代理应用。

  1. 在内网机器上运行 frpc 客户端,主动向公网服务器的 frps 发起连接(因为内网访问外网是被允许的)。

  2. 建立一条长期存在的安全隧道。

  3. 当外部用户访问公网服务器的指定端口时,frps 会顺着隧道把请求转发给内网的 frpc。

三、 实战配置

(插入 frpc.toml 的截图)

bash 复制代码
# frpc.toml (运行在内网)
serverAddr = "云服务器公网IP"
serverPort = 7000
[[proxies]]
name = "ssh-tunnel"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22     # 内网本地服务端口
remotePort = 8081  # 暴露给公网的端口

四、 测试验证与避坑

(插入 ssh -p 8081 连接成功的截图)

配置完成后,启动 frps 和 frpc。在公网机器上执行 ssh -p 8081 用户名@云服务器IP,成功通过公网 8081 端口登录到了内网的 22 端口。

⚠️ 核心避坑:

  1. 云服务器的安全组 必须放行 7000(通信端口)和 8081(映射端口)。

  2. 如果想让 frp 在后台常驻,可以使用 nohup ./frpc -c frpc.toml >/dev/null 2>&1 & 命令。

自我实战操作

bash 复制代码
cd ~/linux_study/network_test
mkdir frp_demo && cd frp_demo
第一步:下载并解压 frp

(如果 GitHub 下载慢,可以找网上的国内镜像加速)

bash 复制代码
# 下载 Linux amd64 版本
wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz
解压
tar -zxvf frp_0.58.1_linux_amd64.tar.gz
cd frp_0.58.1_linux_amd64
第二步:配置公网端(frps.toml)
bash 复制代码
vim frps.toml

(输入以下代码)

cpp 复制代码
bindPort = 7000

(默认通信端口是 7000。重点排坑:去云服务器控制台的安全组里,放行 7000 端口!)

第三步:配置内网端(frpc.toml)
bash 复制代码
vim frpc.toml

(输入以下代码)

cpp 复制代码
serverAddr = "127.0.0.1"  # 模拟环境填 127.0.0.1。如果你在家里,填云服务器的公网 IP
serverPort = 7000         # 连向 frps 的 7000 端口
[[proxies]]
name = "ssh-tunnel"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22            # 内网真正要暴露的服务端口 (这里是 SSH 的 22)
remotePort = 8081         # 映射到公网的 8081 端口

(重点排坑:安全组里还要放行 8081 端口!)

第四步:启动并测试

终端 A(启动服务端):

bash 复制代码
./frps -c frps.toml

(看到 frps started successfully 说明成功)

终端 B(启动客户端):

bash 复制代码
./frpc -c frpc.toml

(看到 start proxy success 说明隧道建好了)

第五步:见证奇迹

现在,你用本地的电脑(或者直接开第三个终端):

bash 复制代码
# 尝试连接云服务器的 8081 端口
ssh -p 8081 blog@127.0.0.1

现象 :当执行 ssh -p 8081 blog@127.0.0.1 时,终端弹出了 The authenticity of host ... can't be established. 的指纹确认提示。

说明:这是 SSH 的首次连接安全机制。因为我们刚才配置了 frp 内网穿透,将本地的 22 端口映射到了 8081 端口。SSH 客户端发现了这个"陌生"的隧道端口,为了防范中间人攻击,要求我们核对 RSA/ED25519 指纹。

操作 :输入 yes 确认后,成功进入了目标主机的终端。这标志着 frp 穿透大获全胜,以后在家里、在公司,随时随地都可以用 8081 这个暗门,连回这台服务器了!

现象 :在终端执行 ssh -p 8081 blog@127.0.0.1 并输入密码后,成功弹出了 Ubuntu 的欢迎信息,提示符变成了 blog@VM-0-16-ubuntu:~$。

深度解析:

  1. 我明明连接的是 8081 端口,为什么能登录进 blog 用户?因为 frp 客户端在后台默默把请求转发给了本机的 22 端口。

  2. 这个实战虽然是在同一台机器上模拟的,但如果在真实的办公场景中:

    • frps(服务端)跑在云服务器上。

    • frpc(客户端)跑在公司的内网电脑上。

    • 那么你在家里,只要执行 ssh -p 公网IP的8081端口,就能直接远程操控公司的电脑!

  3. 安全提醒:真实场景下,千万不要把带有公网 IP 的 22 端口直接暴露出去,使用 frp 映射加上强密码/密钥认证,是最稳妥的方案。

(实战演示完毕后,记得用 Ctrl+C 关掉 frps 和 frpc,或者用文档里提到的 nohup 让它们在后台运行:nohup ./frpc -c frpc.toml &>/dev/null &)

相关推荐
在猴站学算法16 分钟前
(《统计学习方法》(第2版) 李航)第2章 感知机算法
学习·算法·机器学习·统计学习
Android系统攻城狮22 分钟前
Linux FFmpeg深度解析之av_guess_format调用流程与实战(三十六)
linux·运维·服务器·ffmpeg·ffmpeg音视频进阶
旖旎夜光34 分钟前
【C++ 基础入门】C++ 继承(上):概念、切片、隐藏、默认成员函数与友元
c++·笔记·学习
Godspeed Zhao35 分钟前
从零开始学AI24——无监督学习之K均值
学习·机器学习
进击的荆棘1 小时前
Linux系统——线程概念与控制之线程封装
linux·运维·服务器·线程
叼烟扛炮1 小时前
[LangChain] 学习笔记(05):提示词模板(Prompt)与少样本注入(Few-Shot)实战
linux·人工智能·笔记·学习·langchain·prompt
CodeYp20191 小时前
第5讲:Socket 编程 TCP
linux·socket·tcp
咔_1 小时前
有IPv6地址,为什么外面还是连不进来?让同一台服务分别卡在四个位置
linux·计算机网络
CodeYp20191 小时前
第3讲:网络命令
linux·网络·命令