閱讀這篇文章須要站在前文的基礎上,若是你在閱讀時遇到障礙,請參考以前的文章。web
前文中,咱們已經瞭解了以下動做數據庫
ACCEPT、DROP、REJECT、LOGwindows
今天,咱們來認識幾個新動做,它們是:centos
SNAT、DNAT、MASQUERADE、REDIRECT服務器
在認識它們以前,咱們先來聊聊NAT,若是你對NAT的相關概念已經倒背如流,能夠跳過以下場景描述。網絡
NAT是Network Address Translation的縮寫,譯爲"網絡地址轉換",NAT說白了就是修改報文的IP地址,NAT功能一般會被集成到路由器、防火牆、或獨立的NAT設備中。tcp
爲何要修改報文的IP地址呢?咱們來描述一些場景,便可知道爲何有這方面的需求了。編輯器
假設,網絡內部有10臺主機,它們有各自的IP地址,當網絡內部的主機與其餘網絡中的主機通信時,則會暴露本身的IP地址,若是咱們想要隱藏這些主機的IP地址,該怎麼辦呢?能夠這樣辦,以下。測試
當網絡內部的主機向網絡外部主機發送報文時,報文會通過防火牆或路由器,當報文通過防火牆或路由器時,將報文的源IP修改成防火牆或者路由器的IP地址,當其餘網絡中的主機收到這些報文時,顯示的源IP地址則是路由器或者防火牆的,而不是那10臺主機的IP地址,這樣,就起到隱藏網絡內部主機IP的做用,當網絡內部主機的報文通過路由器時,路由器會維護一張NAT表,表中記錄了報文來自於哪一個內部主機的哪一個進程(內部主機IP+端口),當報文通過路由器時,路由器會將報文的內部主機源IP替換爲路由器的IP地址,把源端口也映射爲某個端口,NAT表會把這種對應關係記錄下來。centos7
示意圖以下:
因而,外部主機收到報文時,源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表示意圖以下
綜上所述,SNAT不只可以隱藏網內的主機IP,還可以共享公網IP,這在IPV4地址較爲緊張的今天,是很是有用的。
場景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,示意圖以下
如上述示意圖所示,實驗使用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爲已經添加過的虛擬網絡,此處再也不重複操做。
主機C與主機D的網關都指向主機B的私網IP,以下圖所示
主機B有兩塊網卡,分別配置了私網IP與公網IP,私網IP爲10.1.0.3,私網IP所在的網卡也存在於vmnet6中,模擬公網的IP爲192.168.1.146,B主機的公網IP所在的網卡與A主機都使用橋接模式的虛擬網絡,因此,B主機既能與私網主機通信,也能與公網主機通信。
因爲B主機此時須要負責對報文的修改與轉發,因此,須要開啓B主機中的核心轉發功能,Linux主機默認不會開啓核心轉發,這在前文中已經詳細的描述過,此處再也不贅述,若是你還不明白爲何,請回顧前文,使用臨時生效的方法開啓B主機的核心轉發功能,以下圖所示。
A主機的IP地址以下,能夠與B主機進行通信,可是不能與C、D進行通信,由於此刻,A是公網主機,B既是公網主機又是私網主機,C、D是私網的主機,A是不可能訪問到C和D的。
爲了可以更好的區分公網服務與私網服務,咱們分別在主機A與主機C上啓動httpd服務,以下圖所示。
好了,實驗環境準備完畢,咱們來一塊兒動動手,實際操做一下。
在文章開頭的場景中,咱們已經描述過,網絡內部的主機能夠藉助SNAT隱藏本身的IP地址,同時還可以共享合法的公網IP,讓局域網內的多臺主機共享公網IP訪問互聯網。
而此時的主機B就扮演了擁有NAT功能的設備,咱們使用iptables的SNAT動做達到剛纔所說的目的。
鏈接到B主機,添加以下規則。
如上圖所示,上圖中的規則表示未來自於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),示例以下
如上圖所示,"內網主機"已經能夠依靠SNAT訪問"互聯網"了。
爲了更加清晰的理解整個SNAT過程,在C主機上抓包看看,查看一下請求報文與響應報文的IP地址,以下,在C主機上同時打開兩個命令窗口,一個命令窗口中向A主機發送ping請求,另外一個窗口中,使用tcpdump命令對指定的網卡進行抓包,抓取icmp協議的包。
從上圖能夠看到,10.1.0.1發出ping包,192.168.1.147進行迴應,正是A主機的IP地址(用於模擬公網IP的IP地址)
看來,只是用於配置SNAT的話,咱們並不用 手動的進行DNAT設置,iptables會自動維護NAT表,並將響應報文的目標地址轉換回來。
那麼,咱們去A主機上再次重複一遍剛纔的操做,在A主機上抓包看看,以下圖所示,C主機上繼續向A主機的公網IP發送ping請求,在主機A的網卡上抓包看看。
從上圖能夠看出,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通。以下
windows主機也ping通了外網主機,在A主機上抓包,看到的仍然是B主機的IP地址。
那麼,C主機與D主機可以訪問外網服務嗎?咱們來看看。
在C主機上訪問A主機的web服務,以下圖所示,訪問正常。
同理,在windows主機中訪問A主機的web服務,以下圖所示,訪問正常。
好了,源地址轉換,已經完成了,咱們只依靠了一條iptables規則,就可以是內網主機可以共享公網IP訪問互聯網了。
公司只有一個公網IP,可是公司的內網中卻有不少服務器提供各類服務,咱們想要經過公網訪問這些服務,改怎麼辦呢?
沒錯,使用DNAT便可,咱們對外宣稱,公司的公網IP上既提供了web服務,也提供了windows遠程桌面,無論是訪問web服務仍是遠程桌面,只要訪問這個公網IP就好了,咱們利用DNAT,將公網客戶端發送過來的報文的目標地址與端口號作了映射,將訪問web服務的報文轉發到了內網中的C主機中,將訪問遠程桌面的報文轉發到了內網中的D主機中。
好了,理論說完了,來動手實踐一下。
若是咱們想要實現剛纔描述的場景,則須要在B主機中進行以下配置。
如上圖所示,咱們先將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
示例以下。
注:理論上只配置DNAT規則便可,可是若是在測試時沒法正常DNAT,能夠嘗試配置對應的SNAT,此處按照配置SNAT的流程進行。
沒錯,與剛纔定義SNAT時使用的規則徹底同樣。
好了,完成上述配置後,咱們則能夠經過B主機的公網IP,鏈接D主機(windows主機)的遠程桌面了,示例以下。
找到公網中的一臺windows主機,打開遠程程序
輸入公司的公網IP,點擊鏈接按鈕
注意:沒有指定端口的狀況下,默認使用3389端口進行鏈接,同時,爲了確保可以鏈接到windows虛擬主機,請將windows虛擬主機設置爲容許遠程鏈接。
輸入遠程鏈接用戶的密碼之後,便可鏈接到windows主機
鏈接之後,遠程鏈接程序顯示咱們鏈接到了公司的公網IP,可是當咱們查看IP地址時,發現被遠程機器的IP地址實際上是公司私網中的D主機的IP地址。
上圖證實,咱們已經成功的經過公網IP訪問到了內網中的服務。
同理,使用相似的方法,咱們也可以在外網中訪問到C主機提供的web服務。
示例以下。
如上圖所示,咱們將公司公網IP的801號端口映射到了公司內網中C主機的80端口,因此,當外網主機訪問公司公網IP的801端口時,報文將會發送到C主機的80端口上。
此次,咱們不用再次定義SNAT規則了,由於以前已經定義過SNAT規則,上次定義的SNAT規則只要定義一次就行,而DNAT規則則須要根據實際的狀況去定義。
好了,完成上述DNAT映射後,咱們在A主機上訪問B主機的801端口試試,以下
能夠看到,咱們訪問的是B主機的公網IP,可是返回結果顯示的倒是C主機提供的服務內容,證實DNAT已經成功。
而上述過程當中,外網主機A訪問的始終都是公司的公網IP,可是提供服務的倒是內網主機,可是咱們能夠對外宣稱,公網IP上提供了某些服務,快來訪問吧!
我以爲我說明白了,你聽明白了嗎?
上文中,咱們已經描述了SNAT,也就是源地址轉換,那麼咱們如今來認識一個與SNAT相似的動做:MASQUERADE
當咱們撥號網上時,每次分配的IP地址每每不一樣,不會長期分給咱們一個固定的IP地址,若是這時,咱們想要讓內網主機共享公網IP上網,就會很麻煩,由於每次IP地址發生變化之後,咱們都要從新配置SNAT規則,這樣顯示不是很人性化,咱們經過MASQUERADE便可解決這個問題,MASQUERADE會動態的將源地址轉換爲可用的IP地址,其實與SNAT實現的功能徹底一致,都是修改源地址,只不過SNAT須要指明將報文的源地址改成哪一個IP,而MASQUERADE則不用指定明確的IP,會動態的將報文的源地址修改成指定網卡上可用的IP地址,示例以下:
如上圖所示,咱們指定,經過外網網卡出去的報文在通過POSTROUTING鏈時,會自動將報文的源地址修改成外網網卡上可用的IP地址,這時,即便外網網卡中的公網IP地址發生了改變,也可以正常的、動態的將內部主機的報文的源IP映射爲對應的公網IP。
能夠把MASQUERADE理解爲動態的、自動化的SNAT,若是沒有動態SNAT的需求,沒有必要使用MASQUERADE,由於SNAT更加高效。
使用REDIRECT動做能夠在本機上進行端口映射
好比,將本機的80端口映射到本機的8080端口上
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
通過上述規則映射後,當別的機器訪問本機的80端口時,報文會被重定向到本機的8080端口上。
REDIRECT規則只能定義在PREROUTING鏈或者OUTPUT鏈中。
爲了方便之後回顧,咱們對上述命令進行總結。
若是想要NAT功能可以正常使用,須要開啓Linux主機的核心轉發功能。
1
|
echo 1 > /proc/sys/net/ipv4/ip_forward
|
配置SNAT,能夠隱藏網內主機的IP地址,也能夠共享公網IP,訪問互聯網,若是隻是共享IP的話,只配置以下SNAT規則便可。
1
|
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 公網IP
|
若是公網IP是動態獲取的,不是固定的,則可使用MASQUERADE進行動態的SNAT操做,以下命令表示將10.1網段的報文的源IP修改成eth0網卡中可用的地址。
1
|
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERADE
|
配置DNAT,能夠經過公網IP訪問局域網內的服務。
注:理論上來講,只要配置DNAT規則,不須要對應的SNAT規則便可達到DNAT效果。
可是在測試DNAT時,對應SNAT規則也須要配置,才能正常DNAT,能夠先嚐試只配置DNAT規則,若是沒法正常DNAT,再嘗試添加對應的SNAT規則,SNAT規則配置一條便可,DNAT規則須要根據實際狀況配置不一樣的DNAT規則。
1
2
3
|
iptables -t nat -I PREROUTING -d 公網IP -p tcp --dport 公網端口 -j DNAT --to-destination 私網IP:端口號
iptables -t nat -I PREROUTING -d 公網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 公網IP
|
在本機進行目標端口映射時可使用REDIRECT動做。
1
|
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
|
配置完成上述規則後,其餘機器訪問本機的80端口時,會被映射到8080端口。
好了,這篇文章就總結到這裏,但願能對你有所幫助~~~~~