iptables防火牆

iptables防火牆

Linux防火牆基礎

Linux的防火牆體系主要工作在網絡層,針對TCP/IP數據包實施過濾和限制,屬於典型的包過濾防火牆(或稱網絡層防火牆)。Linux的防火牆體系基於內核編碼實現,具有非常穩定的性能和高效率,也因此獲得廣泛的應用。

在許多安全技術資料中,netfilter和iptables都用來指Linux防火牆。

netfilter和iptables的主要區別如下所述:

netfilter指的是Linux內核中實現包過濾防火牆的內部結構,不以程序或文件的形式存在,屬於“內核態”(KernelSpace,又稱內核空間)的防火牆功能體系。

iptables指的是用來管理Linux防火牆的命令程序,通常位於/sbin/iptables,屬於“用戶態”(User Space,又稱用戶空間)的防火牆管理體系。

niptables的表、鏈結構

iptables的作用是在於爲包過濾機制的實現提供規則(或稱策略),通過各種不同的規則,告訴netfilter對來自某些源、前往某些目的或具有某些協議特徵的數據包應該如何處理。爲了更加方便的組織和管理防火牆規則,iptables採用了“表”和“鏈”的分層結構。

其中每個規則“表”相當於內核空間的一個容器,根據規則集的用途不同劃分爲默認的四個表;在每個“表”容器內包括不同的規則“鏈”,根據處理數據包的時機不同劃分爲五種鏈;而決定是否過濾或處理數據包的各種規則,按先後順序存放在各規則鏈中。

1.規則表

爲了從規則集的功能上有所區別,iptables管理着四個不同的規則表,其功能分別由獨立的內核模塊實現。這四個表的名稱、包含的鏈、各自的用途如下所述:

filter表:filter表用來對數據包進行過濾,根據具體的規則要求決定如何處理一個數據包。filter表對應的內核模塊爲iptable_filter,表內包含三個鏈:INPUT、FORWARD、OUTPUT。

nat表:nat(Network Address Translation,網絡地址轉換)表主要用來修改數據包的IP地址、端口號信息。nat表對應的內核模塊爲iptable_nat,表內包含三個鏈:PREROUTING、POSTROUTING、OUTPUT。

mangle表:mangle表用來修飾數據包的TOS(Type Of Services,服務類型)、TTL(Time To Live,生存週期)值,或者爲數據包設置Mark標記,以實現流量整形、策略路由等高級應用。mangle表對應的內核模塊爲iptable_mangle,表內包含五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD。

raw表:raw表是自1.2.9以後版本的iptables新增的表,主要用來決定是否對數據包進行裝態跟蹤。raw表對應的內核模塊爲iptable_raw,表內包含兩個鏈:OUTPUT、PREROUTING。

2.規則鏈

在處理各種數據包時,根據防火牆規則的不同介入時機,iptables默認劃分爲五種不同的規則鏈。這五種鏈的名稱、各自的介入時機如下所述:

INPUT鏈:當收到訪問防火牆本機地址的數據包(入站)時,應用此鏈中的規則。

OUTPUT鏈:當防火牆本機向外發送數據包(出戰)時,應用此鏈中的規則。

FORWARD鏈:當接受到需要通過防火牆中轉發送給其他地址的數據包(轉發)時,應用此鏈中的規則。

PREROUTING鏈:在對數據包作路由選擇之前,應用此鏈中的規則。(對目標地址進行修改)

POSTROUTING鏈:在對數據包作路由選擇之後,應用此鏈中的規則。(對源地址進行修改)

其中INPUT、OUTPUT鏈主要用在“主機型防火牆”中,即主要針對服務器本機進行保護的防火牆;而FORWARD、PREROUTING、POSTROUTING鏈多用在“網絡型防火牆”中,例如使用Linux防火牆作爲網關服務器,在公司內網與Internet之間進行安全控制。

n數據包過濾的匹配流程

1.規則表之間的順序

當數據包抵達防火牆時,將依次應用raw、mangle、nat和filter表中對應鏈內的規則(如果有的話),應用順序爲:raw→mangle→nat→filter。

2.規則鏈之間的順序

根據規則鏈的劃分原則,不同鏈的處理時機是比較固定的,因此規則鏈之間的應用順序取決於數據包的流向,具體表述如下:

入站數據流向:來自外界的數據包到達防火牆後,首先被PERROUTING鏈處理(是否修改數據包地址等),然後進行路由選擇(判斷該數據包應發往何處);如果數據包的目標地址是防火牆本機(如Internet用戶訪問網關的Web服務端口),那麼內核將其傳遞給INPUT鏈進行處理(決定是否允許通過等),通過以後再交給系統上層的應用程序(如httpd服務器)進行響應。PREROUTING→INPUT

轉發數據流向:來自外界的數據包到達防火牆後,首先被PREROUTING鏈處理,然後再進行路由選擇;如果數據包的目標地址是其他外部地址(如局域網用戶通過網關訪問QQ服務器),則內核將其傳遞給FORWARD鏈進行處理(允許轉發或攔截、丟棄),最後交給POSTROUTING鏈(是否修改數據包的地址都等)進行處理。PREROUTING→FORWARD→POSTROUTING

出站數據流向:防火牆本機向外部地址發送的數據包(如在防火牆主機中測試公網DNS服務時),首先被OUTPUT鏈處理,然後進行路由選擇,再交給POSTROUTING鏈(是否修改數據包的地址等)進行處理。OUTPUT→POSTROUTING

3.規則鏈內部各條防火牆規則之間的順序

當數據包經過每條規則鏈時,依次按第1條規則、第2條規則、……的順序進行匹配和處理。鏈內的過濾遵循“匹配即停止”的原則,一旦找到一條相匹配的規則(使用LOG日誌操作的規則除外),則不再檢查本鏈內後續的其他規則。如果比對完整個鏈,也找不到和數據包相匹配的規則,就按照該規則鏈的默認策略進行處理。

*編寫防火牆規則

n基本語法、控制類型

使用iptables命令管理、編寫防火牆規則時,基本的命令格式如下:

iptables[-t表名]管理選項[鏈名][匹配條件][-j控制類型]

其中,表名、鏈名用來指定iptables命令所操作的表和鏈,未指定表名時將默認使用filter表;管理選項表示iptables規則的操作方式,如插入、增加、刪除、查看等;匹配條件用來指定要處理的數據包的特徵,不符合指定條件的數據包將不會處理;控制類型指定的是數據包的處理方式,如允許、拒絕、丟棄等。鏈名和控制類型必須大寫。

對於防火牆來說,數據包的控制類型非常關鍵,直接關係到數據包的放行、封堵以及做相應的日誌記錄等。在iptables防火牆體系中,最常用的幾種控制類型如下所述:

ACCEPT允許數據包通過

DROP直接丟棄數據包,不給出任何迴應信息

REJECT:拒絕數據包通過,必要時會給數據發送端一個響應信息

LOG在/var/log/messages文件中記錄日誌信息,然後將數據包傳遞給下一條規則。防火牆規則的“匹配即停止”原則對於LOG操作來說是一個特例,因爲LOG只是一種輔助動作,並沒有真正的處理數據包。

n添加、查看、刪除規則等基本操作

iptables的常用管理選項

選項名功能及特點

-A在指定鏈的末尾添加(--append)一條新的規則

-D刪除(--delete)指定鏈中的某一條規則,可指定規則序號

或具體內容

-I在指定鏈中插入(--insert)一條新的規則,未指定序號時

默認作爲第1條規則

-R修改、替換(--replace)指定鏈中的某一條規則,可指定

規則序號或具體內容

-L列出(--list)指定鏈中所有的規則,若未指定鏈名,則列

出表中的所有鏈

-F清空(--flush)指定鏈中的所有規則,若未指定鏈名,則

清空表中的所有鏈

-P設置指定鏈的默認策略(--policy)

-n使用數字形式(--numeric)顯示輸出結果,如顯示IP地址

而不是主機名

-v查看規則列表時顯示詳細(--verbose)的信息

-h查看命令幫助信息(--help)

-X刪除自定義的規則鏈(自定義的規則鏈必須鏈接上默認的則

鏈才能生效)

--line-numbers查看規則列表時,同時顯示規則在鏈中的順序號

1. 添加新的規則

添加新的防火牆規則時,使用管理選項“-A”、“-I”,前者用來追加規則,後者用來插入規則。例如,若要在filter表INPUT鏈的末尾添加一條防火牆規則,可以執行以下操作(其中“-p協議名”作爲匹配條件)

[root@localhost]#iptables -t filter -A INPUT -p tcp -jACCEPT

當使用管理選項“-I”時,允許同時指定新添加規則的順序號,未指定序號時默認作爲第1條。例如,以下操作添加的兩條規則將分別位於filter表的第1條、第2條(其中省略了“-t filter”選項,默認使用filter表)。

[root@localhost]#iptables-I INPUT-pudp-jACCEPT

[root@localhost]#iptables-I INPUT2-picmp-jACCEPT

2.查看規則列表

查看已有的防火牆規則時,使用管理選項“-L”,結合“—line-numbers”選項還可以顯示各條規則在鏈內的順序號。例如,若要查看filter表INPUT鏈中的所有規則,並顯示規則序號,可以執行以下操作。

[root@localhost]#iptables -L INPUT--line-numbers

當防火牆規則的數量較多時,若能夠以數字形式顯示地址和端口信息,可以減少地址解析的環節,在一定程度上加快命令執行的速度。例如,若要以數字地址形式查看filter表INPUT鏈中的所有規則,可以執行以下操作。

[root@localhost]#iptables-n-LINPUT//“-n -L”可合寫爲“-nL”

3.刪除、清空規則

刪除一條防火牆規則時,使用管理選項“-D”。例如,若要刪除filter表INPUT鏈中的第3條規則,可以執行以下操作。

[root@localhost]#iptables-DINPUT3

清空指定鏈或表中的多有防火牆規則,使用管理選項“-F”。例如,若要清空filter表INPUT鏈中的所有規則,可以執行以下操作。

[root@localhost]#iptables-FINPUT

使用管理選項“-F”時,允許省略鏈名而清空指定表所有鏈的規則。例如,以下操作分別用來filter表、nat表、mangle表。

[root@localhost]#iptables -F

[root@localhost]#iptables -t nat -F

[root@localhost]#iptables -t mangle -F

4.設置默認策略

iptables的各條鏈中,默認策略是規則匹配的最後一個環節——當找不到任何一條能夠匹配數據包的規則時,則執行默認策略。默認策略的控制類型爲ACCEPT(允許)、DROP(丟棄)這兩種。例如,以下操作可以將filter表中FORWARD鏈的默認策略設爲丟棄、OUTPUT鏈的默認策略設爲允許。

[root@localhost]#iptables -t filter -P FORWARD DROP

[root@localhost]#iptables -P OUTPUT ACCEPT

需要注意的是,當使用管理選項“-F”清空鏈時,默認策略不受影響。因此若要修改默認策略,必須通過管理選項“-P”重新進行設置。另外,默認策略並不參與鏈內規則的順序編排,因此在其他規則之前或之後設置並無區別。

n規則的匹配條件

在編寫防火牆規則時,匹配條件的設置起着決定性的作用。只有清晰、準確的設置好匹配條件,防火牆才知道要對符合什麼條件的數據包進行處理,避免“誤殺”。對於同一條防火牆規則,可以指定多個匹配條件,表示這些條件必須都滿足規則纔會生效。根據數據包的各種特徵,結合iptables的模塊結構,匹配條件的設置包括三大類:通用匹配、隱含匹配、顯示匹配。

1.通用匹配

通用匹配也稱爲常規匹配,這種匹配方式可以獨立使用,不依賴於其他條件或擴展模塊。常見的通用匹配包括協議匹配、地址匹配、網絡接口匹配。

1)協議匹配

編寫iptables規則時使用“-p 協議名”的形式指定,用來檢查數據包所使用的網絡協議(--protocol),如tcp、udp、icmp和all(針對所有IP數據包)等,可用的協議類型存放於Linux系統的/etc/protocols文件中。例如,若要丟棄通過icmp協議訪問防火牆本機的數據包、允許轉發經過防火牆的除icmp協議以外的數據包,可以執行以下操作。

[root@localhost]#iptables-IINPUT-picmp-jDROP

[root@localhost]#iptables-AFORWARD-p !icmp-jACCEPT

2)地址匹配

編寫iptables規則時使用“-s 源地址”或“-d 目標地址”的形式指定,用來檢查數據包的源地址(--source)或目標地址(--destination)。IP地址、網段地址等都是可以接受的,但不建議使用主機名、域名地址(解析過程會影響效率)。例如,若要拒絕轉發源地址爲192.168.1.11的數據、允許轉發源地址位於192.168.7.0/24網段的數據,可以執行以下操作。

[root@localhost]#iptables -A FORWARD -s 192.168.1.11 -jREJECT

[root@localhost]#iptables -A FORWARD -s 192.168.7.0/24 -jACCEPT

當遇到小規模的網絡掃描或***時,封IP地址是比較有效的方式。例如,若檢測到來自某個網段(10.20.30.0/24)的頻繁掃描、登錄窮舉等不良企圖,可立即添加防火牆規則進行封鎖。

[root@localhost]#iptables -I INPUT -s 10.20.30.0/24-j DROP

[root@localhost]#iptables -I FORWARD -s10.20.30.0/24-j DROP

3)網絡接口匹配

編寫iptables規則時使用“-i接口名”和“-o 接口名”的形式,用於檢查數據包從防火牆的哪一個接口進入或發出,分別對應入站網卡(--in-interface)、出戰網卡(--out-interface)。例如,若要丟棄從外網接口(eth1)訪問防火牆本機且源地址爲私有地址的數據包,可以執行以下操作。

[root@localhost]#iptables -A INPUT -i eth1 -s10.0.0.0/8-j DROP

[root@localhost]#iptables -A INPUT -i eth1 -s172.16.0.0/12-j DROP

[root@localhost]#iptables -A INPUT -i eth1 -s192.168.0.0/16-j DROP

2.隱含匹配

這種匹配方式要求以指定的協議匹配作爲前提條件,相當於子條件,因此無法獨立使用,其對應的功能由iptables在需要時自動(隱含)載入內核常見。常見的隱含匹配包括端口匹配、TCP標記匹配、ICMP類型匹配。

1)端口匹配

編寫iptables規則時使用“—sport 源端口”或“--dport 目標端口”的形式,針對的協議爲TCP或UDP,用來檢查數據包的源端口(--source-port)或目標端口(--destination-port)。單個端口號或者以冒號“:”分隔的端口範圍都是可以接受的,但不連續的多個端口不能採用這種方式。例如,若要允許爲網段192.168.4.0/24轉發DNS查詢數據包,可以執行以下操作:

[root@localhost]#iptables -A FORWARD -s 192.168.4.0/24 -pudp- -dport 53 -j ACCEPT

[root@localhost]#iptables -A FORWARD -d 192.168.4.0/24 -pudp- -sport 53 -j ACCEPT

再例如,構建vsftpd服務器時,若要開放20、21端口,以及用於被動模式的端口範圍24500-24600,可以參考以下操作設置防火牆規則。

[root@localhost]#iptables -A INPUT -p tcp --dport 20:21-j ACCEPT

[root@localhost]#iptables -A INPUT -p tcp --dport24500:24600 -j ACCEPT

2)TCP標記匹配

編寫iptables規則時使用“--tcp-flags 檢查範圍 被設置的標記”的形式,針對的協議爲TCP,用來檢查數據包的標記位(--tcp-flags)。其中“檢查範圍”指出需要檢查數據包的哪幾個標記,“被設置的標記”則明確匹配對應值爲1的標記,多個標記之間以逗號進行分隔。例如,若要拒絕從外網接口(eth1)直接訪問防火牆本機的TCP請求,但其他主機發給防火牆的TCP響應等數據包允許,可以執行以下操作。

[root@localhost]#iptables -P INPUT DROP

[root@localhost]#iptables -I INPUT -i eth1 -p tcp--tcp-flags SYN,RST,ACK SYN -j DROP

[root@localhost]#iptables–I INPUT -i eth1 -p tcp--tcp-flags ! --syn -j ACCEPT

上述防火牆規則操作中,“--syn”的用法是兼容舊版本iptables的形式,等同於第二條規則中“--tcp-flagsSYN,RST,ACK SYN”。

3)ICMP類型匹配

編寫iptables規則時使用“--icmp-type ICMP 類型”的形式,針對的協議爲ICMP,用來檢查ICMP數據包的類型(--icmp-type)。ICMP類型使用字符串或數字代碼表示,如“Echo-Request”(代碼爲8)、“Echo-Reply”(代碼爲0)、“Destination-Unreachable”(代碼爲3),分別對應ICMP協議的請求、回顯、目標不可達。例如,若要禁止從其他主機ping本機,但是允許本機ping其他主機,可以執行以下操作。

[root@localhost]#iptables -A INPUT -p icmp --icmp-type 8-j DROP

[root@localhost]#iptables -A INPUT -p icmp --icmp-type 0-j ACCEPT

[root@localhost]#iptables -A INPUT -p icmp --icmp-type 3-j ACCEPT

[root@localhost]#iptables -A INPUT -p icmp -j DROP

關於可用的ICMP協議類型,可以執行“iptables -p icmp -h”命令,在幫助信息的最後部分列出了所有支持的類型。

[root@localhost]#iptables -p icmp -h

3.顯示匹配

這種匹配方式要求有額外的內核模塊提供支持,必須手動以“-m 模塊名”的形式調用相應的模塊,然後方可設置匹配條件。添加了帶顯示匹配條件的規則以後,可以執行“lsmod | grepxt_”命令查看到相關的內核擴展模塊(如xt_multiport、xt_iptrange、xt_mac、xt_state)。常見的顯示匹配包括多端口匹配、IP範圍匹配、MAC地址匹配、狀態匹配。

1)多端口匹配

編寫iptables規則時使用“-m multiport --dport 端口列表”、“-m multiport--sport 端口列表”的形式,用來檢查數據包的源端口、目標端口,多個端口之間以逗號進行分隔。例如,若要允許本機開放25、80、110、143端口,以便提供電子郵件服務,可以執行以下操作。

[root@localhost]#iptables -A INPUT -p tcp -m multiport--dport 25,80,110,143 -j ACCEPT

2)IP範圍匹配

編寫iptables規則時使用“-m iprange --src-range IP範圍”、“-m iprange–dst-rangeIP範圍”的形式,用來檢查數據包的源地址、目標地址,其中IP範圍採用“起始地址—結束地址”的形式表示。例如,若要禁止轉發源IP地址位於192.168.4.21與192.168.4.28之間的TCP數據包,可以執行以下操作。

[root@localhost]#iptables -A FORWARD -p tcp -m iprange--src-range 192.168.4.21-192.168.4.28 -j ACCEPT

3)MAC地址狀態

編寫iptables規則時使用“-m mac --mac-source MAC地址”的形式,用來檢查數據包的源MAC地址。由於MAC地址本身的侷限性,此類匹配條件一般只適用於內部網絡。例如,若要根據MAC地址封鎖主機,禁止其訪問本機的任何應用,可以參考以下操作。

[root@localhost]#iptables–A INPUT –m mac --mac-source 00:0c:29:c0:55:3f-j DROP

4)狀態匹配

編寫iptables規則時使用“-m state --state 連接狀態”的形式,基於iptables的狀態機制用來檢查數據包的連接狀態(state)。常見的連接狀態包括NEW(與任何連接無關的)、SETABLISHED(響應請求或者已建立連接的)和RELATED(與已有連接有相關性的,如FTP數據連接)。例如,如要禁止轉發與正常TCP連接無關的非- -syn請求數據包(如僞造的一些網絡***數據包),可以執行以下操作。

[root@localhost]#iptables -A FORWARD -m state --state NEW-p tcp !--syn -j DROP

再例如,若只開放本機的Web服務(80端口),但對發給本機的TCP應答數據包予以放行,其他入站數據包均丟棄,則對應的入站控制規則可參考以下操作。

[root@localhost]#iptables–I INPUT -p tcp -m multiport--dport 80 -j ACCEPT

[root@localhost]#iptables -I INPUT -p tcp -m state--state ESTABLISHED,RELATED -j ACCEPT

[root@localhost]#iptables -P INPUT DROP

保存:service iptables save

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章