frp 内网穿透实操(Kali NAT 环境 · 附原理说明)
环境:VMware 下的 Kali 虚拟机(NAT 模式)+ Windows 宿主机 + 同一 WiFi 下的手机
目标:把 Kali 上的服务通过 FRP 暴露出来,让手机能够访问,并彻底搞懂
7000端口的作用。
一、实验环境与拓扑
1.1 设备与地址
| 设备 | IP 地址 | 在 FRP 中的角色 |
|---|---|---|
| Windows 宿主机 | 192.168.31.161(WLAN) 192.168.211.1(VMnet8) |
服务端 frps(模拟"公网服务器") |
| Kali 虚拟机 | 192.168.211.128 |
客户端 frpc(内网目标机器) |
| 手机 | 192.168.31.x |
外部访问者 |
1.2 拓扑与连通性
手机 192.168.31.x ──同WiFi── Windows宿主机 192.168.31.161 ──VMnet8──┐
192.168.211.1 │ NAT隔离
▼
Kali 192.168.211.128
(在VMware NAT内网里)
三台设备的可达性是不对称的,这是本实验的关键:
- 手机与宿主机在同一 WiFi,可以互相访问。
- Kali 处于 VMware NAT 模式 ,只有宿主机(经由 VMnet8 网卡
192.168.211.1)能直接看到它。 - 手机没有任何路由 能到达
192.168.211.128,因此无法直接访问 Kali 上的服务。
结论 :宿主机是唯一"手机和 Kali 都能到达"的节点,天然适合扮演"公网中转服务器"。本实验就是把 Kali 的 Web 服务通过 FRP 搬到宿主机的 8080 端口上,让手机访问宿主机即可看到 Kali 的内容。
⚠️ 注意:由于三台设备实际都在同一局域网内,这是一次模拟的内网穿透。真实生产环境里,扮演 frps 的机器必须是真正具备公网 IP 的服务器(如云主机),其余原理完全一致。
二、原理速览
2.1 三个角色
| 角色 | 你的环境中是谁 | 部署什么 | 职责 |
|---|---|---|---|
| 公网服务端 S | Windows 宿主机 | frps |
监听 7000,接收并转发外部请求 |
| 内网客户端 C | Kali 虚拟机 | frpc + 业务服务 |
主动连接 S,把内网服务"挂"出去 |
| 外部访问者 V | 手机 / 浏览器 | 无 | 通过 S 的地址访问内网服务 |
2.2 两种端口,分工完全不同
| 类别 | 端口 | 谁监听 | 谁连接 | 作用 |
|---|---|---|---|---|
| 控制端口 | 7000(bindPort) |
frps(宿主机) | frpc(Kali)主动连出去 | 认证、注册代理、心跳保活、承载隧道数据 |
| 业务端口 | 8080(remotePort) |
frps(宿主机) | 手机等外部访问者 | 真正对外提供服务的入口 |
一句话记住 :7000 是 frpc 找服务端"挂号"并保持联络的控制通道入口 ,只在内网机器与服务端之间"内部通话";手机从头到尾访问的是 8080,不会碰 7000。
2.3 数据流两阶段
【阶段一:建立隧道】内网主动向外(这一步穿透 NAT)
Kali(frpc) ──TCP 连到 7000──▶ Windows(frps)
│ 提交 token、注册 "把本地80映射到远端8080"
└◀── 通道建立,之后持续心跳保活 ──▶
【阶段二:访问业务】外部请求进来
手机 ──HTTP 请求 8080──▶ Windows(frps)
│ 复用 7000 那条已建立的连接转发
▼
Kali(frpc) ──▶ 127.0.0.1:80(你的 Web 服务)
为什么这样就穿透了 NAT? FRP 的思路是让内网先主动连出去并一直挂着,之后外部请求顺着这条已有连接被"送"进来。

三、实操步骤
3.0 环境约定
| 项 | 值 |
|---|---|
| frps 所在 | Windows 宿主机,目录 C:\frp |
| frpc 所在 | Kali,目录 ~/frp_0.71.0_linux_amd64 |
| Kali 连接宿主机用 | 192.168.211.1 |
| 手机访问宿主机用 | 192.168.31.161 |
| token | kali_frp_2026(请自行改成更复杂的) |
第 1 步:下载 FRP
前往官方发布页 github.com/fatedier/frp/releases,按你的架构下载最新稳定版 (当前为 v0.71.0):

- Windows 端:
frp_0.71.0_windows_amd64.zip,解压到C:\frp - Kali 端:
frp_0.71.0_linux_amd64.tar.gz
解压后目录里会有 frps、frps.toml、frpc、frpc.toml 四个文件:
- Kali 只用带
c的(客户端 frpc) - Windows 只用带
s的(服务端 frps)
📌 重要 :FRP 自 v0.52.0 起已彻底弃用
.ini配置,全面改用.toml,且参数由下划线命名(server_addr)改为驼峰命名(serverAddr)、多代理由[分区]改为[[proxies]]数组。网上大量老教程仍是 INI 写法,照抄会直接报错。
第 2 步:配置服务端(Windows)
在 C:\frp 下用记事本新建 / 编辑 frps.toml:
toml
bindPort = 7000
auth.method = "token"
auth.token = "kali_frp_2026"
# 可选的监控面板,想省事可先不加
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin123"
在 C:\frp 目录打开 CMD,启动服务端:
cmd
frps.exe -c frps.toml
看到类似 frps started successfully 的输出即启动成功。
第 3 步:配置客户端(Kali)
在 Kali 的 frp 目录下编辑 frpc.toml:
toml
serverAddr = "192.168.211.1"
serverPort = 7000
auth.method = "token"
auth.token = "kali_frp_2026"
[[proxies]]
name = "kali-web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 8080
# 可以顺手把 SSH 也穿出去,方便后面玩
[[proxies]]
name = "kali-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
启动客户端:
bash
./frpc -c frpc.toml
看到 start proxy success 就说明隧道已打通。
💡 修改配置后,可用官方校验命令先检查语法,避免启动即报错:
bash./frpc verify -c ./frpc.toml

第 4 步:在 Kali 上起一个测试服务
另开一个 Kali 终端:
bash
mkdir -p /tmp/frp_test && cd /tmp/frp_test
echo "Hello from Kali via FRP!" > index.html
sudo python3 -m http.server 80
80 是特权端口,必须用
sudo。若不想占用 80,可改成python3 -m http.server 8000,同时把frpc.toml里的localPort改成8000。

第 5 步:放行 Windows 防火墙(关键)
必须放行三个 TCP 端口:7000(让 Kali 连进来)、8080(让手机访问)、6000(SSH 映射,可选)。用管理员权限的 CMD:
cmd
netsh advfirewall firewall add rule name="FRP bind 7000" dir=in action=allow protocol=TCP localport=7000 profile=any
netsh advfirewall firewall add rule name="FRP web 8080" dir=in action=allow protocol=TCP localport=8080 profile=any
netsh advfirewall firewall add rule name="FRP ssh 6000" dir=in action=allow protocol=TCP localport=6000 profile=any
⚠️ 这里必须单独放行 TCP 端口 ,TCP 端口是独立的规则。
第 6 步:分层验证
按从近到远逐层确认,出问题好定位:
- Kali 本机 :
curl http://127.0.0.1/→ 应看到Hello from Kali via FRP! - Windows 本机浏览器 :访问
http://127.0.0.1:8080→ 应看到同样内容(说明 frps ↔ frpc 隧道 OK) - 手机浏览器 :访问
http://192.168.31.161:8080→ 应看到同样内容(说明外部访问链路 OK)
如果第 2 步通、第 3 步不通,基本就是 Windows 防火墙没放行 8080,或 WLAN 被识别成"公用网络"而规则未覆盖到。


停止frp后手机就无法访问kali了

四、端口与配置速查表
| 配置项 | 写在哪 | 含义 | 你的取值 |
|---|---|---|---|
bindPort |
frps | 控制端口,frpc 连过来的入口 | 7000 |
webServer.port |
frps | Dashboard 面板端口(可选) | 7500 |
serverAddr |
frpc | frps 的地址 | 192.168.211.1 |
serverPort |
frpc | 须与 frps 的 bindPort 一致 |
7000 |
localIP / localPort |
frpc | 内网真实服务地址 | 127.0.0.1 : 80 |
remotePort |
frpc | 业务端口,映射到服务端对外 | 8080 |
auth.token |
两端 | 身份凭证,必须完全一致 | 自定义 |
五、常见报错排查
| 现象 / 报错 | 原因与解决 |
|---|---|
login to server failed: i/o timeout |
7000 端口不通。先 telnet 192.168.211.1 7000 测 TCP 连通,90% 是 Windows 防火墙未放行 7000 |
token mismatch |
两端 auth.token 不一致,逐字符核对 |
port already used |
8080 被占用,换一个 remotePort(如 8081) |
| 提示 INI 文件已被弃用 | 配置里混用了 [common] 等 INI 分区写法。改后缀名也没用,必须彻底改成 TOML 语法 |
start proxy success 但手机打不开 |
手机应访问 192.168.31.161:8080(WLAN 网卡),不是 192.168.211.1;同时确认防火墙已放行 8080 |
| 能访问但页面空白 / 连接被重置 | Kali 上 Web 服务没真正起来,检查 python3 -m http.server 是否仍在运行、端口是否对得上 |
六、进阶练习方向
-
加 Dashboard :浏览器打开
http://192.168.31.161:7500,用配置里的用户名密码登录,能实时看到在线客户端、代理列表与流量统计,比翻日志直观。



端口情况查看

-
试 HTTP 类型的域名映射 :把
type改成http,配customDomains与 frps 的vhostHTTPPort,体验基于域名的反向代理。 -
错误 token 实验 :故意把一端 token 改错(kali的改为kali_frp_2027),观察 frpc 的认证失败日志,理解鉴权机制。

-
开启加密与压缩 :在
[[proxies]]里加transport.useEncryption = true和transport.useCompression = true,对比开启前后的大文件传输速度。 -
换成云主机:把 frps 部署到一台有公网 IP 的云服务器上,内部服务换成更真实的应用,即可获得一套真正可用的内网穿透环境。

