【Q】之Linux中的防火墙netfilter iptables
防火墻
- 一、Linux防火墻基礎
- 1.1 Linux包過濾防火墻概述
- 1.2 數據包控制的匹配流程
- 控制的匹配流程👇
- 1.2.1 四表
- 1.2.2 五鏈
- 1.2.3 四表五鏈總結
- 1.2.4 規則鏈之間的匹配順序
- 1.2.5 規則鏈內的匹配順序∶
- 過濾的匹配流程👇
- 二、編寫防火墻規則
- 2.1 基本語法、控制類型
- 2.1.1 iptables防火墻的配置方法∶
- 2.1.2 iptables 命令行配置方法∶
- 2.1.3 常用的控制類型∶
- 2.1.4 常用的管理選項∶
- 2.2 添加、查看、刪除規則
- 2.2.1 添加新的規則∶
- 2.2.2 查看規則列表∶
- 2.2.3 設置默認策略∶
- 2.2.4 刪除規則∶
- 2.2.5 清空規則∶
- 2.3 規則的匹配條件
- 2.3.1 通用匹配
- 2.3.2 隱含匹配
- 2.3.4 TCP標記匹配∶ --tcp-flags TCP標記
- 2.3.5 ICMP類型匹配∶–icmp-type ICMP類型
- 2.3.6 顯式匹配
- 2.3.7 IP范圍匹配∶ -m iprange --src-range IP范圍
- 2.3.8 狀態匹配∶-m state_–state 連接狀態
一、Linux防火墻基礎
1.1 Linux包過濾防火墻概述
■netfilter
- 位于Linux內核中的包過濾功能體系
- 稱為Linux防火墻的"內核態"
■iptables
- 位于/sbiniptables,用來管理防火墻規則的工具
- 稱為Linux防火墻的"用戶態"
上述2種稱呼都可以表示Linux防火墻
■包過濾的工作層次
- 主要是網絡層,針對IP數據包
- 體現在對包內的IP地址、端口等信息的處理上
1.2 數據包控制的匹配流程
控制的匹配流程👇
數據包到達防火墻時,規則表之間的優先順序:
raw > mangle > nat > filter
1.2.1 四表
raw表∶ 確定是否對該數據包進行狀態跟蹤。包含兩個規則鏈, OUTPUT、PREROUTING。
mangle表∶修改數據包內容,用來做流量整形的,給數據包設置標記。包含五個規則鏈,INPUT、OUTPUT、FORWARD、PREROUTTNG、POSTROUTING。
nat表∶ 負責網絡地址轉換,用來修改數據包中的源、目標IP地址或端口。包含三個規則鏈, OUTPUT、PREROUTING、POSTRoUTING。
filter表;負責過濾數據包, 確定是否放行該數據包(過濾)。 包含三個規則鋅鏈,INPUT、FORWARD、OUTPUT。
注:在iptables的四個規則表中, mangle表和raw表的應用相對較少
1.2.2 五鏈
INPUT∶ 處理入站數據包,匹配目標IP為本機的數據包。
OUTPUT∶處理出站數據包,一般不在此鏈上,做配置。
FORWARD∶ 處理轉發數據包,匹配流經本機的數據包。
PREROUTING鏈∶ 在進行路由選擇前處理數據包,用來修改目的地址,用來做DNAT。相當于把內網服務器的工P和端口映射到路由器的外網IP和端口上。
POSTROUTING鏈∶ 在進行路由選擇后處理數據包,用來修改源地址,用來做SNAT。相當于內網通過路由器NAT轉換功能實現內網主機通過一個公網工iP地址上網。
1.2.3 四表五鏈總結
規則表的作用∶對數據包進行過濾或處理
規則鏈的作用∶容納各種防火墻規則
鏈的分類依據:處理數據包的不同時機
總結∶表里有鏈,鏈里有規則
1.2.4 規則鏈之間的匹配順序
1)主機型防火墻∶
數據包直接進入到防火墻所在的服務器的內部某一個應用程序當中
入站數據(來自外界的數據包,且目標地址是防火墻本機)∶ PREROUTING --> INPUT --> 本機的應用程序
出站數據(從防火墻本機向外部地址發送的數據包)∶ 本機的應用程序 --> OUTPUT --> POSTROUTING
2)網絡型防火墻∶
轉發數據(需要經過防火墻轉發的數據包)∶ PREROUTING --> FORWARD --> POSTROUTING
1.2.5 規則鏈內的匹配順序∶
自上向下按順序依次進行檢查,找到相匹配的規則即停止 (LOG策略例外, 表示記錄相關日志)
若在該鏈內找不到相匹配的規則,則按該鏈的默認策略處理(未修改的狀況下,默認策略為允許)
過濾的匹配流程👇
- 入站數據流向:來自外界的數據包到達防火墻后,首先被PREROUTING鏈處理(是否修改數據包地址等) ,然后進行路由選擇(判斷該數據包應發往何處) ;如果數據包的目標地址是防火墻本機(如Internet用戶訪問網關的web服務端口) ,那么內核將其傳遞給INPUT鏈進行處理(決定是否允許通過等) ,通過以后再交給系統上層的應用程序(如httpd服務器)進行響應。
- 轉發數據流向:來自外界的數據包到達防火墻后,首先被PREROUTING鏈處理,然后再進行路由選擇;如果數據包的目標地址是其他外部地址(如局域網用戶通過網關訪問QQ服務器) ,則內核將其傳遞給FORWARD鏈進行處理(允許轉發或攔截、丟棄)最后交給POSTROUTING鏈(是否修改數據包的地址等)進行處理。
- 出站數據流向:防火墻本機向外部地址發送的數據包(如在防火墻主機中測試公網DNS服務時) ,首先進行路由選擇,確定了輸出路徑后,再經由OUTPUT鏈處理,最后再交POSTROUTING鏈(是否修改數據包的地址等)進行處理。
入站PREROUTING input 應用程序 output postrouting
注:按第一條規則 ....二條規則的順序進行匹配處理,遵循“匹配即停止"的原則,
一旦找到一條匹配規則將不再檢查后續的其他規則,如果一直找不到匹配的規則,就按默認規則處理。
默認規則用iptables-L查看,規則鏈后面出現(policy ACCEPT)即是默認放行
默認策略不參與鏈內規則的順序編排
-F清空鏈時,默認策略不受影響
二、編寫防火墻規則
準備工作:
1.iptables的安裝
CentOS 7默認使用firewalld防火墻,沒有安裝 iptables,若想使用iptables防火墻。必須先關閉firewalld防火墻,再安裝 iptables
systemctl stop firewalld.service #關閉防火墻
systemctl disable firewalld.service #設為開機不自啟
setenforce 0 #關閉安全增強型
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 控制類型 ]
例:iptables -t filter -l INPUT -p icmp -j REJECT
其中,表名、鏈名用來指定iptables命令所操作的表和鏈,未指定表名時將默認使用filter表;
管理選項:表示iptables規則的操作方式,如插入、增加、刪除、查看等;
匹配條件:用來指定要處理的數據包的特征,不符合指定條件的數據包將不會處理;控制類型指的是數據包的處理方式,如允許、拒絕、丟棄等。
注意事項:
不指定表名時,默認指filter表
不指定鏈名時,默認指表內的所有鏈
除非設置鏈的默認策略,否則必須指定匹配條件
控制類型使用大寫字母,其余均為小寫
2.1.3 常用的控制類型∶
對于防火墻,數據包的控制類型非常關鍵,直接關系到數據包的放行、封堵及做相應的日志記錄等。在iptables防火墻體系中,最常用的幾種控制類型如下。
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 添加新的規則∶
添加新的防火墻規則時,使用管理選項“-A"、"-I",前者用來追加規則,后者用來插入規則。
iptables -t filter -A INPUT -p icmp -j DROP 禁止ping通本主機(無響應)
iptables -t filter -A INPUT -p icmp -j REJECT //不允許任何主機ping本主機(有響應)
iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT//允許主機ssh端口 進過我的
其他
iptables -t filter -A INPUT -p tcp -j ACCEPT //允許任何主機tcp
iptables -I INPUT -p udp -j ACCEPT//允許任何主機udp
2.2.2 查看規則列表∶
iptables [-t 表名 ]-n -L[ 鏈名][–line-numbers]
或
iptables -[vn]L #注意∶不可以合寫為 -Ln,#L放后面
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 -p tcp --dport 22 -j REJECT
iptables -t filter -D INPUT -p icmp -j REJECT
iptables -D INPUT 2
#一般在生產環境中設置網絡型防火墻、主機型防火墻時都要設置默認規則為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 -A 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
總結
以上是生活随笔為你收集整理的【Q】之Linux中的防火墙netfilter iptables的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【拔刀吧少年】之Expect 自动化控制
- 下一篇: 【Q】之防火墙的SNAT DANT原理应