1. 程式人生 > >iptables詳解(11):iptables之網絡防火墻

iptables詳解(11):iptables之網絡防火墻

允許 什麽 模塊 進行 通訊 usr accep 屬於 兩個

我們一起來回顧一下之前的知識,在第一篇介紹iptables的文章中,我們就描述過防火墻的概念,我們說過,防火墻從邏輯上講,可以分為主機防火墻與網絡防火墻。

主機防火墻:針對於單個主機進行防護。

網絡防火墻: 往往處於網絡入口或邊緣,針對於網絡入口進行防護,服務於防火墻背後的本地局域網。

在前文的舉例中,iptables都是作為主機防火墻的角色出現的,那麽,iptables怎樣作為網絡防火墻呢?這就是我們今天要聊的話題。

回到剛才的概念,網絡防火墻往往處於網絡的入口或者邊緣,那麽,如果想要使用iptables充當網絡防火墻,iptables所在的主機則需要處於網絡入口處,示意圖如下。

技術分享圖片技術分享圖片

上圖中,橘黃色主機為iptables所在主機,此時iptables充當的角色即為網絡防火墻,上圖中的淺藍色圓形表示網絡防火墻所防護的網絡區域,圓形內的藍色矩形表示網絡內的主機。

當外部網絡中的主機與網絡內部主機通訊時,不管是由外部主機發往內部主機的報文,還是由內部主機發往外部主機的報文,都需要經過iptables所在的主機,由iptables所在的主機進行"過濾並轉發",所以,防火墻主機的主要工作就是"過濾並轉發",那麽,說到這裏,我們則不得不再次回顧之前的iptables報文流程圖了,如下:

技術分享圖片技術分享圖片

前文中,iptables都是作為"主機防火墻"的角色出現的,所以我們舉例時,只用到了上圖中的INPUT鏈與OUTPUT鏈,因為擁有"過濾功能"的鏈只有3條,INPUT、OUTPUT、FORWARD,當報文發往本機時,如果想要過濾,只能在INPUT鏈與OUTPUT鏈中實現,而此時,iptables的角色發生了轉變,我們想要將iptables所在的主機打造成"網絡防火墻",而剛才已經說過,網絡防火墻的職責就是"過濾並轉發",要想"過濾",只能在INPUT、OUTPUT、FORWARD三條鏈中實現,要想"轉發",報文則只會經過FORWARD鏈(發往本機的報文才會經過INPUT鏈),所以,綜上所述,iptables的角色變為"網絡防火墻"時,規則只能定義在FORWARD鏈中。


環境準備

那麽為了能夠進行實驗,我們來設置一下實驗場景,如下圖所示(後面有對圖的解釋)

技術分享圖片技術分享圖片

我們假設,上圖中圓形所示的網絡為內部網絡

註:此處所描述的內網、外網與我們平常所說的公網、私網不同。

此處描述的內外部網絡你可以理解成兩個網段,A網絡與B網絡,為了方便描述,我們把圓形內的主機稱為內部主機,把上圖中圓形所表示的網絡稱為內部網絡,把圓形外的網絡稱為外部網絡。

假設,內部網絡的網段為10.1.0.0/16,此內部網絡中存在主機C,主機C的IP地址為10.1.0.1。

上圖中的主機B充當了網絡防火墻的角色,主機B也屬於內部網絡,同時主機B也能與外部網絡進行通訊,如上圖所示,主機B有兩塊網卡,網卡1與網卡2,網卡1的IP地址為10.1.0.3,網卡2的IP地址為192.168.1.146,所以,防火墻主機在內部網絡中的IP地址為10.1.0.3,防火墻主機與外部網絡通訊的IP地址為192.168.1.146。

上圖中的主機A充當了"外部網絡主機"的角色,A主機的IP地址為192.168.1.147,我們使用主機A訪問內部網絡中的主機C,但是需要主機B進行轉發,主機B在轉發報文時會進行過濾,以實現網絡防火墻的功能。

我已經準備了3臺虛擬機,A、B、C

虛擬機A與虛擬機B的網卡2都使用了橋接模式。

為了能夠盡量模擬內部網絡的網絡入口,我們將虛擬機B的網卡1與虛擬機C同時放在"僅主機模式"的虛擬網絡中,虛擬機設置如下圖所示

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

技術分享圖片技術分享圖片

由於B主機現在的角色是10.1.0.0中的"網絡防火墻",那麽,我們直接將C主機的網關指向B主機的內部網絡IP,如下圖所示

技術分享圖片

技術分享圖片

同時,為了盡量簡化路由設置,我們直接將A主機訪問10.1網絡時的網關指向B主機的網卡2上的IP,如下圖所示。

註:route命令配置的路由條目在網絡重啟後將會失效

技術分享圖片技術分享圖片

現在A主機通往10.1網絡的網關已經指向了B主機,那麽,現在A主機能夠達到10.1.0.0/16網絡嗎?我們來試試

如下圖所示,我們直接在A主機上向C主機發起ping請求,並沒有得到任何回應。

技術分享圖片技術分享圖片

那麽,我們再來試試B主機上的內部網IP,如下圖所示,直接在A主機上向B主機的內部網IP發起ping請求,發現是可以ping通的,這是為什麽呢?

技術分享圖片技術分享圖片

按照道理來說,10.1.0.1與10.1.0.3都屬於10.1.0.0/16網段,為什麽B主機上的IP就能通,C主機上的IP卻不通呢?

咱們先來聊聊為什麽10.1.0.1沒有回應。

A主機通過路由表得知,發往10.1.0.0/16網段的報文的網關為B主機,當報文達到B主機時,B主機發現A的目標為10.1.0.1,而自己的IP是10.1.0.2,這時,B主機則需要將這個報文轉發給10.1.0.1(也就是C主機),但是,Linux主機在默認情況下,並不會轉發報文,如果想要讓Linux主機能夠轉發報文,需要額外的設置,這就是為什麽10.1.0.1沒有回應的原因,因為B主機壓根就沒有將A主機的ping請求轉發給C主機,C主機壓根就沒有收到A的ping請求,所以A自然得不到回應。

現在再來聊聊為什麽10.1.0.3會回應。

這是因為10.1.0.3這個IP與192.168.1.146這個IP都屬於B主機,當A主機通過路由表將ping報文發送到B主機上時,B主機發現自己既是192.168.1.146又是10.1.0.3,所以,B主機就直接回應了A主機,並沒有將報文轉發給誰,所以A主機得到了10.1.0.3的回應。

我想我應該說明白了,那麽,我們應該怎樣設置,才能讓Linux主機轉發報文呢?我們一起來設置一遍就好了。

首先,我們可以查看/proc/sys/net/ipv4/ip_forward文件中的內容,如果文件內容為0,則表示當前主機不支持轉發。

技術分享圖片技術分享圖片

如果我們想要讓當前主機支持核心轉發功能,只需要將此文件中的值設置為1即可,示例如下。

技術分享圖片技術分享圖片

好了,現在我們就開啟了B主機的核心轉發功能。

除了上述方法,還能使用sysctl命令去設置是否開啟核心轉發,示例如下。

技術分享圖片

技術分享圖片

上述兩種方法都能控制是否開啟核心轉發,但是通過上述兩種方法設置後,只能臨時生效,當重啟網絡服務以後,核心轉發功能將會失效。

如果想要永久生效,則需要設置/etc/sysctl.conf文件(centos7中配置/usr/lib/sysctl.d/00-system.conf文件),添加(或修改)配置項 net.ipv4.ip_forward = 1 即可,示例如下。

技術分享圖片技術分享圖片

現在,B主機已經具備了核心轉發功能,已經可以轉發報文了,現在,我們再次回到A主機中,向C主機發起ping請求,如下圖所示,已經可以ping通。

註:如果你仍然無法ping通,可能是因為你使用route命令配置了C主機的默認網關,這種情況下,請查看C主機的路由配置是否自動消失了,如果沒有對應的路由條目,請重新配置,同時,如果你的主機C如果有多塊網卡,可以暫時禁用其他網卡試試

技術分享圖片

技術分享圖片

同時,從主機C向主機A發起ping請求,也可以ping通,如下圖所示

技術分享圖片技術分享圖片

好了,我們的測試環境已經準備完畢,現在可以開始測試了。

但是在開始之前,請確定主機A與主機C上沒有對應的iptables規則,因為此處我們主要是用來測試"網絡防火墻"的,為了減少主機防火墻帶來的影響,我們直接將主機A與主機C上的規則清空。

網絡防火墻測試

之前說過,iptables作為網絡防火墻時,主要負責"過濾與轉發",既然要過濾,則需配置filter表,既然要轉發,則需在FORWAED鏈中定義規則,所以,我們應該在filter表中的FORWARD鏈中配置規則。

那麽,我們先來看看主機B上的filter表中是否已經存在規則,如下

技術分享圖片技術分享圖片

從上圖可以看出,FORWARD鏈中沒有任何規則,默認策略為ACCEPT,我們可以使用"白名單機制"(如果忘了請回顧前文:黑白名單機制)

在主機B中FORWARD鏈的末端添加一條默認拒絕的規則,然後將"放行規則"設置在這條"默認拒絕規則"之前即可。

示例如下

技術分享圖片技術分享圖片

好了,配置完上述規則後,主機A與主機C已經無法通訊了,因為它們之間如果想要通訊,則需要靠主機B進行轉發,而上述規則設置完成後,所有報文都無法通過FORWARD鏈了,所以任何經過轉發的報文在經過FORWARD鏈時都會被拒絕,外部主機的報文無法轉發到內部主機中,內部網主機的報文也無法轉發到外部主機中,因為主機B已經拒絕轉發所有報文。

現在,我們同時將A主機與C主機中的web服務啟動,以便進行測試。

首先,我們啟動A主機的httpd服務

技術分享圖片技術分享圖片

同時,啟動C主機的httpd服務

技術分享圖片技術分享圖片

由於剛才已經在主機B中設置了默認拒絕的規則,所以此刻,A主機無法訪問C主機的web服務,C主機同樣無法訪問A主機的web服務。

那麽,如果我們想要使內部的主機能夠訪問外部主機的web服務,我們應該怎樣做呢?沒錯,我們需要在FORWARD鏈中放行內部主機對外部主機的web請求,只需如下配置即可。

技術分享圖片技術分享圖片

如上圖所示,防火墻放行了內部主機的web請求,因為我們將來自內部網絡中目標端口為80的報文都放行了,那麽此時,我們在C主機上訪問A主機的web服務試試

此時,在主機C上訪問主機A的web服務,如下

技術分享圖片技術分享圖片

可以看到,主機C並無法訪問到主機A上的web服務,這是為什麽呢?

聰明如你肯定已經想到了,我們只在主機B上放行了內部主機訪問80端口的請求,但是並沒有放行外部主機的回應報文,雖然內部主機的請求能夠通過防火墻主機B轉發出去,但是回應的報文則無法進入防火墻,所以,我們仍然需要在主機B上進行如下設置。

技術分享圖片技術分享圖片

如上圖所示,當外部主機中的web服務響應內部主機時,目標地址肯定為內部主機,所以,我們需要放行目標IP屬於內部主機網段的報文,源端口為80,因為外部主機肯定會使用80端口進行回應。

完成上述配置後,再次回到C主機上,訪問A主機的web服務,可以看到,已經能夠正常訪問了。

技術分享圖片技術分享圖片

從上述示例可以看出,當iptables作為"網絡防火墻"時,在配置規則時,往往需要考慮"雙向性",也就是說,我們為了達成一個目的,往往需要兩條規則才能完成。

那麽此時,A主機能夠訪問C主機中的web服務嗎?我想你已經知道答案了,沒錯,A主機此時無法訪問C主機中的web服務,因為B主機中並沒有放行相關報文。

結合之前的知識,我們可以將上述規則配置進行優化,比如,不管是由內而外,還是由外而內,只要是"響應報文",我們統統放行,配置如下

註:如果你沒有明白如下配置的含義,請回顧之前的文章

技術分享圖片技術分享圖片

如上圖所示,先將"web響應報文放行規則"刪除,同時增加了上圖中的規則,只需要在網絡防火墻主機的FORWARD鏈中添加如上一條規則,就可以將絕大多數響應報文放行了,不管是外部響應內部,還是內部響應外部,一條規則就能搞定,當iptables作為網絡防火墻時,每次配置規則時都要考慮"雙向"的問題,但是配置完上述規則後,我們只要考慮請求報文的方向就行了,而回應報文,上述一條規則就能搞定,這樣配置,即使以後有更多服務的響應報文需要放行,我們也不用再去針對響應報文設置規則了(具體原因前文已經詳細的總結過),應該會讓我們省去不少規則吧。

比如,我們除了想要讓內部主機能夠訪問外部的web服務,還想讓內部主機能夠訪問外部的sshd服務,那麽,我們則可以進行如下設置。

技術分享圖片技術分享圖片


如上圖所示,我們只要考慮內部主機的請求方向的報文規則即可,因為響應報文的規則已經被之前配置的規則"承包了"。

此刻,使用C主機即可訪問A主機的22端口。

技術分享圖片技術分享圖片

目前,我們只允許內部主機訪問外部主機的web服務與sshd服務,但是外部主機還無法訪問內部主機的服務,那麽具體怎麽配置我們就不贅述了,就由客官你去負責實現吧。

備註:在之前的一次實驗中,使用centos6.8作為網絡防火墻,出現了即使開啟核心轉發,也無法轉發報文的情況,具體原因仍未查明,遇到過類似場景的朋友如果有解決方法,歡迎賜教。

小結

為了方便以後回顧,我們將上述過程提煉總結一下。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #如果想要iptables作為網絡防火墻,iptables所在主機開啟核心轉發功能,以便能夠轉發報文。 #使用如下命令查看當前主機是否已經開啟了核心轉發,0表示為開啟,1表示已開啟 cat /proc/sys/net/ipv4/ip_forward #使用如下兩種方法均可臨時開啟核心轉發,立即生效,但是重啟網絡配置後會失效。 方法一:echo 1 > /proc/sys/net/ipv4/ip_forward 方法二:sysctl -w net.ipv4.ip_forward=1 #使用如下方法開啟核心轉發功能,重啟網絡服務後永久生效。 配置/etc/sysctl.conf文件(centos7中配置/usr/lib/sysctl.d/00-system.conf文件),在配置文件中將 net.ipv4.ip_forward設置為1 #由於iptables此時的角色為"網絡防火墻",所以需要在filter表中的FORWARD鏈中設置規則。 #可以使用"白名單機制",先添加一條默認拒絕的規則,然後再為需要放行的報文設置規則。 #配置規則時需要考慮"方向問題",針對請求報文與回應報文,考慮報文的源地址與目標地址,源端口與目標端口等。 #示例為允許網絡內主機訪問網絡外主機的web服務與sshd服務。 iptables -A FORWARD -j REJECT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 80 -j ACCEPT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 22 -j ACCEPT #可以使用state擴展模塊,對上述規則進行優化,使用如下配置可以省略許多"回應報文放行規則"。 iptables -A FORWARD -j REJECT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

一些註意點:

1、當測試網絡防火墻時,默認前提為網絡已經正確配置。

2、當測試網絡防火墻時,如果出現問題,請先確定主機防火墻規則的配置沒有問題。

iptables詳解(11):iptables之網絡防火墻