简介
为了绕过NAT(网络地址转换)设备对非内网数据包请求的屏蔽,通过网络服务器代理实现内网服务与外网服务之间的通信,这种技术就是NAT穿透(也称“内网穿透”)。
什么是NAT(网络地址转换)?
公有网络地址: 互联网上全球唯一的一个IP地址,相当于主机的地址,通过这个地址可以接> 收外部发起的数据请求,同时也可以向同样拥有公网IP地址的设备发送数据。(于2019年11月26日,全球的43亿个IPV4地址彻底枯竭)
私有网络地址: 指在内部网络间通信的地址,比如我们常见的192.168.. 开头的IP地址就是内网的IP。
NAT就是将私有网络地址转换为公有网络地址与外界的公网进行通信。即将私有网络的地址、端口和公有网络地址、端口形成一个映射关系,通过将内网地址转换成公网IP地址,进而访问外界网络。
原理
通过一台拥有 "公共网络地址" 的服务器作为中转媒介,和内网服务主机建立通信关系,以此实现通过外部网络访问内网的效果。(如图:1.1)
缺点:
- 访问速度受限于公网服务器的宽带
- 安全性相对较低
用途
目前所见,尽管许多主流平台提供各种优惠活动,但对于一些长期使用的小型网站(如博客、内部管理系统等),选择轻量服务器 + 内网穿透可能更具成本效益。这种组合不仅能够降低运营成本,还能有效支持网站部署、远程桌面控制、文件系统等应用场景。
部署
准备材料
1、一台电脑/笔记本
本文使用的是window 64位系统
2、(阿里云/腾讯云/华为云)服务器
(示例)服务器公网IP:22.130.16.3 (可以到相应服务商查看自己购买服务器的实际IP)
3、代理软件:FRP(window、linux)
window:https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_windows_amd64.zip
linux:https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz
FRP-服务端 部署
- frp-server 以下简称 "frps "
1、登录linux服务器,进入home目录
cd /home
2、通过wget下载frp软件
sudo wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz
3、解压缩
sudo tar -zxvf frp_0.58.1_linux_amd64.tar.gz
4、重命名文件夹
sudo mv frp_0.58.1_linux_amd64 ./frp0.58.1
5、进入frp目录
cd frp_0.58.1
6、编辑服务配置文件 frps.toml
sudo vi frps.toml
注意:如果下载的版本比较旧,配置文件的后缀可能是 frps.init,请尽量使用较新的版本
7、编写配置文件内容
# 服务端监听端口
bindPort = 7000
# http代理监听端口
vhostHTTPPort = 8001
# 鉴权方式
auth.method = "token"
# 客户端连接token
auth.token = "62a20ae0d6154fc0aff1b214771bd3c6"
# 服务端web端口
webServer.port = 8003
webServer.addr = "0.0.0.0"
# 面板登录的用户名和密码
webServer.user = 'frpsAdmin'
webServer.password = 'frpsAdmin'
8、启动Frps服务
sudo ./frps -c ./frps.toml
注:这种运行方式,如果退出linux,服务会自动断掉。可以使用以下命令社会在后台运行
nohup ./frps -c frps.toml >/dev/null 2>&1 &
9、开放端口(重点)
在这里我们需要在两个地方需要开放防火墙的端口,否则外界无法和服务器通信
- 服务商云服务器的管理后台设置
- 服务器内部的防火墙
配置文件一共设置了3个端口,分别是:7000、8001、8003
设置服务器管理后台防火墙

设置服务器防火墙
# 逐个执行以下命令
sudo firewall-cmd --zone=public --add-port=7000/tcp --permanent
sudo firewall-cmd --zone=public --add-port=8001/tcp --permanent
sudo firewall-cmd --zone=public --add-port=8003/tcp --permanent
# 刷新防火墙配置
sudo firewall-cmd --reload
10、访问服务端的FRPS面板
到浏览器打开链接:http://IP地址:8003
http://22.130.16.3 :8003
11、登录FRPS服务面板
用户名:frpsAdmin
密码:frpsAdmin
- 如果能成功进入这个页面,说明服务端已经配置完毕

- 查看监听的端口

- 至此,服务端的配置流程已完毕!
FRP-客户端 部署
- frp-client 以下简称 "frpc"
1、下载frp服务文件
https://github.com/fatedier/frp/releases
2、选择下载的frp文件(根据不同平台选择,我这里只演示window x64)
https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_windows_amd64.zip

3、用记事本打开frpc.toml配置文件,修改配置如下
# Frp服务器的IP地址
serverAddr = "22.130.16.3"
# 映射服务绑定的端口
serverPort = 7000
# 通过token认证
auth.method="token"
auth.token = "62a20ae0d6154fc0aff1b214771bd3c6"
# 扫描confd文件夹下的所有toml配置(比如:tcp.toml、udp.toml)
includes = ["./confd/*.toml"]
# 服务面板配置
webServer.addr = "0.0.0.0"
webServer.port = 8100
# 本地Frp服务的登录用户名和密码
webServer.user = "frpcAdmin"
webServer.password = "frpcAdmin"
4、新建 confd文件夹
5、新建 tcp.toml
文件,配置tcp连接请求。配置信息如下:
注意:这里只演示tcp的映射,其他映射配置(如:tcp、https(国内服务器需要域名和证书))可以自行去尝试
frp 支持多种代理类型,以适应不同的使用场景。以下是一些常见的代理类型:
- TCP:提供纯粹的 TCP 端口映射,使服务端能够根据不同的端口将请求路由到不同的内网服务。
- UDP:提供纯粹的 UDP 端口映射,与 TCP 代理类似,但用于 UDP 流量。
- HTTP:专为 HTTP 应用设计,支持修改 Host Header 和增加鉴权等额外功能。
- HTTPS:类似于 HTTP 代理,但专门用于处理 HTTPS 流量。
- STCP:提供安全的 TCP 内网代理,要求在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
- SUDP:提供安全的 UDP 内网代理,与 STCP 类似,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
- XTCP:点对点内网穿透代理,与 STCP 类似,但流量不需要经过服务器中转。
- TCPMUX:支持服务端 TCP 端口的多路复用,允许通过同一端口访问不同的内网服务。

# 下面提供两种配置方式 (如果映射端口过多,建议使用第一种)
# start:配置一
{{- range $_, $v := parseNumberRangePair "8001,8003" "8001,8003" }}
[[proxies]]
name = "tcp-{{ $v.First }}"
type = "tcp"
# 客户端(本地)的端口
localPort = {{ $v.First }}
# 服务端开放的端口
remotePort = {{ $v.Second }}
#localIP="127.0.0.1"
{{- end }}
# end:配置一
# start:配置二
[[proxies]]
name = "tcp-8001"
type = "tcp"
localPort = 8001
remotePort = 8001
[[proxies]]
name = "tcp-8003"
type = "tcp"
localPort = 8003
remotePort = 8003
# end:配置二
6、打开cmd窗口,进入frp文件夹目录下,输入命令启动frpc服务
frpc.exe -c ./frpc.toml

7、打开浏览器,输入frpc地址,进入管理面板
到浏览器打开链接:http://IP地址:8100
http://localhost:8100
用户名:frpcAdmin
密码:frpcAdmin

至此,frps (frp服务) 和 frpc (frp客户端) 配置完毕
8、返回 frp服务端面板,查看监听状态是否在线

额外:网站部署(frp客户端)
(1)、创建一个Vue项目,设置端口为8001,并启动项目
(2)、测试 localhost:8001
打开
测试结果:本地访问项目正常

(3)、重点:测试网站映射是否成功
通过IP访问局域网的网站:http://IP:8001
测试结果:网站映射成功

总结:
实践一遍下来,流程还算比较简单,主要配置 frps.toml和frpc.toml 这两个文件。主要难度还是在理解内网穿透原理上,涉及到计算机网络层面的知识,需要了解到NAT的相关背景,再去深入了解NAT的类型以及如何保证和外部网络建立连接关系的;大概了解NAT原理后,就开始从反向角度去想,怎么解决外界无法主动请求内部网络的问题。
评论