如何使用netfilter/iptables構建防火牆

 

對於Internet上的系統,不管是什麼情況都要明確一點:網絡是不安全的。因此,雖然創建一個防火牆並不能保證系統100%安全,但卻是絕對必要的。Linux提供了一個非常優秀的防火牆工具—netfilter/iptables。它完全免費、功能強大、使用靈活、可以對流入和流出的信息進行細化控制,且可以在一臺低配置機器上很好地運行。本文將簡單介紹使用netfilter/iptables實現防火牆架設和Internet連接共享等應用。

netfilter/iptabels應用程序,被認爲是Linux中實現包過濾功能的第四代應用程序。netfilter/iptables包含在2.4以後的內核中,它可以實現防火牆、NAT(網絡地址翻譯)和數據包的分割等功能。netfilter工作在內核內部,而iptables則是讓用戶定義規則集的表結構。netfilter/iptables從ipchains和ipwadfm(IP防火牆管理)演化而來,功能更加強大。下文將netfilter/iptabels統一稱爲iptables。

可以用iptables爲Unix、Linux和BSD個人工作站創建一個防火牆,也可以爲一個子網創建防火牆以保護其它的系統平臺。iptales只讀取數據包頭,不會給信息流增加負擔,也無需進行驗證。要想獲得更好的安全性,可以將其和一個代理服務器(比如squid)相結合。

基本概念

典型的防火牆設置有兩個網卡:一個流入,一個流出。iptables讀取流入和流出數據包的報頭,將它們與規則集(Ruleset)相比較,將可接受的數據包從一個網卡轉發至另一個網卡,對被拒絕的數據包,可以丟棄或按照所定義的方式來處理。

通過向防火牆提供有關對來自某個源地址、到某個目的地或具有特定協議類型的信息包要做些什麼的指令,規則控制信息包的過濾。通過使用iptables系統提供的特殊命令iptables建立這些規則,並將其添加到內核空間特定信息包過濾表內的鏈中。關於添加、去除、編輯規則的命令,一般語法如下:

iptables [-t table] command [match] [target]

1.表(table)

[-t table]選項允許使用標準表之外的任何表。表是包含僅處理特定類型信息包的規則和鏈的信息包過濾表。有三個可用的表選項:filter、nat和mangle。該選項不是必需的,如果未指定,則filter作爲缺省表。各表實現的功能如表1所示。

278843.jpg

表1 三種表實現的功能

2.命令(command)

command部分是iptables命令最重要的部分。它告訴iptables命令要做什麼,例如插入規則、將規則添加到鏈的末尾或刪除規則。表2是最常用的一些命令及例子。

278844.jpg

表2 命令的功能和樣例

3.匹配(match)

iptables命令的可選match部分指定信息包與規則匹配所應具有的特徵(如源地址、目的地址、協議等)。匹配分爲通用匹配和特定於協議的匹配兩大類。這裏將介紹可用於採用任何協議的信息包的通用匹配。表3是一些重要且常用的通用匹配及示例說明。

278845.jpg

表3 通用匹配及示例說明

4.目標(target)

目標是由規則指定的操作,對與那些規則匹配的信息包執行這些操作。除了允許用戶定義的目標之外,還有許多可用的目標選項。表4是常用的一些目標及示例說明。

除表4外,還有許多用於建立高級規則的其它目標,如LOG、REDIRECT、MARK、MIRROR和MASQUERADE等。

278846.jpg

表4 目標及示例說明

應用iptables

與ipchains和ipfwadm不同的是,iptables可以配置有狀態的防火牆。iptables可以檢測到源地址和目的地址、源端口和目的端口及流入數據包的順序,即iptables記住了在現有連接中,哪些數據包已經被允許接收。這使得暫時性的端口只有在需要時纔會被打開,並且會拒絕所有永久性佔用端口的請求,大大地加強了安全性。同時,那些被更改了報頭的數據包,即使包含有一個被允許的目的地址和端口,也會被檢測到並被丟棄。此外,有狀態的防火牆能夠指定並記住爲發送或接收信息包所建立連接的狀態。防火牆可以從信息包的連接跟蹤狀態獲得該信息。在決定新的信息包過濾時,防火牆所使用的這些狀態信息可以增加其效率和速度。

1.啓動和停止iptables

下面將正式使用iptables來創建防火牆。啓動和停止iptables的方法取決於所使用的Linux發行版,可以先查看所使用Linux版本的文檔。

一般情況下,iptables已經包含在Linux發行版中,運行iptables --version來查看系統是否安裝了iptables。在Red Hat 9.0中,安裝的版本是iptables v1.2.7a。如果系統沒有安裝iptables,則可以從http://www.netfilter.org下載。

2.查看規則集

上面僅對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是最常用的表,在filter表中最常用的三個目標是ACCEPT、DROP和REJECT。DROP會丟棄數據包,不再對其進行任何處理。REJECT會把出錯信息傳送至發送數據包的主機。

278847.gif

圖1 Red Hat 9.0中安全設置的GUI工具

在Red Hat 9.0中,提供一個GUI程序來讓用戶對系統的安裝級別進行簡單的配置。該工具的啓動方法是:主選單→系統設置→安全工具(如圖1所示)。在此將安全級別設爲“高級”,並選擇使用默認的防火牆規則。點擊確定後,再用iptables -list顯示,發現iptables與沒有定義規則前已經有很大不同,如下所示:

[root@workstation root]# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
RH-Lokkit-0-50-INPUT  all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
RH-Lokkit-0-50-INPUT  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
......

現實中一般不使用這個GUI工具,因爲它的功能有限,也不夠透明。相比較而言,SuSE 9.0中相應的配置工具要好得多,它可以在GUI下對防火牆進行更加細化的配置(比如增加了IP轉發和僞裝等功能的配置)。儘管這樣,一般還是自己來增加和刪除規則。

278848.gif

圖2 SuSE 9.0中YaST配置工具中的防火牆設置

3.增加規則

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

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

也可以很輕易地阻止所有流向攻擊者IP地址的數據包,該命令稍有不同:

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

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

4.刪除規則

網絡上的惡意攻擊者總是在變化的,因此需要不斷改變IP。假設一個網上攻擊者轉移到新的IP地址,而其老的IP地址被分配給一些清白的用戶,那麼這時這些用戶的數據包將無法通過你的網絡。這種情況下,可以使用帶-D選項的命令來刪除現有的規則:

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

5.缺省的策略

創建一個具有很好靈活性、可以抵禦各種意外事件的規則需要大量的時間。對於那些沒有時間這樣做的人,最基本的原則是“先拒絕所有的數據包,然後再允許需要的”。下面來爲每一個鏈設置缺省的規則:

# 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

6.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數據包。SYN用於初始化一個TCP連接,如果自己機器上沒有運行任何服務器,別人也就不會向你發送SYN數據包。

7.有狀態的數據包的檢測

前邊的例子把每一個數據包看成是獨立的,而不是相互關聯的,依靠的是數據包的頭信息。iptables會檢查數據包的源和目的IP地址、源和目的端口、流入數據包的順序號、TCP先後順序的信息及頭標記(SYN、ACK、FIN、RST等)的狀態,即它會跟蹤整個連接會話,從而使整個過濾過程是相互關聯的。

8.共享一個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

這顯示了有狀態的數據包檢測的價值。請注意,這裏是如何實現流入數據包只有在屬於一個已經存在的連接時才被允許,而所有來自局域網內流向外的數據包則都允許通過。第一條規則讓所有流出的信息看起來都是來自防火牆機器的,而並不會顯示出防火牆後面還有一個局域網。

下面的命令爲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

9.運行服務器時的情況

有時也會把服務器放置在防火牆後面,這時iptables就需要知道從哪兒通過數據包,設置如下所示:

# iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 80 -j DNAT -to 192.168.0.10:80
# iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 25 -j DNAT -to 192.168.0.11:25

10.規則的保存

到現在爲止,所有的例子都是在命令行中進行的。在測試新的規則時,這是一種很好的方式,但一旦測試結果令人滿意,就可以將它們保存爲腳本。可以使用 iptables-save 命令來實現:

$ iptables-save > iptables-script

信息包過濾表中的所有規則都被保存在文件iptables-script中。無論何時再次引導系統,都可以使用iptables-restore命令將規則集從該腳本文件恢復到信息包過濾表。恢復命令如下所示:

$ iptables-restore iptables-script

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

下面的例子並不是一個完整的腳本,它只是描述瞭如何使用變量及提供了一些附加的規則樣例。

#!/bin/sh
#爲變量賦值
IPTABLES=/sbin/iptables
LAN_NET="192.168.1.0/24"
IFACE= "eth0"
LO_IFACE="lo"
LO_IP="127.0.0.1"
#加載所需的內核
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_nat
#缺省情況下,IP轉發都處於不可用狀態,將其設置爲可用狀態:
echo "1" > /proc/sys/net/ipv4/ip_forward
#使IP的動態分配功能可用
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
#每次重啓這個腳本時,最好清除以前所設的規則
$IPTABLES -P INPUT DROP
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD DROP
$IPTABLES -F FORWARD
$IPTABLES -F -t nat
#只允許在LAN中使用SSH連接
$IPTABLES -A INPUT -s LAN_NET -p tcp --destination-port ssh -j ACCEPT
#允許loopback!
$IPTABLES -A INPUT -i lo -p all -j ACCEPT
$IPTABLES -A OUTPUT -o lo -p all -j ACCEPT
#丟棄那些流入的宣稱是來自本地機器的數據包
#丟棄那些流出的不是出自本地機的數據包
$IPTABLES -A INPUT -i $IFACE -s $LAN_NET -j DROP
$IPTABLES -A OUTPUT -o $IFACE -s ! $LAN_NET -j DROP
#限制一些流出的信息
$IPTABLES -A OUTPUT -o eth0 -p tcp -dport 31337 -j DROP
$IPTABLES -A OUTPUT -o eth0 -p tcp -sport 31337 -j DROP
#此外,31335、27444、27665、20034 NetBus、9704、137-139(smb)端口也應被禁止。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章