【计算机网络】Linux配置SNAT/DNAT策略

什么是NAT?

NAT 全称是 Network Address Translation(网络地址转换),是一个用来在多个设备共享一个公网 IP上网的技术。

NAT 的核心作用:将一个网络中的私有 IP 地址,转换为公网 IP 地址,从而实现上网功能。

没有NAT的情况:
在这里插入图片描述

环境准备

VMware 创建两台 Linux 虚拟机:

server1:nat-router
  • 作用: NAT 路由器,作为网络地址转换的中介。
  • 网卡配置:
    • ens32:NAT 模式(连接外网)
    • ens33:仅主机模式(与 server2 通信)
[root@nat-router ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32
BOOTPROTO=static
NAME=ens32
DEVICE=ens32
ONBOOT=yes
IPADDR=192.168.100.202
NEKMASK=255.255.255.0
GATEWAY=192.168.100.2
DNS1=223.5.5.5
DNS2=8.8.8.8[root@nat-router ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE=ens33
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.200.253
NETMASK=255.255.255.0
server2:nat-client
  • 作用: NAT 客户端,通过 server1 上网。
  • 网卡配置:
    • ens32:仅主机模式(连接 server1)
[root@nat-client ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32
BOOTPROTO=static
NAME=ens32
DEVICE=ens32
ONBOOT=yes
IPADDR=192.168.200.201
NEKMASK=255.255.255.0
GATEWAY=192.168.200.253
DNS1=223.5.5.5

NAT 实现原理

使用 iptables 实现 NAT 转换

  • iptables 是一个 防火墙工具,用于配置 Linux 内核的网络行为。
  • 本身不做 NAT 转换,它的作用是 告诉内核怎么做

实际执行 NAT 转换的是 Linux 内核

  • 负责对底层网络数据包进行管理、处理与转发。
  • 管理网卡、路由、数据包过滤等功能。
NAT 数据包处理流程:
人(配置命令) -> iptables(设置规则) -> 内核(执行SNAT) -> 网络通信

防火墙(Firewall)概念

  • 作用: 管控进出网络的数据,防止非法访问或数据泄露。
  • Linux 中常见防火墙工具有:
    • iptables(传统,功能强大)
    • firewalld(基于 zone 的新型防火墙,CentOS 7+ 默认)

SNAT配置

server1(NAT 路由器)上配置 SNAT(源地址转换)

# 清除规则
iptables -F
iptables -t nat -F
  • 清除原有的 iptables 规则,避免旧规则干扰。
    • -F:清空 filter 表(默认表)的所有规则。
    • -t nat -F:清空 nat 表的所有规则。
# 开启路由功能
echo 1 > /proc/sys/net/ipv4/ip_forward
  • 启用 IP 转发,使 Linux 内核可以作为路由器转发数据包。
iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o ens32 -j SNAT --to-source 192.168.100.202
  • 设置 SNAT 规则:
    • -t nat:操作 NAT 表。
    • -A POSTROUTING:在数据包离开本机之前改变源地址。
    • -s 192.168.200.0/24:匹配从 nat-client 发来的内网地址段。
    • -o ens32:数据包从哪张网卡出去(外网网卡)。
    • -j SNAT --to-source 192.168.100.202:将源地址改成 server1 外网 IP。
[root@nat-router ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destinationChain INPUT (policy ACCEPT)
target     prot opt source               destinationChain OUTPUT (policy ACCEPT)
target     prot opt source               destinationChain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  192.168.200.0/24     0.0.0.0/0            to:192.168.100.202

nat-client测试网络情况

                             My traceroute  [v0.85]
nat-client (0.0.0.0)                                   Sat Apr  5 22:15:10 2025
Keys:  Help   Display mode   Restart statistics   Order of fields   quitPackets               PingsHost                                Loss%   Snt   Last   Avg  Best  Wrst StDev1. 192.168.200.253                   0.0%     7    0.5   0.5   0.4   0.7   0.02. 192.168.100.2                     0.0%     7    0.5   0.7   0.4   1.3   0.03. ???

可以看到正常转发网络请求
在这里插入图片描述

DNAT 配置

什么是 DNAT?

DNAT(Destination Network Address Translation,目的地址转换)是一种 NAT 技术,用于将 访问公网 IP 的请求转发到内网指定主机

  • 常见于部署在路由器上的 端口映射 功能,比如访问公网 80 端口,就自动转发到内网 Web 服务器的 80 端口。

使用场景

假设你希望让外部主机访问 192.168.100.202:80(server1 公网 IP + 端口),但实际要访问的是 内网的 server2(192.168.200.201)的 Web 服务


开启 DNAT 转发规则

iptables -t nat -A PREROUTING -i ens32 -d 192.168.100.202 -p tcp --dport 80 -j DNAT --to-destination 192.168.200.201
  • -t nat:操作 NAT 表。
  • -A PREROUTING:在数据包进入防火墙(内核处理)前修改其目标地址。
  • -i ens32:从外网接口进来的数据包。
  • -d 192.168.100.202:目的 IP 是 server1 的公网 IP。
  • -p tcp --dport 80:匹配 TCP 协议的 80 端口(Web 请求)。
  • -j DNAT --to-destination 192.168.200.201:将请求转发到内网 server2 的 IP 地址。

开启 IP 转发功能(如果还没启)

echo 1 > /proc/sys/net/ipv4/ip_forward
  • 允许 Linux 内核像路由器一样转发数据包。

查看 DNAT 配置是否生效

iptables -t nat -nL PREROUTING
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  0.0.0.0/0            192.168.100.202       tcp dpt:80 to:192.168.200.201

访问验证

从任意一台外部机器(能访问 server1)访问:

curl http://192.168.100.202

如果 server2(192.168.200.201)运行着 Web 服务,会成功响应!


可选:如果 server2 没有默认网关指向 server1,还需配置 SNAT(返回地址转换)

如果 server2 的返回数据包没有经过 server1,那么客户端可能收不到响应。这时需要配合 SNAT:

iptables -t nat -A POSTROUTING -d 192.168.200.201 -j SNAT --to-source 192.168.200.253
  • 强制 server2 把响应发回 server1,再由 server1 转发出去。

这种 DNAT+SNAT 的搭配也叫 双向 NAT,常用于网络地址“伪装”或负载均衡。


结构图示意:

   ┌─────────────┐│  外部客户端  │└─────┬───────┘↓┌────────────────────┐│   server1 (NAT网关) ││ ens32: 192.168.100.202│ ens33: 192.168.200.253└────────┬───────────┘↓ DNAT转发┌────────────────────┐│  server2 (内网Web) ││ ens32: 192.168.200.201└────────────────────┘

总结:SNAT 与 DNAT 的区别

类型全称修改内容作用方向常用于
SNATSource NAT源 IP 地址出去的包内网访问公网(上网)
DNATDestination NAT目的 IP 地址进入的包公网访问内网服务(端口映射)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis淘汰策略详解!

目录 一、为什么需要淘汰策略? 🤔二、Redis 的淘汰策略详解 👇三、如何选择合适的淘汰策略? 🤔➡️✅四、如何切换 Redis 的淘汰策略? ⚙️🔧五、总结 🎉 🌟我的其他文章…

存储基石:深度解读Linux磁盘管理机制与文件系统实战

Linux系列 文章目录 Linux系列前言一、磁盘1.1 初识磁盘1.2 磁盘的物理结构1.3 磁盘的存储结构1.4 磁盘的逻辑结构 二、文件系统2.1 系统对磁盘的管理2.2 文件在磁盘中的操作 前言 Linux 文件系统是操作系统中用于管理和组织存储设备(如硬盘、SSD、USB 等&#xff…

本节课课堂总结

匿名子类: 说明 和 Java 一样,可以通过包含带有定义或重写的代码块的方式创建一个匿名的子类。 单例对象(伴生对象) Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概念&a…

I²C、SPI、UART、CAN 通信协议详解

一、协议基本特性对比 特性ICSPIUARTCAN通信类型同步、半双工同步、全双工异步、全双工异步、多主多从信号线SDA(数据)、SCL(时钟)MOSI、MISO、SCK、SS(片选)TX(发送)、RX&#xff…

【diffusers 进阶(十五)】dataset 工具,Parquet和Arrow 数据文件格式,load dataset 方法

系列文章目录 【diffusers 极速入门(一)】pipeline 实际调用的是什么? call 方法!【diffusers 极速入门(二)】如何得到扩散去噪的中间结果?Pipeline callbacks 管道回调函数【diffusers极速入门&#xff0…

第十三章:持久化存储_《凤凰架构:构建可靠的大型分布式系统》

第十三章 持久化存储 一、Kubernetes存储设计核心概念 (1)存储抽象模型 PersistentVolume (PV):集群级别的存储资源抽象(如NFS卷/云存储盘)PersistentVolumeClaim (PVC):用户对存储资源的声明请求&#…

以太网安全

前言: 端口隔离可实现同一VLAN内端口之间的隔离。用户只需要将端口加入到隔离组中,就可以实现隔离组内端口之间的二层数据的隔离端口安全是一种在交换机接入层实施的安全机制,旨在通过控制端口的MAC地址学习行为,确保仅授权设备能…

跨域问题前端解决

由于浏览器的同源策略,前后端分离的项目,调试的时候总是会遇到跨域的问题,这里通过修改前端代码解决跨域问题。 首先先查看前端代码的根目录下,有没有vue.config.js文件, 若有,使用方法1,若没有此文件&…

Elasticsearch 报错index_closed_exception

index_closed_exception 是 Elasticsearch 中的一个异常类型,它通常发生在尝试对一个已经被关闭(closed)的索引执行搜索、写入或其他操作时。在 Elasticsearch 中,索引是用来存储和检索数据的逻辑命名空间,可以将其类比…

LearnOpenGL-笔记-其九

今天让我们完结高级OpenGL的部分: Instancing 很多时候,在场景中包含有大量实例的时候,光是调用GPU的绘制函数这个过程都会带来非常大的开销,因此我们需要想办法在每一次调用GPU的绘制函数时尽可能多地绘制,这个过程就…

PDF预览-搜索并高亮文本

在PDF.js中实现搜索高亮功能可以通过自定义一些代码来实现。PDF.js 是一个通用的、基于Web的PDF阅读器,它允许你在网页上嵌入PDF文件,并提供基本的阅读功能。要实现搜索并高亮显示文本,你可以通过以下几个步骤来完成: 1. 引入PDF…

二叉树——队列bfs专题

1.N叉树的层序遍历 我们之前遇到过二叉树的层序遍历,只需要用队列先进先出的特性就可以达到层序遍历的目的。 而这里不是二叉树,也就是说让节点的孩子入队列时不仅仅是左右孩子了,而是它的所有孩子。而我们看这棵多叉树的构造,它…

Python高级爬虫之JS逆向+安卓逆向1.1节-搭建Python开发环境

目录 引言: 1.1.1 为什么要安装Python? 1.1.2 下载Python解释器 1.1.3 安装Python解释器 1.1.4 测试是否安装成功 1.1.5 跟大神学高级爬虫安卓逆向 引言: 大神薯条老师的高级爬虫安卓逆向教程: 这套爬虫教程会系统讲解爬虫的初级&…

Windows 安装和使用 ElasticSearch

SpringBoot3 整合 Elasticsearch 1. ElasticSearch 1.1 ES (1)ES 是一个开源的分布式搜索和分析引擎,专为处理大模型数据而设计,它能够实现近乎实时的数据检索、分析和可视化,广泛用于全文搜索、日志分析和监控&…

matplotlib初探

库引入 import matplotlib.pyplot as pltpyplot.figure 创建新图形或激活现有图形

NVM 多版本Node.js 管理全指南(Windows系统)

🧑 博主简介:CSDN博客专家、全栈领域优质创作者、高级开发工程师、高级信息系统项目管理师、系统架构师,数学与应用数学专业,10年以上多种混合语言开发经验,从事DICOM医学影像开发领域多年,熟悉DICOM协议及…

实验室预约|实验室预约小程序|基于Java+vue微信小程序的实验室预约管理系统设计与实现(源码+数据库+文档)

实验室预约小程序 目录 基于微信小程序的实验室预约管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 (1)管理员登录 (2)实验室管理 (3)公告信息管理…

SpringBoot底层-数据源自动配置类

SpringBoot默认使用Hikari连接池,当我们想要切换成Druid连接池,底层原理是怎样呢 SpringBoot默认连接池——Hikari 在spring-boot-autoconfiguration包内有一个DataSourceConfiguraion配置类 abstract class DataSourceConfiguration {Configuration(p…

面试算法高频03-递归

认识递归 递归的概念与特性:递归本质类似循环,是通过函数体进行的循环操作。借助电影《盗梦空间》类比,递归如同主角在不同梦境层穿梭,向下进入不同递归层,向上能回到原来一层,每一层环境和周围元素相似&a…

linux Gitkraken 破解

ubuntu 安装 Gitkraken 9.x Pro 版本_gitcracken.git-CSDN博客