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

相关文章

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

使用JavaConfig配置Spring的流程步骤

《使用JavaConfig配置Spring的流程步骤》JavaConfig是Spring框架提供的一种基于Java的配置方式,它通过使用@Configuration注解标记的类来替代传统的XML配置文... 目录一、什么是 JavaConfig?1. 核心注解2. 与 XML 配置的对比二、JavaConf

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

springboot filter实现请求响应全链路拦截

《springbootfilter实现请求响应全链路拦截》这篇文章主要为大家详细介绍了SpringBoot如何结合Filter同时拦截请求和响应,从而实现​​日志采集自动化,感兴趣的小伙伴可以跟随小... 目录一、为什么你需要这个过滤器?​​​二、核心实现:一个Filter搞定双向数据流​​​​三、完整代码

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

在VSCode中本地运行DeepSeek的流程步骤

《在VSCode中本地运行DeepSeek的流程步骤》本文详细介绍了如何在本地VSCode中安装和配置Ollama和CodeGPT,以使用DeepSeek进行AI编码辅助,无需依赖云服务,需要的朋友可... 目录步骤 1:在 VSCode 中安装 Ollama 和 CodeGPT安装Ollama下载Olla

linux环境openssl、openssh升级流程

《linux环境openssl、openssh升级流程》该文章详细介绍了在Ubuntu22.04系统上升级OpenSSL和OpenSSH的方法,首先,升级OpenSSL的步骤包括下载最新版本、安装编译... 目录一.升级openssl1.官网下载最新版openssl2.安装编译环境3.下载后解压安装4.备份