【計算機網絡】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.pswp.cn/diannao/76984.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76984.shtml
英文地址,請注明出處:http://en.pswp.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…

I2C、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博客