用iptales實現包過慮型防火牆(一)(轉)

post0發表於2007-08-10
用iptales實現包過慮型防火牆(一)(轉)[@more@]

bye2000

本文版權由linuxAid和作者所有

摘要:本文介紹linux2.4.x核心中的防火牆工具--iptables的原理與配置,同時還給出了實際運用的例子,在文章的最後歸納了iptables與ipchains的區別。

一、 概述

從1.1核心開始,linux就已經具有包過慮功能了,在2.0的核心中我們採用ipfwadm來操作核心包過慮規則。之後在2.2核心中,採用了大家並不陌生的ipchains來控制核心包過慮規則。現在最新linux核心版本是2.4.1,在2.4核心中我們不再使用ipchains,而是採用一個全新的核心包過慮管理工具--iptables。 這個全新的核心包過慮工具將使使用者更易於理解其工作原理,更容易被使用,當然也將具有更為強大的功能。

我們說過iptables只是一個管理核心包過慮的工具,iptables 可以加入、插入或刪除核心包過濾表格(鏈)中的規則。實際上真正來執行這些過慮規則的是netfilter(Linux 核心中一個通用架構)及其相關模組(如iptables模組和nat模組),下面我們一起來看看 netfilter的工作原理。

二、 原理

netfilter是Linux 核心中一個通用架構,它提供了一系列的"表"(tables),每個表由若干"鏈"(chains)組成,而每條鏈中可以有一條或數條規則(rule)組成。我們可以這樣來理解,netfilter是表的容器,表是鏈的容器,而鏈又是規則的容器(如圖一所示)。

系統預設的表為"filter",該表中包含了INPUT、FORWARD和OUTPUT 3個鏈。每一條鏈中可以有一條或數條規則,每一條規則都是這樣定義的“如果資料包頭符合這樣的條件,就這樣處理這個資料包”。當一個資料包到達一個鏈時,系統就會從第一條規則開始檢查,看是否符合該規則所定義的條件: 如果滿足,系統將根據該條規則所定義的方法處理該資料包;如果不滿足則繼續檢查下一條規則。最後,如果該資料包不符合該鏈中任一條規則的話,系統就會根據該鏈預先定義的策略(policy)來處理該資料包。

資料包在filter表中的流程如圖二所示。有資料包進入系統時,系統首先根據路由表決定將資料包發給哪一條鏈,則可能有三種情況:

1. 如果資料包的目的地址是本機,則系統將資料包送往INPUT鏈,如果透過規則檢查,則該包被髮給相應的本地程式處理;如果沒透過規則檢查,系統就會將這個包丟掉;

2. 如果資料包的目的地址不是本機,也就是說,這個包將被轉發,則系統將資料包送往FORWARD鏈,如果透過規則檢查,則該包被髮給相應的本地程式處理;如果沒透過規則檢查,系統就會將這個包丟掉;

3. 如果資料包是由本地系統程式產生的,則系統將其送往OUTPUT鏈,如果透過規則檢查,則該包被髮給相應的本地程式處理;如果沒透過規則檢查,系統就會將這個包丟掉。

從以上我們可以看出,netfilter比起以前的ipfwadm和ipchains思路上清晰了好多,也好理解了好多,這對於原先對ipfwadm和ipchains總是感到一頭霧水的使用者來說無疑是一個福音。

三、 準備工作

1. 系統需求

netfilter要求核心版本不低於2.3.5,在編譯新核心時,要求選擇和netfilter相關的專案。這些專案通常都是位於“Networking options”子項下。以2.4.0核心為例,我們應該選中的專案有:

[*] Kernel/User netlink socket

[ ] Routing messages

Netlink device emulation

[*] Network packet filtering (replaces ipchains)

.......

然後,在“IP: Netfilter Configuration ----&gt”選中:

Connection tracking (required for masq/NAT)

FTP protocol support

IP tables support (required for filtering/masq/NAT)

limit match support

MAC address match support

Netfilter MARK match support

Multiple port match support

TOS match support

Connection state match support

Packet filtering

REJECT target support

Full NAT

MASQUERADE target support

REDIRECT target support

Packet mangling

TOS target support

MARK target support

LOG target support

ipchains (2.2-style) support

ipfwadm (2.0-style) support

其中最後兩個專案可以不選,但是如果你比較懷念ipchains或者ipfwadm,你也可以將其選中,以便在2.4核心中使用ipchians 或ipfwadm。但是需要注意的是,iptables是和ipchians/ipfwadm相對立的,在使用iptables的同時就不能同時使用 ipchains/ipfwadm。編譯成功後,這些模組檔案都位於以下目錄中

/lib/modules/2.4.0/kernel/net/ipv4/netfilter

編譯2.4.0的新核心時還應該注意要在“Processor type and features”中選擇和你的CPU相對應的正確的CPU選項,否則新核心可能無法正常工作。

2. 載入模組

要使用iptables,還必須載入相關模組。可以使用以下命令載入相關模組:

#modprobe iptable_tables

modprobe命令會自動載入指定模組及其相關模組。iptables_filter模組會在執行時自動載入。

三、 語法

1. 對鏈的操作

建立一個新鏈 (-N)。

刪除一個空鏈 (-X)。

改變一個內建鏈的原則 (-P)。

列出一個鏈中的規則 (-L)。

清除一個鏈中的所有規則 (-F)。

歸零(zero) 一個鏈中所有規則的封包位元組(byte) 記數器 (-Z)。

2. 對規則的操作

加入(append) 一個新規則到一個鏈 (-A)的最後。

在鏈內某個位置插入(insert) 一個新規則(-I),通常是插在最前面。

在鏈內某個位置替換(replace) 一條規則 (-R)。

在鏈內某個位置刪除(delete) 一條規則 (-D)。

刪除(delete) 鏈內第一條規則 (-D)。

3. 指定源地址和目的地址

透過--source/--src/-s來指定源地址(這裡的/表示或者的意思,下同),透過--destination/--dst/-s來指定目的地址。可以使用以下四中方法來指定ip地址:

a. 使用完整的域名,如“”;

b. 使用ip地址,如“192.168.1.1”;

c. 用x.x.x.x/x.x.x.x指定一個網路地址,如“192.168.1.0/255.255.255.0”;

d. 用x.x.x.x/x指定一個網路地址,如“192.168.1.0/24”這裡的24表明了子網掩碼的有效位數,這是 UNIX環境中通常使用的表示方法。

預設的子網掩碼數是32,也就是說指定192.168.1.1等效於192.168.1.1/32。

4. 指定協議

可以透過--protocol/-p選項來指定協議,比如-p tcp。

5. 指定網路介面將

可以使用--in-interface/-i或--out-interface/-o來指定網路介面。需要注意的是,對於INPUT鏈來說,只可能有-i,也即只會有進入的包;通理,對於OUTPUT鏈來說,只可能有-o,也即只會有出去的包。只有FORWARD鏈既可以有-i的網路介面,也可以有-o的網路介面。我們也可以指定一個當前並不存在的網路介面,比如ppp0,這時只有撥號成功後該規則才有效。

6. 指定ip碎片

在TCP/IP通訊過程中,每一個網路介面都有一個最大傳輸單元(MTU),這個引數定義了可以透過的資料包的最大尺寸。如果一個資料包大於這個引數值時,系統會將其劃分成更小的數個資料包(稱之為ip碎片)來傳輸,而接收方則對這些ip碎片再進行重組以還原整個包。

但是再進行包過濾的時候,ip碎片會導致這樣一個問題:當系統將大資料包劃分成ip碎片傳送時,第一個碎片含有完整的包頭資訊,但是後續的碎片只有包頭的部分資訊,比如源地址,目的地址。因此假如我們有這樣一條規則:

iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 --dport 80 -j ACCEPT

並且這時的FORWARD的策略(policy)為DROP時,系統只會讓第一個ip碎片透過,而丟掉其餘的ip碎片,因為第一個碎片含有完整的包頭資訊,可以滿足該規則的條件,而餘下的碎片因為包頭資訊不完整而無法滿足規則定義的條件,因而無法透過。

我們可以透過--fragment/-f選項來指定第二個及其以後的ip碎片,比如以上面的例子為例,我們可以再加上這樣一條規則來解決這個問題:

iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT

但是需要注意的是,現在已經有好多進行ip碎片攻擊的例項(比如向Win98 NT4/SP5,6 Win2K傳送大量的ip碎片進行DoS攻擊),因此允許ip碎片透過是有安全隱患的,對於這一點我們可以採用iptables的匹配擴充套件來進行限制,但是這又會影響服務質量,我們將在下面討論這個問題。

  

7. 指定非

可以在某些選項前加上!來表示非指定值,比如“-s -! 192.168.1.1/32”表示除了192.168.1.1以外的ip地址,“-p -! tcp”表示除了tcp以外的協議。

8. TCP匹配擴充套件

透過使用--tcp-flags選項可以根據tcp包的標誌位進行過濾,該選項後接兩個引數:第一個引數為要檢查的標誌位,可以是SYN, ACK,FIN,RST,URG,PSH的組合,可以用ALL指定所有標誌位;第二個引數是標誌位值為1的標誌。比如你要過濾掉所有SYN標誌位為1的 tcp包,可以使用以下規則:

iptables -A FORWARD -p tcp --tcp-flags ALL SYN -j DROP

選項--syn是以上的一種特殊情況,相當於“--tcp-flags SYN,RST,ACK SYN”的簡寫。

9. mac匹配擴充套件

可以使用-m選項來擴充套件匹配內容。使用--match mac/-m mac匹配擴充套件可以用來檢查ip資料包的源mac地址。只要在--mac-source後面跟上mac地址就可以了。比如:

iptables -A FORWARD -m mac --mac-source 00:00:BA:A5:7D:12 -j DROP

需要注意的是一個ip包在經過路由器轉發後,其源mac地址已經變成了路由器的mac地址。

10. limit匹配擴充套件

limit擴充套件是一個非常有用的匹配擴充套件。使用-m nat 來指定,其後可以有兩個選項:

--limit avg: 指定單位時間內允許透過的資料包的個數。單位時間可以是/second、/minute、/hour、/day或使用第一個字母,比如5/second和5/s是一樣的,都是表示每秒可以透過5個資料包,預設值是3/hour。

  --limit-burst number:指定觸發事件的閥值,預設值是5。

看起來好像有點複雜,就讓我們來看一個例子:

假設又如下的規則:

iptables -A INPUT -p icmp -m limit --limit 6/m --limit-burst 5 -j ACCEPT

iptables -P INPUT DROP

然後從另一部主機上ping這部主機,就會發生如下的現象:

首先我們可以看到前四個包的回應都很正常,然後從第五個包開始,我們每10秒可以收到一個正常的回應。這是因為我們設定了單位時間(在這裡是每分鐘)內允許透過的資料包的個數是每分鐘6個,也即每10秒鐘一個;其次我們又設定了事件觸發閥值為5,所以我們的前四個包都是正常的,只是從第五個包開始,限制規則開始生效,故只能每10秒收到一個正常回應。

假設我們停止ping,30秒後又開始ping,這時的現象是:

前兩個包是正常的,從第三個包開始丟包,這是因為在這裡我的允許一個包透過的週期是10秒,如果在一個週期內系統沒有收到符合條件的包,系統的觸發值就會恢復1,所以假如我們30秒內沒有符合條件的包透過,系統的觸發值就會恢復到3,假如5個週期內都沒有符合條件的包透過,系統都觸發值就會完全恢復。不知道你明白了沒有,歡迎你來信討論。

11. LOG目標擴充套件

netfilter預設的目標(也就是一旦滿足規則所定義以後系統對資料包的處理方法)有:

ACEEPT:接收並轉發資料包

DORP:丟掉資料包

目標擴充套件模組提供了擴充套件的目標。LOG目標提供了記錄資料包的功能。該目標擴充套件有以下幾個引數:

--log-level:指定記錄資訊的級別,級別有debug、info、notice、warning、err、crit、alert、emerg分別對應7到0的數字。其含義請參看syslog.conf的man手冊。

--log-prefix:後接一個最長為30個字元的字串,該字串將出現在每一條日誌的前面。

12. REJECT目標擴充套件

該目標擴充套件完全和DORP標準目標一樣,除了向傳送方返回一個“port unreachable”的icmp資訊外。

還有其他一些擴充套件是常用的,如果你想了解可以參考Packet-Filtering-HOWTO。當然,最直接獲得幫助的辦法是檢視 iptables的線上幫助,比如想得到關於mac匹配擴充套件的幫助可以執行“iptables -m mac -help”命令,想得到LOG目標擴充套件的幫助可以執行“iptables -j LOG -help”命令。

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

相關文章