天天看點

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

儲存:service iptables save

繼續閱讀