1. 程式人生 > >Linux防火墻之iptables

Linux防火墻之iptables

filter iptables 防火墻

簡 述

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

Netfilter與iptables的關系

Netfilter: 是指Linux內核中的一個框架,它可以用於在不同階段將某些鉤子函數(hook)作用域網絡協議棧。Netfilter本身並不對數據包進行過濾,它只是允許可以過濾數據包或修改數據包的函數連接到內核網絡協議棧中的適當位置,這些函數是可以自定義的,它屬於“內核態”的防火墻功能體系。

iptables: 是用戶層的工具,它提供命令行接口,能夠向Netfilter中添加規則策略,從而實現報文過濾,修改等功能。Linux系統中並不止有iptables能夠生成防火墻規則,其他的工具如firewalld等也能實現類似的功能。它通常位於/sbin/iptables目錄下,屬於“用戶態”的防火墻體系。

iptables 四表五鏈

iptables的作用是為包過濾機制的實現提供規則,通過各種不同的規則,告訴netfilter對來自某些源、前往某些目的或具有某些協議特征的數據包應該如何處理。為了方便地組織和管理防火墻規則,iptables采用了“表”和“鏈”的分層結構,其中,每個規則表相當於內核空間的一個容器,根據規則集的不同用途劃分為默認的四個表;在每個表容器內包含不同的鏈,根據數據包的不同時機劃分為五種鏈;而決定是否過濾或處理數據包的各種規則,按先後順序存放在各規則鏈中。

iptables 規則表

iptables根據功能分類,iptables共有4個表:filter、nat、mangle和raw;

filter表: 主要實現過濾功能,根據具體的規則要求決定如何處理一個數據包。filter表對應的內核模塊為iptable_filter,表內包含三個鏈,即INPUT、FORWARD、OUTPUT。

nat表: 實現Nat功能,主要用來修改數據包的IP地址、端口號等信息。nat表對應的內核模塊為iptable_nat,表內包含三個鏈,即PREROUTING /POSTROUTING/OUTPUT。

mangle表: 用於修改分組數據,mangle表對應的內核模塊為iptable_managle,表內包含五個鏈,即PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD。

raw表: 用來決定是否對數據包進行狀態跟蹤。raw表對應的內核模塊為iptable_raw,表內包含兩個鏈,即OUTPUT、PREROUTING。

iptables 規則鏈

每個表都有一組內置鏈,用戶還可以添加自定義的鏈,最重要的內置鏈是filter表中的額INPUT、OUTPUT和FORWARD鏈。

  • PREROUTING鏈: 在進行路由選擇前處理數據包
  • INPUT鏈: 處理流入的數據包
  • OUTPUT鏈: 處理流出的數據包
  • FORWARD鏈: 處理轉發的數據包
  • POSTROUTING鏈: 在進行路由選擇後處理數據包

一般從內網向外網發送的流量一般都是可控且良性的,因此我們使用最多的就是INPUT規則鏈,該規則鏈可以增大破壞人員從外網×××內網的難度。

其中,INPUT、OUTPUT鏈主要用在“主機型防火墻”中,主要針對服務器本身進行保護的防火墻;而FORWARD、PREROUTING、POSTROUTING鏈多用在“網絡型防火墻”中,主要用於網關服務器,在公司內網和Internet之間進行安全控制。

如下圖展現了一個數據包是如何通過內核中的net表和filter表的:

技術分享圖片

匹配過程

1. 規則表之間的順序

當數據包抵達防火墻時,將依次應用raw表、mangle表、nat表和filter表中的對應規則;

2. 規則鏈之間的順序

  • 入站數據流向: 來自外部的數據包到達防火墻後,首先被PREROUTING鏈處理(是否修改數據包地址等),然後進行路由選擇(判斷該數據包發往何處);如果數據包的目標地址是防火墻(如Internet用戶訪問網關的Web服務端口),那麽內核將其傳遞給INPUT鏈進行處理(決定是否允許通過等),通過以後再交給系統上層的應用程序(如httpd服務器)進行相應;
  • 轉發數據流向: 來自外部的數據包到達防火墻後,首先被PREROUTING鏈處理,然後再進行路由選擇;如何數據包的目標地址是其他外部地址(如局域網用戶通過網關用戶QQ服務器),則內核將其傳遞給FORWARD鏈進行處理(允許轉發或攔截、丟棄),最後交給POSTROUTING鏈進行處理(是否修改數據包的地址等);
  • 出站數據流向: 防火墻本機向外部地址發送的數據包(如在防火墻主機中測試公網DNS服務時),首先被OUTPUT鏈處理,然後進行路由選擇,再交給POSTROUTING鏈進行處理(是否處理數據包的地址等)。

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

當數據包經過每條規則鏈時,依次按第一條規則、第二條規則...的順序進行匹配和處理。鏈內的過濾遵循“匹配及停止”的原則,一旦找到了一條相匹配的規則,則不再檢查本鏈內後續的其他規則。如果對比完整個鏈,也找不到與數據包相匹配的規則,就按照規則鏈的默認策略進行處理。

編寫防火墻規則

基本命令格式

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

在iptables防火墻體系中,最常用的幾種控制類型:

  • ACCEPT:允許數據包通過;
  • DROP:直接丟棄數據包,不給出任何回應信息;
  • REJECT:拒絕數據包通過,必要時會給數據發送端一個響應信息;
  • LOG:在/var/log/message文件中記錄日誌信息,然後將數據包傳遞給下一條規則,防火墻規則的“匹配即停止”對於LOG操作是一個特例,因為LOG只是一種輔助動作,並沒有真正處理數據包。

管理規則基本操作

選項名 功能及特點
-A 在指定鏈的末尾添加一條新的規則(追加)
-I 在指定鏈中插入一條新的規則,未指定序號時默認作為第一條規則
-D 刪除指定鏈中的某一條規則,可指定規則序號或具體內容
-R 修改、替換指定鏈中的某一條規則,可指定規則序號或具體內容
-L 列出指定鏈中所有的規則,若未指定鏈名,則列出表中的所有鏈
-F 清空指定鏈中的所有規則,若未指定鏈名,則清空表中的所有鏈
-P 設置指定鏈的默認策略
--line-numbers 查看規則列表時,同時顯示規則在鏈中的順序號

舉例:

  1. 添加新規則,允許tcp協議通過

技術分享圖片

  1. 查看規則表

技術分享圖片

  1. 刪除規則

技術分享圖片

  1. 清空規則

技術分享圖片

  1. 設置默認策略
    默認策略是當找不到任何一條能夠匹配數據包的規則時,則執行默認策略。默認策略的控制類型為ACCEPT、DROP兩種。

規則的匹配條件

1. 通用匹配

可以獨立使用,不依賴於其他條件或擴展模塊。常見的有以下三種:

1) 協議匹配

使用“-p 協議名”指定,用來檢查數據包所使用的網絡協議,如tcp、udp、icmp和all等,支持協議可以查詢/etc/protocols文件。

例題:
丟棄通過icmp協議訪問防火墻本機的數據包,允許轉發經過防火墻的除icmp協議外的數據包?

技術分享圖片

2) 地址匹配

使用“-s 源地址”或“-d 目標地址”指定,用來檢查數據包的源地址或目的地址,IP地址、網段地址等都是支持的,但是不建議使用主機名、域名,因為解析過程會影響效率。

例題:
拒絕轉發源地址為192.168.100.10的數據,允許轉發源地址為192.168.1.0/24網段的數據?

技術分享圖片

3) 網絡接口匹配

使用“-i 接口名”和“-o 接口名”指定,用來檢查數據包從防火墻的哪一個接口進入或發出,分別對應入站網卡、出站網卡。

例題:
丟棄從外網接口(eth1)訪問防火墻本機且源地址為私有地址的數據包?

技術分享圖片

2. 隱含匹配

無法獨立使用,需要以指定的協議匹配作為前提條件,相當於子條件,其對應的功能由iptables在需要時自動(隱含)載入內核。常見的有以下三種:

1) 端口匹配

使用“--sport 源端口”或“--dport 目標端口”指定,主要針對TCP、UDP協議,用愛來檢查數據包的源端口、目標端口,單個端口號或以冒號“:”間隔的端口連續的端口範圍都是可以接受的。

例題:
允許轉發網段為192.168.1.0/24轉發DNS查詢數據包

技術分享圖片

2) ICMP類型匹配

使用“--icmp-type ICMP類型“的形式,針對的協議為ICMP,用來檢查ICMP數據包的類型(--icmp-type),ICMP類型使用字符串或數字代碼表示,如請求為“Echo-Request(代碼8)”、回顯為“Echo-Reply(代碼0)”、目標不可達為“Destination-Unreachable(代碼3)”。

例題:
禁止從其他主機ping本機,但是允許本機ping其他主機?

技術分享圖片

3. 顯示匹配

需要有額外的內核模塊提供支持,必須以“-m 模塊名稱”的形式調用相應的模塊,然後設置匹配條件。常見的有以下六種:

1) 多端口匹配

使用“-m multiport --dports 端口列表”、“-m multiport --sports”的形式,檢查數據包的源端口、目標端口,多端口時以逗號進行間隔。
例題:
允許本機開放25、80、110、143端口,以提供電子郵件服務?

技術分享圖片

2) IP範圍匹配

使用"-m iprange --src-range IP"、“-m iprange --dst-range IP"的形式,用來檢查數據包的源地址、目標地址。

例題:
禁止轉發源IP地址位於192.168.1.10 ~ 192.168.1.20之間的TCP數據包?

技術分享圖片

3) MAC地址匹配

使用“-m mac --mac-source MAC地址”的形式,用來檢查數據包的源MAC地址。

例題:
根據MAC地址封鎖主機,禁止其訪問本機的任何應用?

技術分享圖片

技術分享圖片

技術分享圖片

4) 狀態匹配

使用“-m state --state 連接狀態”的形式,基於iptables的狀態跟蹤機制用來檢查數據包的連接狀態。

例題:
只開放本機的web服務(80端口),但對發給本機的TCP應答數據包予以放行,其他入站數據包均丟棄?

技術分享圖片

5) 連接數限制

使用“-m connlimit [!] --connlimit-above N"限制同時連接數量

6) 基於時間控制

使用“-m time"

#匹配起始時間與結束時間
--datestart YYYY[-MM[[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

#根據時間和星期幾來匹配
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]

SNAT策略(源地址轉換)

SNAT是Linux防火墻的一種地址轉換操作,也是iptables命令中的一種數據包控制類型,其作用是根據指定條件修改數據包的源IP地址。

可以在網關中應用SNAT策略,解決局域網共享上網的問題,同時Internet中的服務器並不知道局域網PC的實際IP地址,中間的轉換完全由網關來完成,一定程度上保護了內部網絡的作用。

SNAT應用

待續寫中...

DNAT策略(目標地址轉換)

DNAT是Linux防火墻的另一種地址轉換操作,同樣也是iptables命令中的一種數據包控制類型,其作用是根據指定條件修改數據包的目標IP地址和目標端口。

可以應用於發布企業內部Web服務器。

DNAT應用

待續寫中...

規則導出、導入

iptables規則提供了批量導出與導入命令功能,即iptables-save和iptables-restore。

1. 規則導出

iptables-save #規則將被保存至/etc/sysconfig/iptables

iptables-save > /opt/iptables.20180613

2. 規則導入

#iptables-restore #規則將被保存至/etc/sysconfig/iptables

#iptables-restore < /opt/iptables.20180613

Linux防火墻之iptables