C 语言网络编程 — NAT 网关运行原理

2023-07-24 23:16:36

目录

NAT

NAT(Network Address Translation,网络地址转换)是一种 L3 网络层的 IP 地址转换技术,由 IETF 定义标准,最初用于缓解 IPv4 公网地址紧缺的问题。现在广泛被应用于公网 IP(全球唯一可寻址 IP 地址)和私网 IP(10、172、192 网段)之间的转换。

除了解决公网 IP 地址紧缺的问题之外,NAT 技术还常用于支撑以下网络功能:

  1. 数据安全伪装:可以将私网 IP 地址信息统一转换为公网 IP 地址,不让私网主机直接暴露在公网上,以此来提供网络安全性。
  2. 负载均衡:通过修改 srcIP、dstIP、dstPort 将数据包转发到后端 Real Server 进行处理。详细参考 LVS-NAT 技术实现。
  3. 透明代理:将 HTTP request 重定向到指定的 HTTP 代理服务器。
  4. 等等。

在这里插入图片描述

NAT GW 实现原理

NAT 技术的类型

NAT GW 的基本原理是在转发 IP 数据包时,对其 srcIP/dstIP 甚至是 srcPort/dstPort 进行编辑和转换。

从 IP 映射关系上,可以细分为:

  • 静态 NAT 技术(Static NAT):手动建立和维护一张静态地址映射表,公网 IP 和私网 IP 一一映射。由于无法有效解决公网 IP 紧缺的问题,所以基本不会使用。
  • 动态 NAT 技术(Pooled NAT):自动建立和维护一张动态的地址映射表,公网 IP 和私网 IP 是一对多的关系。它具有一个公网 IP Pool,私网 IP 从这个 Pool 中动态获得公网 IP 地址,并与外部建立连接。而当连接断开后就会释放其占用的公网 IP 给其他私网 IP 使用。这个过程是动态完成的。

在这里插入图片描述

从 IP 编辑和转换类型上,可以细分为:

  • SNAT 技术:修改 srcIP 的 NAT,解决私网 IP 访问公网的问题。
  • DNAT 技术:修改 dstIP 的 NAT,解决公网 IP 访问私网的问题。
  • NAPT 技术(Port-Level NAT):修改 dstPort 的 NAT,解决一个公网 IP 要映射到多个私网 IP 的问题。

NAT 技术的基本原理

在这里插入图片描述

如上图所示,NAT GW 具有对外和对内的 2 类网络端口:

  • 公网 IP:202.20.65.5
  • 私网网段:192.168.1.0/24,同时它还作为私网的 NAT GW 具有 192.168.1.1 IP 地址。

如果此时 NAT GW 已经配置了私网网段和公网 IP 地址之间的动态 NAT 规则,那么当私网中的 ClientA 192.168.1.2 向公网中 Web Server 202.20.65.4 发送了 1 个 IP Packet(srcIP=192.168.1.2、dstIP=202.20.65.4)时会执行以下 NAT 行为。

  • 发包时 SNAT:NAT GW 会把 IP Packet 的 srcIP 转换为公网 IP,并发送到 Web Server。
  • 收包时 DNAT:NAT GW 会把 IP Packet 的 dstIP 转换为私网 IP,并发送到 ClientA。

在这里插入图片描述

NAT 技术的连接跟踪功能

动态 NAT 技术需要依赖 Connection Track(连接跟踪)功能来维护动态的地址映射表,它使得 “回程包“ 知道应该转发给哪个私网 IP 地址。如下图所示:

在这里插入图片描述

NAPT 技术的基本原理

NAPT(Network Address Port Translation)用于实现将一个公网 IP 地址映射到多个私网 IP 上。如下图所示。

在这里插入图片描述

NAPT 技术的连接跟踪功能

NAT GW 的 Connection Track 还用于支持 NAPT 技术,

在这里插入图片描述

NAT Server

NAT Server,顾名思义是一台服务器角色,可以主动接受公网 Client 的请求,并转发到后端私网 IP 地址。实现的原理和上述一致,区别在于由于应用场景的不同,所以 NAT Table Entries 的创建时机不同。

  • NAT GW:在 Egress 流量经过时创建 Entry。
  • NAT Server:在 Ingress 流量进入前创建 Enty。

NAT 穿透

NAT 穿透是一种特殊的应用场景,顾名思义就是 “绕过 NAT GW“,实现两个网络间的 P2P(点到点)直接通信。NAT 穿透在多种场景中有用,例如:

  • 网络游戏:通过使用 NAT 穿透技术,玩家可以直接建立 P2P 连接,实现低延迟的游戏体验,而无需借助中间服务器进行数据转发。
  • 文件共享:通过使用 NAT 穿透技术,用户可以直接建立文件传输的连接,方便快速地共享文件。
  • 实时通信应用:如视频会议、语音通话和实时聊天等,通常需要快速、稳定的连接以实现实时的数据传输。通过使用 NAT 穿透技术,参与通信的用户可以直接建立点对点连接,提供更好的通信质量和用户体验。
  • 远程访问:在远程访问场景中,用户需要从外部网络访问位于内部网络的设备或资源。通过使用 NAT 穿透技术,用户可以直接访问内部网络中的设备,如远程桌面、网络摄像头或家庭自动化设备等,而无需依赖复杂的端口映射或 VPN 设置。
  • IoT 设备通信:物联网(IoT)设备的快速发展导致了大量的设备连接到网络中,这些设备可能位于不同的 NAT 网络中。通过使用 NAT 穿透技术,可以帮助这些设备直接进行通信,实现设备之间的数据交换和互操作性,为物联网应用提供更多的灵活性和可扩展性。

Linux iptables NAT

Linux iptables NAT 转发操作需要在 filter 表中 FORWARD 链中允许,并且打开 Kernel ip_forwarding 转发功能。

另外,由于 iptables 会主动维护 NAT Table,所以在使用 iptables 配置时往往只需要配置 SNAT 或 DNAT 即可 “回包“,而无需为一个数据流同时创建 2 条规则。同时,Linux iptables 在 Kernel 中会将 Netfilter 和 ConnTrack 组合支撑会话跟踪功能。

SNAT

SNAT 作用于 Egress 流量,所以在 iptables 的 POSTROUTING 链生效。出站路径为:APP => TCP/IP stack 路由子系统 => filter:OUTPUT => nat:POSTROUTING => 出站。

$ iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to 198.51.100.3 

在动态 NAT 场景中,还需要使用 IP 地址伪装模式(MASQUERADE),这是一种动态 SNAT 技术,通常用于家庭网络或移动网络。

$ iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

在这里插入图片描述

DNAT

DNAT 作用于 Ingress 流量,所以在 PREROUTING 链中生效。

$ iptables -t nat -I PREROUTING -p tcp -d 198.51.100.3 --dport 80 -j DNAT --to 192.168.0.2

在这里插入图片描述

NAPT

NAPT 通常和 DNAT 一起使用,例如:将本机公网 IP 的 2222 端口映射到虚拟机内网 IP 的 22 端口。

$ iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222  -j DNAT --to-dest 192.168.188.115:22

# 测试。
$ ssh root@210.14.67.127 -p 2222
更多推荐

开源在物联网(IoT)中的应用

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

【Docker】Docker持续集成与持续部署(四)

前言:Docker与持续集成/持续部署(CI/CD)的作用是通过容器化技术实现环境一致性、快速构建和隔离性,从而加快软件交付速度、提高部署效率,确保持续集成和持续部署的顺利实施。持续集成(ContinuousIntegration)持续集成是一种开发实践,通过频繁地将代码集成到共享的主干(版本控制仓库)中,然后自动运行

ElasticSearch系列-索引原理与数据读写流程详解

索引原理倒排索引倒排索引(InvertedIndex)也叫反向索引,有反向索引必有正向索引。通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key。ES底层在检索时底层使用的就是倒排索引。索引模型现有索引和映射如下:{"products":{"mappings":{"properties":{

C语言指针笔试题讲解

大家好,我们来学习一些C语言的指针笔试题。对于C语言指针的模块想必大家都非常的头疼吧,那么我们就来就来看看一些关于C语言指针的笔试题。首先让我们看到我们今天的第一题。intmain(){inta[5]={1,2,3,4,5};int*ptr=(int*)(&a+1);printf("%d,%d",*(a+1),*(pt

springboot集成Logback 日志写入数据库

springboot集成Logback日志写入数据库引入maven依赖<!--logback日志--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>

Mybatis学习笔记3 在Web中应用Mybatis

Mybatis学习笔记2增删改查及核心配置文件详解_biubiubiu0706的博客-CSDN博客技术栈:HTML+Servlet+Mybatis学习目标:掌握mybatis在web应用中如何使用Mybatis三大对对象的作用域和生命周期关于Mybatis中三大对象的作用域和生命周期、官网说明ThreadLocal原理

基于Java+SpringBoot+Vue前后端分离智慧生活商城系统设计和实现

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

深度学习100例 | 第31天-卷积神经网络(DenseNet)识别生活物品

🚀我的环境:语言环境:Python3.6.5编译器:jupyternotebook深度学习环境:TensorFlow2.4.1显卡(GPU):NVIDIAGeForceRTX3080数据:📌【传送门】🚀本文选自专栏:《深度学习100例》🚀深度学习新人必看:《小白入门深度学习》小白入门深度学习|第一篇:配置深度学

基于Java生活缴费系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

Vue项目中可能存在的问题和解决方案

相比其他的框架来说,Vue中更容易产出不合格代码;因为Vue中的options就是一个大对象,导致js本身的很多检测都失效了,比如一个函数没有用到的话会“变灰”,template中代码提示比较少,较多的mixins等等;遇到不合格代码,大多数人第一反应就是这谁写的代码这么差,其实大多数公司大多数人至少曾经都写过一些不合

Greenplum的并发控制概述

注:本文翻译自https://docs.vmware.com/en/VMware-Greenplum/7/greenplum-database/admin_guide-intro-about_mvcc.htmlGreenplum数据库使用PostgreSQL多版本并发控制(MVCC)模型来管理堆表的并发事务。数据库管理

热文推荐