Linux防火墻的IPtables設(shè)置與用法
利用IPtables來設(shè)置Linux的防火墻的方法很簡單,具體的過程如下:
防火墻典型的設(shè)置是有兩個網(wǎng)卡,一個流入,一個流出。iptables讀取流入和流出的數(shù)據(jù)包的報頭,然后將它們與規(guī)劃集(ruleset)相比較,然后將可接受的數(shù)據(jù)包從一個網(wǎng)卡轉(zhuǎn)發(fā)至另外一個網(wǎng)卡。對于被拒絕的數(shù)據(jù)包,可以被丟棄或者按照你所定義的方式來處理。
通過向防火墻提供有關(guān)對來自某個源、到某個目的地或具有特定協(xié)議類型的信息包要做些什么的指令的規(guī)則,控制信息包的過濾。通過使用iptables系統(tǒng)提供的特殊命令 iptables,建立這些規(guī)則,并將其添加到內(nèi)核空間的特定信息包過濾表內(nèi)的鏈中。關(guān)于添加、除去、編輯規(guī)則的命令的一般語法如下:
iptables [-t table] command [match] [target]
現(xiàn)實中,為了易讀,我們一般都用這種語法。大部分規(guī)則都是按這種語法寫的,因此,如果看到別人寫的規(guī)則,你很可能會發(fā)現(xiàn)用的也是這種語法。
如果不想用標(biāo)準(zhǔn)的表,就要在[table]處指定表名。一般情況下沒有必要指定使用的表,因為iptables 默認(rèn)使用filter表來執(zhí)行所有的命令。也沒有必要非得在這里指定表名,實際上幾乎可在規(guī)則的任何地方指定表名。當(dāng)然,把表名放在開始處已經(jīng)是約定俗成的標(biāo)準(zhǔn)。盡管命令總是放在開頭,或者是直接放在表名后面,我們也要考慮到底放在哪兒易讀。
“command”告訴程序該做什么,比如:插入一個規(guī)則,還是在鏈的末尾增加一個規(guī)則,還是刪除一個規(guī)則。下面會仔細(xì)地介紹。
“match”細(xì)致地描述了包的某個特點,以使這個包區(qū)別于其它所有的包。在這里,我們可以指定包的來源IP 地址、網(wǎng)絡(luò)接口、端口、協(xié)議類型,或者其他什么。下面我們將會看到許多不同的match。
最后是數(shù)據(jù)包的目標(biāo)所在“target”。若數(shù)據(jù)包符合所有的match,內(nèi)核就用target來處理它,或者說把包發(fā)往target。比如,我們可以讓內(nèi)核把包發(fā)送到當(dāng)前表中的其他鏈(可能是我們自己建立的),或者只是丟棄這個包而不做任何處理,或者向發(fā)送者返回某個特殊的應(yīng)答。下面我們來逐個討論這些選項:
表(table)
[-t table]選項允許使用標(biāo)準(zhǔn)表之外的任何表。表是包含僅處理特定類型信息包的規(guī)則和鏈的信息包過濾表。有三種可用的表選項:filter、nat 和 mangle。該選項不是必需的,如果未指定,則filter用作缺省表。下面介紹各表實現(xiàn)的功能。
filter
filter 表用來過濾數(shù)據(jù)包,我們可以在任何時候匹配包并過濾它們。我們就是在這里根據(jù)包的內(nèi)容對包做DROP或ACCEPT的。當(dāng)然,我們也可以預(yù)先在其他地方做些過濾,但是這個表才是設(shè)計用來過濾的。幾乎所有的target都可以在這兒使用。
nat
nat表的主要用處是網(wǎng)絡(luò)地址轉(zhuǎn)換,即Network Address Translation,縮寫為NAT。做過NAT操作的數(shù)據(jù)包的地址就被改變了,當(dāng)然這種改變是根據(jù)我們的規(guī)則進(jìn)行的。屬于一個流的包只會經(jīng)過這個表一次。
如果第一個包被允許做NAT或Masqueraded,那么余下的包都會自動地被做相同的操作。也就是說,余下的包不會再通過這個表,一個一個的被NAT,而是自動地完成。這就是我們?yōu)槭裁床粦?yīng)該在這個表中做任何過濾的主要原因。PREROUTING 鏈的作用是在包剛剛到達(dá)防火墻時改變它的目的地址,如果需要的話。OUTPUT鏈改變本地產(chǎn)生的包的目的地址。
POSTROUTING鏈在包就要離開防火墻之前改變其源地址此表僅用于NAT,也就是轉(zhuǎn)換包的源或目標(biāo)地址。注意,只有流的第一個包會被這個鏈匹配,其后的包會自動被做相同的處理。實際的操作分為以下幾類:
◆ DNAT
◆ SNAT
◆ MASQUERADE
DNAT操作主要用在這樣一種情況,你有一個合法的IP地址,要把對防火墻的訪問 重定向到其他的機(jī)子上(比如DMZ)。也就是說,我們改變的是目的地址,以使包能重路由到某臺主機(jī)。
SNAT改變包的源地址,這在極大程度上可以隱藏你的本地網(wǎng)絡(luò)或者DMZ等。一個很好的例子是我們知道防火墻的外部地址,但必須用這個地址替換本地網(wǎng)絡(luò)地址。有了這個操作,防火墻就 能自動地對包做SNAT和De-SNAT(就是反向的SNAT),以使LAN能連接到Internet。
如果使用類似 192.168.0.0/24這樣的地址,是不會從Internet得到任何回應(yīng)的。因為IANA定義這些網(wǎng)絡(luò)(還有其他的)為私有的,只能用于LAN內(nèi)部。
MASQUERADE的作用和MASQUERADE完全一樣,只是計算機(jī) 的負(fù)荷稍微多一點。因為對每個匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址是配置好的。當(dāng)然,這也有好處,就是我們可以使用通過PPP、 PPPOE、SLIP等撥號得到的地址,這些地址可是由ISP的DHCP隨機(jī)分配的。
Mangle
這個表主要用來mangle數(shù)據(jù)包。我們可以改變不同的包及包頭的內(nèi)容,比如 TTL,TOS或MARK。 注意MARK并沒有真正地改動數(shù)據(jù)包,它只是在內(nèi)核空間為包設(shè)了一個標(biāo)記。防火墻內(nèi)的其他的規(guī)則或程序(如tc)可以使用這種標(biāo)記對包進(jìn)行過濾或高級路由。這個表有五個內(nèi)建的鏈: PREROUTING,POSTROUTING, OUTPUT,INPUT和 FORWARD。
#p#
PREROUTING在包進(jìn)入防火墻之后、路由判斷之前改變包,POSTROUTING是在所有路由判斷之后。 OUTPUT在確定包的目的之前更改數(shù)據(jù)包。INPUT在包被路由到本地之后,但在用戶空間的程序看到它之前改變包。注意,mangle表不能做任何NAT,它只是改變數(shù)據(jù)包的TTL,TOS或MARK,而不是其源目的地址。NAT是在nat表中操作的,以下是mangle表中僅有的幾種操作:
◆ TOS
◆ TTL
◆ MARK
TOS操作用來設(shè)置或改變數(shù)據(jù)包的服務(wù)類型域。這常用來設(shè)置網(wǎng)絡(luò)上的數(shù)據(jù)包如何被路由等策略。 注意這個操作并不完善,有時得不所愿。它在Internet上還不能使用,而且很多路由器不會注意到這個域值。換句話說,不要設(shè)置發(fā)往Internet的包,除非你打算依靠TOS來路由,比如用iproute2。
TTL操作用來改變數(shù)據(jù)包的生存時間域,我們可以讓所有數(shù)據(jù)包只有一個特殊的TTL。它的存在有一個很好的理由,那就是我們可以欺騙一些ISP。為什么要欺騙他們呢?因為他們不愿意讓我們共享 一個連接。
那些ISP會查找一臺單獨的計算機(jī)是否使用不同的TTL,并且以此作為判斷連接是否被共享的標(biāo)志。
MARK用來給包設(shè)置特殊的標(biāo)記。iproute2能識別這些標(biāo)記,并根據(jù)不同的標(biāo)記(或沒有標(biāo)記) 決定不同的路由。用這些標(biāo)記我們可以做帶寬限制和基于請求的分類。
命令(command)
命令中必要的組成部分command是iptables命令的最重要部分。它告訴 iptables 命令要做什么,例如,插入規(guī)則、將規(guī)則添加到鏈的末尾或刪除規(guī)則。
在使用iptables時,如果必須的參數(shù)沒有輸入就按了回車,那么它就會給出一些提示信息,告訴你需要哪些參數(shù)等。iptables的選項-v用來顯示iptables的版本,-h給出語法的簡短說明。
匹配(match)
iptables命令的可選match部分指定信息包與規(guī)則匹配所應(yīng)具有的特征(如源和目的地地址、協(xié)議等)。可把它們歸為五類:第一類是generic matches(通用的匹配),適用于所有的規(guī)則;第二類是TCP matches,顧名思義,這只能用于TCP包;第三類是UDP matches, 當(dāng)然它只能用在UDP包上了;第四類是ICMP matches ,針對ICMP包的;第五類比較特殊,針對的是狀態(tài),指所有者和訪問的頻率限制等。在此,只介紹通用匹配,熟悉了通用匹配,其它的幾種也就比較容易理解了。
目標(biāo)(target)
我們已經(jīng)知道,目標(biāo)是由規(guī)則指定的操作,那些與規(guī)則匹配的信息包執(zhí)行這些操作。除了允許用戶定義的目標(biāo)之外,還有許多可用的目標(biāo)選項。用于建立高級規(guī)則的目標(biāo),如LOG、REDIRECT、MARK、MIRROR 和MASQUERADE等。
狀態(tài)機(jī)制
狀態(tài)機(jī)制是iptables中特殊的一部分,其實它不應(yīng)該叫狀態(tài)機(jī)制,因為它只是一種連接跟蹤機(jī)制。但是,很多人都認(rèn)可狀態(tài)機(jī)制這個名字。連接跟蹤可以讓netfilter知道某個特定連接的狀態(tài)。運(yùn)行連接跟蹤的防火墻稱作帶有狀態(tài)機(jī)制的防火墻,以下簡稱為狀態(tài)防火墻。狀態(tài)防火墻比非狀態(tài)防火墻要安全,因為它允許我們編寫更嚴(yán)密的規(guī)則。
在iptables里,包是和被跟蹤連接的四種不同狀態(tài)有關(guān)的。它們是NEW、ESTABLISHED、RELATED和INVALID。使用--state匹配操作,我們能很容易地控制“誰或什么能發(fā)起新的會話”。
所有在內(nèi)核中由netfilter的特定框架做的連接跟蹤稱作conntrack(就是connection tracking的首字母縮寫)。conntrack可以作為模塊安裝,也可以作為內(nèi)核的一部分。大部分情況下,我們需要更詳細(xì)的連接跟蹤。因此,conntrack中有許多用來處理TCP、UDP或ICMP協(xié)議的部件。這些模塊從數(shù)據(jù)包中提取詳細(xì)的、唯一的信息,因此能保持對每一個數(shù)據(jù)流的跟蹤。這些信息也告知conntrack流當(dāng)前的狀態(tài)。例如,UDP流一般由他們的目的地址、源地址、目的端口和源端口唯一確定。
在以前的內(nèi)核里,我們可以打開或關(guān)閉重組功能。然而,自從iptables和netfilter,尤其是連接跟蹤被引入內(nèi)核,這個選項就被取消了。因為沒有包的重組,連接跟蹤就不能正常工作。現(xiàn)在重組已經(jīng)整合入conntrack,并且在conntrack啟動時自動啟動。不要關(guān)閉重組功能,除非你要關(guān)閉連接跟蹤。
除了本地產(chǎn)生的包由OUTPUT鏈處理外,所有連接跟蹤都是在PREROUTING鏈里進(jìn)行處理的,意思就是說iptables會在PREROUTING鏈里重新計算所有的狀態(tài)。如果我們發(fā)送一個流的初始化包,狀態(tài)就會在OUTPUT鏈里被設(shè)置為NEW,當(dāng)我們收到回應(yīng)的包時,狀態(tài)就會在PREROUTING鏈里被設(shè)置為ESTABLISHED。如果第一個包不是本地產(chǎn)生的,那就會在PREROUTING鏈里被設(shè)置為NEW狀態(tài)。綜上所述,所有狀態(tài)的改變和計算都是在nat表中的PREROUTING鏈和OUTPUT鏈里完成的。
正如前面說的,包的狀態(tài)依據(jù)IP所包含的協(xié)議不同而不同,但在內(nèi)核外部,也就是用戶空間里,只有4種狀態(tài):NEW、ESTABLISHED、RELATED和INVALID。它們主要是和狀態(tài)匹配一起使用。
NEW
NEW說明這個包是我們看到的第一個包。意思就是,這是conntrack模塊看到的某個連接第一個包,它即將被匹配了。比如,我們看到一個SYN包,是我們所留意的連接的第一個包,就要匹配它。第一個包也可能不是SYN包,但它仍會被認(rèn)為是NEW狀態(tài)。
ESTABLISHED
ESTABLISHED已經(jīng)注意到兩個方向上的數(shù)據(jù)傳輸,而且會繼續(xù)匹配這個連接的包。處于ESTABLISHED狀態(tài)的連接是非常容易理解的。只要發(fā)送并接到應(yīng)答,連接就是ESTABLISHED的了。一個連接要從NEW變?yōu)镋STABLISHED,只需要接到應(yīng)答包即可,不管這個包是發(fā)往防火墻的,還是要由防火墻轉(zhuǎn)發(fā)的。ICMP的錯誤和重定向等信息包也被看作是ESTABLISHED,只要它們是我們所發(fā)出的信息的應(yīng)答。
RELATED
RELATED是個比較麻煩的狀態(tài)。當(dāng)一個連接和某個已處于ESTABLISHED狀態(tài)的連接有關(guān)系時,就被認(rèn)為是RELATED的了。換句話說,一個連接要想是RELATED的,首先要有一個ESTABLISHED的連接。這個ESTABLISHED連接再產(chǎn)生一個主連接之外的連接,這個新的連接就是RELATED的了,當(dāng)然前提是conntrack模塊要能理解RELATED。ftp是個很好的例子,F(xiàn)TP-data 連接就是和FTP-control有RELATED的。
INVALID
INVALID說明數(shù)據(jù)包不能被識別屬于哪個連接或沒有任何狀態(tài)。有幾個原因可以產(chǎn)生這種情況,比如,內(nèi)存溢出,收到不知屬于哪個連接的ICMP錯誤信息。一般地,我們DROP這個狀態(tài)的任何東西。
這些狀態(tài)可以一起使用,以便匹配數(shù)據(jù)包。這可以使我們的防火墻非常強(qiáng)壯和有效。以前,我們經(jīng)常打開1024以上的所有端口來放行應(yīng)答的數(shù)據(jù)?,F(xiàn)在,有了狀態(tài)機(jī)制,就不需再這樣了。因為我們可以只開放那些有應(yīng)答數(shù)據(jù)的端口,其他的都可以關(guān)閉。這樣就安全多了。
通過文章我們知道Linux防火墻的IPtables設(shè)置與用法。希望本文對大家有幫助!
【編輯推薦】