iptables详解(13):iptables动作总结之二
所屬分類(lèi):IPtables??Linux基礎(chǔ)
在本博客中,從理論到實(shí)踐,系統(tǒng)的介紹了iptables,如果你想要從頭開(kāi)始了解iptables,可以查看iptables文章列表,直達(dá)鏈接如下
iptables零基礎(chǔ)快速入門(mén)系列
?
概述
閱讀這篇文章需要站在前文的基礎(chǔ)上,如果你在閱讀時(shí)遇到障礙,請(qǐng)參考之前的文章。
前文中,我們已經(jīng)了解了如下動(dòng)作
ACCEPT、DROP、REJECT、LOG
今天,我們來(lái)認(rèn)識(shí)幾個(gè)新動(dòng)作,它們是:
SNAT、DNAT、MASQUERADE、REDIRECT
在認(rèn)識(shí)它們之前,我們先來(lái)聊聊NAT,如果你對(duì)NAT的相關(guān)概念已經(jīng)滾瓜爛熟,可以跳過(guò)如下場(chǎng)景描述。
NAT是Network Address Translation的縮寫(xiě),譯為"網(wǎng)絡(luò)地址轉(zhuǎn)換",NAT說(shuō)白了就是修改報(bào)文的IP地址,NAT功能通常會(huì)被集成到路由器、防火墻、或獨(dú)立的NAT設(shè)備中。
為什么要修改報(bào)文的IP地址呢?我們來(lái)描述一些場(chǎng)景,即可知道為什么有這方面的需求了。
?
場(chǎng)景1:
假設(shè),網(wǎng)絡(luò)內(nèi)部有10臺(tái)主機(jī),它們有各自的IP地址,當(dāng)網(wǎng)絡(luò)內(nèi)部的主機(jī)與其他網(wǎng)絡(luò)中的主機(jī)通訊時(shí),則會(huì)暴露自己的IP地址,如果我們想要隱藏這些主機(jī)的IP地址,該怎么辦呢?可以這樣辦,如下。
當(dāng)網(wǎng)絡(luò)內(nèi)部的主機(jī)向網(wǎng)絡(luò)外部主機(jī)發(fā)送報(bào)文時(shí),報(bào)文會(huì)經(jīng)過(guò)防火墻或路由器,當(dāng)報(bào)文經(jīng)過(guò)防火墻或路由器時(shí),將報(bào)文的源IP修改為防火墻或者路由器的IP地址,當(dāng)其他網(wǎng)絡(luò)中的主機(jī)收到這些報(bào)文時(shí),顯示的源IP地址則是路由器或者防火墻的,而不是那10臺(tái)主機(jī)的IP地址,這樣,就起到隱藏網(wǎng)絡(luò)內(nèi)部主機(jī)IP的作用,當(dāng)網(wǎng)絡(luò)內(nèi)部主機(jī)的報(bào)文經(jīng)過(guò)路由器時(shí),路由器會(huì)維護(hù)一張NAT表,表中記錄了報(bào)文來(lái)自于哪個(gè)內(nèi)部主機(jī)的哪個(gè)進(jìn)程(內(nèi)部主機(jī)IP+端口),當(dāng)報(bào)文經(jīng)過(guò)路由器時(shí),路由器會(huì)將報(bào)文的內(nèi)部主機(jī)源IP替換為路由器的IP地址,把源端口也映射為某個(gè)端口,NAT表會(huì)把這種對(duì)應(yīng)關(guān)系記錄下來(lái)。
示意圖如下:
?
于是,外部主機(jī)收到報(bào)文時(shí),源IP與源端口顯示的都是路由的IP與端口,當(dāng)外部網(wǎng)絡(luò)中的主機(jī)進(jìn)行回應(yīng)時(shí),外部主機(jī)將響應(yīng)報(bào)文發(fā)送給路由器,路由器根據(jù)剛才NAT表中的映射記錄,將響應(yīng)報(bào)文中的目標(biāo)IP與目標(biāo)端口再改為內(nèi)部主機(jī)的IP與端口號(hào),然后再將響應(yīng)報(bào)文發(fā)送給內(nèi)部網(wǎng)絡(luò)中的主機(jī)。整個(gè)過(guò)程中,外部主機(jī)都不知道內(nèi)部主機(jī)的IP地址,內(nèi)部主機(jī)還能與外部主機(jī)通訊,于是起到了隱藏網(wǎng)絡(luò)內(nèi)主機(jī)IP的作用。
上述整個(gè)過(guò)程中,就用到了NAT功能,準(zhǔn)確的說(shuō)是用到了NAPT功能,NAPT是NAT的一種,全稱(chēng)為Network Address Port Translation,說(shuō)白了就是映射報(bào)文IP地址的同時(shí)還會(huì)映射其端口號(hào),就像剛才描述的過(guò)程一樣。
剛才描述的過(guò)程中,"IP地址的轉(zhuǎn)換"一共發(fā)生了兩次。
內(nèi)部網(wǎng)絡(luò)的報(bào)文發(fā)送出去時(shí),報(bào)文的源IP會(huì)被修改,也就是源地址轉(zhuǎn)換:Source Network Address Translation,縮寫(xiě)為SNAT。
外部網(wǎng)絡(luò)的報(bào)文響應(yīng)時(shí),響應(yīng)報(bào)文的目標(biāo)IP會(huì)再次被修改,也就是目標(biāo)地址轉(zhuǎn)換:Destinationnetwork?address?translation,縮寫(xiě)為DNAT。
但是,上述"整個(gè)過(guò)程"被稱(chēng)為SNAT,因?yàn)?/span>"整個(gè)過(guò)程"的前半段使用了SNAT,如果上述"整個(gè)過(guò)程"的前半段使用了DNAT,則整個(gè)過(guò)程被稱(chēng)為DNAT,也就是說(shuō),整個(gè)過(guò)程被稱(chēng)為SNAT還是DNAT,取決于整個(gè)過(guò)程的前半段使用了SNAT還是DNAT。
其實(shí)剛才描述的場(chǎng)景不僅僅能夠隱藏網(wǎng)絡(luò)內(nèi)部主機(jī)的IP地址,還能夠讓局域網(wǎng)內(nèi)的主機(jī)共享公網(wǎng)IP,讓使用私網(wǎng)IP的主機(jī)能夠訪問(wèn)互聯(lián)網(wǎng)。
比如,整個(gè)公司只有一個(gè)公網(wǎng)IP,但是整個(gè)公司有10臺(tái)電腦,我們?cè)鯓幽茏屵@10臺(tái)電腦都訪問(wèn)互聯(lián)網(wǎng)呢?我們可以為這10臺(tái)電腦都配置上各自的私網(wǎng)IP,比如"192.168"這種私網(wǎng)IP,但是互聯(lián)網(wǎng)是不會(huì)路由私網(wǎng)IP的,如果想要訪問(wèn)互聯(lián)網(wǎng),則必須使用公網(wǎng)IP,那么,我們就需要想辦法,能讓這10臺(tái)主機(jī)共享公司僅有的一個(gè)公網(wǎng)IP,沒(méi)錯(cuò),這與剛才描述的場(chǎng)景其實(shí)完全一致,我們只要在路由器上配置公網(wǎng)IP,在私網(wǎng)主機(jī)訪問(wèn)公網(wǎng)服務(wù)時(shí),報(bào)文經(jīng)過(guò)路由器,路由器將報(bào)文中的私網(wǎng)IP與端口號(hào)進(jìn)行修改和映射,將其映射為公網(wǎng)IP與端口號(hào),這時(shí),內(nèi)網(wǎng)主機(jī)即可共享公網(wǎng)IP訪問(wèn)互聯(lián)網(wǎng)上的服務(wù)了,NAT表示意圖如下
?
綜上所述,SNAT不僅能夠隱藏網(wǎng)內(nèi)的主機(jī)IP,還能夠共享公網(wǎng)IP,這在IPV4地址較為緊張的今天,是非常有用的。
場(chǎng)景2:
場(chǎng)景1中,我們描述的過(guò)程為SNAT的過(guò)程,雖然其過(guò)程中也牽扯到DNAT,但是由于整個(gè)過(guò)程的前半段使用了SNAT,所以整個(gè)過(guò)程稱(chēng)之為SNAT,那么在什么情況下,整個(gè)過(guò)程能稱(chēng)之為DNAT呢?
沒(méi)錯(cuò),當(dāng)整個(gè)過(guò)程的前半段使用了DNAT時(shí),整個(gè)過(guò)程被稱(chēng)為DNAT,具體場(chǎng)景如下。
公司有自己的局域網(wǎng),網(wǎng)絡(luò)中有兩臺(tái)主機(jī)作為服務(wù)器,主機(jī)1提供web服務(wù),主機(jī)2提供數(shù)據(jù)庫(kù)服務(wù),但是這兩臺(tái)服務(wù)器在局域網(wǎng)中使用私有IP地址,只能被局域網(wǎng)內(nèi)的主機(jī)訪問(wèn),互聯(lián)網(wǎng)無(wú)法訪問(wèn)到這兩臺(tái)服務(wù)器,整個(gè)公司只有一個(gè)可用的公網(wǎng)IP,怎樣通過(guò)這個(gè)公網(wǎng)IP訪問(wèn)到內(nèi)網(wǎng)中的這些服務(wù)呢?我們可以將這個(gè)公網(wǎng)IP配置到公司的某臺(tái)主機(jī)或路由器上,然后對(duì)外宣稱(chēng),這個(gè)IP地址對(duì)外提供web服務(wù)與數(shù)據(jù)庫(kù)服務(wù),于是互聯(lián)網(wǎng)主機(jī)將請(qǐng)求報(bào)文發(fā)送給這公網(wǎng) IP地址,也就是說(shuō),此時(shí)報(bào)文中的目標(biāo)IP為公網(wǎng)IP,當(dāng)路由器收到報(bào)文后,將報(bào)文的目標(biāo)地址改為對(duì)應(yīng)的私網(wǎng)地址,比如,如果報(bào)文的目標(biāo)IP與端口號(hào)為:公網(wǎng)IP+3306,我們就將報(bào)文的目標(biāo)地址與端口改為:主機(jī)2的私網(wǎng)IP+3306,同理,公網(wǎng)IP+80端口映射為主機(jī)1的私網(wǎng)IP+80端口,當(dāng)私網(wǎng)中的主機(jī)回應(yīng)對(duì)應(yīng)請(qǐng)求報(bào)文時(shí),再將回應(yīng)報(bào)文的源地址從私網(wǎng)IP+端口號(hào)映射為公網(wǎng)IP+端口號(hào),再由路由器或公網(wǎng)主機(jī)發(fā)送給互聯(lián)網(wǎng)中的主機(jī)。
上述過(guò)程也牽扯到DNAT與SNAT,但是由于整個(gè)過(guò)程的前半段使用了DNAT,所以上述過(guò)程被稱(chēng)為DNAT
其實(shí),不管是SNAT還是DNAT,都起到了隱藏內(nèi)部主機(jī)IP的作用。
實(shí)驗(yàn)環(huán)境準(zhǔn)備
好了,我們已經(jīng)了解了SNAT與DNAT的相關(guān)概念,那么現(xiàn)在,我們可以動(dòng)動(dòng)手了,首先,準(zhǔn)備一下實(shí)驗(yàn)環(huán)境
大致的實(shí)驗(yàn)環(huán)境是這樣的,公司局域網(wǎng)使用的網(wǎng)段為10.1.0.0/16,目前公司只有一個(gè)公網(wǎng)IP,局域網(wǎng)內(nèi)的主機(jī)需要共享這個(gè)IP與互聯(lián)網(wǎng)上的主機(jī)進(jìn)行通訊。
由于我們沒(méi)有真正的公網(wǎng)IP,所以,我們使用私網(wǎng)IP:192.168.1.146模擬所謂的公網(wǎng)IP,示意圖如下
?
如上述示意圖所示,實(shí)驗(yàn)使用4臺(tái)虛擬機(jī),A、B、C、D
主機(jī)A:扮演公網(wǎng)主機(jī),嘗試訪問(wèn)公司提供的服務(wù),IP地址為192.168.1.147
主機(jī)B:扮演了擁有NAT功能的防火墻或路由器,充當(dāng)網(wǎng)關(guān),并且負(fù)責(zé)NAT,公網(wǎng)、私網(wǎng)通訊的報(bào)文通過(guò)B主機(jī)時(shí),報(bào)文會(huì)被NAT
主機(jī)C:扮演內(nèi)網(wǎng)web服務(wù)器
主機(jī)D:扮演內(nèi)網(wǎng)windows主機(jī)
上圖中圓形所示的邏輯區(qū)域表示公司內(nèi)網(wǎng),網(wǎng)段為10.1.0.0/16,主機(jī)B、C、D都屬于內(nèi)網(wǎng)主機(jī),主機(jī)B比較特殊,同時(shí)扮演了網(wǎng)關(guān)與防火墻,主機(jī)B持有公司唯一的公網(wǎng)IP(我們用了一個(gè)假的公網(wǎng)IP),局域網(wǎng)內(nèi)主機(jī)如果想與公網(wǎng)主機(jī)通訊,需要共享此公網(wǎng)IP,由B主機(jī)進(jìn)行NAT,所以,我們?yōu)橹鳈C(jī)B準(zhǔn)備了兩塊網(wǎng)卡,公網(wǎng)IP與私網(wǎng)IP分別配置到這兩塊網(wǎng)卡中,同時(shí),在虛擬機(jī)中設(shè)置了一個(gè)"僅主機(jī)模式"的虛擬網(wǎng)絡(luò),以模擬公司局域網(wǎng)。
?
聰明如你,應(yīng)該已經(jīng)發(fā)現(xiàn)了,上述實(shí)驗(yàn)環(huán)境與之前描述的"網(wǎng)絡(luò)防火墻"的實(shí)驗(yàn)環(huán)境相差無(wú)幾,只不過(guò)之前的環(huán)境并沒(méi)有公網(wǎng),私網(wǎng)的概念,而此刻,圓形邏輯區(qū)域之內(nèi)為私網(wǎng),圓形邏輯區(qū)域之外為公網(wǎng)。
?
環(huán)境具體準(zhǔn)備過(guò)程如下
首先,創(chuàng)建一個(gè)虛擬網(wǎng)絡(luò),模擬公司內(nèi)網(wǎng)。
點(diǎn)擊vmware虛擬機(jī)的編輯菜單,打開(kāi)"虛擬網(wǎng)絡(luò)編輯器",點(diǎn)擊更改設(shè)置,添加"僅主機(jī)模式"的虛擬網(wǎng)絡(luò),下圖中的VMnet6為已經(jīng)添加過(guò)的虛擬網(wǎng)絡(luò),此處不再重復(fù)操作。
?
主機(jī)C與主機(jī)D的網(wǎng)關(guān)都指向主機(jī)B的私網(wǎng)IP,如下圖所示
?
主機(jī)B有兩塊網(wǎng)卡,分別配置了私網(wǎng)IP與公網(wǎng)IP,私網(wǎng)IP為10.1.0.3,私網(wǎng)IP所在的網(wǎng)卡也存在于vmnet6中,模擬公網(wǎng)的IP為192.168.1.146,B主機(jī)的公網(wǎng)IP所在的網(wǎng)卡與A主機(jī)都使用橋接模式的虛擬網(wǎng)絡(luò),所以,B主機(jī)既能與私網(wǎng)主機(jī)通訊,也能與公網(wǎng)主機(jī)通訊。
?
由于B主機(jī)此時(shí)需要負(fù)責(zé)對(duì)報(bào)文的修改與轉(zhuǎn)發(fā),所以,需要開(kāi)啟B主機(jī)中的核心轉(zhuǎn)發(fā)功能,Linux主機(jī)默認(rèn)不會(huì)開(kāi)啟核心轉(zhuǎn)發(fā),這在前文中已經(jīng)詳細(xì)的描述過(guò),此處不再贅述,如果你還不明白為什么,請(qǐng)回顧前文,使用臨時(shí)生效的方法開(kāi)啟B主機(jī)的核心轉(zhuǎn)發(fā)功能,如下圖所示。
?
A主機(jī)的IP地址如下,可以與B主機(jī)進(jìn)行通訊,但是不能與C、D進(jìn)行通訊,因?yàn)榇丝?#xff0c;A是公網(wǎng)主機(jī),B既是公網(wǎng)主機(jī)又是私網(wǎng)主機(jī),C、D是私網(wǎng)的主機(jī),A是不可能訪問(wèn)到C和D的。
?
為了能夠更好的區(qū)分公網(wǎng)服務(wù)與私網(wǎng)服務(wù),我們分別在主機(jī)A與主機(jī)C上啟動(dòng)httpd服務(wù),如下圖所示。
?
好了,實(shí)驗(yàn)環(huán)境準(zhǔn)備完畢,我們來(lái)一起動(dòng)動(dòng)手,實(shí)際操作一下。
動(dòng)作:SNAT
在文章開(kāi)頭的場(chǎng)景中,我們已經(jīng)描述過(guò),網(wǎng)絡(luò)內(nèi)部的主機(jī)可以借助SNAT隱藏自己的IP地址,同時(shí)還能夠共享合法的公網(wǎng)IP,讓局域網(wǎng)內(nèi)的多臺(tái)主機(jī)共享公網(wǎng)IP訪問(wèn)互聯(lián)網(wǎng)。
而此時(shí)的主機(jī)B就扮演了擁有NAT功能的設(shè)備,我們使用iptables的SNAT動(dòng)作達(dá)到剛才所說(shuō)的目的。
連接到B主機(jī),添加如下規(guī)則。
?
如上圖所示,上圖中的規(guī)則表示將來(lái)自于10.1.0.0/16網(wǎng)段的報(bào)文的源地址改為公司的公網(wǎng)IP地址。
"-t nat"表示操作nat表,我們之前一直在灌輸一個(gè)概念,就是不同的表有不同的功能,filter表的功能是過(guò)濾,nat表的功能就是地址轉(zhuǎn)換,所以我們需要在nat表中定義nat規(guī)則。
"-A POSTROUTING"表示將SNAT規(guī)則添加到POSTROUTING鏈的末尾,在centos7中,SNAT規(guī)則只能存在于POSTROUTING鏈與INPUT鏈中,在centos6中,SNAT規(guī)則只能存在于POSTROUTING鏈中。
你可能會(huì)問(wèn),為什么SNAT規(guī)則必須定義在POSTROUTING鏈中,我們可以這樣認(rèn)為,POSTROUTING鏈?zhǔn)?/span>iptables中報(bào)文發(fā)出的最后一個(gè)"關(guān)卡",我們應(yīng)該在報(bào)文馬上發(fā)出之前,修改報(bào)文的源地址,否則就再也沒(méi)有機(jī)會(huì)修改報(bào)文的源地址了,在centos7中,SNAT規(guī)則也可以定義在INPUT鏈中,我們可以這樣理解,發(fā)往本機(jī)的報(bào)文經(jīng)過(guò)INPUT鏈以后報(bào)文就到達(dá)了本機(jī),如果再不修改報(bào)文的源地址,就沒(méi)有機(jī)會(huì)修改了。
"-s 10.1.0.0/16"表示報(bào)文來(lái)自于10.1.0.0/16網(wǎng)段,前文中一直在使用這個(gè)匹配條件,我想此處應(yīng)該不用贅述了。
"-j SNAT"表示使用SNAT動(dòng)作,對(duì)匹配到的報(bào)文進(jìn)行處理,對(duì)匹配到的報(bào)文進(jìn)行源地址轉(zhuǎn)換。
"--to-source 192.168.1.146"表示將匹配到的報(bào)文的源IP修改為192.168.1.146,前文中,我們已經(jīng)總結(jié)過(guò),某些動(dòng)作會(huì)有自己的選項(xiàng),"--to-source"就是SNAT動(dòng)作的常用選項(xiàng),用于指定SNAT需要將報(bào)文的源IP修改為哪個(gè)IP地址。
?
好了,只要站在前文的基礎(chǔ)上,理解上述語(yǔ)句應(yīng)該是分分鐘的事情,聰明如你應(yīng)該已經(jīng)學(xué)會(huì)了,那么我們來(lái)測(cè)試一下。
目前來(lái)說(shuō),我們只配置了一條SNAT規(guī)則,并沒(méi)有設(shè)置任何DNAT,現(xiàn)在,我們從內(nèi)網(wǎng)主機(jī)上ping外網(wǎng)主機(jī),看看能不能ping通,登錄內(nèi)網(wǎng)主機(jī)C,在C主機(jī)上向A主機(jī)的外網(wǎng)IP發(fā)送ping請(qǐng)求(假外網(wǎng)IP),示例如下
?
如上圖所示,"內(nèi)網(wǎng)主機(jī)"已經(jīng)可以依靠SNAT訪問(wèn)"互聯(lián)網(wǎng)"了。
為了更加清晰的理解整個(gè)SNAT過(guò)程,在C主機(jī)上抓包看看,查看一下請(qǐng)求報(bào)文與響應(yīng)報(bào)文的IP地址,如下,在C主機(jī)上同時(shí)打開(kāi)兩個(gè)命令窗口,一個(gè)命令窗口中向A主機(jī)發(fā)送ping請(qǐng)求,另一個(gè)窗口中,使用tcpdump命令對(duì)指定的網(wǎng)卡進(jìn)行抓包,抓取icmp協(xié)議的包。
?
從上圖可以看到,10.1.0.1發(fā)出ping包,192.168.1.147進(jìn)行回應(yīng),正是A主機(jī)的IP地址(用于模擬公網(wǎng)IP的IP地址)
看來(lái),只是用于配置SNAT的話,我們并不用 手動(dòng)的進(jìn)行DNAT設(shè)置,iptables會(huì)自動(dòng)維護(hù)NAT表,并將響應(yīng)報(bào)文的目標(biāo)地址轉(zhuǎn)換回來(lái)。
?
那么,我們?nèi)?/span>A主機(jī)上再次重復(fù)一遍剛才的操作,在A主機(jī)上抓包看看,如下圖所示,C主機(jī)上繼續(xù)向A主機(jī)的公網(wǎng)IP發(fā)送ping請(qǐng)求,在主機(jī)A的網(wǎng)卡上抓包看看。
?
從上圖可以看出,C主機(jī)向A主機(jī)發(fā)起ping請(qǐng)求時(shí)得到了回應(yīng),但是在A主機(jī)上,并不知道是C主機(jī)發(fā)來(lái)的ping請(qǐng)求,A主機(jī)以為是B主機(jī)發(fā)來(lái)的ping請(qǐng)求,從抓包的信息來(lái)看,A主機(jī)以為B主機(jī)通過(guò)公網(wǎng)IP:192.168.1.146向自己發(fā)起了ping請(qǐng)求,而A主機(jī)也將響應(yīng)報(bào)文回應(yīng)給了B主機(jī),所以,整個(gè)過(guò)程,A主機(jī)都不知道C主機(jī)的存在,都以為是B主機(jī)在向自己發(fā)送請(qǐng)求,即使不是在公網(wǎng)私網(wǎng)的場(chǎng)景中,我們也能夠使用這種方法,隱藏網(wǎng)絡(luò)內(nèi)的主機(jī),只不過(guò)此處,我們所描述的環(huán)境就是私網(wǎng)主機(jī)共享公網(wǎng)IP訪問(wèn)互聯(lián)網(wǎng),那么可以看到,私網(wǎng)中的主機(jī)已經(jīng)共享了192.168.1.146這個(gè)"偽公網(wǎng)IP",那么真的共享了嗎?我們使用內(nèi)網(wǎng)主機(jī)D試試,主機(jī)D是一臺(tái)windows虛擬機(jī),我們使用它向主機(jī)A發(fā)送ping請(qǐng)求,看看能不能ping通。如下
?
windows主機(jī)也ping通了外網(wǎng)主機(jī),在A主機(jī)上抓包,看到的仍然是B主機(jī)的IP地址。
?
那么,C主機(jī)與D主機(jī)能夠訪問(wèn)外網(wǎng)服務(wù)嗎?我們來(lái)看看。
在C主機(jī)上訪問(wèn)A主機(jī)的web服務(wù),如下圖所示,訪問(wèn)正常。
?
同理,在windows主機(jī)中訪問(wèn)A主機(jī)的web服務(wù),如下圖所示,訪問(wèn)正常。
?
好了,源地址轉(zhuǎn)換,已經(jīng)完成了,我們只依靠了一條iptables規(guī)則,就能夠使內(nèi)網(wǎng)主機(jī)能夠共享公網(wǎng)IP訪問(wèn)互聯(lián)網(wǎng)了。
?
動(dòng)作DNAT
公司只有一個(gè)公網(wǎng)IP,但是公司的內(nèi)網(wǎng)中卻有很多服務(wù)器提供各種服務(wù),我們想要通過(guò)公網(wǎng)訪問(wèn)這些服務(wù),改怎么辦呢?
沒(méi)錯(cuò),使用DNAT即可,我們對(duì)外宣稱(chēng),公司的公網(wǎng)IP上既提供了web服務(wù),也提供了windows遠(yuǎn)程桌面,不管是訪問(wèn)web服務(wù)還是遠(yuǎn)程桌面,只要訪問(wèn)這個(gè)公網(wǎng)IP就行了,我們利用DNAT,將公網(wǎng)客戶端發(fā)送過(guò)來(lái)的報(bào)文的目標(biāo)地址與端口號(hào)做了映射,將訪問(wèn)web服務(wù)的報(bào)文轉(zhuǎn)發(fā)到了內(nèi)網(wǎng)中的C主機(jī)中,將訪問(wèn)遠(yuǎn)程桌面的報(bào)文轉(zhuǎn)發(fā)到了內(nèi)網(wǎng)中的D主機(jī)中。
好了,理論說(shuō)完了,來(lái)動(dòng)手實(shí)踐一下。
?
如下配置由 [ 運(yùn)維工程師 王圣杰 ] ?提供,我們一起來(lái)討論一下。
如果我們想要實(shí)現(xiàn)剛才描述的場(chǎng)景,則需要在B主機(jī)中進(jìn)行如下配置。
?
如上圖所示,我們先將nat表中的規(guī)則清空了,從頭來(lái)過(guò),清空nat表規(guī)則后,定義了一條DNAT規(guī)則。
"-t nat -I PREROUTING"表示在nat表中的PREROUTING鏈中配置DNAT規(guī)則,DNAT規(guī)則只配置在PREROUTING鏈與OUTPUT鏈中。
"-d 192.168.1.146 -p tcp --dport 3389"表示報(bào)文的目標(biāo)地址為公司的公網(wǎng)IP地址,目標(biāo)端口為tcp的3389號(hào)端口,而我們知道,windows遠(yuǎn)程桌面使用的默認(rèn)端口號(hào)就是3389,當(dāng)外部主機(jī)訪問(wèn)公司公網(wǎng)IP的3389號(hào)端口時(shí),報(bào)文則符合匹配條件。
"-j DNAT --to-destination 10.1.0.6:3389"表示將符合條件的報(bào)文進(jìn)行DNAT,也就是目標(biāo)地址轉(zhuǎn)換,將符合條件的報(bào)文的目標(biāo)地址與目標(biāo)端口修改為10.1.0.6:3389,"--to-destination"就是動(dòng)作DNAT的常用選項(xiàng)。
那么綜上所述,上圖中定義的規(guī)則的含義為,當(dāng)外網(wǎng)主機(jī)訪問(wèn)公司公網(wǎng)IP的3389時(shí),其報(bào)文的目標(biāo)地址與端口將會(huì)被映射到10.1.0.6:3389上。
?
好了,DNAT規(guī)則定義完了,現(xiàn)在能夠直接使用外網(wǎng)主機(jī)訪問(wèn)私網(wǎng)中的服務(wù)了嗎?
理論上只要完成上述DNAT配置規(guī)則即可,但是在測(cè)試時(shí),只配置DNAT規(guī)則后,并不能正常DNAT,經(jīng)過(guò)測(cè)試發(fā)現(xiàn),將相應(yīng)的SNAT規(guī)則同時(shí)配置后,即可正常DNAT,于是我們又配置了SNAT
示例如下。
?
注:理論上只配置DNAT規(guī)則即可,但是如果在測(cè)試時(shí)無(wú)法正常DNAT,可以嘗試配置對(duì)應(yīng)的SNAT,此處按照配置SNAT的流程進(jìn)行。
沒(méi)錯(cuò),與剛才定義SNAT時(shí)使用的規(guī)則完全一樣。
?
好了,完成上述配置后,我們則可以通過(guò)B主機(jī)的公網(wǎng)IP,連接D主機(jī)(windows主機(jī))的遠(yuǎn)程桌面了,示例如下。
找到公網(wǎng)中的一臺(tái)windows主機(jī),打開(kāi)遠(yuǎn)程程序
?
輸入公司的公網(wǎng)IP,點(diǎn)擊連接按鈕
注意:沒(méi)有指定端口的情況下,默認(rèn)使用3389端口進(jìn)行連接,同時(shí),為了確保能夠連接到windows虛擬主機(jī),請(qǐng)將windows虛擬主機(jī)設(shè)置為允許遠(yuǎn)程連接。
?
輸入遠(yuǎn)程連接用戶的密碼以后,即可連接到windows主機(jī)
?
連接以后,遠(yuǎn)程連接程序顯示我們連接到了公司的公網(wǎng)IP,但是當(dāng)我們查看IP地址時(shí),發(fā)現(xiàn)被遠(yuǎn)程機(jī)器的IP地址其實(shí)是公司私網(wǎng)中的D主機(jī)的IP地址。
上圖證明,我們已經(jīng)成功的通過(guò)公網(wǎng)IP訪問(wèn)到了內(nèi)網(wǎng)中的服務(wù)。
同理,使用類(lèi)似的方法,我們也能夠在外網(wǎng)中訪問(wèn)到C主機(jī)提供的web服務(wù)。
示例如下。
?
如上圖所示,我們將公司公網(wǎng)IP的801號(hào)端口映射到了公司內(nèi)網(wǎng)中C主機(jī)的80端口,所以,當(dāng)外網(wǎng)主機(jī)訪問(wèn)公司公網(wǎng)IP的801端口時(shí),報(bào)文將會(huì)發(fā)送到C主機(jī)的80端口上。
這次,我們不用再次定義SNAT規(guī)則了,因?yàn)橹耙呀?jīng)定義過(guò)SNAT規(guī)則,上次定義的SNAT規(guī)則只要定義一次就行,而DNAT規(guī)則則需要根據(jù)實(shí)際的情況去定義。
?
好了,完成上述DNAT映射后,我們?cè)?/span>A主機(jī)上訪問(wèn)B主機(jī)的801端口試試,如下
?
可以看到,我們?cè)L問(wèn)的是B主機(jī)的公網(wǎng)IP,但是返回結(jié)果顯示的卻是C主機(jī)提供的服務(wù)內(nèi)容,證明DNAT已經(jīng)成功。
而上述過(guò)程中,外網(wǎng)主機(jī)A訪問(wèn)的始終都是公司的公網(wǎng)IP,但是提供服務(wù)的卻是內(nèi)網(wǎng)主機(jī),但是我們可以對(duì)外宣稱(chēng),公網(wǎng)IP上提供了某些服務(wù),快來(lái)訪問(wèn)吧!
我覺(jué)得我說(shuō)明白了,你聽(tīng)明白了嗎?
?
動(dòng)作MASQUERADE
上文中,我們已經(jīng)描述了SNAT,也就是源地址轉(zhuǎn)換,那么我們現(xiàn)在來(lái)認(rèn)識(shí)一個(gè)與SNAT類(lèi)似的動(dòng)作:MASQUERADE
當(dāng)我們撥號(hào)網(wǎng)上時(shí),每次分配的IP地址往往不同,不會(huì)長(zhǎng)期分給我們一個(gè)固定的IP地址,如果這時(shí),我們想要讓內(nèi)網(wǎng)主機(jī)共享公網(wǎng)IP上網(wǎng),就會(huì)很麻煩,因?yàn)槊看?/span>IP地址發(fā)生變化以后,我們都要重新配置SNAT規(guī)則,這樣顯示不是很人性化,我們通過(guò)MASQUERADE即可解決這個(gè)問(wèn)題,MASQUERADE會(huì)動(dòng)態(tài)的將源地址轉(zhuǎn)換為可用的IP地址,其實(shí)與SNAT實(shí)現(xiàn)的功能完全一致,都是修改源地址,只不過(guò)SNAT需要指明將報(bào)文的源地址改為哪個(gè)IP,而MASQUERADE則不用指定明確的IP,會(huì)動(dòng)態(tài)的將報(bào)文的源地址修改為指定網(wǎng)卡上可用的IP地址,示例如下:
?
如上圖所示,我們指定,通過(guò)外網(wǎng)網(wǎng)卡出去的報(bào)文在經(jīng)過(guò)POSTROUTING鏈時(shí),會(huì)自動(dòng)將報(bào)文的源地址修改為外網(wǎng)網(wǎng)卡上可用的IP地址,這時(shí),即使外網(wǎng)網(wǎng)卡中的公網(wǎng)IP地址發(fā)生了改變,也能夠正常的、動(dòng)態(tài)的將內(nèi)部主機(jī)的報(bào)文的源IP映射為對(duì)應(yīng)的公網(wǎng)IP。
可以把MASQUERADE理解為動(dòng)態(tài)的、自動(dòng)化的SNAT,如果沒(méi)有動(dòng)態(tài)SNAT的需求,沒(méi)有必要使用MASQUERADE,因?yàn)?/span>SNAT更加高效。
動(dòng)作REDIRECT
使用REDIRECT動(dòng)作可以在本機(jī)上進(jìn)行端口映射
比如,將本機(jī)的80端口映射到本機(jī)的8080端口上
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
經(jīng)過(guò)上述規(guī)則映射后,當(dāng)別的機(jī)器訪問(wèn)本機(jī)的80端口時(shí),報(bào)文會(huì)被重定向到本機(jī)的8080端口上。
REDIRECT規(guī)則只能定義在PREROUTING鏈或者OUTPUT鏈中。
?
小結(jié)
為了方便以后回顧,我們對(duì)上述命令進(jìn)行總結(jié)。
?
如果想要NAT功能能夠正常使用,需要開(kāi)啟Linux主機(jī)的核心轉(zhuǎn)發(fā)功能。
Shell
?
| 1 | echo?1?>?/proc/sys/net/ipv4/ip_forward |
?
SNAT相關(guān)操作
配置SNAT,可以隱藏網(wǎng)內(nèi)主機(jī)的IP地址,也可以共享公網(wǎng)IP,訪問(wèn)互聯(lián)網(wǎng),如果只是共享IP的話,只配置如下SNAT規(guī)則即可。
Shell
?
| 1 | iptables?-t?nat?-A?POSTROUTING?-s?10.1.0.0/16?-j?SNAT?--to-source?公網(wǎng)IP |
?
如果公網(wǎng)IP是動(dòng)態(tài)獲取的,不是固定的,則可以使用MASQUERADE進(jìn)行動(dòng)態(tài)的SNAT操作,如下命令表示將10.1網(wǎng)段的報(bào)文的源IP修改為eth0網(wǎng)卡中可用的地址。
Shell
?
| 1 | iptables?-t?nat?-A?POSTROUTING?-s?10.1.0.0/16?-o?eth0?-j?MASQUERADE |
?
DNAT相關(guān)操作
配置DNAT,可以通過(guò)公網(wǎng)IP訪問(wèn)局域網(wǎng)內(nèi)的服務(wù)。
注:理論上來(lái)說(shuō),只要配置DNAT規(guī)則,不需要對(duì)應(yīng)的SNAT規(guī)則即可達(dá)到DNAT效果。
但是在測(cè)試DNAT時(shí),對(duì)應(yīng)SNAT規(guī)則也需要配置,才能正常DNAT,可以先嘗試只配置DNAT規(guī)則,如果無(wú)法正常DNAT,再嘗試添加對(duì)應(yīng)的SNAT規(guī)則,SNAT規(guī)則配置一條即可,DNAT規(guī)則需要根據(jù)實(shí)際情況配置不同的DNAT規(guī)則。
Shell
?
| 1 2 3 | iptables?-t?nat?-I?PREROUTING?-d?公網(wǎng)IP?-p?tcp?--dport?公網(wǎng)端口?-j?DNAT?--to-destination?私網(wǎng)IP:端口號(hào) iptables?-t?nat?-I?PREROUTING?-d?公網(wǎng)IP?-p?tcp?--dport?8080?-j?DNAT?--to-destination?10.1.0.1:80 iptables?-t?nat?-A?POSTROUTING?-s?10.1.0.0/16?-j?SNAT?--to-source?公網(wǎng)IP |
?
在本機(jī)進(jìn)行目標(biāo)端口映射時(shí)可以使用REDIRECT動(dòng)作。
Shell
?
| 1 | iptables?-t?nat?-A?PREROUTING?-p?tcp?--dport?80?-j?REDIRECT?--to-ports?8080 |
配置完成上述規(guī)則后,其他機(jī)器訪問(wèn)本機(jī)的80端口時(shí),會(huì)被映射到8080端口。
轉(zhuǎn)載于:https://www.cnblogs.com/colos/p/11083217.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的iptables详解(13):iptables动作总结之二的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 车载u盘真的能提升6倍吗(车载app应用
- 下一篇: 线程间通信: Handler , Loo