前面介紹了iptables的基本概念和用法,下面我們就開始正式使用iptables來創建我們的防火牆。啟動和停止iptables的方法取決於所使用的Linux發行版,你可以查看所使用Linux版本的文檔。在Red Hat中,啟動iptables用: #service iptables start 一般情況下,iptables已經包含在了Linux發行版中,可以運行iptables --version來查看系統是否安裝了iptables。在我使用的Fedora Core 1中,安裝的版本是iptables v1.2.8。如果你的系統確實沒有安裝iptables,那麼可以從以下地址下載: http://www.netfilter.org/
查看規則集 雖然上文對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