Linux网络 NAT、代理服务、内网穿透

news/2025/3/6 15:40:21/

NAT 技术

IPv4 协议中存在  IP 地址数量不充足的问题,而 NAT 技术是当前解决 IP 地址不够用的主要手段 , 是路由器的一个重要功能。NAT 能够将私有 IP 对外通信时转为全局 IP,也就是就是一种将私有 IP 和全局 IP 相互转化的技术方法。
这可以让很多学校,家庭,公司内部采用每个终端设置私有 IP,而在路由器或必要的服务器上设置全局 IP。全局 IP 要求唯一,但是私有 IP 不需要,在不同的局域网中出现相同的私有 IP 是完全不影响的

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

那么问题来了 如果局域网内 有多个主机都访问同一个外网服务器 那么对于服务器返回的数据中, 目的 IP 都是相同的 . 那么 NAT 路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候 NAPT 来解决这个问题了 使用 IP+port 来建立这个关联关系。
这种关联关系也是由 NAT 路由器自动维护的 例如在 TCP 的情况下 建立连接时 , 就会生成这个表项; 在断开连接后 , 就会删除这个表项。

代理服务器

代理服务(Proxy)是一种中间服务器,它充当中间人,转发客户端和目标服务器之间的请求和响应。代理服务器可以提供多种功能,如缓存、匿名访问、访问控制等。

客户端将请求发送到代理服务器,代理服务器再将请求转发到目标服务器。目标服务器的响应会通过代理服务器返回给客户端。代理方式可以分为:

正向代理

正向代理( Forward Proxy )是一种常见的网络代理方式,它位于客户端和目标服务器之间,代表客户端向目标服务器发送请求。正向代理服务器接收客户端的请求,然后将请求转发给目标服务器,最后将目标服务器的响应返回给客户端。通过这种方式,正向代理可以实现多种功能,如提高访问速度、隐藏客户端身份、实施访问控制等。

工作原理

  1. 客户端将请求发送给正向代理服务器
  2. 正向代理服务器接收请求,并根据配置进行处理,如缓存查找、内容过滤等。
  3. 正向代理服务器将处理后的请求转发给目标服务器
  4. 目标服务器处理请求,并将响应返回给正向代理服务器
  5. 正向代理服务器将响应返回给客户端。

功能特点

  • 缓存功能:正向代理服务器可以缓存经常访问的资源,当客户端再次请求这些资源时,可以直接从缓存中获取,提高访问速度。
  • 内容过滤:正向代理可以根据预设的规则对请求或响应进行过滤,如屏蔽广告、阻止恶意网站等。
  • 访问控制:通过正向代理,可以实现对特定网站的访问控制,如限制员工在工作时间访问娱乐网站。
  • 隐藏客户端身份:正向代理可以隐藏客户端的真实 IP 地址,保护客户端的隐私。
  • 负载均衡:在多个目标服务器之间分配客户端请求,提高系统的可扩展性和可靠性。

应用场景

  • 企业网络管理:企业可以通过正向代理实现对员工网络访问的管理和控制,确保员工在工作时间内专注于工作,避免访问不良网站或泄露公司机密。
  • 公共网络环境:在公共场所如图书馆、学校等提供的网络环境中,通过正向代理可以实现对网络资源的合理分配和管理,确保网络使用的公平性和安全性。
  • 内容过滤与保护:家长可以通过设置正向代理来过滤不良内容,保护孩子免受网络上的不良信息影响。
  • 提高访问速度:对于经常访问的网站或资源,正向代理可以通过缓存机制提高访问速度,减少网络延迟。
  • 跨境电商与海外访问:对于跨境电商或需要访问海外资源的企业和个人,正向代理可以帮助他们突破网络限制,顺畅地访问海外网站和资源。

反向代理

反向代理服务器是一种网络架构模式,其作为 Web 服务器的前置服务器,接收来自客户端的请求,并将这些请求转发给后端服务器,然后将后端服务器的响应返回给客户端。这种架构模式可以提升网站性能、安全性和可维护性等。

基本原理

反向代理服务器位于客户端和 Web 服务器之间,当客户端发起请求时,它首先会到达反向代理服务器。反向代理服务器会根据配置的规则将请求转发给后端的 Web 服务器,并将 Web 服务器的响应返回给客户端。在这个过程中,客户端并不知道实际与哪个 Web 服务器进行了交互,它只知道与反向代理服务器进行了通信。

应用场景

  • 负载均衡:反向代理服务器可以根据配置的负载均衡策略,将客户端的请求分发到多个后端服务器上,以实现负载均衡。这有助于提升网站的整体性能和响应速度,特别是在高并发场景下。
  • 安全保护:反向代理服务器可以隐藏后端 Web 服务器的真实 IP 地址,降低其被直接攻击的风险。同时,它还可以配置防火墙、访问控制列表(ACL)等安全策略,对客户端的请求进行过滤和限制,以保护后端服务器的安全。
  • 缓存加速:反向代理服务器可以缓存后端 Web 服务器的响应内容,对于重复的请求,它可以直接从缓存中返回响应,而无需再次向后端服务器发起请求。这可以大大减少后端服务器的负载,提升网站的响应速度。
  • 内容过滤和重写:反向代理服务器可以根据配置的规则对客户端的请求进行过滤和重写,例如添加或删除请求头、修改请求路径等。这有助于实现一些特定的业务需求,如 URL 重写、用户认证等。
  • 动静分离:在大型网站中,通常需要将静态资源和动态资源分开处理。通过将静态资源部署在反向代理服务器上,可以直接从反向代理服务器返回静态资源的响应,而无需再次向后端服务器发起请求。这可以大大提升静态资源的访问速度。

NAT 和代理服务器

路由器往往都具备 NAT 设备的功能 , 通过 NAT 设备进行中转 , 完成子网设备和其他子网设备的通信过程;代理服务器看起来和 NAT 设备有一点像 . 客户端像代理服务器发送请求 , 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后 , 代理服务器又把结果回传给客户端.
那么 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
而后使用 rz 或者直接将之前已经下载好的 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 &
&> /dev/null :这是重定向操作,用于将命令的标准输出( stdout )和标准错误(stderr )都重定向到 /dev/null /dev/null 是一个特殊的设备文件,向它写入的内容都会被丢弃,读取它则会立即返回文件结束。因此,这个操作的作用是忽略命令的所有输出信息。
之后就可以通过连接在 frpc.toml 上配置的 serverAddr 和 remotePort 就可以登陆虚拟机。

http://www.ppmy.cn/news/1577103.html

相关文章

Java后端高频面经——Mysql

3. Mysql(21) 第三范式的作用与原理&#xff1f;&#xff08;B站&#xff09; 数据库范式有 3 种&#xff1a; 1NF(第一范式)&#xff1a;属性不可再分。 1NF 是所有关系型数据库的最基本要求 &#xff0c;也就是说关系型数据库中创建的表一定满足第一范式。 2NF(第二范式)&am…

Vue 监听器的魔法之旅:@Watch(‘form.productId’) vs @Watch(‘value’) 大揭秘!✨

以下是一篇技术博客&#xff0c;主题围绕 Watch(form.productId) 和 Watch(value) 这两个 watcher 的功能、区别及使用场景&#xff0c;基于 compare-form.vue 的代码。准备好一起探索 Vue 监听器的魔法了吗&#xff1f;&#x1f604; &#x1f604; Vue 监听器的魔法之旅&…

从数据中挖掘洞见:初探数据挖掘的艺术与科学

从数据中挖掘洞见&#xff1a;初探数据挖掘的艺术与科学 在当今信息爆炸的时代&#xff0c;我们每天都被海量数据所包围。这些数据不仅记录了我们每天的生活轨迹&#xff0c;还蕴含着无数潜在的模式和洞见。作为大数据领域的自媒体创作者&#xff0c;我笔名Echo_Wish&#xff…

gmock和cppfreemock原理学习

1.gmock用法 gmock&#xff08;Google Mock&#xff09;是 Google Test 的一个扩展库&#xff0c;专门用于 C 单元测试中的模拟&#xff08;mocking&#xff09;。它的核心原理是通过 继承和方法重载/覆盖 来模拟 C 中的虚函数&#xff0c;从而在测试中隔离依赖对象&#xff0…

访问grafana的api

创建 Service accounts 菜单路径&#xff1a;Administration -> Users and access -> Service accounts 访问封装 /*** https://grafana.com/docs/grafana/latest/developers/http_api/dashboard/**/ Slf4j public class GrafanaRequestUtils {public static final St…

智能汽车制造:海康EasyNVR多品牌NVR管理平台实现无插件视频监控直播方案

一、背景介绍 近年来&#xff0c;随着网络在我国的普及和深化发展&#xff0c;企业的信息化建设不断深入&#xff0c;各行各业都加快了信息网络平台的建设&#xff0c;大多数单位已经或者正在铺设企业内部的计算机局域网。与此同时&#xff0c;网络也成为先进的新兴应用提供了…

K8S学习之基础六:k8s中pod亲和性

Pod节点亲和性和反亲和性 podaffinity&#xff1a;pod节点亲和性指的是pod会被调度到更趋近与哪个pod或哪类pod。 podunaffinity&#xff1a;pod节点反亲和性指的是pod会被调度到远离哪个pod或哪类pod 1. Pod节点亲和性 requiredDuringSchedulingIgnoredDuringExecution&am…

Docker 学习(一)

一、Docker 核心概念 Docker 是一个开源的容器化平台&#xff0c;允许开发者将应用及其所有依赖&#xff08;代码、运行时、系统工具、库等&#xff09;打包成一个轻量级、可移植的“容器”&#xff0c;实现 “一次构建&#xff0c;随处运行”。 1、容器&#xff08;Container…