简介

为了绕过NAT(网络地址转换)设备对非内网数据包请求的屏蔽,通过网络服务器代理实现内网服务与外网服务之间的通信,这种技术就是NAT穿透(也称“内网穿透”)。

什么是NAT(网络地址转换)?

公有网络地址: 互联网上全球唯一的一个IP地址,相当于主机的地址,通过这个地址可以接> 收外部发起的数据请求,同时也可以向同样拥有公网IP地址的设备发送数据。(于2019年11月26日,全球的43亿个IPV4地址彻底枯竭)

私有网络地址: 指在内部网络间通信的地址,比如我们常见的192.168.. 开头的IP地址就是内网的IP。

NAT就是将私有网络地址转换为公有网络地址与外界的公网进行通信。即将私有网络的地址、端口和公有网络地址、端口形成一个映射关系,通过将内网地址转换成公网IP地址,进而访问外界网络。

原理

通过一台拥有 "公共网络地址" 的服务器作为中转媒介,和内网服务主机建立通信关系,以此实现通过外部网络访问内网的效果。(如图:1.1)

缺点:

  • 访问速度受限于公网服务器的宽带
  • 安全性相对较低

img

图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

设置服务器管理后台防火墙
image-20240830181627898
图1.2
设置服务器防火墙
# 逐个执行以下命令
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

  • 如果能成功进入这个页面,说明服务端已经配置完毕
image-20240902113234010
图1.3
  • 查看监听的端口
image-20240902113746293
图1.4
  • 至此,服务端的配置流程已完毕!

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

image-20240902114224804
图1.5
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 端口的多路复用,允许通过同一端口访问不同的内网服务。

image-20240902115027545

图1.6
image-20240902115243501
图1.7
# 下面提供两种配置方式 (如果映射端口过多,建议使用第一种)
# 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
image-20240902135944681
图1.8
7、打开浏览器,输入frpc地址,进入管理面板

到浏览器打开链接:http://IP地址:8100

http://localhost:8100

用户名:frpcAdmin

密码:frpcAdmin

image-20240902142219389
图1.9

至此,frps (frp服务)frpc (frp客户端) 配置完毕

8、返回 frp服务端面板,查看监听状态是否在线
image-20240902141756157
图2.0

额外:网站部署(frp客户端)

(1)、创建一个Vue项目,设置端口为8001,并启动项目
(2)、测试 localhost:8001 打开

测试结果:本地访问项目正常

image-20240902141150912
图2.1
(3)、重点:测试网站映射是否成功

通过IP访问局域网的网站:http://IP:8001

测试结果:网站映射成功

image-20240902141025125
图2.2

总结:

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