|
在本博客中,從理論到實(shí)踐,系統(tǒng)的介紹了iptables,如果你想要從頭開(kāi)始了解iptables,可以查看iptables文章列表,直達(dá)鏈接如下 當(dāng)我們通過(guò)http的url訪問(wèn)某個(gè)網(wǎng)站的網(wǎng)頁(yè)時(shí),客戶端向服務(wù)端的80端口發(fā)起請(qǐng)求,服務(wù)端再通過(guò)80端口響應(yīng)我們的請(qǐng)求,于是,作為客戶端,我們似乎應(yīng)該理所應(yīng)當(dāng)?shù)姆判?0端口,以便服務(wù)端回應(yīng)我們的報(bào)文可以進(jìn)入客戶端主機(jī),于是,我們?cè)诳蛻舳朔判辛?0端口,同理,當(dāng)我們通過(guò)ssh工具遠(yuǎn)程連接到某臺(tái)服務(wù)器時(shí),客戶端向服務(wù)端的22號(hào)端口發(fā)起請(qǐng)求,服務(wù)端再通過(guò)22號(hào)端口響應(yīng)我們的請(qǐng)求,于是我們理所應(yīng)當(dāng)?shù)姆判辛怂?2號(hào)端口,以便遠(yuǎn)程主機(jī)的響應(yīng)請(qǐng)求能夠通過(guò)防火墻,但是,作為客戶端,如果我們并沒(méi)有主動(dòng)向80端口發(fā)起請(qǐng)求,也沒(méi)有主動(dòng)向22號(hào)端口發(fā)起請(qǐng)求,那么其他主機(jī)通過(guò)80端口或者22號(hào)端口向我們發(fā)送數(shù)據(jù)時(shí),我們可以接收到嗎?應(yīng)該是可以的,因?yàn)槲覀優(yōu)榱耸盏絟ttp與ssh的響應(yīng)報(bào)文,已經(jīng)放行了80端口與22號(hào)端口,所以,不管是"響應(yīng)"我們的報(bào)文,還是"主動(dòng)發(fā)送"給我們的報(bào)文,應(yīng)該都是可以通過(guò)這兩個(gè)端口的,那么仔細(xì)想想,這樣是不是不太安全呢?如果某些與你敵對(duì)的人,利用這些端口"主動(dòng)"連接到你的主機(jī),你肯定會(huì)不爽的吧,一般都是我們主動(dòng)請(qǐng)求80端口,80端口回應(yīng)我們,但是一般不會(huì)出現(xiàn)80端口主動(dòng)請(qǐng)求我們的情況吧。 你心里可能會(huì)這樣想:我知道哪些主機(jī)是安全的,我只要針對(duì)這些安全的主機(jī)放行對(duì)應(yīng)的端口就行了,其他IP一律拒絕,比如,我知道IP為123的主機(jī)是安全的,所以,我對(duì)123主機(jī)開(kāi)放了22號(hào)端口,以便123主機(jī)能夠通過(guò)22號(hào)端口響應(yīng)我們的ssh請(qǐng)求,那么,如果你需要管理的主機(jī)越來(lái)越多呢?你是不是每次都要為新的主機(jī)配置這些規(guī)則呢?如果有30臺(tái)主機(jī)呢?如果有300臺(tái)主機(jī)呢?80端口就更別提了,難道你每次訪問(wèn)一個(gè)新的網(wǎng)址,都要對(duì)這個(gè)網(wǎng)址添加信任嗎?這顯然不太合理。 你心里可能又會(huì)想:針對(duì)對(duì)應(yīng)的端口,我用--tcp-flags去匹配tcp報(bào)文的標(biāo)志位,把外來(lái)的"第一次握手"的請(qǐng)求拒絕,是不是也可以呢?那么如果對(duì)方使用的是UDP協(xié)議或者ICMP協(xié)議呢?似乎總是有一些不完美的地方。 那么我們仔細(xì)的思考一下,造成上述問(wèn)題的"根源"在哪里,我們?yōu)榱俗?quot;提供服務(wù)方"能夠正常的"響應(yīng)"我們的請(qǐng)求,于是在主機(jī)上開(kāi)放了對(duì)應(yīng)的端口,開(kāi)放這些端口的同時(shí),也出現(xiàn)了問(wèn)題,別人利用這些開(kāi)放的端口,"主動(dòng)"的攻擊我們,他們發(fā)送過(guò)來(lái)的報(bào)文并不是為了響應(yīng)我們,而是為了主動(dòng)攻擊我們,好了,我們似乎找到了問(wèn)題所在? 問(wèn)題就是:怎樣判斷這些報(bào)文是為了回應(yīng)我們之前發(fā)出的報(bào)文,還是主動(dòng)向我們發(fā)送的報(bào)文呢? 我們可以通過(guò)iptables的state擴(kuò)展模塊解決上述問(wèn)題,但是我們需要先了解一些state模塊的相關(guān)概念,然后再回過(guò)頭來(lái)解決上述問(wèn)題。 從字面上理解,state可以譯為狀態(tài),但是我們也可以用一個(gè)高大上的詞去解釋它,state模塊可以讓iptables實(shí)現(xiàn)"連接追蹤"機(jī)制。 那么,既然是"連接追蹤",則必然要有"連接"。 咱們就來(lái)聊聊什么是連接吧,一說(shuō)到連接,你可能會(huì)下意識(shí)的想到tcp連接,但是,對(duì)于state模塊而言的"連接"并不能與tcp的"連接"畫(huà)等號(hào),在TCP/IP協(xié)議簇中,UDP和ICMP是沒(méi)有所謂的連接的,但是對(duì)于state模塊來(lái)說(shuō),tcp報(bào)文、udp報(bào)文、icmp報(bào)文都是有連接狀態(tài)的,我們可以這樣認(rèn)為,對(duì)于state模塊而言,只要兩臺(tái)機(jī)器在"你來(lái)我往"的通信,就算建立起了連接,如下圖所示
而報(bào)文在這個(gè)所謂的鏈接中是什么狀態(tài)的呢?這是我們后面討論的話題。 對(duì)于state模塊的連接而言,"連接"其中的報(bào)文可以分為5種狀態(tài),報(bào)文狀態(tài)可以為NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED 那么上述報(bào)文的狀態(tài)都代表什么含義呢?我們先來(lái)大概的了解一下概念,然后再結(jié)合示例說(shuō)明。 注意:如下報(bào)文狀態(tài)都是對(duì)于state模塊來(lái)說(shuō)的。 NEW:連接中的第一個(gè)包,狀態(tài)就是NEW,我們可以理解為新連接的第一個(gè)包的狀態(tài)為NEW。 ESTABLISHED:我們可以把NEW狀態(tài)包后面的包的狀態(tài)理解為ESTABLISHED,表示連接已建立。 或許用圖說(shuō)話更容易被人理解
RELATED:從字面上理解RELATED譯為關(guān)系,但是這樣仍然不容易理解,我們舉個(gè)例子。 比如FTP服務(wù),F(xiàn)TP服務(wù)端會(huì)建立兩個(gè)進(jìn)程,一個(gè)命令進(jìn)程,一個(gè)數(shù)據(jù)進(jìn)程。 命令進(jìn)程負(fù)責(zé)服務(wù)端與客戶端之間的命令傳輸(我們可以把這個(gè)傳輸過(guò)程理解成state中所謂的一個(gè)"連接",暫稱(chēng)為"命令連接")。 數(shù)據(jù)進(jìn)程負(fù)責(zé)服務(wù)端與客戶端之間的數(shù)據(jù)傳輸 ( 我們把這個(gè)過(guò)程暫稱(chēng)為"數(shù)據(jù)連接" )。 但是具體傳輸哪些數(shù)據(jù),是由命令去控制的,所以,"數(shù)據(jù)連接"中的報(bào)文與"命令連接"是有"關(guān)系"的。 那么,"數(shù)據(jù)連接"中的報(bào)文可能就是RELATED狀態(tài),因?yàn)檫@些報(bào)文與"命令連接"中的報(bào)文有關(guān)系。 (注:如果想要對(duì)ftp進(jìn)行連接追蹤,需要單獨(dú)加載對(duì)應(yīng)的內(nèi)核模塊nf_conntrack_ftp,如果想要自動(dòng)加載,可以配置/etc/sysconfig/iptables-config文件) INVALID:如果一個(gè)包沒(méi)有辦法被識(shí)別,或者這個(gè)包沒(méi)有任何狀態(tài),那么這個(gè)包的狀態(tài)就是INVALID,我們可以主動(dòng)屏蔽狀態(tài)為INVALID的報(bào)文。 UNTRACKED:報(bào)文的狀態(tài)為untracked時(shí),表示報(bào)文未被追蹤,當(dāng)報(bào)文的狀態(tài)為Untracked時(shí)通常表示無(wú)法找到相關(guān)的連接。 上述5種狀態(tài)的詳細(xì)解釋可以參考如下文章的"User-land states"章節(jié) http://www./en/connection-state.html 好了,我們已經(jīng)大致了解了state模塊中所定義的5種狀態(tài),那么現(xiàn)在,我們回過(guò)頭想想剛才的問(wèn)題。 剛才問(wèn)題的根源就是:怎樣判斷報(bào)文是否是為了回應(yīng)之前發(fā)出的報(bào)文。 剛才舉例中的問(wèn)題即可使用state擴(kuò)展模塊解決,我們只要放行狀態(tài)為ESTABLISHED的報(bào)文即可,因?yàn)槿绻麍?bào)文的狀態(tài)為ESTABLISHED,那么報(bào)文肯定是之前發(fā)出的報(bào)文的回應(yīng),如果你還不放心,可以將狀態(tài)為RELATED或ESTABLISHED的報(bào)文都放行,這樣,就表示只有回應(yīng)我們的報(bào)文能夠通過(guò)防火墻,如果是別人主動(dòng)發(fā)送過(guò)來(lái)的新的報(bào)文,則無(wú)法通過(guò)防火墻,示例如下。
當(dāng)前主機(jī)IP為104,當(dāng)放行ESTABLISHED與RELATED狀態(tài)的包以后,并沒(méi)有影響通過(guò)本機(jī)遠(yuǎn)程ssh到IP為77的主機(jī)上,但是無(wú)法從104上使用22端口主動(dòng)連接到77上。 對(duì)于其他端口與IP來(lái)說(shuō),也是相同的,可以從104主動(dòng)發(fā)送報(bào)文,并且能夠收到響應(yīng)報(bào)文,但是其他主機(jī)并不能主動(dòng)向104發(fā)起請(qǐng)求。 好了,state模塊就總結(jié)到這里,希望這篇文章能夠?qū)δ阌兴鶐椭?/p> |
|
|
來(lái)自: nethelper > 《iptables》