Linux防火牆詳解

一、Linux防火牆基礎html

做爲隔離內外網、過濾非法數據的有力屏障,防火牆一般按實現環境的不一樣分爲硬件防火牆和軟件防火牆。硬件防火牆是功能專注的硬件設備,具備比較全面的功能,其工做效率較高,可是加個昂貴,一般只應用於很是重要的主幹網絡節點。而軟件防火牆的功能是由操做系統或軟件程序實現的,能夠在Linux或者Windows等系統平臺構建軟件防火牆。軟件防火牆的價格優點比較明顯,配置也相對靈活,若是設置得當,一樣能夠實現硬件防火牆具備的功能和效率。Internet中有大量的企業網絡在使用Linux系統搭建軟件防火牆node

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防火牆的配置和使用。linux

●>netfiter與iptables安全

在許多關於防火牆的資料中,netfiter和iptables一般均可以用來指Linux防火牆,每每容易引發混淆。二者的主要區別以下:
>>>netfiter:指的是Linux內核中實現包過濾防火牆的內部結構,不以程序或文件的形式存在,屬於「內核態」(Kernel Space,又稱內核空間)的防火牆功能體系
>>>iptables: 指的是管理防火牆的命令工具,程序一般位於/sbin/iptables,屬於「用戶態」(User Space,又稱用戶空間)的防火牆管理體系。
1.2>、iptables的規則表、鏈結構服務器

iptables的做用在於爲包過濾的實現提供規則(或稱策略),經過各類不一樣的規則,告訴netfiter對來自有些源、前往某些目的地或具備某些協議特徵的數據包應該如何處理。爲了更方便地組織和管理防火牆策略,iptables採用了「表」和「鏈」的分層結構。每一個規則「表」至關於內核空間的一個容器,根據處理數據包的時機不一樣,表容器內包括不一樣的規則「鏈」。針對特定數據包的各類防火牆規則,按順序依次放入對應的規則「鏈」中。網絡

◆規則表app

按照防火牆策略的不一樣用途,iptables管理着四個不一樣的規則表,其功能分別由獨立的內核模塊實現。ssh

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

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配置說明)。若是比對完整個規則鏈,也找不到和數據包相匹配的規則,就按照該規則鏈的默認策略進行處理。

二、管理和設置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鏈的末尾添加一條防火牆規則。

[root@node1 ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT

eg :  在filter表的INPUT鏈中插入一條防火牆規則(此處省略了「-t filter」選項,按默認處理filter表)。
[root@node1 ~]# iptables -I INPUT -p udp -j ACCEPT

eg:   在filter表的INPUT鏈中插入一條防火牆規則(做爲鏈中的第二條規則)。
[root@node1 ~]# iptables -I INPUT 2 -p icmp -j ACCEPT

B、查看規則列表
eg:   查看filter表INPUT鏈中的全部規則,同時顯示各條規則的順序號。(下面是對比圖)
[root@node1 ~]# iptables -L INPUT --line-numbers

[root@node1 ~]# iptables -L INPUT


C、刪除、清空規則

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


[root@node1 ~]# iptables -D INPUT 2

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

[root@node1 ~]# iptables -F             //不指定表名時默認清空filter表
[root@node1 ~]# iptables -t nat -F
[root@node1 ~]# iptables -t mangle -F

 

D、設置規則鏈的默認策略

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

eg:  將filter表中FORWARD規則鏈的默認策略設爲DROP

 

1
[root@node1 ~]# iptables -t filter -P FORWARD DROP

E、得到iptables相關選項用法的幫助信息

eg:  查看iptables命令中關於icmp協議的幫助信息(在輸出內容的最後部分列出)。

 

1
[root@node1 ~]# iptables -p icmp -h

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

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

 

1
[root@node1 ~]# iptables -t raw -N TCP_PACKETS

eg:  清空raw表中的用戶自定義的全部規則鏈。

 

1
[root@node1 ~]# 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
[root@node1 ~]# iptables -I INPUT -p icmp -j REJECT

eg  :容許防火牆轉發除icmp協議之外的全部數據包(使用驚歎號"!"能夠將除條件取反)。

1
[root@node1 ~]# iptables -A FORWARD ! -p icmp -j ACCEPT

 

>>>地址匹配。用於檢查數據包的IP地址、網絡地址。在iptables命令中使用「-s 源地址」和「-d 目標地址」的形式,分別對應於源(--source)地址和目標(--destination)地址。

eg:  拒絕轉發來自192.168.1.11主機的數據,容許轉發來自192.168.0.0/24網段的數據。


[root@node1 ~]# iptables -A FORWARD -s 192.168.1.11 -j REJECT
[root@node1 ~]# iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT


>>>網絡接口匹配。用於檢查數據包從防火牆的哪個接口進入或離開。在iptables命令中使用「-i 網絡接口名」和「-o 網絡接口名」的形式,分別對應於接收數據包(--in-interface)的網卡和發送數據包(--out-interface)的網卡

eg: 丟棄從外網接口(eth1)進入防火牆本機的源地址爲私網地址的數據包。


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

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


[root@node1 ~]# iptables -I INPUT -s 10.20.30.0/24 -j DROP
[root@node1 ~]# iptables -I FORWARD -s 10.20.30.0/24 -j DROP
[root@node1 ~]# at now +2 hours
at> iptables -D INPUT 1
at> iptables -D FORWARD 1
at><EOT>                             //此處按Ctrl+D組合鍵
job 4 at 2013-06-11 22:47

B、隱含(Implicit)條件匹配

這種匹配一般須要以指定的協議匹配爲前提,其對應的功能由iptables自動(隱含)的裝載入內核,通常不須要用戶收到加載模塊。常見的隱含匹配方式包括如下幾種。

>>>端口匹配。用於檢查數據包的TCP或UDP端口號,須要以「-p tcp」或「-p udp」匹配爲前提。在iptables命令中使用「--sport 源端口號」、「--dport 目標端口」的形式,分別對應於源端口(--source-port)、目標端口(--destination-port)。端口能夠表示爲單個端口號或者用冒號「:」分割的端口範圍。

eg:  僅容許系統管理員從202.13.0.0/16 網段使用SSH方式遠程登陸防火牆主機。

1
2
[root@node1 ~]# iptables -A INPUT -p tcp --dport  22  -s  202.13 . 0.0 / 16  -j ACCEPT
[root@node1 ~]# iptables -A INPUT -p tcp --dport  22  -j DROP

eg:  容許本機開放從TCP端口20-1024提供的應用服務

1
2
[root@node1 ~]# iptables -A INPUT -p tcp --dport  20 : 1024  -j ACCEPT
[root@node1 ~]# iptables -A OUTPUT -p tcp --sport  20 : 1024  -j ACCEPT

eg:  做爲網關使用時,容許轉發來自192.168.0.0/24局域網段的DNS解析請求數據包。

1
2
[root@node1 ~]# iptables -A FORWARD -s  192.168 . 0.0 / 24  -p udp --dport  53  -j ACCEPT
[root@node1 ~]# iptables -A FORWARD -d  192.168 . 0.0 / 24  -p udp --sport  53  -j ACCEPT

>>>、TCP標記匹配。用於檢查數據包的TCP標記位(--tcp-flags),須要以「-p tcp」匹配爲前提。在iptables命令中使用「--tcp-flags檢查範圍被設置的標記」的形式,兩個參數「檢查範圍」和「被設置的標記」均爲TCP標記的列表,各標記之間用逗號分割。「檢查範圍」告訴iptables須要檢查數據包的哪幾個標記,「被設置的標記」則明確匹配對應值爲1的標記。

eg:  拒絕從接口(eth0)直接訪問防火牆本機的數據包,可是容許響應防火牆TCP請求的數據包進入。

1
2
[root@node1 ~]# iptables -P INPUT DROP      //此命令執行當心,不提早設置經過ssh的話,你的遠程直接就斷開了
[root@node1 ~]# iptables -I INPUT -i eth0 -p tcp --tcp-flags SYN,RST,ACK SYN -j REJECT

>>>、ICMP類型匹配。用於檢查ICMP數據包的類型(--icmp-type),有選擇的過濾數據包,須要以「-p icmp」匹配爲前提。在iptables命令中使用「--icmp-type ICMP類型」的形式。ICMP類型可使用字符串或數字代碼,例如「Echo-Request」(數字代碼爲8)、「Echo-Reply」(數字代碼爲0)、「Destination-Unreachable」(數字代碼爲3),分別對應ICMP協議的請求、回顯、目標不可達數據。

eg:  禁止其餘主機ping防火牆主機,可是容許從防火牆上ping其餘主機(容許接受ICMP迴應數據)。

1
2
3
iptables -A INPUT -p icmp --icmp-type Echo-Request -j DROP
iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT

C、  顯式(Explicit)條件匹配

這種匹配的功能須要由額外的內核模塊提供,所以須要手工指定匹配方式。在iptables命令中使用「-m 模塊關鍵字」的形式調用顯式匹配,固然,還的指定對應的匹配內容。在使用過顯式匹配之後,能夠執行「lsmod |grep xt_」命令查看到擴展防火牆功能的相關內核模塊(如:xt_mac,xt_state,xt_multiport等)。常見的顯式匹配包括如下幾種。

>>>、MAC地址匹配。主要用於檢查數據包的源MAC地址。在iptables命令中使用「--mac-source MAC地址」的形式。

eg:  禁止轉發來自MAC地址爲3C-97-0E-77-7F-67(這是我本機的mac)的主機的數據包  

1
[root@node1 ~]# iptables -A FORWARD -m mac --mac-source 3C- 97 -0E- 77 -7F- 67  -j DROP

>>>、多端口匹配。檢查數據包的源端口、目標端口時,用於匹配多個不連續的端口號。在iptables命令中主要使用」--dports 端口列表「或者」--sports 端口列表「的形式,分別對應源端口地址列表、目標端口地址列表。

eg :  容許防火牆本機對外開放TCP端口20、2一、2五、110以及被動模式FTP端口1250-1280。

1
[root@node1 ~]# iptables -A INPUT -p tcp -m multiport --dport  20 , 21 , 25 , 110 , 1250 : 1280  -j ACCEPT

>>>、多IP地址匹配。檢查數據包的源地址、目標地址時,用於匹配一段範圍內的IP地址。在iptables命令中主要使用」--src-range IP地址範圍「或者」--dst-range IP地址範圍「的形式,分別對應源IP地址範圍、目標ip地址範圍。

eg: 禁止轉發源IP地址爲192.168.1.20~192.168.1.99 的TCP數據包。

1
[root@node1 ~]# iptables -A FORWARD -p tcp -m iprange --src-range  192.168 . 1.20 - 192.168 . 1.99  -j DROP

>>>、狀態匹配。基於iptables的狀態跟蹤機制,檢查數據包的連接狀態(State)。常見的數據包情況主要包括NEW(與任何鏈接無關的)、ESTABLISHED(響應請求或者已創建鏈接的)和RELATED(與已有鏈接有相關性的,如FTP數據鏈接)。

eg:  禁止轉發與正常TCP鏈接無關的非--syn請求數據包(如網絡中可能存在的一些非法攻擊數據包)。

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

eg : 拒絕訪問防火牆的新數據包,但容許響應鏈接或與已有鏈接相關的數據包。

1
2
[root@node1 ~]# iptables -A INPUT -p tcp -m state --state NEW -j DROP
[root@node1 ~]# iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

eg:  在服務器上設置防火牆策略,只開放本機的Web服務(80端口)、FTP服務(2一、20端口、20450~20480),放行外部主機發往服務器其餘端口的應答數據包,將其餘入站數據包均予以丟棄處理。

1
2
3
4
[root@node1 ~]# iptables -I INPUT -p tcp -m multiport --dport  20 , 21 , 80  -j ACCEPT
[root@node1 ~]# iptables -I INPUT -p tcp --dport  20450 : 20480  -j ACCEPT
[root@node1 ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
[root@node1 ~]# iptables -P INPUT DROP

2.4>、數據包控制

在上面經過一些iptables規則的實例,已經接觸到了如ACCEPT、DROP、REJECT等數據包控制方式。iptables對知足」條件匹配「指定條件的數據包,最常採用的處理方式以下。

>>>>>、ACCEPT    容許數據包經過。

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

>>>>>、REJECT     拒絕數據包經過,必須時會給數據發送端一個響應信息。

>>>>>、LOG         在/var/log/messages 文件中記錄日誌信息,而後將數據包傳遞給下一條規則。經過狀況下,只要在規則鏈中找到一條相匹配的規則,則再也不繼續檢查該鏈內後面的規則;但使用LOG處理方式的規則是一個特例,由於LOG只是一個輔助動做,並無真正的處理數據包。

eg:  對於嘗試經過SSH方式登陸防火牆主機的訪問數據,記錄日誌信息並禁止其訪問。

1
2
[root@node1 桌面]# iptables -I INPUT -p tcp --dport  22  -j DROP
[root@node1 桌面]# iptables -I INPUT -p tcp --dport  22  -j LOG

這個時候當我在ssh的時候,會發現以下截圖的狀況:

tail -f /var/log/messages 查看本機log發現

爲了不日誌記錄過於頻繁,經過結合LIMIT顯式匹配(-m limit)對日誌寫入頻繁進行限制。例如如下規則,用於將記錄日誌的頻率限制爲平均三次/分鐘,容許的峯值爲八次。

1
[root@node1 ~]# iptables -R INPUT  1  -p tcp --dport  22  -m limit --limit  3 /minute --limit-burst  8 -j LOG

>>>、 用戶自定義鏈 將數據包傳遞給用戶自定義的鏈(內的規則)進行處理。

eg:自定義一個新的鏈MY1,轉發自/至192.168.1.0/24網段的數據包均交給該鏈中的規則處理。

1
2
3
4
5
[root@node1 ~]# iptables -t filter -N MY1
[root@node1 ~]# iptables -A FORWARD -s  192.168 . 1.0 / 24  -j MY1
[root@node1 ~]# iptables -A FORWARD -d  192.168 . 1.0 / 24  -j MY1
[root@node1 ~]# iptables -A MY1 -p icmp -j DROP
[root@node1 ~]# .....接着能夠添加更多規則
相關文章
相關標籤/搜索