1. 程式人生 > >Linux防火牆詳解

Linux防火牆詳解

在Internet中,企業通過架設各種伺服器系統為使用者提供豐富多彩的網路應用,例如Web網站、電子郵件系統、FTP伺服器、資料庫系統等。那麼如何來保護這些特定的服務,過濾企業不需要的訪問甚至是惡意的入侵呢?使用防火牆正是強有力的防護措施之一。

1、Linux防火牆基礎

作為隔離內外網、過濾非法資料的有力屏障,防火牆通常按實現環境的不同分為硬體防火牆和軟體防火牆。硬體防火牆是功能專一的硬體裝置,具有比較全面的功能,其工作效率較高,但是加個昂貴,通常只應用於非常重要的主幹網路節點。而軟體防火牆的功能是由作業系統或軟體程式實現的,可以在Linux或者Windows等系統平臺構建軟體防火牆。軟體防火牆的價格優勢比較明顯,配置也相對靈活,如果設定得當,同樣可以實現硬體防火牆具有的功能和效率。Internet中有大量的企業網路在使用Linux系統搭建軟體防火牆

1.1>、Linux的防火牆體系主要工作在網路層,針對TCP/IP資料包實施過濾和限制,屬於典型的包過濾防火牆(或稱網路層防火牆)。Linux的防火牆體系基於核心編碼實現,因此具有非常穩定的效能和高效率,也因此被更加廣泛採納和應用。
●>Linux防火牆發展歷史
linux核心從很早的時候就實現了網路防火牆的功能,併為使用者提供了管理防火牆規則的命令工具。www.it165.net
>>>在2.0版本的核心中,包過濾機制是ipfw,管理防火牆規則的命令工具是ipfwadm。
>>>在2.2版本的核心中,包過濾機制是ipchain,管理防火牆規則的命令工具是ipchains。
>>>在2.4版本的核心開始,包過濾機制是netfiter,管理防火牆的命令工具是iptables。
本文以iptables作為主要命令工具,學習Linux防火牆的配置和使用。

●>netfiter與iptables

在許多關於防火牆的資料中,netfiter和iptables通常都可以用來指Linux防火牆,往往容易引起混淆。兩者的主要區別如下:
>>>netfiter:指的是Linux核心中實現包過濾防火牆的內部結構,不以程式或檔案的形式存在,屬於“核心態”(Kernel Space,又稱核心空間)的防火牆功能體系
>>>iptables: 指的是管理防火牆的命令工具,程式通常位於/sbin/iptables,屬於“使用者態”(User Space,又稱使用者空間)的防火牆管理體系。
1.2>、iptables的規則表、鏈結構

iptables的作用在於為包過濾的實現提供規則(或稱策略),通過各種不同的規則,告訴netfiter對來自有些源、前往某些目的地或具有某些協議特徵的資料包應該如何處理。為了更方便地組織和管理防火牆策略,iptables採用了“表”和“鏈”的分層結構。每個規則“表”相當於核心空間的一個容器,根據處理資料包的時機不同,表容器內包括不同的規則“鏈”。針對特定資料包的各種防火牆規則,按順序依次放入對應的規則“鏈”中。

◆規則表

按照防火牆策略的不同用途,iptables管理著四個不同的規則表,其功能分別由獨立的核心模組實現。

>>>filter表,包含三個規則鏈:INPUT,FORWARD,OUTPUT。

filter 表主要用於對資料包進行過濾,根據具體的規則決定是否放行該資料包。

filter 表對應的核心模組為 iptable_filter。

>>>nat表,包含三個規則鏈:PREROUTING,POSTROUTING,OUTPUT。

nat (Network Address Translation,網路地址轉換)表主要用於修改資料包的IP地址、埠號等資訊。

nat 表對應的核心模組為 iptable_nat。

>>>mangle表,包含五個規則鏈:PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。

mangle表主要用於修改資料包的TOS(Type Of Service,服務型別)、TTL(Time To Live,生存週期)指以及為資料包設定Mark標記,以實現Qos(Quality Of Service,服務質量)調整以及策略路由等應用,由於需要相應的路由裝置支援,因此應用並不廣泛。

mangle 表對應的核心模組為 iptable_mangle。

>>>raw表,包含兩條規則鏈:OUTPUT、PREROUTING。

raw表是自1.2.9以後版本的iptables新增的表,主要用於決定資料包是否被狀態跟蹤機制處理。在匹配資料包時,raw表的規則要優先於其他表。

raw表對應的核心模組為iptable_raw。

Ps:在iptables的四個規則表中,mangle表和raw的表應用相對較少,下面主要介紹filter表和nat表的防火牆應用。

規則鏈

在處理各種資料包時,根據防火牆規則的不同介入時機,iptables供涉及5種預設規則鏈,其應用時間點分別對應如下。

>>>INPUT鏈:當接收到防火牆本機地址的資料包(入站)時,應用此鏈中的規則。

>>>OUTPUT鏈:當防火牆本機向外傳送資料包(出戰)時,應用次鏈中的規則。

>>>FORWARD鏈:當接收到需要通過防火牆傳送給其他地址的資料包(轉發)時,應用次鏈中的規則。

>>>PREROUTING鏈:在對資料包作路由選擇之前,應用次鏈中的規則。

>>>POSTROUTING鏈:在對資料包作路由選擇之後,應用次鏈中的規則。

Ps:期中INPUT、OUTPUT鏈更多的應用在“主機防火牆”中,即主要針對伺服器本機進出資料的安全控制;而FORWARD、PREROUTING、POSTROUTING鏈更多的應用在“網路防火牆”中,特別是防火牆伺服器作為閘道器使用時的情況。

1.3>、資料包過濾匹配流程

在前面內容中,已經介紹過iptables管理的4個預設表和5種規則鏈,在每個表的規則鏈裡都可以設定防火牆規則,防火牆將根據這些規則來決定如何處理資料包。那麼,當網路資料包到達防火牆以後,會有限使用哪一個表、哪一個鏈裡的規則呢?資料包出入防火牆的規則匹配過程是怎樣的?下面從不同的角度依次介紹資料包過濾的匹配流程。

ⅰ>、規則表之間的優先順序

當資料包抵達防火牆時,將依次應用raw、mangle、nat和filter表中對應鏈內的規則(如果有的話)就像上圖;

ⅱ>、規則鏈之間的優先順序

由於預設規則鏈是根據規則介入時機進行分類的,因此優先順序直接取決於資料包的具體流程;

ⅰ>、入站資料流向: 來自外界的資料包到達防火牆後,首先被PREROUTING規則鏈處理(是否修改資料包地址等),之後會進行路由選擇(判斷該資料包應該發往何處),如果資料包的目標地址是防火牆本機(如Internet使用者訪問防火牆主機中的Web服務的資料包),那麼核心將其傳遞給INPUT鏈進行處理(決定是否允許通過等),通過以後再交給系統上層的應用程式(如httpd伺服器)進行響應。

ⅱ>、轉發資料流向:來自外界的資料包到達防火牆後,首先被PREROUTING規則處理,之後會進行路由選擇,如果資料包的目標地址是其他外部地址(如區域網使用者通過閘道器訪問QQ站點的資料包),則核心將其傳遞給FORWARD鏈進行處理(是否轉發或攔截),然後再講給POSTROUTING規則鏈(是否修改資料包的地址等)進行處理。

ⅲ>、出戰資料流向:防火牆本機向外部地址傳送的資料包(如在防火牆主機中測試公網DNS服務時),首先被OUTPUT規則鏈處理,之後進行路由選擇,然後傳遞給POSTROUTING規則鏈(是否修改資料包的地址等)進行處理。

1.4>、規則鏈內部各條防火牆規則之間的優先順序

在資料包經由各條規則鏈的處理過程中,依次按第1條規則、第2條規則、第3條規則.....的順序進行匹配和處理。如果找到一條能夠匹配該資料包的規則,則不會繼續檢查後面的規則(使用LOG記錄日誌的規則除外,下面iptables配置說明)。如果比對完整個規則鏈,也找不到和資料包相匹配的規則,就按照該規則鏈的預設策略進行處理。

2、管理和設定iptables規則

前面講解了linux防火牆的表、鏈結構,下面講述netfilter防火牆的管理工具——iptables命令的使用。

2.1 >、iptables的基本語法格式

使用iptables命令設定防火牆規則時,其基本的命令格式如下:

iptables [ -t 表名] 命令選項 [鏈名] [條件匹配] [-j 目標動作或跳轉]

其中,表名、鏈名用於指定iptables命令所操作的表和鏈,若未指定表名,將預設使用filter表;命令選項用於指定管理iptables規則的方式,如插入、增加、刪除以及檢視等;條件匹配用於指定對符合什麼樣條件的資料包進行處理;目標動作或跳轉用於知道資料包的處理方式,如允許通過、拒絕、丟棄或跳轉(jump)給其他鏈進行處理等。

2.2>、管理iptables規則

在管理iptables防火牆的過程中,首先需要考慮的就是如何檢視規則、新增規則、清空鏈內的規則等基本操作。


01.iptables 命令的管理控制選項 02.選項名     功能及特點 03.-A      在指定鏈的末尾新增(--append)一條新的規則 04.-D      刪除(--delete)指定鏈中的某一條規則,按規則序號或內容確定要刪除的規則 05.-I      在指定鏈中插入(--insert)一條新的規則,若未指定插入位置,則預設在鏈的開頭插入 06.-R      修改、替換(--replace)指定鏈中的某一條規則,按規則序號或內容確定要替換的規則 07.-L      列出(--list)指定鏈中的所有的規則進行檢視,若未指定鏈名,則列出表中所有鏈的內容 08.-F      清空(--flush)指定鏈中的所有規則,若未指定鏈名,則清空表中所有鏈的內容 09.-N      新建(--new-chain)一條使用者自己定義的規則鏈 10.-X      刪除指定表中使用者自定義的規則鏈(--delete-chain) 11.-P      設定指定鏈的預設策略(--policy) 12.-n      使用數字形式(--numeric)顯示輸出結果,若顯示主機的IP地址而不是主機名 13.-v      檢視規則列表時顯示詳細(--verbose)的資訊 14.-V      檢視iptables命令工具的版本(--Version)資訊 15.-h      檢視命令幫助資訊(--help) 16.--line-number   檢視規則列表時,同時顯示規則在鏈中的順序號

其中,新增、插入、刪除、清空規則和檢視規則是最常用的管理選項,下面通過例項的方式顯示部分選項的應用。
Α、新增及插入規則
eg     :在filter表的INPUT鏈的末尾新增一條防火牆規則。

[[email protected] ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT

eg :  在filter表的INPUT鏈中插入一條防火牆規則(此處省略了“-t filter”選項,按預設處理filter表)。
[[email protected] ~]# iptables -I INPUT -p udp -j ACCEPT

eg:   在filter表的INPUT鏈中插入一條防火牆規則(作為鏈中的第二條規則)。
[[email protected] ~]# iptables -I INPUT 2 -p icmp -j ACCEPT

B、檢視規則列表
eg:   檢視filter表INPUT鏈中的所有規則,同時顯示各條規則的順序號。(下面是對比圖)
[[email protected] ~]# iptables -L INPUT --line-numbers

[[email protected] ~]# iptables -L INPUT


C、刪除、清空規則

eg:   刪除filter表INPUT鏈中的第2條規則。


[[email protected] ~]# iptables -D INPUT 2

eg: 清空filter表、nat表、mangle表各鏈中的所有規則。

[[email protected] ~]# iptables -F             //不指定表名時預設清空filter表
[[email protected] ~]# iptables -t nat -F
[[email protected] ~]# iptables -t mangle -F

D、設定規則鏈的預設策略
最基本的兩種策略為ACCEPT(允許)、DROP(丟棄)。
eg:  將filter表中FORWARD規則鏈的預設策略設為DROP

[[email protected] ~]# iptables -t filter -P FORWARD DROP


eg: 清空filter表、nat表、mangle表各鏈中的所有規則。

1 2 3 [[email protected] ~]# iptables -F             //不指定表名時預設清空filter表 [[email protected] ~]# iptables -t nat -F [[email protected] ~]# iptables -t mangle -F

D、設定規則鏈的預設策略

最基本的兩種策略為ACCEPT(允許)、DROP(丟棄)。

eg:  將filter表中FORWARD規則鏈的預設策略設為DROP

1 [[email protected] ~]# iptables -t filter -P FORWARD DROP

E、獲得iptables相關選項用法的幫助資訊

eg:  檢視iptables命令中關於icmp協議的幫助資訊(在輸出內容的最後部分列出)。

1 [[email protected] ~]# iptables -p icmp -h

F、新增、刪除自定義規則鏈

eg:  在raw表中新增一條自定義的規則鏈,鏈名為TCP_PACKETS.

1 [[email protected] ~]# iptables -t raw -N TCP_PACKETS

eg:  清空raw表中的使用者自定義的所有規則鏈。

1 [[email protected] ~]# iptables -t raw -X

Ps:在iptables的規則表中,允許使用者自定義新的鏈。但是需要在預設的鏈中新增相應的跳轉策略(如“iptables -I INPUT ...... -j 自定義鏈名”),否則在處理資料包時將不會使用自定義鏈中的規則。後面會給個例子;好累~~~

2.3>、條件匹配

對於Linux防火牆來說,應該對什麼樣的資料包進行過濾,對什麼樣的資料包做地址轉換......,對於一條有效的防火牆策略來說,條件匹配的設定起著決定性的作用,Linux防火牆需要非常清楚的知道針對符合什麼條件的資料包進行什麼樣的處理。

區分資料包的條件匹配方式可以分為通用匹配、隱含匹配和顯式匹配,各種匹配條件可以結合在一起使用。

A、通過(general)條件匹配

這種匹配操作一般可以直接使用,而不依賴於其他的條件匹配及其擴充套件。常見的通用匹配方式包括以下集中。

>>>協議匹配。用於檢查資料包的網路協議(--protocal),允許使用的協議名包含在/etc/protocols檔案中,常見的為tcp、udp、icmp和all(針對所有IP資料包)。在iptables命令中使用“-p 協議名”的形式。

eg:  拒絕進入防火牆的所有icmp協議資料包。

1 [[email protected] ~]# iptables -I INPUT -p icmp -j REJECT

eg  :允許防火牆轉發除icmp協議以外的所有資料包(使用驚歎號"!"可以將除條件取反)。

1 [[email protected] ~]# iptables -A FORWARD ! -p icmp -j ACCEPT

>>>地址匹配。用於檢查資料包的IP地址、網路地址。在iptables命令中使用“-s 源地址”和“-d 目標地址”的形式,分別對應於源(--source)地址和目標(--destination)地址。

eg:  拒絕轉發來自192.168.1.11主機的資料,允許轉發來自192.168.0.0/24網段的資料。


[[email protected] ~]# iptables -A FORWARD -s 192.168.1.11 -j REJECT
[[email protected] ~]# iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT


>>>網路介面匹配。用於檢查資料包從防火牆的哪一個介面進入或離開。在iptables命令中使用“-i 網路介面名”和“-o 網路介面名”的形式,分別對應於接收資料包(--in-interface)的網絡卡和傳送資料包(--out-interface)的網絡卡

eg: 丟棄從外網介面(eth1)進入防火牆本機的源地址為私網地址的資料包。


[[email protected] ~]# iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
[[email protected] ~]# iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
[[email protected] ~]# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

eg: 管理員在閘道器伺服器上檢測到來自某個IP網段(如 10.20.30.0/24)的頻繁掃描,希望設定iptables規則封堵該IP地址段,兩小時後解封。


[[email protected] ~]# iptables -I INPUT -s 10.20.30.0/24 -j DROP
[[email protected] ~]# iptables -I FORWARD -s 10.20.30.0/24 -j DROP
[[email protected] ~]# at now +2 hours