Linux防火牆之IPtables概念與用法(轉)

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-947603/,如需轉載,請註明出處,否則將追究法律責任。

相關文章