iptables詳解(13):iptables動做總結之二

概述

閱讀這篇文章須要站在前文的基礎上,若是你在閱讀時遇到障礙,請參考以前的文章。web

 

前文中,咱們已經瞭解了以下動做數據庫

ACCEPT、DROP、REJECT、LOGwindows

今天,咱們來認識幾個新動做,它們是:centos

SNAT、DNAT、MASQUERADE、REDIRECT服務器

 

在認識它們以前,咱們先來聊聊NAT,若是你對NAT的相關概念已經倒背如流,能夠跳過以下場景描述。網絡

 

NAT是Network Address Translation的縮寫,譯爲"網絡地址轉換",NAT說白了就是修改報文的IP地址,NAT功能一般會被集成到路由器、防火牆、或獨立的NAT設備中。tcp

爲何要修改報文的IP地址呢?咱們來描述一些場景,便可知道爲何有這方面的需求了。編輯器

 

場景1:

假設,網絡內部有10臺主機,它們有各自的IP地址,當網絡內部的主機與其餘網絡中的主機通信時,則會暴露本身的IP地址,若是咱們想要隱藏這些主機的IP地址,該怎麼辦呢?能夠這樣辦,以下。測試

當網絡內部的主機向網絡外部主機發送報文時,報文會通過防火牆或路由器,當報文通過防火牆或路由器時,將報文的源IP修改成防火牆或者路由器的IP地址,當其餘網絡中的主機收到這些報文時,顯示的源IP地址則是路由器或者防火牆的,而不是那10臺主機的IP地址,這樣,就起到隱藏網絡內部主機IP的做用,當網絡內部主機的報文通過路由器時,路由器會維護一張NAT表,表中記錄了報文來自於哪一個內部主機的哪一個進程(內部主機IP+端口),當報文通過路由器時,路由器會將報文的內部主機源IP替換爲路由器的IP地址,把源端口也映射爲某個端口,NAT表會把這種對應關係記錄下來。centos7

示意圖以下:

iptables詳解(13):iptables動做總結之二

 

因而,外部主機收到報文時,源IP與源端口顯示的都是路由的IP與端口,當外部網絡中的主機進行迴應時,外部主機將響應報文發送給路由器,路由器根據剛纔NAT表中的映射記錄,將響應報文中的目標IP與目標端口再改成內部主機的IP與端口號,而後再將響應報文發送給內部網絡中的主機。整個過程當中,外部主機都不知道內部主機的IP地址,內部主機還能與外部主機通信,因而起到了隱藏網絡內主機IP的做用。

上述整個過程當中,就用到了NAT功能,準確的說是用到了NAPT功能,NAPT是NAT的一種,全稱爲Network Address Port Translation,說白了就是映射報文IP地址的同時還會映射其端口號,就像剛纔描述的過程同樣。

剛纔描述的過程當中,"IP地址的轉換"一共發生了兩次。

內部網絡的報文發送出去時,報文的源IP會被修改,也就是源地址轉換:Source Network Address Translation,縮寫爲SNAT。

外部網絡的報文響應時,響應報文的目標IP會再次被修改,也就是目標地址轉換:Destinationnetwork address translation,縮寫爲DNAT。

可是,上述"整個過程"被稱爲SNAT,由於"整個過程"的前半段使用了SNAT,若是上述"整個過程"的前半段使用了DNAT,則整個過程被稱爲DNAT,也就是說,整個過程被稱爲SNAT仍是DNAT,取決於整個過程的前半段使用了SNAT仍是DNAT。

 

其實剛纔描述的場景不只僅可以隱藏網絡內部主機的IP地址,還可以讓局域網內的主機共享公網IP,讓使用私網IP的主機可以訪問互聯網。

好比,整個公司只有一個公網IP,可是整個公司有10臺電腦,咱們怎樣能讓這10臺電腦都訪問互聯網呢?咱們能夠爲這10臺電腦都配置上各自的私網IP,好比"192.168"這種私網IP,可是互聯網是不會路由私網IP的,若是想要訪問互聯網,則必須使用公網IP,那麼,咱們就須要想辦法,能讓這10臺主機共享公司僅有的一個公網IP,沒錯,這與剛纔描述的場景其實徹底一致,咱們只要在路由器上配置公網IP,在私網主機訪問公網服務時,報文通過路由器,路由器將報文中的私網IP與端口號進行修改和映射,將其映射爲公網IP與端口號,這時,內網主機便可共享公網IP訪問互聯網上的服務了,NAT表示意圖以下

iptables詳解(13):iptables動做總結之二

綜上所述,SNAT不只可以隱藏網內的主機IP,還可以共享公網IP,這在IPV4地址較爲緊張的今天,是很是有用的。

 

 

場景2:

場景1中,咱們描述的過程爲SNAT的過程,雖然其過程當中也牽扯到DNAT,可是因爲整個過程的前半段使用了SNAT,因此整個過程稱之爲SNAT,那麼在什麼狀況下,整個過程能稱之爲DNAT呢?

沒錯,當整個過程的前半段使用了DNAT時,整個過程被稱爲DNAT,具體場景以下。

公司有本身的局域網,網絡中有兩臺主機做爲服務器,主機1提供web服務,主機2提供數據庫服務,可是這兩臺服務器在局域網中使用私有IP地址,只能被局域網內的主機訪問,互聯網沒法訪問到這兩臺服務器,整個公司只有一個可用的公網IP,怎樣經過這個公網IP訪問到內網中的這些服務呢?咱們能夠將這個公網IP配置到公司的某臺主機或路由器上,而後對外宣稱,這個IP地址對外提供web服務與數據庫服務,因而互聯網主機將請求報文發送給這公網 IP地址,也就是說,此時報文中的目標IP爲公網IP,當路由器收到報文後,將報文的目標地址改成對應的私網地址,好比,若是報文的目標IP與端口號爲:公網IP+3306,咱們就將報文的目標地址與端口改成:主機2的私網IP+3306,同理,公網IP+80端口映射爲主機1的私網IP+80端口,當私網中的主機迴應對應請求報文時,再將回應報文的源地址從私網IP+端口號映射爲公網IP+端口號,再由路由器或公網主機發送給互聯網中的主機。

上述過程也牽扯到DNAT與SNAT,可是因爲整個過程的前半段使用了DNAT,因此上述過程被稱爲DNAT

 

其實,無論是SNAT仍是DNAT,都起到了隱藏內部主機IP的做用。

 

實驗環境準備

好了,咱們已經瞭解了SNAT與DNAT的相關概念,那麼如今,咱們能夠動動手了,首先,準備一下實驗環境

大體的實驗環境是這樣的,公司局域網使用的網段爲10.1.0.0/16,目前公司只有一個公網IP,局域網內的主機須要共享這個IP與互聯網上的主機進行通信。

因爲咱們沒有真正的公網IP,因此,咱們使用私網IP:192.168.1.146模擬所謂的公網IP,示意圖以下

iptables詳解(13):iptables動做總結之二

 

如上述示意圖所示,實驗使用4臺虛擬機,A、B、C、D

主機A:扮演公網主機,嘗試訪問公司提供的服務,IP地址爲192.168.1.147

主機B:扮演了擁有NAT功能的防火牆或路由器,充當網關,而且負責NAT,公網、私網通信的報文經過B主機時,報文會被NAT

主機C:扮演內網web服務器

主機D:扮演內網windows主機

上圖中圓形所示的邏輯區域表示公司內網,網段爲10.1.0.0/16,主機B、C、D都屬於內網主機,主機B比較特殊,同時扮演了網關與防火牆,主機B持有公司惟一的公網IP(咱們用了一個假的公網IP),局域網內主機若是想與公網主機通信,須要共享此公網IP,由B主機進行NAT,因此,咱們爲主機B準備了兩塊網卡,公網IP與私網IP分別配置到這兩塊網卡中,同時,在虛擬機中設置了一個"僅主機模式"的虛擬網絡,以模擬公司局域網。

 

聰明如你,應該已經發現了,上述實驗環境與以前描述的"網絡防火牆"的實驗環境相差無幾,只不過以前的環境並無公網,私網的概念,而此刻,圓形邏輯區域以內爲私網,圓形邏輯區域以外爲公網。

 

環境具體準備過程以下

首先,建立一個虛擬網絡,模擬公司內網。

點擊vmware虛擬機的編輯菜單,打開"虛擬網絡編輯器",點擊更改設置,添加"僅主機模式"的虛擬網絡,下圖中的VMnet6爲已經添加過的虛擬網絡,此處再也不重複操做。

iptables詳解(13):iptables動做總結之二

 

 

主機C與主機D的網關都指向主機B的私網IP,以下圖所示

iptables詳解(13):iptables動做總結之二

 

 

iptables詳解(13):iptables動做總結之二

 

主機B有兩塊網卡,分別配置了私網IP與公網IP,私網IP爲10.1.0.3,私網IP所在的網卡也存在於vmnet6中,模擬公網的IP爲192.168.1.146,B主機的公網IP所在的網卡與A主機都使用橋接模式的虛擬網絡,因此,B主機既能與私網主機通信,也能與公網主機通信。

iptables詳解(13):iptables動做總結之二

 

因爲B主機此時須要負責對報文的修改與轉發,因此,須要開啓B主機中的核心轉發功能,Linux主機默認不會開啓核心轉發,這在前文中已經詳細的描述過,此處再也不贅述,若是你還不明白爲何,請回顧前文,使用臨時生效的方法開啓B主機的核心轉發功能,以下圖所示。

iptables詳解(13):iptables動做總結之二 

 

A主機的IP地址以下,能夠與B主機進行通信,可是不能與C、D進行通信,由於此刻,A是公網主機,B既是公網主機又是私網主機,C、D是私網的主機,A是不可能訪問到C和D的。

iptables詳解(13):iptables動做總結之二

 

 

爲了可以更好的區分公網服務與私網服務,咱們分別在主機A與主機C上啓動httpd服務,以下圖所示。

iptables詳解(13):iptables動做總結之二

 

 

好了,實驗環境準備完畢,咱們來一塊兒動動手,實際操做一下。

 

動做:SNAT

在文章開頭的場景中,咱們已經描述過,網絡內部的主機能夠藉助SNAT隱藏本身的IP地址,同時還可以共享合法的公網IP,讓局域網內的多臺主機共享公網IP訪問互聯網。

而此時的主機B就扮演了擁有NAT功能的設備,咱們使用iptables的SNAT動做達到剛纔所說的目的。

鏈接到B主機,添加以下規則。

iptables詳解(13):iptables動做總結之二

 

如上圖所示,上圖中的規則表示未來自於10.1.0.0/16網段的報文的源地址改成公司的公網IP地址。

"-t nat"表示操做nat表,咱們以前一直在灌輸一個概念,就是不一樣的表有不一樣的功能,filter表的功能是過濾,nat表的功能就是地址轉換,因此咱們須要在nat表中定義nat規則。

"-A POSTROUTING"表示將SNAT規則添加到POSTROUTING鏈的末尾,在centos7中,SNAT規則只能存在於POSTROUTING鏈與INPUT鏈中,在centos6中,SNAT規則只能存在於POSTROUTING鏈中。

你可能會問,爲何SNAT規則必須定義在POSTROUTING鏈中,咱們能夠這樣認爲,POSTROUTING鏈是iptables中報文發出的最後一個"關卡",咱們應該在報文立刻發出以前,修改報文的源地址,不然就再也沒有機會修改報文的源地址了,在centos7中,SNAT規則也能夠定義在INPUT鏈中,咱們能夠這樣理解,發往本機的報文通過INPUT鏈之後報文就到達了本機,若是再不修改報文的源地址,就沒有機會修改了。

"-s 10.1.0.0/16"表示報文來自於10.1.0.0/16網段,前文中一直在使用這個匹配條件,我想此處應該不用贅述了。

"-j SNAT"表示使用SNAT動做,對匹配到的報文進行處理,對匹配到的報文進行源地址轉換。

"--to-source 192.168.1.146"表示將匹配到的報文的源IP修改成192.168.1.146,前文中,咱們已經總結過,某些動做會有本身的選項,"--to-source"就是SNAT動做的經常使用選項,用於指定SNAT須要將報文的源IP修改成哪一個IP地址。

 

好了,只要站在前文的基礎上,理解上述語句應該是分分鐘的事情,聰明如你應該已經學會了,那麼咱們來測試一下。

目前來講,咱們只配置了一條SNAT規則,並無設置任何DNAT,如今,咱們從內網主機上ping外網主機,看看能不能ping通,登陸內網主機C,在C主機上向A主機的外網IP發送評請求(假外網IP),示例以下

 

iptables詳解(13):iptables動做總結之二

如上圖所示,"內網主機"已經能夠依靠SNAT訪問"互聯網"了。

 

爲了更加清晰的理解整個SNAT過程,在C主機上抓包看看,查看一下請求報文與響應報文的IP地址,以下,在C主機上同時打開兩個命令窗口,一個命令窗口中向A主機發送ping請求,另外一個窗口中,使用tcpdump命令對指定的網卡進行抓包,抓取icmp協議的包。

iptables詳解(13):iptables動做總結之二

 

從上圖能夠看到,10.1.0.1發出ping包,192.168.1.147進行迴應,正是A主機的IP地址(用於模擬公網IP的IP地址)

看來,只是用於配置SNAT的話,咱們並不用 手動的進行DNAT設置,iptables會自動維護NAT表,並將響應報文的目標地址轉換回來。

 

那麼,咱們去A主機上再次重複一遍剛纔的操做,在A主機上抓包看看,以下圖所示,C主機上繼續向A主機的公網IP發送ping請求,在主機A的網卡上抓包看看。

iptables詳解(13):iptables動做總結之二

 

從上圖能夠看出,C主機向A主機發起ping請求時獲得了迴應,可是在A主機上,並不知道是C主機發來的ping請求,A主機覺得是B主機發來的ping請求,從抓包的信息來看,A主機覺得B主機經過公網IP:192.168.1.146向本身發起了ping請求,而A主機也將響應報文迴應給了B主機,因此,整個過程,A主機都不知道C主機的存在,都覺得是B主機在向本身發送請求,即便不是在公網私網的場景中,咱們也可以使用這種方法,隱藏網絡內的主機,只不過此處,咱們所描述的環境就是私網主機共享公網IP訪問互聯網,那麼能夠看到,私網中的主機已經共享了192.168.1.146這個"僞公網IP",那麼真的共享了嗎?咱們使用內網主機D試試,主機D是一臺windows虛擬機,咱們使用它向主機A發送ping請求,看看能不能ping通。以下

iptables詳解(13):iptables動做總結之二

 

windows主機也ping通了外網主機,在A主機上抓包,看到的仍然是B主機的IP地址。

iptables詳解(13):iptables動做總結之二

 

那麼,C主機與D主機可以訪問外網服務嗎?咱們來看看。

在C主機上訪問A主機的web服務,以下圖所示,訪問正常。

iptables詳解(13):iptables動做總結之二

 

 

同理,在windows主機中訪問A主機的web服務,以下圖所示,訪問正常。

iptables詳解(13):iptables動做總結之二

 

 

好了,源地址轉換,已經完成了,咱們只依靠了一條iptables規則,就可以是內網主機可以共享公網IP訪問互聯網了。

 

動做DNAT

公司只有一個公網IP,可是公司的內網中卻有不少服務器提供各類服務,咱們想要經過公網訪問這些服務,改怎麼辦呢?

沒錯,使用DNAT便可,咱們對外宣稱,公司的公網IP上既提供了web服務,也提供了windows遠程桌面,無論是訪問web服務仍是遠程桌面,只要訪問這個公網IP就好了,咱們利用DNAT,將公網客戶端發送過來的報文的目標地址與端口號作了映射,將訪問web服務的報文轉發到了內網中的C主機中,將訪問遠程桌面的報文轉發到了內網中的D主機中。

好了,理論說完了,來動手實踐一下。

 

若是咱們想要實現剛纔描述的場景,則須要在B主機中進行以下配置。

iptables詳解(13):iptables動做總結之二

 

如上圖所示,咱們先將nat表中的規則清空了,從頭來過,清空nat表規則後,定義了一條DNAT規則。

"-t nat -I PREROUTING"表示在nat表中的PREROUTING鏈中配置DNAT規則,DNAT規則只配置在PREROUTING鏈與OUTPUT鏈中,爲何DNAT規則只能存在與這兩個鏈中呢?咱們知道,PREROUTING鏈處於路由層面以前,若是咱們不在PRERTOURING鏈中修改目標地址,當報文到達路由層面時,路由就會根據目標地址發送報文,因此,咱們應該在報文到達路由層面以前就修改報文的目標地址,因此,咱們應該在PREROUTING鏈或OUTPUT鏈中定義DNAT規則。

"-d 192.168.1.146 -p tcp --dport 3389"表示報文的目標地址爲公司的公網IP地址,目標端口爲tcp的3389號端口,而咱們知道,windows遠程桌面使用的默認端口號就是3389,當外部主機訪問公司公網IP的3389號端口時,報文則符合匹配條件。

"-j DNAT --to-destination 10.1.0.6:3389"表示將符合條件的報文進行DNAT,也就是目標地址轉換,將符合條件的報文的目標地址與目標端口修改成10.1.0.6:3389,"--to-destination"就是動做DNAT的經常使用選項。

那麼綜上所述,上圖中定義的規則的含義爲,當外網主機訪問公司公網IP的3389時,其報文的目標地址與端口將會被映射到10.1.0.6:3389上。

 

好了,DNAT規則定義完了,如今可以直接使用外網主機訪問私網中的服務了嗎?

理論上只要完成上述DNAT配置規則便可,可是在測試時,只配置DNAT規則後,並不能正常DNAT,通過測試發現,將相應的SNAT規則同時配置後,便可正常DNAT,因而咱們又配置了SNAT

示例以下。

 

iptables詳解(13):iptables動做總結之二

注:理論上只配置DNAT規則便可,可是若是在測試時沒法正常DNAT,能夠嘗試配置對應的SNAT,此處按照配置SNAT的流程進行。

沒錯,與剛纔定義SNAT時使用的規則徹底同樣。

 

好了,完成上述配置後,咱們則能夠經過B主機的公網IP,鏈接D主機(windows主機)的遠程桌面了,示例以下。

找到公網中的一臺windows主機,打開遠程程序

iptables詳解(13):iptables動做總結之二

 

 

輸入公司的公網IP,點擊鏈接按鈕

注意:沒有指定端口的狀況下,默認使用3389端口進行鏈接,同時,爲了確保可以鏈接到windows虛擬主機,請將windows虛擬主機設置爲容許遠程鏈接。

iptables詳解(13):iptables動做總結之二

 

 

輸入遠程鏈接用戶的密碼之後,便可鏈接到windows主機

iptables詳解(13):iptables動做總結之二

 

鏈接之後,遠程鏈接程序顯示咱們鏈接到了公司的公網IP,可是當咱們查看IP地址時,發現被遠程機器的IP地址實際上是公司私網中的D主機的IP地址。

上圖證實,咱們已經成功的經過公網IP訪問到了內網中的服務。

 

同理,使用相似的方法,咱們也可以在外網中訪問到C主機提供的web服務。

示例以下。

 

iptables詳解(13):iptables動做總結之二

如上圖所示,咱們將公司公網IP的801號端口映射到了公司內網中C主機的80端口,因此,當外網主機訪問公司公網IP的801端口時,報文將會發送到C主機的80端口上。

此次,咱們不用再次定義SNAT規則了,由於以前已經定義過SNAT規則,上次定義的SNAT規則只要定義一次就行,而DNAT規則則須要根據實際的狀況去定義。

 

好了,完成上述DNAT映射後,咱們在A主機上訪問B主機的801端口試試,以下

iptables詳解(13):iptables動做總結之二

 

能夠看到,咱們訪問的是B主機的公網IP,可是返回結果顯示的倒是C主機提供的服務內容,證實DNAT已經成功。

 

而上述過程當中,外網主機A訪問的始終都是公司的公網IP,可是提供服務的倒是內網主機,可是咱們能夠對外宣稱,公網IP上提供了某些服務,快來訪問吧!

我以爲我說明白了,你聽明白了嗎?

 

動做MASQUERADE

上文中,咱們已經描述了SNAT,也就是源地址轉換,那麼咱們如今來認識一個與SNAT相似的動做:MASQUERADE

當咱們撥號網上時,每次分配的IP地址每每不一樣,不會長期分給咱們一個固定的IP地址,若是這時,咱們想要讓內網主機共享公網IP上網,就會很麻煩,由於每次IP地址發生變化之後,咱們都要從新配置SNAT規則,這樣顯示不是很人性化,咱們經過MASQUERADE便可解決這個問題,MASQUERADE會動態的將源地址轉換爲可用的IP地址,其實與SNAT實現的功能徹底一致,都是修改源地址,只不過SNAT須要指明將報文的源地址改成哪一個IP,而MASQUERADE則不用指定明確的IP,會動態的將報文的源地址修改成指定網卡上可用的IP地址,示例以下:

iptables詳解(13):iptables動做總結之二

 

如上圖所示,咱們指定,經過外網網卡出去的報文在通過POSTROUTING鏈時,會自動將報文的源地址修改成外網網卡上可用的IP地址,這時,即便外網網卡中的公網IP地址發生了改變,也可以正常的、動態的將內部主機的報文的源IP映射爲對應的公網IP。

 

能夠把MASQUERADE理解爲動態的、自動化的SNAT,若是沒有動態SNAT的需求,沒有必要使用MASQUERADE,由於SNAT更加高效。

 

動做REDIRECT

使用REDIRECT動做能夠在本機上進行端口映射

好比,將本機的80端口映射到本機的8080端口上

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

通過上述規則映射後,當別的機器訪問本機的80端口時,報文會被重定向到本機的8080端口上。

REDIRECT規則只能定義在PREROUTING鏈或者OUTPUT鏈中。

 

小結

爲了方便之後回顧,咱們對上述命令進行總結。

 

若是想要NAT功能可以正常使用,須要開啓Linux主機的核心轉發功能。

 

 

SNAT相關操做

配置SNAT,能夠隱藏網內主機的IP地址,也能夠共享公網IP,訪問互聯網,若是隻是共享IP的話,只配置以下SNAT規則便可。

 

 

若是公網IP是動態獲取的,不是固定的,則可使用MASQUERADE進行動態的SNAT操做,以下命令表示將10.1網段的報文的源IP修改成eth0網卡中可用的地址。

 

 

DNAT相關操做

配置DNAT,能夠經過公網IP訪問局域網內的服務。

注:理論上來講,只要配置DNAT規則,不須要對應的SNAT規則便可達到DNAT效果。

可是在測試DNAT時,對應SNAT規則也須要配置,才能正常DNAT,能夠先嚐試只配置DNAT規則,若是沒法正常DNAT,再嘗試添加對應的SNAT規則,SNAT規則配置一條便可,DNAT規則須要根據實際狀況配置不一樣的DNAT規則。

 

 

在本機進行目標端口映射時可使用REDIRECT動做。

 

配置完成上述規則後,其餘機器訪問本機的80端口時,會被映射到8080端口。

 

好了,這篇文章就總結到這裏,但願能對你有所幫助~~~~~

相關文章
相關標籤/搜索