使用IPtables搭建防火牆的規則(轉)

amyz發表於2007-08-13
使用IPtables搭建防火牆的規則(轉)[@more@]

  瞭解了iptables的基本概念和用法,下面我們就開始正式使用iptables來建立我們的防火牆。啟動和停止iptables的方法取決於所使用的Linux發行版,你可以檢視所使用Linux版本的文件。在Red Hat中,啟動iptables用:

  #service iptables start

  一般情況下,iptables已經包含在了Linux發行版中,可以執行iptables --version來檢視系統是否安裝了iptables。在我使用的Fedora Core 1中,安裝的版本是iptables v1.2.8。如果你的系統確實沒有安裝iptables,那麼可以從以下地址下載:

  

  檢視規則集

  雖然上文對iptables的用法作一個簡單介紹,但現實中我們可能需要知道更完整的資訊,這時我們可以執行man iptables來檢視所有命令和選項的完整介紹,也可以執行iptables help來檢視一個快速幫助。要檢視系統中現有的iptables規劃集,可以執行以下命令:

  iptables list

  下面是沒有定義規劃時iptables的樣子:

  Chain INPUT (policy ACCEPT)

  target  prot opt source  destination

  Chain FORWARD (policy ACCEPT)

  target  prot opt source  destination

  Chain OUTPUT (policy ACCEPT)

  target  prot opt source  destination

  如上面的例子所示,每一個資料包都要透過三個內建的鏈(INPUT、OUTPUT和FORWARD)中的一個。 filter是最常用的表,上文所示設定所有的表規則的基本語法:iptables [-t table] command [match] [target]。

  現實中,不一定要用到這裡所列出的所有選項,也不一定是以這個順序。當然,這是一種慣例,因為規則一般都比較長,為了清晰起見,最好能夠按照這個順序。

  在沒有指定規則表的情況下,預設時使用的filter表。在filter表中最常用的三個目標是ACCEPT、DROP和REJECT。DROP會丟棄資料包,不再對其進行任何處理。REJECT會把出錯資訊傳送至傳送資料包的主機。雖然有時會有一些預想不到的影響,但在很多時候它還是非常有用。

  增加規則

  本例中的規則將會阻止來自某一特定IP範圍內的資料包,因為該IP地址範圍被管理員懷疑有大量惡意的攻擊者在活動:

  # iptables -t filter -A INPUT -s 123.456.789.0/24 -j DROP

  要了解有關iptables詳細的引數和命令格式,請使用man iptables檢視。可以說,現在我們對於網路上的惡意攻擊者已經深惡痛絕,但不管怎麼說,我們也不能因為憎恨它們就以同樣的方法對其實行簡單的報復,至少這種事情不能在你的網路裡發生。因此,我們也可以很輕易地阻止所有流向攻擊者IP地址的資料包,該命令也只是稍有不同:

  # iptables -t filter -A OUTPUT -d 123.456.789.0/24 -j DROP

  注意這裡的A選項,如前所述,使用它說明是給現有的鏈新增規則。

  刪除規則

  網路上的惡意攻擊者總是在變化著的,因此我們也要不斷改變IP。假設我們瞭解的一個網上攻擊者轉移到了新的IP地址,而其老的IP地址被分配給了一些清白的使用者,那麼這時這些使用者的資料包就無法透過你的網路了。這種情況下,我們可以使用帶-D選項的命令來刪除現有的規則:

  # iptables -t filter -D OUTPUT -d 123.456.789.0/24 -j DROP

  預設的策略

  建立一個具有很好靈活性,可以抵禦各種意外事件的規則需要花大量的時間。對於那些不想這樣做的人,最基本的原則就是“先拒絕所有的資料包,然後再允許需要的”。下面我們來為每一個鏈設定預設的規則:

  # iptables -P INPUT DROP

  # iptables -P FORWARD DROP

  # iptables -P OUTPUT ACCEPT

  這裡選項-P用於設定鏈的策略,只有三個內建的鏈才有策略。這些策略可以讓資訊毫無限制地流出,但不允許資訊流入。但很多時候,我們還是需要接收外部資訊的。這時可使用以下命令:

  # iptables -t filter -A INPUT -s 123.456.789.0/24 -j ACCEPT

  SYN的使用

  我們不能關閉所有的埠,那將會把我們自己完全“與世隔絕”。我們也不能只指定某些埠處於開啟狀態,因為我們無法預見哪一個埠將會被使用。事實上,只簡單地允許目的地為某一特定埠的資料流透過將對阻止惡意的攻擊毫無意義。那麼我們怎樣才能設定一個有效的規則,即可以允許普通使用者正常透過,又可以阻止惡意攻擊者訪問我們的網路呢?

  對於剛開始使用iptables的人,我們可以充分利用syn標識來阻止那些未經授權的訪問。因為iptables只檢測資料包的報頭,所以不會增加有效負荷。事實上,除iptables以外,很多其它有用的資料包分析都是基於報頭的。

  比如,在進行Web衝浪時,一個請求從你的PC傳送至其它某一個地方的Web伺服器之上,接著該伺服器就會響應請求並且向你發回一個資料包,並且得到你的系統上的一個臨時埠。與響應請求不同的是,伺服器並不關心你所傳送的內容。這們可以利用這種特點,來設定一個規則,讓它阻止所有沒有經過你的系統授權的TCP連線:

  # iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP

  這裡的-i指的是網路卡,-p則是指協議,--syn則表示帶有syn標識設定的TCP資料包。從中我們可以看出,對TCP/IP的瞭解將非常有利於維護網路安全。SYN用於初始化一個TCP連線,如果你在自己的機器上沒有執行任何伺服器,別人自然也就不會向你傳送SYN資料包了。

  就這點而言,有人會說:何必如此麻煩?的確,我們有更簡單的建立防火牆的方法,也有很多不錯的軟體也可以幫助我們來構建自己的規則集,但是我們應該清楚,最簡單的辦法,往往不是最好的方法。既然我們有更好的方法,為什麼不使用呢?

  共享一個Internet連線

  網路地址翻譯和IP偽裝都可以實現多臺主機共享一個Internet連線,而這個區域網可以是Linux和Windows系統組成的多系統區域網。假設現在我們有一臺機器有兩個網路卡,其中eth0為“公共”網路卡,eth1為“私有”網路卡。

  換句話說,eth0被分配了一個靜態的,可路由的IP地址,而eth1則被分配給了一個私有的、不能路由的IP,也就是說該IP是屬於該區域網子網的。要實現上述功能,我們需要向nat和filter表中新增一些鏈:

  # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

  # iptables -t filter -A FORWARD -i eth0 -o eth1 -m state --state

  RELATED,ESTABLISHED -j ACCEPT

  # iptables -t filter -A FORWARD -i eth1 -o eth0 -j ACCEPT

  這顯示了有狀態的資料包檢測的價值。請注意,我們這裡是如何實現流入資料包只有在屬於一個已經存在的連線時才被允許的,而所有來自區域網內流向外的資料包則都允許透過 (注意:這裡的filter是預設的表,但它並不是必須的)。第一條規則讓所有流出的資訊看起來都是來自防火牆機器的,而並不會顯示出防火牆後面還有一個區域網。

  下面的例子是為FORWARD和POSTROUTING鏈設定了預設的策略,在使用偽裝時,有一個預設的POSTROUTING DROP策略是非常重要的,否則,就有可能有心懷惡意的使用者突破閘道器後偽裝它自己的身份。

  # iptables -t filter -P FORWARD DROP

  # iptables -t nat -P POSTROUTING DROP

  下面的例子是為了撥號連線設定的,它可以動態地分配IP地址:

  # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

  規則的儲存

  使用指令碼更改規則的問題是:改動每個規則都要呼叫命令iptables,而每一次呼叫iptables,它首先要把netfilter核心空間中的整個規則集都提取出來,然後再插入或附加,或做其他的改動,最後,再把新的規則集從它的記憶體空間插入到核心空間中,這顯然會花費很多時間。

  為了解決這個問題,可以使用命令iptables-save和restore 。iptables-save用來把規則集儲存到一個特殊格式的文字檔案裡,而iptables-restore則用來把這個檔案重新裝入到核心空間中。

  這兩個命令最好的地方在於一次呼叫就可以裝載和儲存規則集,而不像指令碼中每個規則都要呼叫一次iptables。

  iptables-save執行一次就可以把整個規則集從核心裡提取出來,並儲存到檔案裡,而iptables-restore每次裝入一個規則表。換句話說,對於一個很大的規則集,如果用指令碼來設定,那這些規則就會反覆地被解除安裝、安裝很多次,而我們現在可以把整個規則集一次就儲存下來,安裝時則是一次一個表,這可是節省了大量的時間。所以,一旦測試結果令你滿意,你就可以將它們儲存為指令碼:

  # iptables-save > iptables-script

  現在,資訊包過濾表中的所有規則都被儲存在檔案iptables-script中。無論何時再次引導系統,都可以使用 iptables-restore 命令將規則集從該指令碼檔案恢復到資訊包過濾表,恢復指令如下所示:

  # iptables-restore iptables-script

  如果您願意在每次引導系統時自動恢復該規則集,則可以將上面指定的這條命令放到任何一個初始化shell指令碼中。

  事實上,大部分發行版都為使用者提供了一個可以自動載入的檔案,讓使用者在其中編輯規則集,並且大部分發行版都會有一個已經預先配置好的防火牆。不同的發行版的配置檔案位置不盡相同,我們可以使用命令locate iptables來找到配置檔案。對於Red Hat或者 Fedora Core而言,這個配置檔案位於/etc/sysconfig/iptables。該檔案初始的內容如下:

  1 # Firewall configuration

  2 *filter

  3 :INPUT [0:0]

  4 :FORWARD [0:0]

  5 :OUTPUT [0:0]

  6

  7 # your rules here

  8

  9 COMMIT

  建議將其基本框架改成以下內容:

  1 *filter

  2 :INPUT DROP [0:0]

  3 :FORWARD DROP [0:0]

  4 :OUTPUT ACCEPT [0:0]

  5

  6 # allow local loopback connections

  7 -A INPUT -i lo -j ACCEPT

  8

  9 # drop INVALID connections

  10 -A INPUT  -m state --state INVALID -j DROP

  11 -A OUTPUT -m state --state INVALID -j DROP

  12 -A FORWARD -m state --state INVALID -j DROP

  13

  14 # allow all established and related

  15 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

  16

  17 # add anymore rules here

  18

  19 COMMIT

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

相關文章