日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iptables详解(13):iptables动作总结之二

發布時間:2023/12/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iptables详解(13):iptables动作总结之二 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

所屬分類:IPtables??Linux基礎

在本博客中,從理論到實踐,系統的介紹了iptables,如果你想要從頭開始了解iptables,可以查看iptables文章列表,直達鏈接如下

iptables零基礎快速入門系列

?

概述

閱讀這篇文章需要站在前文的基礎上,如果你在閱讀時遇到障礙,請參考之前的文章。

前文中,我們已經了解了如下動作

ACCEPT、DROP、REJECT、LOG

今天,我們來認識幾個新動作,它們是:

SNAT、DNATMASQUERADEREDIRECT

在認識它們之前,我們先來聊聊NAT,如果你對NAT的相關概念已經滾瓜爛熟,可以跳過如下場景描述。

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

為什么要修改報文的IP地址呢?我們來描述一些場景,即可知道為什么有這方面的需求了。

?

場景1

假設,網絡內部有10臺主機,它們有各自的IP地址,當網絡內部的主機與其他網絡中的主機通訊時,則會暴露自己的IP地址,如果我們想要隱藏這些主機的IP地址,該怎么辦呢?可以這樣辦,如下。

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

示意圖如下:

?

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

上述整個過程中,就用到了NAT功能,準確的說是用到了NAPT功能,NAPTNAT的一種,全稱為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地址較為緊張的今天,是非常有用的。

場景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+端口號,再由路由器或公網主機發送給互聯網中的主機。

上述過程也牽扯到DNATSNAT,但是由于整個過程的前半段使用了DNAT,所以上述過程被稱為DNAT

其實,不管是SNAT還是DNAT,都起到了隱藏內部主機IP的作用。

實驗環境準備

好了,我們已經了解了SNATDNAT的相關概念,那么現在,我們可以動動手了,首先,準備一下實驗環境

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

由于我們沒有真正的公網IP,所以,我們使用私網IP192.168.1.146模擬所謂的公網IP,示意圖如下

?

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

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

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

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

主機D:扮演內網windows主機

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

?

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

?

環境具體準備過程如下

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

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

?

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

?

主機B有兩塊網卡,分別配置了私網IP與公網IP,私網IP10.1.0.3,私網IP所在的網卡也存在于vmnet6中,模擬公網的IP192.168.1.146B主機的公網IP所在的網卡與A主機都使用橋接模式的虛擬網絡,所以,B主機既能與私網主機通訊,也能與公網主機通訊。

?

由于B主機此時需要負責對報文的修改與轉發,所以,需要開啟B主機中的核心轉發功能,Linux主機默認不會開啟核心轉發,這在前文中已經詳細的描述過,此處不再贅述,如果你還不明白為什么,請回顧前文,使用臨時生效的方法開啟B主機的核心轉發功能,如下圖所示。

?

A主機的IP地址如下,可以與B主機進行通訊,但是不能與CD進行通訊,因為此刻,A是公網主機,B既是公網主機又是私網主機,C、D是私網的主機,A是不可能訪問到CD的。

?

為了能夠更好的區分公網服務與私網服務,我們分別在主機A與主機C上啟動httpd服務,如下圖所示。

?

好了,實驗環境準備完畢,我們來一起動動手,實際操作一下。

動作:SNAT

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

而此時的主機B就扮演了擁有NAT功能的設備,我們使用iptablesSNAT動作達到剛才所說的目的。

連接到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發送ping請求(假外網IP),示例如下

?

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

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

?

從上圖可以看到,10.1.0.1發出ping包,192.168.1.147進行回應,正是A主機的IP地址(用于模擬公網IPIP地址)

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

?

那么,我們去A主機上再次重復一遍剛才的操作,在A主機上抓包看看,如下圖所示,C主機上繼續向A主機的公網IP發送ping請求,在主機A的網卡上抓包看看。

?

從上圖可以看出,C主機向A主機發起ping請求時得到了回應,但是在A主機上,并不知道是C主機發來的ping請求,A主機以為是B主機發來的ping請求,從抓包的信息來看,A主機以為B主機通過公網IP192.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訪問互聯網了。

?

動作DNAT

公司只有一個公網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鏈中。

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

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

那么綜上所述,上圖中定義的規則的含義為,當外網主機訪問公司公網IP3389時,其報文的目標地址與端口將會被映射到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服務。

示例如下。

?

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

這次,我們不用再次定義SNAT規則了,因為之前已經定義過SNAT規則,上次定義的SNAT規則只要定義一次就行,而DNAT規則則需要根據實際的情況去定義。

?

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

?

可以看到,我們訪問的是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地址,示例如下:

?

如上圖所示,我們指定,通過外網網卡出去的報文在經過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主機的核心轉發功能。

Shell

?

1

echo?1?>?/proc/sys/net/ipv4/ip_forward

?

SNAT相關操作

配置SNAT,可以隱藏網內主機的IP地址,也可以共享公網IP,訪問互聯網,如果只是共享IP的話,只配置如下SNAT規則即可。

Shell

?

1

iptables?-t?nat?-A?POSTROUTING?-s?10.1.0.0/16?-j?SNAT?--to-source?公網IP

?

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

Shell

?

1

iptables?-t?nat?-A?POSTROUTING?-s?10.1.0.0/16?-o?eth0?-j?MASQUERADE

?

DNAT相關操作

配置DNAT,可以通過公網IP訪問局域網內的服務。

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

但是在測試DNAT時,對應SNAT規則也需要配置,才能正常DNAT,可以先嘗試只配置DNAT規則,如果無法正常DNAT,再嘗試添加對應的SNAT規則,SNAT規則配置一條即可,DNAT規則需要根據實際情況配置不同的DNAT規則。

Shell

?

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動作。

Shell

?

1

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

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

轉載于:https://www.cnblogs.com/colos/p/11083217.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的iptables详解(13):iptables动作总结之二的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。