(轉(zhuǎn)注:這篇文章全面而深入的介紹了linux下iptables的使用!強(qiáng)烈推薦) 對(duì) 于Internet上的系統(tǒng),不管是什么情況都要明確一點(diǎn):網(wǎng)絡(luò)是不安全的。因此,雖然創(chuàng)建一個(gè)防火墻并不能保證系統(tǒng)100%安全,但卻是絕對(duì)必要的。 Linux提供了一個(gè)非常優(yōu)秀的防火墻工具?netfilter/iptables。它完全免費(fèi)、功能強(qiáng)大、使用靈活、可以對(duì)流入和流出的信息進(jìn)行細(xì)化控 制,且可以在一臺(tái)低配置機(jī)器上很好地運(yùn)行。本文將簡(jiǎn)單介紹使用netfilter/iptables實(shí)現(xiàn)防火墻架設(shè)和Internet連接共享等應(yīng)用。 netfilter/iptabels應(yīng)用程序,被認(rèn)為是Linux中實(shí)現(xiàn)包過(guò)濾功能 的第四代應(yīng)用程序。netfilter/iptables包含在2.4以后的內(nèi)核中,它可以實(shí)現(xiàn)防火墻、NAT(網(wǎng)絡(luò)地址翻譯)和數(shù)據(jù)包的分割等功能。 netfilter工作在內(nèi)核內(nèi)部,而iptables則是讓用戶定義規(guī)則集的表結(jié)構(gòu)。netfilter/iptables從ipchains和 ipwadfm(IP防火墻管理)演化而來(lái),功能更加強(qiáng)大。下文將netfilter/iptabels統(tǒng)一稱為iptables。 可以用iptables為Unix、Linux和BSD個(gè)人工作站創(chuàng)建一個(gè)防火墻,也 可以為一個(gè)子網(wǎng)創(chuàng)建防火墻以保護(hù)其它的系統(tǒng)平臺(tái)。iptales只讀取數(shù)據(jù)包頭,不會(huì)給信息流增加負(fù)擔(dān),也無(wú)需進(jìn)行驗(yàn)證。要想獲得更好的安全性,可以將其 和一個(gè)代理服務(wù)器(比如squid)相結(jié)合。 基本概念 典型的防火墻設(shè)置有兩個(gè)網(wǎng)卡:一個(gè)流入,一個(gè)流出。iptables讀取流入和流出數(shù)據(jù)包的報(bào)頭,將它們與規(guī)則集(Ruleset)相比較,將可接受的數(shù)據(jù)包從一個(gè)網(wǎng)卡轉(zhuǎn)發(fā)至另一個(gè)網(wǎng)卡,對(duì)被拒絕的數(shù)據(jù)包,可以丟棄或按照所定義的方式來(lái)處理。 通過(guò)向防火墻提供有關(guān)對(duì)來(lái)自某個(gè)源地址、到某個(gè)目的地或具有特定協(xié)議類型的信息包要做 些什么的指令,規(guī)則控制信息包的過(guò)濾。通過(guò)使用iptables系統(tǒng)提供的特殊命令iptables建立這些規(guī)則,并將其添加到內(nèi)核空間特定信息包過(guò)濾表 內(nèi)的鏈中。關(guān)于添加、去除、編輯規(guī)則的命令,一般語(yǔ)法如下: iptables [-t table] command [match] [target] 1.表(table) [-t table]選項(xiàng)允許使用標(biāo)準(zhǔn)表之外的任何表。表是包含僅處理特定類型信息包的規(guī)則和鏈的信息包過(guò)濾表。有三個(gè)可用的表選項(xiàng):filter、nat和mangle。該選項(xiàng)不是必需的,如果未指定,則filter作為缺省表。各表實(shí)現(xiàn)的功能如表1所示。 command部分是iptables命令最重要的部分。它告訴iptables命令要做什么,例如插入規(guī)則、將規(guī)則添加到鏈的末尾或刪除規(guī)則。表2是最常用的一些命令及例子。 iptables命令的可選match部分指定信息包與規(guī)則匹配所應(yīng)具有的特征(如源地址、目的地址、協(xié)議等)。匹配分為通用匹配和特定于協(xié)議的匹配兩大類。這里將介紹可用于采用任何協(xié)議的信息包的通用匹配。表3是一些重要且常用的通用匹配及示例說(shuō)明。 目標(biāo)是由規(guī)則指定的操作,對(duì)與那些規(guī)則匹配的信息包執(zhí)行這些操作。除了允許用戶定義的目標(biāo)之外,還有許多可用的目標(biāo)選項(xiàng)。表4是常用的一些目標(biāo)及示例說(shuō)明。 除表4外,還有許多用于建立高級(jí)規(guī)則的其它目標(biāo),如LOG、REDIRECT、MARK、MIRROR和MASQUERADE等。 表4 目標(biāo)及示例說(shuō)明 與ipchains和ipfwadm不同的是,iptables可以配置有狀態(tài)的防火 墻。iptables可以檢測(cè)到源地址和目的地址、源端口和目的端口及流入數(shù)據(jù)包的順序,即iptables記住了在現(xiàn)有連接中,哪些數(shù)據(jù)包已經(jīng)被允許接 收。這使得暫時(shí)性的端口只有在需要時(shí)才會(huì)被打開,并且會(huì)拒絕所有永久性占用端口的請(qǐng)求,大大地加強(qiáng)了安全性。同時(shí),那些被更改了報(bào)頭的數(shù)據(jù)包,即使包含有 一個(gè)被允許的目的地址和端口,也會(huì)被檢測(cè)到并被丟棄。此外,有狀態(tài)的防火墻能夠指定并記住為發(fā)送或接收信息包所建立連接的狀態(tài)。防火墻可以從信息包的連接 跟蹤狀態(tài)獲得該信息。在決定新的信息包過(guò)濾時(shí),防火墻所使用的這些狀態(tài)信息可以增加其效率和速度。 1.啟動(dòng)和停止iptables 下面將正式使用iptables來(lái)創(chuàng)建防火墻。啟動(dòng)和停止iptables的方法取決于所使用的Linux發(fā)行版,可以先查看所使用Linux版本的文檔。 一般情況下,iptables已經(jīng)包含在Linux發(fā)行版中,運(yùn)行iptables --version來(lái)查看系統(tǒng)是否安裝了iptables。在Red Hat 9.0中,安裝的版本是iptables v1.2.7a。如果系統(tǒng)沒有安裝iptables,則可以從http://www.netfilter.org下載。 2.查看規(guī)則集 上面僅對(duì)iptables的用法做了一個(gè)簡(jiǎn)單介紹,使用中可以運(yùn)行man iptables來(lái)查看所有命令和選項(xiàng)的完整介紹,或者運(yùn)行iptables -help來(lái)查看一個(gè)快速幫助。要查看系統(tǒng)中現(xiàn)有的iptables規(guī)劃集,可以運(yùn)行以下命令: iptables --list
下面是沒有定義規(guī)劃時(shí)iptables的樣子: Chain INPUT (policy ACCEPT) Chain FORWARD (policy ACCEPT) Chain OUTPUT (policy ACCEPT) filter是最常用的表,在filter表中最常用的三個(gè)目標(biāo)是ACCEPT、DROP和REJECT。DROP會(huì)丟棄數(shù)據(jù)包,不再對(duì)其進(jìn)行任何處理。REJECT會(huì)把出錯(cuò)信息傳送至發(fā)送數(shù)據(jù)包的主機(jī)。 [root@workstation root]# iptables --list Chain FORWARD (policy ACCEPT) Chain OUTPUT (policy ACCEPT)
現(xiàn)實(shí)中一般不使用這個(gè)GUI工具,因?yàn)樗墓δ苡邢?,也不夠透明。相比較而言,SuSE 9.0中相應(yīng)的配置工具要好得多,它可以在GUI下對(duì)防火墻進(jìn)行更加細(xì)化的配置(比如增加了IP轉(zhuǎn)發(fā)和偽裝等功能的配置)。盡管這樣,一般還是自己來(lái)增加和刪除規(guī)則。 .增加規(guī)則 本例中的規(guī)則將會(huì)阻止來(lái)自某一特定IP范圍內(nèi)的數(shù)據(jù)包,因?yàn)樵揑P地址范圍被管理員懷疑有大量惡意攻擊者在活動(dòng): # iptables -t filter -A INPUT -s 123.456.789.0/24 -j DROP
也可以很輕易地阻止所有流向攻擊者IP地址的數(shù)據(jù)包,該命令稍有不同: # iptables -t filter -A OUTPUT -d 123.456.789.0/24 -j DROP
注意這里的A選項(xiàng),如前所述,使用它說(shuō)明是給現(xiàn)有的鏈添加規(guī)則。 4.刪除規(guī)則 網(wǎng)絡(luò)上的惡意攻擊者總是在變化的,因此需要不斷改變IP。假設(shè)一個(gè)網(wǎng)上攻擊者轉(zhuǎn)移到新的IP地址,而其老的IP地址被分配給一些清白的用戶,那么這時(shí)這些用戶的數(shù)據(jù)包將無(wú)法通過(guò)你的網(wǎng)絡(luò)。這種情況下,可以使用帶-D選項(xiàng)的命令來(lái)刪除現(xiàn)有的規(guī)則: # iptables -t filter -D OUTPUT -d 123.456.789.0/24 -j DROP
5.缺省的策略 創(chuàng)建一個(gè)具有很好靈活性、可以抵御各種意外事件的規(guī)則需要大量的時(shí)間。對(duì)于那些沒有時(shí)間這樣做的人,最基本的原則是“先拒絕所有的數(shù)據(jù)包,然后再允許需要的”。下面來(lái)為每一個(gè)鏈設(shè)置缺省的規(guī)則: # iptables -P INPUT DROP
這里選項(xiàng)-P用于設(shè)置鏈的策略,只有三個(gè)內(nèi)建的鏈才有策略。這些策略可以讓信息毫無(wú)限制地流出,但不允許信息流入。很多時(shí)候需要接收外部信息,則可使用以下命令: # iptables -t filter -A INPUT -s 123.456.789.0/24 -j ACCEPT
6.SYN的使用 不能關(guān)閉所有端口,也不能只指定某些端口處于打開狀態(tài),那么怎樣才能設(shè)置一個(gè)有效的規(guī)則,既可以允許普通用戶正常通過(guò),又可以阻止惡意攻擊者訪問網(wǎng)絡(luò)呢? 剛開始使用iptables的人可以充分利用syn標(biāo)識(shí)來(lái)阻止那些未經(jīng)授權(quán)的訪問。 iptables只檢測(cè)數(shù)據(jù)包的報(bào)頭,事實(shí)上,除iptables以外,很多其它有用的數(shù)據(jù)包分析都是基于報(bào)頭的。比如,在進(jìn)行Web沖浪時(shí),一個(gè)請(qǐng)求從 你的PC發(fā)送至其它地方的Web服務(wù)器上,該服務(wù)器會(huì)響應(yīng)請(qǐng)求并發(fā)回一個(gè)數(shù)據(jù)包,同時(shí)得到你系統(tǒng)上的一個(gè)臨時(shí)端口。與響應(yīng)請(qǐng)求不同的是,服務(wù)器并不關(guān)心所 傳送的內(nèi)容??梢岳眠@種特點(diǎn)來(lái)設(shè)置規(guī)則,讓它阻止所有沒有經(jīng)過(guò)你系統(tǒng)授權(quán)的TCP連接: # iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP
這里的-i指的是網(wǎng)卡,-p則是指協(xié)議,--syn則表示帶有syn標(biāo)識(shí)設(shè)置的TCP數(shù)據(jù)包。SYN用于初始化一個(gè)TCP連接,如果自己機(jī)器上沒有運(yùn)行任何服務(wù)器,別人也就不會(huì)向你發(fā)送SYN數(shù)據(jù)包。 7.有狀態(tài)的數(shù)據(jù)包的檢測(cè) 前邊的例子把每一個(gè)數(shù)據(jù)包看成是獨(dú)立的,而不是相互關(guān)聯(lián)的,依靠的是數(shù)據(jù)包的頭信息。 iptables會(huì)檢查數(shù)據(jù)包的源和目的IP地址、源和目的端口、流入數(shù)據(jù)包的順序號(hào)、TCP先后順序的信息及頭標(biāo)記(SYN、ACK、FIN、RST 等)的狀態(tài),即它會(huì)跟蹤整個(gè)連接會(huì)話,從而使整個(gè)過(guò)濾過(guò)程是相互關(guān)聯(lián)的。 8.共享一個(gè)Internet連接 網(wǎng)絡(luò)地址翻譯和IP偽裝都可以實(shí)現(xiàn)多臺(tái)主機(jī)共享一個(gè)Internet連接,這個(gè)局域網(wǎng) 可以是Linux和Windows系統(tǒng)組成的多系統(tǒng)局域網(wǎng)。假設(shè)現(xiàn)在有一臺(tái)機(jī)器,配有兩個(gè)網(wǎng)卡,其中eth0為“公共”網(wǎng)卡,eth1為“私有”網(wǎng)卡,即 eth0被分配了一個(gè)靜態(tài)的、可路由的IP地址,而eth1被分配了一個(gè)私有的、不能路由的IP,該IP是屬于該局域網(wǎng)子網(wǎng)的。要實(shí)現(xiàn)上述功能,需要向 nat和filter表中添加一些鏈: # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
這顯示了有狀態(tài)的數(shù)據(jù)包檢測(cè)的價(jià)值。請(qǐng)注意,這里是如何實(shí)現(xiàn)流入數(shù)據(jù)包只有在屬于一個(gè)已經(jīng)存在的連接時(shí)才被允許,而所有來(lái)自局域網(wǎng)內(nèi)流向外的數(shù)據(jù)包則都允許通過(guò)。第一條規(guī)則讓所有流出的信息看起來(lái)都是來(lái)自防火墻機(jī)器的,而并不會(huì)顯示出防火墻后面還有一個(gè)局域網(wǎng)。 下面的命令為FORWARD和POSTROUTING鏈設(shè)置缺省的策略,在使用偽裝時(shí),有一個(gè)缺省的POSTROUTING DROP策略非常重要,否則就可能有心懷惡意的用戶突破網(wǎng)關(guān)后偽裝自己的身份。 # iptables -t filter -P FORWARD DROP
下面的命令為撥號(hào)連接設(shè)置,它可以動(dòng)態(tài)地分配IP地址: # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
9.運(yùn)行服務(wù)器時(shí)的情況 有時(shí)也會(huì)把服務(wù)器放置在防火墻后面,這時(shí)iptables就需要知道從哪兒通過(guò)數(shù)據(jù)包,設(shè)置如下所示: # iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 80 -j DNAT -to 192.168.0.10:80
10.規(guī)則的保存 到現(xiàn)在為止,所有的例子都是在命令行中進(jìn)行的。在測(cè)試新的規(guī)則時(shí),這是一種很好的方式,但一旦測(cè)試結(jié)果令人滿意,就可以將它們保存為腳本。可以使用 iptables-save 命令來(lái)實(shí)現(xiàn): $ iptables-save > iptables-script
信息包過(guò)濾表中的所有規(guī)則都被保存在文件iptables-script中。無(wú)論何時(shí)再次引導(dǎo)系統(tǒng),都可以使用iptables-restore命令將規(guī)則集從該腳本文件恢復(fù)到信息包過(guò)濾表?;謴?fù)命令如下所示: $ iptables-restore iptables-script
如果愿意在每次引導(dǎo)系統(tǒng)時(shí)自動(dòng)恢復(fù)該規(guī)則集,則可以將上面指定的這條命令放到任何一個(gè)初始化Shell腳本中。 下面的例子并不是一個(gè)完整的腳本,它只是描述了如何使用變量及提供了一些附加的規(guī)則樣例。 #!/bin/sh |
聯(lián)系客服