NAT 技术
IP 转换过程
- 10.0.0.10 要发送数据时,NAT 路由器将源地址从 10.0.0.10 替换成全局的 IP 202.244.174.37
- NAT 路由器收到外部的数据时, 又会把目标 IP 从 202.244.174.37 替换回10.0.0.10
- NAT 路由器内部有一张自动生成的用于地址转换的表,当 10.0.0.10 第一次向 163.221.120.9发送数据时就会生成表中的映射关系
NAPT

代理服务器
代理服务(Proxy)是一种中间服务器,它充当中间人,转发客户端和目标服务器之间的请求和响应。代理服务器可以提供多种功能,如缓存、匿名访问、访问控制等。
客户端将请求发送到代理服务器,代理服务器再将请求转发到目标服务器。目标服务器的响应会通过代理服务器返回给客户端。代理方式可以分为:
正向代理

工作原理
- 客户端将请求发送给正向代理服务器。
- 正向代理服务器接收请求,并根据配置进行处理,如缓存查找、内容过滤等。
- 正向代理服务器将处理后的请求转发给目标服务器。
- 目标服务器处理请求,并将响应返回给正向代理服务器。
- 正向代理服务器将响应返回给客户端。
功能特点
- 缓存功能:正向代理服务器可以缓存经常访问的资源,当客户端再次请求这些资源时,可以直接从缓存中获取,提高访问速度。
- 内容过滤:正向代理可以根据预设的规则对请求或响应进行过滤,如屏蔽广告、阻止恶意网站等。
- 访问控制:通过正向代理,可以实现对特定网站的访问控制,如限制员工在工作时间访问娱乐网站。
- 隐藏客户端身份:正向代理可以隐藏客户端的真实 IP 地址,保护客户端的隐私。
- 负载均衡:在多个目标服务器之间分配客户端请求,提高系统的可扩展性和可靠性。
应用场景
- 企业网络管理:企业可以通过正向代理实现对员工网络访问的管理和控制,确保员工在工作时间内专注于工作,避免访问不良网站或泄露公司机密。
- 公共网络环境:在公共场所如图书馆、学校等提供的网络环境中,通过正向代理可以实现对网络资源的合理分配和管理,确保网络使用的公平性和安全性。
- 内容过滤与保护:家长可以通过设置正向代理来过滤不良内容,保护孩子免受网络上的不良信息影响。
- 提高访问速度:对于经常访问的网站或资源,正向代理可以通过缓存机制提高访问速度,减少网络延迟。
- 跨境电商与海外访问:对于跨境电商或需要访问海外资源的企业和个人,正向代理可以帮助他们突破网络限制,顺畅地访问海外网站和资源。
反向代理

基本原理
应用场景
- 负载均衡:反向代理服务器可以根据配置的负载均衡策略,将客户端的请求分发到多个后端服务器上,以实现负载均衡。这有助于提升网站的整体性能和响应速度,特别是在高并发场景下。
- 安全保护:反向代理服务器可以隐藏后端 Web 服务器的真实 IP 地址,降低其被直接攻击的风险。同时,它还可以配置防火墙、访问控制列表(ACL)等安全策略,对客户端的请求进行过滤和限制,以保护后端服务器的安全。
- 缓存加速:反向代理服务器可以缓存后端 Web 服务器的响应内容,对于重复的请求,它可以直接从缓存中返回响应,而无需再次向后端服务器发起请求。这可以大大减少后端服务器的负载,提升网站的响应速度。
- 内容过滤和重写:反向代理服务器可以根据配置的规则对客户端的请求进行过滤和重写,例如添加或删除请求头、修改请求路径等。这有助于实现一些特定的业务需求,如 URL 重写、用户认证等。
- 动静分离:在大型网站中,通常需要将静态资源和动态资源分开处理。通过将静态资源部署在反向代理服务器上,可以直接从反向代理服务器返回静态资源的响应,而无需再次向后端服务器发起请求。这可以大大提升静态资源的访问速度。
NAT 和代理服务器
- 从应用上讲, NAT 设备是网络基础设备之一, 解决的是 IP 不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器.
- 从底层实现上讲, NAT 是工作在网络层, 直接对 IP 地址进行替换. 代理服务器往往工作在应用层.
- 从使用范围上讲, NAT 一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网.
- 从部署位置上看, NAT 一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上.
内网穿透
内网穿透是一种技术,用于在不直接暴露内网设备的情况下,允许外部设备访问内网资源。它通常通过隧道(Tunnel)技术实现,将内网设备的流量转发到公网服务器,再由公网服务器转发到目标设备。
内网穿透通常涉及以下组件:
-
内网客户端:需要被访问的内网设备。
-
公网服务器:中转服务器,用于转发流量。
-
外部客户端:访问内网资源的设备。
常见的内网穿透工具包括:
-
frp:国内开源工具,支持多种协议,适合内网穿透。
-
ngrok:开源工具,支持HTTP/HTTPS和TCP隧道。
-
ZeroTier:基于虚拟网络的内网穿透工具,支持多设备组网。
手动部署并测试内网穿透
我们使用 frp 内网穿透工具进行部署,首先在以下网址进行下载:https://github.com/fatedier/frp/releases/tag/v0.58.1
下载以下版本
下载好后我们可以将该压缩文件拷贝到 Windows 桌面上
在云服务器(公网)上部署frp
首先我们打开云服务器,并进入到家目录,创建 frp 文件夹,之后再该路径下进行测试
cd ~
mkdir frp
cd frp

tar xzf frp_0.58.1_linux_amd64.tar.gz
进入到解压文件后就可以看到已经编译好的客户端和服务器可执行程序
- frpc:客户端程序,frpc.toml 为对应的配置文件
- frps:服务器程序,frps.toml 为对应的配置文件
- LICENSE:授权许可
由于我们需要云服务器作为内网穿透的服务器,所以配置 frps.toml
bindPort = 7000
在虚拟机(内网)上部署frp
推荐在虚拟机上设置网络适配器模式为 NAT 模式,该模式下相当于在 Windows 中建立了一个子网,Windows 主机充当路由器,虚拟机就位于该子网中,这样 Windows 和虚拟机就可以正常进行网络通信。
首先我们打开虚拟机后,按下 Ctrl + Alt + T 打开终端,并进入到家目录,创建 frp 文件夹,之后再该路径下进行测试。
cd ~
mkdir frp
cd frp
查看虚拟机上的 ip 地址,先安装 net-tools 包,而后使用 ifconig
sudo apt update
sudo apt install net-tools
ifconfig
lbk@lbk-virtual-machine:~/frp$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.22.128 netmask 255.255.255.0 broadcast 192.168.22.255inet6 fe80::d02a:4e7a:58be:12bb prefixlen 64 scopeid 0x20<link>ether 00:0c:29:3c:3a:32 txqueuelen 1000 (以太网)RX packets 49752 bytes 71176201 (71.1 MB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 5643 bytes 457889 (457.8 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
在输出中,inet
后面的地址就是 IPv4 地址,即 192.168.22.128。
而后打开 Windows 下终端,使用 scp 命令传输 frp 压缩文件到虚拟机上
scp /path/to/local/file username@remote_host:/path/to/remote/directory
#/path/to/local/file:本地文件的路径。
#username:远程服务器的用户名。
#remote_host:远程服务器的地址(IP 或域名)。
#/path/to/remote/directory:远程服务器上的目标目录。
scp D:\桌面\frp_0.58.1_linux_amd64.tar.gz lbk@192.168.22.128:/home/lbk/frp
之后在虚拟机中就存在 frp 压缩文件,并解压
tar xzf frp_0.58.1_linux_amd64.tar.gz
由于我们需要远程连接虚拟机,所以配置 frpc.toml
#配置公网服务器上 frp 服务的 IP 与端口
serverAddr = "110.41.138.70"
serverPort = 7000[[proxies]]
name = "ssh-serivce" #名称
type = "tcp" #代理类型
localIP = "127.0.0.1" #本地 IP
localPort = 22 #内网服务监听的端口
remotePort = 7080 #需要在公网服务器上监听的端口,
#其他人未来可以通过这个端口访问我们的本地的 22 号服务
#也就是说 7080 端口会映射到 22 号端口
启动连接
nohup ./frpc -c ./frpc.toml &> /dev/null &
nohup ./frps -c ./frps.toml &> /dev/null &