IPtables之四:NAT原理和配置
NAT一般情況下分為SNAT,DNAT和PNAT
此篇主要講述的是使用iptables配置NAT,所以這3種NAT的區別和應用場景就簡單的說明一下
SNAT:源地址轉換
目標地址不變,重新改寫源地址,並在本機建立NAT表項,當資料返回時,根據NAT表將目的地址資料改寫為資料傳送出去時候的源地址,併發送給主機
目前大多都是解決內網使用者用同一個公網地址上網的情況
DNAT:目標地址轉換
和SNAT相反,源地址不變,重新修改目標地址,在本機建立NAT表項,當資料返回時,根據NAT表將源地址修改為資料傳送過來時的目標地址,併發給遠端主機
在DNAT的基礎上,可以根據請求資料包的埠做PNAT(埠轉換,也稱為埠對映),可以更句請求資料包不同的埠改寫不同的目標地址,從而傳送給不同的主機
這在用一個公網地址做不同服務時用的比較多,而且相對來說,用NAT的方式可以隱藏後端伺服器的真實地址,更加的安全
在使用iptables實現nat之前,再來回頭說說iptables的基礎原理
在這個模型中,完成nat的實現,資料要經過prerouting—forword--postrouting這3個鏈
分析SNAT的資料流向過程
首先進入prerouting,發現不是本網段的地址,而後開始查詢路由表(查詢路由的過程在prerouting和forword之間),於是經過forword鏈進行轉發,在通過postrouting時進行NAT轉換。
在這個流程中,NAT轉換的步驟在postrouting鏈上實現,之所以不再prerouting上做nat是因為資料包在進來之前,還不知道是本網段地址還是外網地址
再分析DNAT的資料流向過程
在DNAT中,NAT要在prerouting鏈上做。之前提到過,在資料進入主機後,路由選擇過程是在prerouting和forword之間的,所以應該先做地址轉換之後,再進行路由選擇,而後經過forword,最後從postrouting出去
理論說了一堆,接下來用實驗環境來驗證下(用dia畫的圖,比較搓。。。在ubuntu下將就用下了。)
其中pc1是我本機,系統是ubuntu12.04,NAT和PC2是vmware虛擬機器
nat主機網路配置
SNAT
在做nat之前,要先把路由功能開啟,不然資料包連forword都過不了
新增nat表項
[[email protected] ~]# iptables -t nat -A POSTROUTING -s 172.16.93.0/24 -j SNAT --to-source 10.0.0.1
表示在postrouting鏈上,將源地址為172.16.93.0/24網段的資料包的源地址都轉換為10.0.0.1
查看下錶項
驗證效果:
先看下本機的網路配置
新增一條去往10.0.0.0/24網段的靜態路由
[email protected]:~$ sudo route add -net 10.0.0.0/24 gw 172.16.93.129
然後在主機上對vmnet1網段進行抓包
[email protected]:~$ sudo tcpdump -i vmnet1 –v
在主機上ping 10.0.0.2,觀察抓到的包
通過抓包可以發現,去往10.0.0.2的源地址為10.0.0.1,說明nat成功的將源地址改寫
以上是實驗驗證部分
這裡再介紹一個SNAT的常用選項:MASQUERADE
此選項可以用在動態獲取IP地址的主機,常用在家庭adsl撥號上
iptables -t nat -A POSTROUTING -s 172.16.93.0/24 -o eth1 -j MASQUEREADE
在這裡最好使用-o 介面來明確指定從哪個接口出去,MASQUEREADE會呼叫該介面的地址作為源地址出去(不指定介面也可以,不過在主機上有多個IP地址的情況下最好配置一下)
DNAT
對於DNAT就不再做實驗驗證了,和SNAT是差不多的,這裡介紹下常用的幾種用法
在DNAT中,要把規則定義在PREROUTING鏈中
iptables -t nat -A PREROUTING -d 10.0.0.1 -j DNAT –-to-destination 172.16.93.1
此條規則將請求IP為10.0.0.1的資料包轉發到後端172.16.93.1主機上
iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp –-dport 80 -j DNAT –-to-destination 172.16.93.1
此條規則將請求IP為10.0.0.1並且埠為80的資料包轉發到後端的172.16.93.1主機上,通過定義不同的埠,就可以實現PNAT,將同一個IP不同的埠請求轉發到後端不同的主機
iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp –-dport 80 -j DNAT –-to-destination 172.16.93.1:8080
此條規則在上條規則的基礎上,發往後端的資料包的目標埠改為8080,在後端主機的web伺服器上使用8080埠接收訪問, 這樣能更好的保護後端主機
iptables系列NAT部分就寫到這裡,有什麼不明白的可以留言探討。下一篇將會講述使用iptables的7lay實現7層的訪問控制,也就是在第一篇中所說的閘道器代理型防火牆,可以實現控制qq,bt等應用程式的網路訪問
相關推薦
IPtables之四:NAT原理和配置
NAT一般情況下分為SNAT,DNAT和PNAT 此篇主要講述的是使用iptables配置NAT,所以這3種NAT的區別和應用場景就簡單的說明一下 SNAT:源地址轉換 目標地址不變,重新改寫源地址,並在本機建立NAT表項,當資料返回時,根據NAT表將目的地址資料
docker容器自動化部署落地實踐之四:jenkins安裝與配置
接下來安裝我們的jenkins jenkins在這裡起到了一個非常重要的作用 為我們從git上邊拉取工程後做的所有工作 可以為我們把工程一次性部署到多臺伺服器 這裡由於沒有太多機器 筆者就以單機做示範 多機用ssh部署過去就可以了 下載並安裝 wget https:/
【資料結構與演算法】內部排序之四:歸併排序和快速排序(含完整原始碼)
前言 之所以把歸併排序和快速排序放在一起探討,很明顯兩者有一些相似之處:這兩種排序演算法都採用了分治的思想。下面來逐個分析其實現思想。歸併排序實現思想 歸併的含義很明顯就是將兩個或者兩個以上的有序表組合成一個新的有序表。歸併排序中一般所用到的是2-路歸併
初學Python之四:使用list和tuple
list是Python 的內建資料型別,list是一種有序的集合,可以隨時新增和刪除其中的元素。 這裡主要分三部分介紹Python中的list和tuple: 1.Python中list的主要用法。 2.Python中tuple的主要用法
Flask中之數據庫框架和模型類四:再述SQLAlchemy配置和基本操作之增刪改查
模糊 offset odi com app ack 字符 add () from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) #設置連接數據庫的URL
如何安裝和配置打印服務器之四:使用組策略部署打印機
fff shadow 賬號 hat 對話框 除了 c4c alt main 如何安裝和配置打印服務器之四:使用組策略部署打印機 ?Lander Zhang 專註外企按需IT基礎架構運維服務,IT Helpdesk 實戰培訓踐行者http://blog.51cto.com/l
《C#圖解教程》讀書筆記之四:類和繼承
intern html pan 類中訪問 ted obj 小寫 his new 本篇已收錄至《C#圖解教程》讀書筆記目錄貼,點擊訪問該目錄可獲取更多內容。 一、萬物之宗:Object (1)除了特殊的Object類,其他所有類都是派生類,即使他們沒有顯示基類定義。
異步IO實戰之四:異步IO的單個處理和批量處理
c語言 異步io aio_write 異步IO由於它的非阻塞特性和強大的並發能力,非常適合用在要求高並發和高吞吐率的場景,比如用在提供SAN存儲的塊設備讀寫的實現上。和傳統IO模式類似,異步IO提供了一次提交一個IO請求的模式,還提供了一次提交一組IO請求的方式。下面將分別介紹這兩種模式的使用方法
Nginx 之四: Nginx服務器的rewrite、全局變量、重定向和防盜鏈相關功能
war int 服務器驗證 %u 寫日誌 防盜鏈 循環 版本 算法 一:Nginx 後端服務器組的配置: 1、upstream: 用於設置後端服務器組的主要指令,upstream類似於之前的server塊或http塊,用法如下: upstreame Myserve
高可用之KeepAlived(一):基本概念和配置文件分析
leg bold touch event radius chm present ket temp KeepAlived系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 本文目錄:1. 概述2. VRRP協
Spring 基礎教程之四:JavaBean基本配置詳解
一:xml 裝配JavaBean屬性含義: 1.id:指定該Bean 的唯一標識。 2.class:指定該Bean 的全限定名。 3.name:為該Bean 指定一到多個別名。多個別名可以用“,”和“;”分割。
WSUS系列之四:組策略配置
登入AD伺服器,開啟伺服器管理器,點選工具,並選擇組策略管理; 新建一個OU並將需要下發策略的計算機拖至此處,右鍵OU選擇新建GPO並在此處連結; 輸入GPO的名稱,點選確定;
mac:Go安裝和配置+GoLand安裝和使用之完整教程
前言作為一個go語言程式設計師,覺得自己有義務為go新手開一條更簡單便捷的上手之路。縱使網上教程很多,但總不盡人意。go的入門門檻還是非常低的,無論是安裝還是使用。 go安裝go 語言支援以下系統: Linux Mac OS X(也稱為 Darwin) Window FreeBSD 本文將介紹mac下的安
python程式設計入門之四:列表和元組
第四章 列表和元組 4.1 建立一個列表 我們之前學過c語言的同學都知道一個數據型別叫做陣列,但是陣列有一個硬性的要求,就是陣列內的資料型別必須一致,但由於python沒有資料型別,所以python便加入了一個強大的列表,並且幾乎可以向裡注入任何型別的元素。 列
Spring Cloud之Gateway(四):TLS/SSL、配置、跨域訪問配置、執行器API、開發人員指南及MVC或Webflux搭建Gateway
版本:2.0.2.RELEASE 連結:http://spring.io/projects/spring-cloud-gateway#overview 本章主要目錄如下: Spring Cloud GatewayTLS/SSL是什麼? Spring Cloud
【機器學習入門】Andrew NG《Machine Learning》課程筆記之四:分類、邏輯迴歸和過擬合
分類和邏輯迴歸 在實際的生活中,會遇到很多二元分類問題(Binary Classification Problem),比如判斷一封郵件是否是垃圾郵件,攝像頭判斷使用者是男是女和一張圖片裡包含的是貓還是狗等等。 在有監督的分類問題中,通常使用帶標記(Label
常用內部排序演算法之四:簡單選擇排序、直接插入排序和氣泡排序
前言 之所以把這三類演算法放在一塊,是因為除此之外的演算法都是在這三類演算法的基礎上進行優化的。簡單選擇排序的思想是每一趟n−i+1(i=1,2,...,n−1)個記錄中選擇最小的記錄作為有序序列的第i個記錄。直接插入排序的思想是將一個記錄插入到已經排好序的有
MyBatis學習之四:MyBatis配置檔案
在定義sqlSessionFactory時需要指定MyBatis主配置檔案: Xml程式碼 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
Linux SPI匯流排和裝置驅動架構之四:SPI資料傳輸的佇列化
我們知道,SPI資料傳輸可以有兩種方式:同步方式和非同步方式。所謂同步方式是指資料傳輸的發起者必須等待本次傳輸的結束,期間不能做其它事情,用程式碼來解釋就是,呼叫傳輸的函式後,直到資料傳輸完成,函式才會返回。而非同步方式則正好相反,資料傳輸的發起者無需等待傳輸的結束,資料傳
Elasticsearch之四種查詢型別和搜尋原理
Elasticsearch Client傳送搜尋請求,某個索引庫,一般預設是5個分片(shard)。 它返回的時候,由各個分片彙總結果回來。 官網API https://www.elastic.co/guide/en/elasticsea