1. 程式人生 > 其它 >Linux中的防火牆netfilter/iptables簡介

Linux中的防火牆netfilter/iptables簡介

一、Linux防火牆基礎

1.1 ptables的表、鏈結構

1.1.1 Linux包過濾防火牆概述

Inetfilter

位於Linux核心中的包過濾功能體系
稱為Linux防火牆的"核心態"
iptables

位於/sbiniptables,用來管理防火牆規則的工具
稱為Linux防火牆的"使用者態"
上述2種稱呼都可以表示Linux防火牆

1.2 資料包控制的匹配流程

資料包到達防火牆時,規則表之間的優先順序:
raw > mangle > nat > filter

1.2.1 四表

raw表∶ 確定是否對該資料包進行狀態跟蹤。包含兩個規則鏈, OUTPUT、PREROUTING。
mangle表∶修改資料包內容,用來做流量整形的,給資料包設定標記。包含五個規則鏈,INPUT、oUTPUT、FORWARD、PRERoUTTNG、PosTRou TING。
nat表∶ 負責網路地址轉換,用來修改資料包中的源、目標IP地址或埠。包含三個規則鏈, oUTPUT、PRERoUTING、PoSTRoUTING。
filter表;負責過濾資料包, 確定是否放行該資料包(過濾)。 包含三個規則鋅鏈,INPUT、FORWARD、OUTPUT。

1.2.2 五鏈

INPUT∶ 處理入站資料包,匹配目標IP為本機的資料包。
OUTPUT∶處理出站資料包,一般不在此鋅上,做配置。
FORWARD∶ 處理轉發資料包,匹配流經本機的資料包。
PREROUTING鏈∶ 在進行路由選擇前處理資料包,用來修改目的地址,用來做DNAT。相當於把內網伺服器的工P和埠對映到路由器的外網IP和端 □上。
POSTROUTING鏈∶ 在進行路由選擇後處理資料包,用來修改源地址,用來做SNAT。相當於內網通過路由器NAT轉換功能實現內網主機通過一個公網工P地址上網。

1.2.3 四表五鏈總結

規則表的作用∶容納各種規則鏈
規則鏈的作用∶容納各種防火牆規則
總結∶表裡有鏈,鏈裡有規則

1.2.4 規則鏈之間的匹配順序

1)主機型防火牆∶

入站資料(來自外界的資料包,且目標地址是防火牆本機)∶ PREROUTING --> INPUT --> 本機的應用程式
出站資料(從防火牆本機向外部地址傳送的資料包)∶ 本機的應用程式 --> OUTPUT --> POSTROUTING網路型防火牆∶
轉發資料(需要經過防火牆轉發的資料包)∶ PREROUTING --> FORWARD --> POSTROUTING
1.2.5 規則鏈內的匹配順序∶
自上向下按順序依次進行檢查,找到相匹配的規則即停 止 (LoG策略例外, 表示記錄相關日誌)
若在該鏈內找不到相匹配的規則,則按該鏈的預設策略處理(未修改的狀況下,預設策略為允許)

二、編寫防火牆規則

準備工作:

1.iptables的安裝

CentOS 7預設使用firewalld防火牆,沒有安裝 iptables,若想使用iptables防火牆。必須先關閉firewalld防火牆,再安裝 iptables

systemctl stop firewalld.service #關閉防火牆
systemctl disable firewalld.service #設為開機不自啟

yum -y install iptables iptables-services #安裝iptables
systemctl start iptables. Service #開啟服務

2.1 基本語法、控制型別

2.1.1 iptables防火牆的配置方法∶

使用iptables 命令列。
使用system-config-firewall

2.1.2 iptables 命令列配置方法

∶命令格式

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

注意事項:

不指定表名時,預設指filter表
不指定鏈名時,預設指表內的所有鏈
除非設定鏈的預設策略,否則必須指定匹配條件
控制型別使用大寫字母,其餘均為小寫

2.1.3 常用的控制型別∶

ACCEPT∶允許資料包通過。
DROP∶直接丟棄資料包,不給出任何迴應資訊。
REJECT∶ 拒絕資料包通過,會給資料傳送端一個響應資訊。 SNAT∶修改資料包的源地址。 DNAT∶修改資料包的目的地址。
MASQUERADE∶偽裝成一個非固定公網IP地址。
LOG∶ 在/var/log/messages檔案中記錄日誌資訊,然後將資料包傳遞給下一條規則。LOG只是一種輔助動作,並沒有真正處理資料包。

2.1.4 常用的管理選項∶

-A ∶ 在指定鏈的末尾追加 (–append)一條新的規則
-I ∶ 在指定鏈的開頭插入(–insert)一條新的規則, 未指定序號時預設作為第一條規則
-R ∶ 修改、替換(–replace)指定鏈中的某一條規則,可指定規則序號或具體內容
-P ∶設定指定鏈的預設策略(–policy)
-D ∶ 刪除 (–delete)指定鏈中的某一條規則, 可指定規則序號或具體內容
-F ∶ 清空(–flush)指定鏈中的所有規則,若未指定鏈名,則清空表中的所有鏈
-L∶列出 (–list)指定鏈中所有的規則,若未指定鏈名,則列出表中的所有鏈
-n ∶ 使用數字形式(–numeric)顯示輸出結果,如顯示 IP 地址而不是主機名
-v ∶ 顯示詳細資訊,包括每條規則的匹配包數量和匹配位元組數
–line-numbers∶ 檢視規則時,顯示規則的序號

2.2 新增、檢視、刪除規則

2.2.1 新增新的規則∶

iptables -t filter -A INPUT -p icmp -j REJECT 禁止ping通本主機(有響應)
iptables -t filter -A INPUT -p icmp -j DROP 禁止ping通本主機(無響應)
iptables -I INPUT 2 -p tcp--dport 22 -jACCEPT

2.2.2 檢視規則列表∶

iptables [-t 表名 ]-n -L[ 鏈名][--line-numbers]

iptables -[vn]L #注意∶不可以合寫為 -Ln
iptables -n -L --line-numbers

2.2.3 設定預設策略∶

iptlables [-t 表名 ] -P <鏈名><控制型別>
iptables -P INPUT DROp iptables -P FORWARD DROp

2.2.4 刪除規則∶

iptables -D INPUT 2
iptables -t filter -D INPUT -p icmp -jREJECT
#一般在生產環境中設定網路型防火牆、主機型防火牆時都要設定預設規則為DROP,並設定白名單

注意∶

若規則列表中有多條相同的規則時, 按內容匹配只刪除的序號最小的一條
按號碼匹配刪除時, 確保規則號碼小於等於已有規則數,否則報錯
按內容匹配刪數時, 確保規則存在, 否則報錯

2.2.5 清空規則∶

iptables 【-t 表名】 -F 【鏈名】
iptables -F INPUT
iptables -F

注意:

-F 僅僅是清空鏈中的規則,並不影響 -P 設定的預設規則,預設規則需要手動進行修改
-P 設定了DROP後,使用-F 一定要小心
防止把允許遠端連線的相關規則清除後導致無法遠端連線主機,此情況如果沒有儲存規則可重啟主機解決
如果不寫表名和鏈名,預設清空filter表中所有鏈裡的所有規則

2.3 規則的匹配條件

2.3.1 通用匹配

可直接使用,不依賴於其他條件或擴充套件,包括網路協議、IP地址、網路介面等條件。

協議匹配∶ -p 協議名
地址匹配∶ -s 源地址、-d 目的地址 #可以是IP、網段、域名、空(任何地址)
介面匹配∶ -i 入站網絡卡、-o 出站網絡卡

iptables -A FORWARD !-p icmp -j ACCEPT
iptables -A INPUT -s 192.168.80.11 -j DROP
iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP

2.3.2 隱含匹配

要求以特定的協議匹配作為前提,包括埠、TCP標記、ICMP型別等條件。

埠匹配∶ --sport 源埠、--dport 目的埠
#可以是個別埠、埠範圍
–sport 1000 匹配源端 口是1000的資料包
–sport 1000:3000 匹配源端 口是1000-3000的資料包
–sport : 3000 匹配源端 口是3000及以下的資料包
–sport 1000: 匹配源端 口是1000及以上的資料包

注意∶ --sport 和 --dport 必須配合 -p <協議型別> 使用

iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
iptables-I FORWARD -d 192.168.80.0/24 -p tcp --dport 24500:24600 -j DROP

2.3.4 TCP標記匹配∶ --tcp-flags TCP標記

iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -jACCEPT
#丟棄SYN請求包,放行其他包

2.3.5 ICMP型別匹配∶–icmp-type ICMP型別

#可以是字串、數字程式碼
"Echo-Request"(程式碼為 8)表示 請求
"Echo-Reply"(程式碼為 0)表示 回顯
"Destination-Unreachable"(程式碼為 3)表示 目標不可達
關於其它可用的 ICMP 協議型別,可以執行"iptables -p icmp -h"命令,檢視幫助資訊

iptables -A INPUT -p icmp --icmp-type 8 -j DROP #禁止其它主機ping 本機
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT #允許本機ping 其它主機

iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT #當本機ping 不通其它主機時提示目標不可達

#此時其它主機需要配置關於icmp協議的控制型別為 REJECT

iptables -A INPUT-p icmp -j REJECT

2.3.6 顯式匹配

要求以"-m 擴充套件模組"的形式明確指出型別,包括多埠、MAC地址、IP範圍、資料包狀態等條件。
多埠匹配∶
-m multiport --sport 源埠列表
-m multiport --dport 目的埠列表

iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -i ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT

2.3.7 IP範圍匹配∶ -m iprange --src-range IP範圍

iptables -A FORWARD -p udp -m iprange--src-range 192.168.80.100-192.168.80.200-j DROP

#禁止轉發源地址位於192.168.80.100-192.168.80.200的udp資料包

2.3.6=8 MAC地址匹配∶-m mac --mac-source MAC地址

iptables - FORWARD -m mac --mac-source xx:xx:xx:xx:xX:xx-j DROP

#禁止來自某MAC 地址的資料包通過本機轉發

2.3.8 狀態匹配∶-m state_–state 連線狀態

常見的連線狀態∶

NEW ∶與任何連線無關的,還沒開始連線
ESTABLISHED ∶響應請求或者已建立連線的,連線態
RELATED ∶ 與已有連線有相關性的(如FTP 主被動模式的資料連線),衍生態,一般與ESTABLISHED 配合使用
INVALID ∶ 不能被識別屬於哪個連線或沒有任何狀態
iptables -A FORWARD -m state --state NEW -p tcp !--syn -j DROP

#禁止轉發與正常 TCP 連線無關的非–syn 請求資料包(如偽造的網路攻擊資料包)

iptables -I INPUT -p tcp -m multiport --dport 80, 22,21,20,53 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED, RELATED -j ACCEPT