2019-09-05-iptables和firewalld(防火墻)


下午工作之余,無意中看到iptables相關(guān)內(nèi)容,由于實際工作環(huán)境中,系統(tǒng)下防火墻都是關(guān)閉狀態(tài),因此對這方面知識,了解不多。借此契機,上網(wǎng)瀏覽一些資料,對Linux系統(tǒng)防火墻進(jìn)行知識整理。

眾所周知,相較于企業(yè)內(nèi)網(wǎng),外部的公網(wǎng)環(huán)境更加惡劣,罪惡叢生。在公網(wǎng)與企業(yè)內(nèi)網(wǎng)之間充當(dāng)保護屏障的防火墻(見圖8-1)雖然有軟件或硬件之分,但主要功能都是依據(jù)策略對穿越防火墻自身的流量進(jìn)行過濾。防火墻策略可以基于流量的源目地址、端口號、協(xié)議、應(yīng)用等信息來定制,然后防火墻使用預(yù)先定制的策略規(guī)則監(jiān)控出入的流量,若流量與某一條策略規(guī)則相匹配,則執(zhí)行相應(yīng)的處理,反之則丟棄。這樣一來,就可以保證僅有合法的流量在企業(yè)內(nèi)網(wǎng)和外部公網(wǎng)之間流動了。


熟悉紅帽操作系統(tǒng)的童鞋都清楚,RHEL7? firewalld替代了RHEL6 iptables,其實,iptables與firewalld都不是真正的防火墻,它們都只是用來定義防火墻策略的防火墻管理工具而已,或者說,它們只是一種服務(wù)。iptables服務(wù)會把配置好的防火墻策略交由內(nèi)核層面的netfilter網(wǎng)絡(luò)過濾器來處理,而firewalld服務(wù)則是把配置好的防火墻策略交由內(nèi)核層面的nftables包過濾框架來處理。換句話說,當(dāng)前在Linux系統(tǒng)中其實存在多個防火墻管理工具,旨在方便運維人員管理Linux系統(tǒng)中的防火墻策略,我們只需要配置妥當(dāng)其中的一個就足夠了。雖然這些工具各有優(yōu)劣,但它們在防火墻策略的配置思路上是保持一致的。大家甚至可以不用完全掌握本章介紹的內(nèi)容,只要在這多個防火墻管理工具中任選一款并將其學(xué)透,就足以滿足日常的工作需求了。

在早期的Linux系統(tǒng)中,默認(rèn)使用的是iptables防火墻管理服務(wù)來配置防火墻。盡管新型的firewalld防火墻管理服務(wù)已經(jīng)被投入使用多年,但是大量的企業(yè)在生產(chǎn)環(huán)境中依然出于各種原因而繼續(xù)使用iptables。

以下介紹一些關(guān)于iptables相關(guān)的知識點

1 策略與規(guī)則鏈

防火墻會從上至下的順序來讀取配置的策略規(guī)則,在找到匹配項后就立即結(jié)束匹配工作并去執(zhí)行匹配項中定義的行為(即放行或阻止)。如果在讀取完所有的策略規(guī)則之后沒有匹配項,就去執(zhí)行默認(rèn)的策略。一般而言,防火墻策略規(guī)則的設(shè)置有兩種:一種是“通”(即放行),一種是“堵”(即阻止)。當(dāng)防火墻的默認(rèn)策略為拒絕時(堵),就要設(shè)置允許規(guī)則(通),否則誰都進(jìn)不來;如果防火墻的默認(rèn)策略為允許時,就要設(shè)置拒絕規(guī)則,否則誰都能進(jìn)來,防火墻也就失去了防范的作用。

iptables服務(wù)把用于處理或過濾流量的策略條目稱之為規(guī)則,多條規(guī)則可以組成一個規(guī)則鏈,而規(guī)則鏈則依據(jù)數(shù)據(jù)包處理位置的不同進(jìn)行分類,具體如下:

在進(jìn)行路由選擇前處理數(shù)據(jù)包(PREROUTING);

處理流入的數(shù)據(jù)包(INPUT);

處理流出的數(shù)據(jù)包(OUTPUT);

處理轉(zhuǎn)發(fā)的數(shù)據(jù)包(FORWARD);

在進(jìn)行路由選擇后處理數(shù)據(jù)包(POSTROUTING)。

一般來說,從內(nèi)網(wǎng)向外網(wǎng)發(fā)送的流量一般都是可控且良性的,因此我們使用最多的就是INPUT規(guī)則鏈,該規(guī)則鏈可以增大黑客人員從外網(wǎng)入侵內(nèi)網(wǎng)的難度。

比如在您居住的社區(qū)內(nèi),物業(yè)管理公司有兩條規(guī)定:禁止小商小販進(jìn)入社區(qū);各種車輛在進(jìn)入社區(qū)時都要登記。顯而易見,這兩條規(guī)定應(yīng)該是用于社區(qū)的正門的(流量必須經(jīng)過的地方),而不是每家每戶的防盜門上。根據(jù)前面提到的防火墻策略的匹配順序,可能會存在多種情況。比如,來訪人員是小商小販,則直接會被物業(yè)公司的保安拒之門外,也就無需再對車輛進(jìn)行登記。如果來訪人員乘坐一輛汽車進(jìn)入社區(qū)正門,則“禁止小商小販進(jìn)入社區(qū)”的第一條規(guī)則就沒有被匹配到,因此按照順序匹配第二條策略,即需要對車輛進(jìn)行登記。如果是社區(qū)居民要進(jìn)入正門,則這兩條規(guī)定都不會匹配到,因此會執(zhí)行默認(rèn)的放行策略。

但是,僅有策略規(guī)則還不能保證社區(qū)的安全,保安還應(yīng)該知道采用什么樣的動作來處理這些匹配的流量,比如“允許”、“拒絕”、“登記”、“不理它”。這些動作對應(yīng)到iptables服務(wù)的術(shù)語中分別是ACCEPT(允許流量通過)、REJECT(拒絕流量通過)、LOG(記錄日志信息)、DROP(拒絕流量通過)。“允許流量通過”和“記錄日志信息”都比較好理解,這里需要著重講解的是REJECT和DROP的不同點。就DROP來說,它是直接將流量丟棄而且不響應(yīng);REJECT則會在拒絕流量后再回復(fù)一條“您的信息已經(jīng)收到,但是被扔掉了”信息,從而讓流量發(fā)送方清晰地看到數(shù)據(jù)被拒絕的響應(yīng)信息。

我們來舉一個例子,讓各位讀者更直觀地理解這兩個拒絕動作的不同之處。比如有一天您正在家里看電視,突然聽到有人敲門,您透過防盜門的貓眼一看是推銷商品的,便會在不需要的情況下開門并拒絕他們(REJECT)。但如果您看到的是債主帶了十幾個小弟來討債,此時不僅要拒絕開門,還要默不作聲,偽裝成自己不在家的樣子(DROP)。

當(dāng)把Linux系統(tǒng)中的防火墻策略設(shè)置為REJECT拒絕動作后,流量發(fā)送方會看到端口不可達(dá)的響應(yīng):


而把Linux系統(tǒng)中的防火墻策略修改成DROP拒絕動作后,流量發(fā)送方會看到響應(yīng)超時的提醒。但是流量發(fā)送方無法判斷流量是被拒絕,還是接收方主機當(dāng)前不在線:


2 基本的命令參數(shù)

iptables是一款基于命令行的防火墻策略管理工具,具有大量參數(shù),學(xué)習(xí)難度較大。好在對于日常的防火墻策略配置來講,大家無需深入了解諸如“四表五鏈”的理論概念,只需要掌握常用的參數(shù)并做到靈活搭配即可,這就足以應(yīng)對日常工作了。

iptables命令可以根據(jù)流量的源地址、目的地址、傳輸協(xié)議、服務(wù)類型等信息進(jìn)行匹配,一旦匹配成功,iptables就會根據(jù)策略規(guī)則所預(yù)設(shè)的動作來處理這些流量。另外,再次提醒一下,防火墻策略規(guī)則的匹配順序是從上至下的,因此要把較為嚴(yán)格、優(yōu)先級較高的策略規(guī)則放到前面,以免發(fā)生錯誤。表8-1總結(jié)歸納了常用的iptables命令參數(shù)。再次強調(diào),我們無需死記硬背這些參數(shù),只需借助下面的實驗來理解掌握即可。


如前面所提到的防火墻策略設(shè)置無非有兩種方式,一種是“通”,一種是“堵”,當(dāng)把INPUT鏈設(shè)置為默認(rèn)拒絕后,就要往里面寫入允許策略了,否則所有流入的數(shù)據(jù)包都會被默認(rèn)拒絕掉,同學(xué)們需要留意規(guī)則鏈的默認(rèn)策略拒絕動作只能是DROP,而不能是REJECT。

向INPUT鏈中添加允許ICMP流量進(jìn)入的策略規(guī)則:

在日常運維工作中,經(jīng)常會使用ping命令來檢查對方主機是否在線,而向防火墻的INPUT規(guī)則鏈中添加一條允許ICMP流量進(jìn)入的策略規(guī)則就默認(rèn)允許了這種ping命令檢測行為。


再次重申,防火墻策略規(guī)則是按照從上到下的順序匹配的,因此一定要把允許動作放到拒絕動作前面,否則所有的流量就將被拒絕掉,從而導(dǎo)致任何主機都無法訪問我們的服務(wù)。另外,這里提到的22號端口是ssh服務(wù)使用的(有關(guān)ssh服務(wù),請見下一章),劉遄老師先在這里挖坑,等大家學(xué)完第9章后可再驗證這個實驗的效果。

在設(shè)置完上述INPUT規(guī)則鏈之后,我們使用IP地址在192.168.10.0/24網(wǎng)段內(nèi)的主機訪問服務(wù)器(即前面提到的設(shè)置了INPUT規(guī)則鏈的主機)的22端口,效果如下:

然后,我們再使用IP地址在192.168.20.0/24網(wǎng)段內(nèi)的主機訪問服務(wù)器的22端口(雖網(wǎng)段不同,但已確認(rèn)可以相互通信),效果如下,就會提示連接請求被拒絕了(Connection?failed):


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容