Blog.043 Linux 防火牆① iptables
本章目錄
1. iptables 概述
1.1 netfilter/iptables 關係
2. iptables 的 四表五鏈
2.1 四表 概述
2.2 五鏈 概述
2.3 四表五鏈的關係圖
2.4 規則鏈的匹配順序
3. 編寫 iptables 防火牆規則
3.1 iptables 的安裝
3.2 基本語法、控制型別
3.3 新增、檢視、刪除規則
3.4 規則的匹配條件
- Linux 系統的防火牆:IP 資訊包過濾系統,它實際上由兩個元件 netfilter 和 iptables 組成;
- 主要工作在網路層,針對 IP 資料包。體現在對包內的IP地址、埠等資訊的處理上。
(1)netfilter:
- 屬於 “核心態” (KernelSpace,又稱為核心空間)的防火牆功能體系;
- 是核心的一部分,由–些資料包過濾表組成,這些表包含核心用來控制資料包過濾處理的規則集。
(2)iptables:
- 屬於“使用者態”(User Space, 又稱為使用者空間)的防火牆管理體系;
- 是一種用來管理 Linux 防火牆的命令程式,它使插入、修改和刪除資料包過濾表中的規則變得容易,通常位於 /sbin/iptables 目錄下;
- netfilter/iptables 後期簡稱為 iptables,iptables 是基於核心的防火牆,其中內建了 raw、mangle、nat 和 filter 四個規則表;
- 表中所有規則配置後,立即生效,不需要重啟服務。
規則表的作用:容納各種規則鏈
規則鏈的作用:容納各種防火牆規則
總結:表裡有鏈,鏈裡有規則
(1)raw表:
- 確定是否對該資料包進行狀態跟蹤。
- 包含兩個規則鏈,OUTPUT、 PREROUTING;
(2)mangle 表:
- 修改資料包內容,用來做流量整形的,給資料包設定標記。
- 包含五個規則鏈,INPUT、 OUTPUT、FORWARD、 PREROUTING、 POSTROUTING;
(3)nat 表:
- 負責網路地址轉換,用來修改資料包中的源、目標IP地址或埠。
- 包含三個規則鏈,OUTPUT、PREROUTING、 POSTROUTING;
(4)filter 表:
- 負責過濾資料包,確定是否放行該資料包(過濾)。包含三個規則鏈,INPUT、 FORWARD、0UTPUT;
- 在 iptables 的四個規則表中,mangle 表和 raw 表的應用相對較少。
資料包到達防火牆時,規則表之間的優先順序:
raw > mangle > nat > filter
(1)INPUT:
- 處理入站資料包,匹配目標IP為本機的資料包;
(2)OUTPUT:
- 處理出站資料包,–般不在此鏈上做配置;
(3)FORWARD:
- 處理轉發資料包,匹配流經本機的資料包;
(4)PREROUTING:
- 在進行路由選擇前處理資料包,用來修改目的地址,用來做DNAT。
- 相當於把內網伺服器的IP和埠對映到路由器的外網IP和埠上;
(5)POSTROUTING:
- 在進行路由選擇後處理資料包,用來修改源地址,用來做SNAT。
- 相當於內網通過路由器NAT轉換功能實現內網主機通過一個公網IP地址上網。
(1)規則鏈之間的匹配順序
- 主機型防火牆:
- 入站資料(來自外界的資料包,且目標地址是防火牆本機) : PREROUTING --> INPUT -->本機的應用程式
- 出站資料(從防火牆本機向外部地址傳送的資料包) : 本機的應用程式–> OUTPUT --> POSTROUTING
- 網路型防火牆:
- 轉發資料( 需要經過防火牆轉發的資料包) : PREROUTING --> FORWARD --> POSTROUTING
(2)規則鏈內的匹配順序
- 自上向下按順序依次進行檢查,找到相匹配的規則即停止 (LOG策略例外,表示記錄相關日誌)
- 若在該鏈內找不到相匹配的規則,則按該鏈的預設策略處理 (未修改的狀況下,預設策略為允許)
3. 編寫 iptables 防火牆規則
3.1 iptables 的安裝
- Centos 7 預設使用 firewalld 防火牆,沒有安裝 iptables,若想使用iptables 防火牆。
- 必須先關閉 firewalld 防火牆,再安裝 iptables。
1 systemctl stop firewalld.service #關閉防火牆
2 systemctl disable firewalld.service #設為開機不自啟
3
4 yum -y install iptables iptables-services #安裝iptables
5 systemctl start iptables. Service #開啟服務
(1)iptables 防火牆的配置方法
- 使用 iptables 命令列
- 使用 system-config-firewall(圖形介面)
(2)iptables 命令列配置方法
命令列格式:
- iptables [-t 表名 ] 管理選項 [ 鏈名 ] [ 匹配條件 ] [-j 控制型別 ]
注意事項:
- 不指定表名時,預設指filter表
- 不指定鏈名時,預設指表內的所有鏈
- 除非設定鏈的預設策略,否則必須指定匹配條件
- 控制型別使用大寫字母,其餘均為小寫
(3)常用的控制型別
- ACCEPT:
允許資料包通過。
- DROP:
直接丟棄資料包,不給出任何迴應資訊。
- REJECT:
拒絕資料包通過,會給資料傳送端一個響應資訊。 SNAT∶修改資料包的源地址。
- DNAT:
修改資料包的目的地址。
- MASQUERADE:
偽裝成一個非固定公網IP地址。
- LOG:
在 /var/log/messages 檔案中記錄日誌資訊,然後將資料包傳遞給下一條規則。
LOG 只是一種輔助動作,並沒有真正處理資料包。
(4)常用的管理選項
-A | 在指定鏈的末尾追加 (–append)一條新的規則 |
-I | 在指定鏈的開頭插入(–insert)一條新的規則, 未指定序號時預設作為第一條規則 |
-R | 修改、替換(–replace)指定鏈中的某一條規則,可指定規則序號或具體內容 |
-P |
設定指定鏈的預設策略(–policy) |
-D | 刪除 (–delete)指定鏈中的某一條規則, 可指定規則序號或具體內容 |
-F | 清空(–flush)指定鏈中的所有規則,若未指定鏈名,則清空表中的所有鏈 |
-L | 列出 (–list)指定鏈中所有的規則,若未指定鏈名,則列出表中的所有鏈 |
-n |
使用數字形式(–numeric)顯示輸出結果,如顯示 IP 地址而不是主機名 |
-v | 顯示詳細資訊,包括每條規則的匹配包數量和匹配位元組數 |
–line-numbers | 檢視規則時,顯示規則的序號 |
- 新增新的規則
1 iptables -t filter -A INPUT -p icmp -j REJECT 禁止ping通本主機(有響應)
2 iptables -t filter -A INPUT -p icmp -j DROP 禁止ping通本主機(無響應)
3 iptables -I INPUT 2 -p tcp--dport 22 -jACCEPT
- 檢視規則列表
1 iptables [-t 表名 ]-n -L[ 鏈名][--line-numbers]
2 或
3 iptables -[vn]L #注意∶不可以合寫為 -Ln
4 iptables -n -L --line-numbers
- 設定預設策略
1 iptlables [-t 表名 ] -P <鏈名><控制型別>
2 iptables -P INPUT DROp iptables -P FORWARD DROp
- 刪除規則
1 iptables -D INPUT 2
2 iptables -t filter -D INPUT -p icmp -jREJECT
一般在生產環境中設定網路型防火牆、主機型防火牆時都要設定預設規則為DROP,並設定白名單
注意:
- 若規則列表中有多條相同的規則時, 按內容匹配只刪除的序號最小的一條
- 按號碼匹配刪除時, 確保規則號碼小於等於已有規則數,否則報錯
- 按內容匹配刪數時, 確保規則存在, 否則報錯
- 清空規則
1 iptables 【-t 表名】 -F 【鏈名】
2 iptables -F INPUT
3 iptables -F
注意:
- -F 僅僅是清空鏈中的規則,並不影響 -P 設定的預設規則,預設規則需要手動進行修改
- -P 設定了DROP後,使用-F 一定要小心
- 防止把允許遠端連線的相關規則清除後導致無法遠端連線主機,此情況如果沒有儲存規則可重啟主機解決
- 如果不寫表名和鏈名,預設清空filter表中所有鏈裡的所有規則
(1)通用匹配
可直接使用,不依賴於其他條件或擴充套件,包括網路協議、IP地址、網路介面等條件。
- 協議匹配∶ -p 協議名
- 地址匹配∶ -s 源地址、-d 目的地址 #可以是IP、網段、域名、空(任何地址)
- 介面匹配∶ -i 入站網絡卡、-o 出站網絡卡
1 iptables -A FORWARD !-p icmp -j ACCEPT
2 iptables -A INPUT -s 192.168.80.11 -j DROP
3 iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP
(2)隱含匹配
要求以特定的協議匹配作為前提,包括埠、TCP標記、ICMP型別等條件
1 埠匹配∶ --sport 源埠、--dport 目的埠
可以是個別埠、埠範圍
- –sport 1000 匹配源端 口是1000的資料包
- –sport 1000:3000 匹配源端 口是1000-3000的資料包
- –sport : 3000 匹配源端 口是3000及以下的資料包
- –sport 1000: 匹配源端 口是1000及以上的資料包
注意:--sport 和 --dport 必須配合 -p <協議型別> 使用
1 iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
2 iptables-I FORWARD -d 192.168.80.0/24 -p tcp --dport 24500:24600 -j DROP
TCP標記匹配:- - tcp-flags TCP標記
1 iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -jACCEPT
2 #丟棄SYN請求包,放行其他包
CMP型別匹配:– icmp-type ICMP型別
可以是字串、數字程式碼
- "Echo-Request"(程式碼為 8)表示 請求
- "Echo-Reply"(程式碼為 0)表示 回顯
- "Destination-Unreachable"(程式碼為 3)表示 目標不可達
關於其它可用的 ICMP 協議型別,可以執行 "iptables -p icmp -h" 命令,檢視幫助資訊
1 iptables -A INPUT -p icmp --icmp-type 8 -j DROP #禁止其它主機ping 本機
2 iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT #允許本機ping 其它主機
3
4 iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT #當本機ping 不通其它主機時提示目標不可達
此時其它主機需要配置關於icmp協議的控制型別為 REJECT
1 iptables -A INPUT-p icmp -j REJECT
(3)顯式匹配
要求以"-m 擴充套件模組"的形式明確指出型別,包括多埠、MAC地址、IP範圍、資料包狀態等條件。
- 多埠匹配
-m multiport --sport 源埠列表
-m multiport --dport 目的埠列表
1 iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -i ACCEPT
2 iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
- IP範圍匹配:-m iprange --src-range IP 範圍
1 iptables -A FORWARD -p udp -m iprange--src-range 192.168.80.100-192.168.80.200-j DROP
- MAC地址匹配:-m mac --mac-source MAC 地址
1 iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xX:xx-j DROP
2 # 禁止來自某MAC 地址的資料包通過本機轉發
- 狀態匹配:-m state_–state 連線狀態
常見的連線狀態∶
- NEW ∶與任何連線無關的,還沒開始連線
- ESTABLISHED ∶響應請求或者已建立連線的,連線態
- RELATED ∶ 與已有連線有相關性的(如 FTP 主被動模式的資料連線),衍生態,一般與ESTABLISHED 配合使用
- INVALID ∶ 不能被識別屬於哪個連線或沒有任何狀態
1 iptables -A FORWARD -m state --state NEW -p tcp !--syn -j DROP
禁止轉發與正常 TCP 連線無關的非–syn 請求資料包(如偽造的網路攻擊資料包)
1 iptables -I INPUT -p tcp -m multiport --dport 80, 22,21,20,53 -j ACCEPT
2 iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
3 iptables -A INPUT -p tcp -m state --state ESTABLISHED, RELATED -j ACCEPT
-