SNAT的链路流程

2024-09-07 14:04
文章标签 流程 snat 链路

本文主要是介绍SNAT的链路流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A主机,有公网ip,比如1.1.1.1

              有内网ip,比如192.168.1.1

B主机, 有内网ip,比如192.168.1.123

A主机和B主机在同一局域网,用交换机连接。或者在云平台,两个属于同一个vpc下的同一个subnet,也就是在同一个虚拟私人网络下的,同一个子网内。

如何实现B主机通过A主机的公网ip访问公网的服务?

这个就是snat解决的问题

snat:  source network  address translation     源  网络地址转换

效果:B主机通过A主机的公网ip,访问公网服务,比如公网上的yum仓库,公网上的容器镜像仓库

首先,在A主机上进行两项操作

1. 开启linux操作系统的路由转发功能

echo  "net.ipv4.ip_forword = 1"  >  /etc/sysctl.conf

sysctl  -p

2. 开启SNAT 网络地址转换功能

用iptables

红帽系列可以用firewalld

实现原理:

B主机将自己的网关地址改为A的内网地址192.168.1.1

B主机访问外网的请求的报文会到A主机

由于A主机开启了ip_forword功能和SNAT功能

所以会实现两个动作,路由转发和源地址转换

由于B主机的报文的目标ip是公网服务器

所以A主机会代替B主机把报文发往公网服务器地址

由于A主机开启了SNAT源地址转换功能

所以A主机在代替B主机把报文发送公网服务器地址的同时

会修改报文的源ip地址,iptables服务进行snat的设置类似如下

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 1.1.1.1

我们可以看到“snat to-source“的字样,意思就是把前面的源地址转变成另一个源地址

这样,B主机请求公网服务的报文的源ip就可以被修改为A主机的公网ip

数据报就可以到达公网服务器。

这里有一个问题?

B主机的报文是如何到达A主机的?它怎么知道A主机可以帮自己转发数据的?

因为,B主机的网关设置为了A主机的IP地址

A主机在这里相当于一个路由器的角色

平时主机把自己的网关设置为路由器的一个端口IP

目的就是把数据报交给路由器,让路由器转发到不同网段。

那么linux操作系统也有路由器的功能,当开启了路由转发

也会进行同样的操作

所有B主机把网关设置为A主机的IP地址

A主机就可以帮B主机把数据报文转发

而SNAT执行的动作主要是修改这个报文的源IP

因为如果报文的源IP还是内网地址,也就是B主机的地址

这个报文是不能在公网上进行通信的

第二个问题,请求报文到达公网服务器,公网给了响应报文之后

这个响应报文的目标IP是A主机的公网IP地址,那么响应报文如何到达B主机?

这里有一个概念,叫连接跟踪表。长这样

连接跟踪表(connection track table)

这个表,路由器上有,linux操作系统上也有。

当A主机接收到公网服务器返回的响应报文的时候

会查看连接跟踪表,看这个响应报文,当时是谁要去请求数据的

一看

是B主机让转发去找这个公网服务器的

然后

A主机就会把响应报文转发给B主机

那么B主机就实现了通过A主机的公网IP来访问公网服务器的目的

这篇关于SNAT的链路流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145266

相关文章

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 升级到8.4版本的完整流程及操作方法

《MySQL升级到8.4版本的完整流程及操作方法》本文详细说明了MySQL升级至8.4的完整流程,涵盖升级前准备(备份、兼容性检查)、支持路径(原地、逻辑导出、复制)、关键变更(空间索引、保留关键字... 目录一、升级前准备 (3.1 Before You Begin)二、升级路径 (3.2 Upgrade

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配