了解了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。該文件初始的內容如下:
1 # Firewall configuration
2 *filter
3 :INPUT <target> [0:0]
4 :FORWARD <target> [0:0]
5 :OUTPUT <target> [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


