1. 程式人生 > >iptables防火墻的基本配置

iptables防火墻的基本配置

iptables netfilter 包過濾防火墻 filter 楊書凡

在Internet中,通過架設各種服務器為用戶提供各種網絡服務,怎樣保護這些服務器,過濾惡意的訪問、入侵呢?這裏主要介紹Linux系統中的防火墻——netfilter和iptables,包括防火墻的結構和匹配流程,以及如何編寫防火墻規則


Linux防火墻基礎

Linux的防火墻體系主要工作在網絡層,針對TCP/IP數據包進行過濾和限制,屬於典型的包過濾防火墻。它基於內核編碼實現,具有非常穩定的性能和高效率,也因此得到了廣泛的應用。netfilter和iptables都可以用來指Linux防火墻,它們的區別如下:

netfilter:在Linux內核中實現防火墻的內部結構,不以文件或程序的形成存在,屬於“內核態”的防火墻功能體系

iptables:用來管理Linux防火墻的命令程序,通常位於/sbin/iptables目錄下,屬於“用戶態”的防火墻管理體系


1. iptables中的表、鏈結構(四表五鏈)

為了更加方便地組織和管理防火墻規則,iptables采用了“表”和“鏈”的分層結構,如下圖所示:

技術分享圖片


(1)規則表(四表)

iptables管理中四個不同的規則表,其功能分別由獨立的內核模塊實現。表的名稱、包含的鏈及用途如下:

filter表:用來對數據包進行過濾,確定是否放行,對應的內核模塊為iptables_filter,表中包含三個鏈,即INPUT、OUTPUT、FORWARD

nat表:網絡地址轉換,修改數據包中的源、目標IP地址或端口,內核模塊為iptables_nat,表中包含三個鏈,即PREROUTING、POSTROUTING、OUTPUT

mangle表:為數據包設置標記,以實現流量整形、策略路由等高級功能,內核模塊為iptables_mangle,表中包含五個鏈,即PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

raw表:確定是否對該數據包進行狀態跟蹤,內核模塊為iptables_raw,表中包含兩個鏈,即OUTPUT、PREROUTING


(2)規則鏈(五鏈)

在處理數據包時,根據防火墻規則的不同介入時機,默認劃分為五個不同的規則鏈,具體如下:

技術分享圖片INPUT:處理入站數據包

技術分享圖片OUTPUT:處理出站數據包

技術分享圖片FORWARD:處理轉發數據包

技術分享圖片POSTROUTING鏈:在進行路由選擇後處理數據包

技術分享圖片PREROUTING鏈:

在進行路由選擇前處理數據包


2. 數據包過濾的匹配順序

iptables管理著四表五鏈,各種規則依次存放在鏈中,那麽當一個數據包到達防火墻時,優先使用哪個表,哪個鏈中的規則?

(1)規則表之間的順序

當數據包抵達防火墻時,應用的順序為技術分享圖片raw——mangle——nat——filter(如果規則同時存在)


(2)規則鏈之間的順序

規則鏈之間的應用順序取決於數據包的流向,具體如下:

1)入站數據流向:(PREROUTING——INPUT)當外界的數據包到達防火墻時,首先被PREROUTING鏈處理,然後進行路由選擇,如果數據包的目標地址是本機,那麽就將其傳遞給INPUT鏈進行處理,通過以後交給上層的應用程序進行響應

2)轉發數據流向:(PREROUTING——FORWARD——POSTROUTING當外界的數據包到達防火墻時,首先被PREROUTING鏈處理,然後進行路由選擇,如果數據包的目標地址是其他外部地址,則將其傳遞給FORWARD鏈進行處理,最後交給POSTROUTING鏈進行處理

3)出站數據流向:(OUTPUT——POSTROUTING)防火墻本機向外部發送數據包時,首先被OUTPUT鏈處理,然後進行路由選擇,再交給POSTROUTING鏈進行處理

技術分享圖片


(3)規則鏈內部的各條防火墻規則匹配順序

技術分享圖片 當數據包經過每條規則鏈時,按順序依次檢查,匹配即停止(LOG策略例外),技術分享圖片若找不到相匹配的規則,則按該鏈的默認策略處理



編寫防火墻規則

1. iptables命令基本語法

基本的命令格式如下:

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

其中

表名、鏈名:指定iptables命令所操作的表和鏈,未指定時默認使用filter表

管理選項:表示iptables規則的操作方式,如增加、刪除、插入、查看等

匹配條件:指定要處理的數據包特征,不符合指定條件的數據包將不會處理

控制類型:指定數據包的處理方式,如允許、拒絕、丟棄等,常用的幾種控制類型如下

(1)ACCEPT:允許數據包通過

(2)DROP:直接丟棄數據包,不給任何回應信息

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

(4)LOG:在/var/log/messages文件中記錄日誌信息,然後將數據包傳遞給下一條規則,不必遵循“匹配即停止”的規則


2. iptables命令的基本操作

技術分享圖片

(1)添加新的規則

技術分享圖片-A:在鏈的末尾追加一條規則

技術分享圖片-I:在鏈的開頭(或指定序號)插入一條規則

[root@localhost ~]# iptables -A INPUT -p tcp -j ACCEPT         //在filter表INPUT鏈的末尾添加一條規則,允許TCP協議的數據包通過
[root@localhost ~]# iptables -I INPUT -p udp -j ACCEPT         //在filter表INPUT鏈的首行添加一條規則,允許UDP協議的數據包通過
[root@localhost ~]# iptables -I INPUT 2 -p icmp -j ACCEPT      //在filter表INPUT鏈的第二行添加一條規則,允許icmp協議的數據包通過


(2)查看規則列表

技術分享圖片-L:列出所有的規則條目,如未指定鏈名,則列出表中所有鏈

技術分享圖片-n:以數字形式顯示地址、端口等信息

技術分享圖片-v:以更詳細的方式顯示規則信息

技術分享圖片--line-numbers:查看規則時,顯示規則的序號

[root@localhost ~]# iptables -L INPUT --line-numbers         //查看filter表INPUT鏈的所有規則,並顯示規則序號
Chain INPUT (policy ACCEPT)
num  target     prot opt source        destination
1    ACCEPT     udp  --  anywhere      anywhere
2    ACCEPT     icmp --  anywhere      anywhere
3    REJECT     icmp --  anywhere      anywhere     reject-with icmp-port-unreachable
4    ACCEPT     tcp  --  anywhere      anywhere

[root@localhost ~]# iptables -nL INPUT                  //以數字形式查看filter表INPUT鏈的所有規則
Chain INPUT (policy ACCEPT)
target     prot opt source          destination
ACCEPT     udp  --  0.0.0.0/0       0.0.0.0/0
ACCEPT     icmp --  0.0.0.0/0       0.0.0.0/0
REJECT     icmp --  0.0.0.0/0       0.0.0.0/0       reject-with icmp-port-unreachable
ACCEPT     tcp  --  0.0.0.0/0       0.0.0.0/0


(3)刪除、清空規則

-D:刪除鏈內指定序號(或內容)的一條規則

技術分享圖片-F:清空所有的規則

[root@localhost ~]# iptables -D INPUT 3           //刪除filter表INPUT鏈的第三條規則
[root@localhost ~]# iptables -F INPUT             //清空filter表INPUT鏈所有的規則
[root@localhost ~]# iptables -F                   //清空filter表
[root@localhost ~]# iptables -t nat -F            //清空nat表
[root@localhost ~]# iptables -t mangle -F         //清空mangle表
[root@localhost ~]# iptables -t raw -F            //清空raw表


(4)設置默認策略

技術分享圖片-P:為指定的鏈設置默認規則

當找不到任何一條策略匹配數據包的規則時,將執行默認策略,默認策略的控制類型為ACCEPT、DROP

[root@localhost ~]# iptables -P FORWARD DROP      //將filter表FORWARD鏈的默認策略設為丟棄
[root@localhost ~]# iptables -P OUTPUT ACCEPT     //將filter表OUTPUT鏈的默認策略設為允許

當使用-F清空鏈時,默認策略不受影響;若要修改默認策略,必須通過-P重新設置


3. 規則的匹配條件

根據數據包的各種特性,結合iptables模塊,匹配條件的設置包括三大類:通用匹配、隱含匹配、顯式匹配

(1)通用匹配

也稱為常規匹配,可以獨立使用,不依賴於其他條件和擴展模塊,包括協議匹配、地址匹配、網絡接口匹配

1)協議匹配:“-p 協議名”,用來檢查數據包所使用的網絡協議,如tcp、udp、icmp、all(所有IP數據包)等

[root@localhost ~]# iptables -I INPUT -p icmp -j DROP                //丟棄通過icmp協議訪問本機的數據包
[root@localhost ~]# iptables -A FORWARD ! -p icmp -j ACCEPT             //允許轉發除了icmp協議之外的數據包

2)地址匹配:“-s 源地址”“-d 目標地址”,用來檢查數據包的源地址和目標地址,不建議使用主機名、域名(解析過程影響效率)

[root@localhost ~]# iptables -A FORWARD -s 192.168.1.11 -j REJECT        //拒絕轉發源地址為192.168.1.11的數據
[root@localhost ~]# iptables -I INPUT -s 10.20.30.0/24 -j DROP           //丟棄源網段為10.20.30.0/24訪問本機的數據

3)網絡接口匹配:“-i 入站網卡”“-o 出站網卡”,用來檢查數據包從防火墻的哪一個接口進入或發出

[root@localhost ~]# iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP     //丟棄從外網訪問本機且防火墻為私有地址的數據包
[root@localhost ~]# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
[root@localhost ~]# iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP


(2)隱含匹配

要求以指定的協議為前提條件,相當於子條件,因此無法獨立使用,常見的隱含匹配包括端口匹配、TCP標記匹配、ICMP類型匹配

技術分享圖片1)端口匹配:“--sport 源端口”“--dport 目的端口”,用來檢查數據包的源端口、目標端口,可以使用單個端口和以冒號分隔的端口範圍,不能使用多個不連續的端口

[root@localhost ~]# iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT   //允許為網段192.168.4.0/24網段轉發DNS查詢數據包
[root@localhost ~]# iptables -A FORWARD -d 192.168.4.0/24 -p udp --sport 53 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT             //允許通過訪問本機FTP服務的數據包

2)技術分享圖片TCP標記匹配:“--tcp-flags 檢查範圍 被設置的標記”,用來檢查TCP數據包的特定標誌,如SYN、ACK、FIN、RST等

[root@localhost ~]# iptables -A INPUT -p tcp  --tcp-flags ALL FIN,URG,PSH -j DROP        //防止Xmas掃描
[root@localhost ~]# iptables -A INPUT -p tcp  --tcp-flags ALL NONE -j DROP                //防止TCP Null掃描
[root@localhost ~]# iptables -A INPUT -p tcp  --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j DROP   //拒絕TCP標記為SYN/ACK,但連接狀態為NEW的數據包,防止ACK欺騙

3)技術分享圖片ICMP類型匹配:“--icmp-type ICMP類型”,用來檢查ICMP數據包的類型,如Echo-Request(代碼8)、Echo-Reply(代碼0)、Destination-Unreachable(代碼3)分別對應ICMP協議的請求、回顯、主機不可達

[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP          //禁止從其他主機ping本機,但允許本機ping其他主機
[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
[root@localhost ~]# iptables -p icmp -h                           //查看可用的ICMP協議類型


(3)顯式匹配

要求有額外的內核模塊提供支持,必須手動以“-m 模塊名稱”的形式調用相應的模塊,然後設置匹配條件。常見的顯式匹配包括多端口匹配、IP範圍匹配、MAC地址匹配、狀態匹配

[root@localhost ~]# lsmod | grep xt_                //查看相關的內核擴展模塊

技術分享圖片1)多端口匹配:“-m multiport --sport 源端口列表”“-m multiport --dport 目的端口列表”,多端口以逗號分隔

[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT     //允許本機開放25、80、110、143端口,以便提供電子郵件服務

2)技術分享圖片IP範圍匹配:“-m iprange --src-range IP範圍”“-m iprange --drc-range IP範圍”,檢查數據包的源、目的IP地址範圍

[root@localhost ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT    //允許轉發192.168.4.21與192.168.4.28之間的TCP數據包

3)技術分享圖片MAC地址匹配:“-m mac --mac-source MAC地址”,用於檢查數據包的源MAC地址,只適用於網絡內部

[root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP     //禁止其MAC地址訪問本機的任何應用

技術分享圖片4)狀態匹配:“-m state --state 連接狀態”,基於iptables的狀態跟蹤機制用來檢查數據包的連接狀態,如NEW(與任何連接無關的)、ESTABLISHED(響應請求或以建立連接的)、RELATED(與已有連接有相關性的)

[root@localhost ~]# iptables -I INPUT -p tcp -m state --state NEW -p tcp ! --syn -j DROP    //禁止轉發與正常TCP連接無關的--syn請求數據包,如偽造的網絡攻擊數據包

[root@localhost ~]# iptables -P INPUT DROP               //只開放本機的web服務,但對發給本機的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 -j ACCEPT



iptables防火墻的基本配置