【Linux】【网络】NAT-->不同子网下客户端无法通信原因
【Linux】【网络】NAT–>不同子网下客户端无法通信原因
之前发现了这个问题 大概知道是由于公网IP和私网IP的原因 但是具体原因仍然不是很清楚 现在大概有了些浅薄的理解 写一下自己的理解和部分转载的文章。
首先说明一下 网关,NAT和路由器:(前面有提到过什么是公网ip,什么是私网ip)
1. 网关(Gateway)
定义
网关是 连接不同网络的设备,用于数据包在不同网络之间的 转发和转换。
当一台设备想要访问不同网络的资源(比如从局域网访问互联网),它需要通过网关进行通信。
作用
- 充当网络之间的桥梁(例如,家用网络连接到 ISP)。
- 负责 IP 数据包的转发,帮助设备访问外部网络。
- 通常是路由器的 IP 地址(如
192.168.1.1
)。
示例
- 你的电脑 IP 地址:
192.168.1.100
- 你的 网关(路由器)IP:
192.168.1.1
- 你的网关会将你的数据 转发到外部互联网。
2. NAT(网络地址转换,Network Address Translation)
定义
NAT 是一种 地址转换技术,用于解决 IPv4 地址短缺问题。它允许多个设备共享一个 公网 IP 访问互联网。
作用
- 将私有 IP 地址转换为公网 IP,使局域网设备可以访问互联网。
- 隐藏内网设备的真实 IP 地址,提高安全性。
- 提供端口映射功能,支持外部设备访问内部服务(如端口转发)。
示例
假设你家里的两台设备访问互联网:
设备 1:192.168.1.100 → 通过 NAT 变为 203.0.113.5:50001
设备 2:192.168.1.101 → 通过 NAT 变为 203.0.113.5:50002
外部服务器只能看到 203.0.113.5:50001 和 203.0.113.5:50002,而不知道设备 1 和 2 的内网地址。
3. 路由器(Router)
定义
路由器是 专门用于管理网络流量的设备,用于在多个网络之间 选择最佳路径 并 转发数据包。
作用
- 连接多个网络(如局域网和互联网)。
- 转发数据包到不同的子网(如
192.168.1.0/24
→192.168.2.0/24
)。 - 通常内置 NAT 功能,允许多个设备共享一个公网 IP。
4. 网关、NAT 和路由器的关系
设备 | 作用 | 是否包含 NAT | 是否充当网关 |
---|---|---|---|
网关(Gateway) | 连接不同网络的设备 | ❌ 不一定有 | ✅ 主要功能 |
NAT | 进行 IP 地址转换 | ✅ 核心功能 | ❌ 不是网关 |
路由器(Router) | 负责数据包转发 | ✅ 一般都有 | ✅ 通常是网关 |
总结
概念 | 作用 | 关键特点 |
---|---|---|
网关(Gateway) | 连接不同网络 | 设备访问外网必须经过网关 |
NAT(网络地址转换) | 内网设备共享公网 IP | 解决 IPv4 地址不足问题 |
路由器(Router) | 选择最佳路径、转发数据 | 连接多个网络,通常带有 NAT 功能 |
- 路由器是一个包含 NAT 功能的网关,它帮助内网设备访问外网。
- NAT 负责转换 IP 地址,确保局域网设备可以共享公网 IP。
- 网关是连接不同网络的桥梁,通常就是你的路由器。
接下来详细说明NAT
NAT
由于全球联网设备越来越多,但 IPv4 地址资源有限
所以,我们需要一种技术,让多个设备「共用」同一个 IP 地址,来缓解 IPv4 地址不够用的问题。
NAT 可用于内网 IP 地址(以下简称为「内网 IP」)和公网 IP 地址(以下简称为「公网 IP」)之间的转换。
例如家庭中的多个联网设备,都拥有各自的内网 IP,无线路由器运行 NAT 功能;家中的设备向外发送数据时,数据中的内网 IP,在无线路由器上会被转换为公网 IP;外部数据发送到家庭设备时,数据中的公网 IP,会被转换为内网 IP。
源端口,目的端口,源IP,目的IP 是我们在网络中能够准确发送数据到对端,对端回复我们的重要要素。
从下图中可以看出在不考虑NAT的情况下整个的简单流程:
那么,如果用户的电脑是内网设备,经过了 NAT,使用浏览器访问网站时,的过程是这样的:
- 首先,浏览器会发送请求报文,报文的源 IP 为电脑的内网 IP (此处以 192.168.1.126 为例)。
- 当报文到达路由器后,路由器
将报文源 IP 修改为公网 IP
(1.1.1.10),并分配一个新的源端口号。在这个过程中,路由器会记录下源 IP 和源端口号,在转换前后的对应关系,形成NAT 表项
。 - 路由器将源 IP 和源端口号转换后的报文发送到服务器,服务器回应的报文,目的 IP 和目的端口端口号,就是请求报文中的源 IP 和源端口号。这样,报文就能根据目的 IP,到达用户的路由器上。
- 路由器收到来自服务器的报文,根据
NAT 表项
,将目的 IP 和目的端口号,从外部 IP、外部端口,转换为内部 IP、内部端口。这样,报文就能顺利到达用户电脑的浏览器上。
从上面的例子中可以看出,NAT 通过记录端口号2、IP 地址的对应关系,将出方向报文的源 IP、源端口号从内部地址转换为外部地址,将入方向报文的目的 IP、目的端口号从外部地址转换为内部地址,让内网设备也能正常访问 Internet。
NAT 为我们带来了哪些不便之处
NAT 缓解了 IP 地址资源不足的问题,同时能使家庭中的多个设备共享同一条宽带,同时上网。另外,启用 NAT 后,外部设备无法主动发起对内网设备的连接,相当于起到了防火墙的作用,保护了内网设备,一定程度上提高了安全性。
NAT 通过「巧妙」的方式,在内部地址和外部地址之间进行转换。大部分情况下,我们感受不到 NAT 的存在。但仍有部分应用,需要内网设备做为服务器,被外部连接,例如:
- 远程访问家中的 NAS、监控摄像头 eMule、BitTorrent 等 P2P
- 文件分享应用,使自己的设备可供外部连接,从而能够连接到更多分享者,获取更快的下载、上传速度
- 部分语音通话、视频会议应用,通信双方直接连接,获取更好的通话质量 部分联机游戏,不会经过第三方服务器,需要玩家之间直接建立连接
- 对于这些应用,如果设备位于 NAT 之内,没有公网 IP,就难以实现了。
但如下两种情况,是 NAT 难以做到的:
- 内网设备做为服务器,外部设备主动向内网设备发起连接
- 使用 TCP、UDP 之外的、没有端口号的协议进行通信3
我们之前就是第一种情况 内网设备作为服务器 另一台不在同一网络内主机作为客户端 实际上无法连接,
这个图能够大概说明为什么:
我们使用了中转服务器来实现:
大概画了一个图,是这样的
但是实际上还有别的实现方式 我们后续大概描述一下。
部分转自:
https://sspai.com/post/68037