1. 概述#
本文介紹防火牆的知識,包括防火牆的作用,分類,性能,iptables 和 firewalld。其中的重點為 iptables 和 firewalld。由於本文較長,閱讀需要一定時間。
2. 防火牆#
2.1 防火牆的作用#
在計算機領域中,防火牆是用於保護信息安全的設備
防火牆會按照默認配置或用戶自定義規則,允許或限制數據的傳輸
- 用於保護內網安全的一種設備
- 依據規則進行防護
- 用戶定義規則
- 允許或限制外部訪問
2.2 防火牆的分類#
邏輯上:
- 主機防火牆:針對單個主機進行防護(服務個人)
- 網絡防火牆:針對網絡進行防護,處於網絡邊緣,防火牆的背後是本地局域網(服務集體)
物理上:
- 硬件防火牆:在硬件級別實現防火牆功能,另一部分基於軟件,性能高,成本高。如:思科,華為,天融信
- 軟件防火牆:應用軟件處理邏輯運行於通用硬件平台上的防火牆,性能相較於硬件防火牆低,成本較低,對於 Linux 系統已自帶,直接使用即可。如:WAF(主要用於截獲所有 HTTP 數據或僅僅滿足某些規則的會話,多見於雲平台中)
2.3 防火牆的性能#
- 吞吐量
- 並發連接
- 新建連接
- 時延
- 抖動
3. iptables#
3.1 什麼是 iptables#
netfilter/iptables 可簡稱為 iptables,為 Linux 平台下的包過濾防火牆,是開源的,內核自帶的,可以代替成本較高的 企業級硬件防火牆
數據包過濾,即防火牆
數據包重定向,即轉發
網絡地址轉換,即可 NAT
- iptables 不是防火牆,是防火牆用戶代理
- 用於把用戶的安全設置添加到 “安全框架” 中
- “安全框架” 是防火牆
- netfilter 就是 “安全框架”
- netfilter 位於內核空間中,是 Linux 系統核心層內部的一個數據包處理模塊
- iptables 是用於在用戶空間對內核空間的 netfilter 進行操作的 命令行工具
注意:iptables 並不是防火牆的服務,真正的服務是由內核提供的,netfilter 才是真正的防火牆
3.2 iptables 工作原理#
iptables 是按照規則 (rules) 來辦事的,而規則就是運維人員所定義的條件
規則一般定義為 “如果數據包頭符合這樣的條件,就這樣處理這個數據包”
規則存儲在內核空間的 數據包過濾表 中
這些規則分別指定了源地址、目的地址,傳輸協議 (TCP、UDP、ICMP) 和服務類型 (HTTP、FTP) 等
當數據包與規則匹配時,iptables 就根據 規則所定義的方法 來處理這些數據包,比如放行 (ACCEPT)、拒絕 (REJECT)、丟棄 (DROP) 等
注意:配置防火牆主要工作就是對 iptables 規則進行添加、修改、刪除等
3.3 iptables 中鏈的概念#
netfilter 才是真正的防火牆,屬於內核的一部分,要想讓 netfilter 起到作用,我們就需要在內核中設置 “關口”,進出的數據報文都要通過這些關口,經檢查,符合放行條件的準允放行,符合阻攔條件的則被阻止,於是就出現了 input 和 output 關口,在 iptables 中我們把關口叫做 鏈
根據上圖,如果用戶發送的報文中請求的服務器地址不是本機,而是其他服務器,就應該進行報文轉發,這個轉發就是內核所支持的 IP_FORWARD 功能 ,這個時候我們的主機類似於路由器功能,對應的還有 “路由前”,“轉發”,“路由後”, 對應的英文就是:“PREROUTING”,“FORWARD”,“POSTROUTING” 。這就是 5 鏈
- INPUT:處理入站數據包
- OUTPUT:處理出站數據包
- FORWARD:處理轉發數據包 (主要是將數據包轉發至本機其它網卡)。當數據報文經過本機時,網卡接收數據報文至緩衝區,內核讀取報文 ip 首部,發現報文不是送到本機時(目的 ip 不是本機),由內核直接送到 forward 鏈做匹配,匹配之後若符合 forward 的規則,再經由 postrouting 送往下一跳或目的主機。
- PREROUTING:在進行路由選擇前處理數據包,修改到達防火牆數據包的目的 IP 地址,用於判斷目標主機
- POSTROUTING:在進行路由選擇後處理數據包,修改要離開防火牆數據包的源 IP 地址,判斷經由哪一接口送往下一跳
我們知道,防火牆的作用在於對經過的數據報文進行規則匹配,然後執行對應的 “動作”,所以數據包經過這些關口時,必須匹配這個關口規則,但是關口規則可能不止一條,可能會有很多,當我們 把眾多規則放在一個關口上 時,所有的數據包經過都要進行匹配,那麼就形成了一個要匹配的規則鏈條,我們也把 “鏈” 稱作 “規則鏈
3.4 iptables 中表的概念#
每個 “規則鏈” 上都設置了一串規則,這樣的話,我們就可以把不同的 “規則鏈” 組合成能夠完成某一特定功能的集合分類,而這個集合分類我們就稱為表,iptables 中共有 5 張表
- filter:過濾功能,確定是否放行該數據包,屬於真正防火牆,內核模塊:iptables_filter
- nat:網絡地址轉換功能,修改數據包中的源、目標 IP 地址或端口;內核模塊:iptable_nat
- mangle:對數據包進行重新封裝功能,為數據包設置標記;內核模塊:iptable_mangle
- raw:確定是否對數據包進行跟蹤;內核模塊:iptables_raw
- security:是否定義強制訪問控制規則;後加上的
3.5 iptables 中鏈表的關係#
我們在應用防火牆時是以表為操作入口的,只要在相應的表中的規則鏈上添加規則即可實現某一功能
那麼我們就應該知道哪張表包括哪些規則鏈,然後在規則鏈上操作即可
- filter 表可以使用哪些鏈定義規則:INPUT,FORWARD,OUTPUT
- nat 表中可以使用哪些鏈定義規則:PREROUTING,OUTPUT,POSTROUTING,INPUT
- mangle 表中可以使用哪些鏈定義規則:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
- raw 表中可以使用哪些鏈定義規則:PREROUTING,OUTPUT
注意:iptables 中表的優先級:raw->mangle->nat->filter (由高至低)
3.6 數據包流經 iptables 流程#
3.7 iptables 規則匹配條件#
3.71 基本匹配條件#
源地址,目標地址,源端口,目標端口等
基本匹配使用選項及功能
-p 指定規則協議,tcp udp icmp all
-s 指定數據包的源地址,ip hostname
-d 指定目的地址
-i 輸入接口
-o 輸出接口
! 取反
基本匹配的特點是:無需加載擴展模塊,匹配規則生效
3.72 擴展匹配條件#
擴展匹配又分為 隱式匹配 和 顯示匹配
擴展匹配的特點是:需要加載擴展模塊,匹配規則方可生效。
隱式匹配的特點:使用 - p 選項指明協議時,無需再同時使用 - m 選項指明擴展模塊以及不需要手動加載擴展模塊;
顯示匹配的特點:必須使用 - m 選項指明要調用的擴展模塊的擴展機制以及需要手動加載擴展模塊
隱式匹配選項及功能:
-p 匹配協議,如:tcp,udp
--sport 匹配報文源端口,可以給出多個端口,但只能是連續的端口範圍
--dport 匹配報文目標端口,可以給出多個端口,但只能是連續的端口範圍
--tcp-flags mask comp 匹配報文中的tcp協議的標誌位
--icmp-type
0/0: echo reply 允許其他主機ping
8/0:echo request 允許ping其他主機
顯式匹配選項及功能:(-m)
- multiport:多端口
iptables -I INPUT -d 192.168.1.111 -p tcp -m multiport --dports 22,80 -j ACCEPT
//在INPUT鏈中開放本機tcp 22,tcp80端口
iptables -I OUTPUT -s 192.168.1.111 -p tcp -m multiport --sports 22,80 -j ACCEPT
//在OUTPUT鏈中開發源端口tcp 22,tcp80
- iprange:多 IP 地址
iptables -A INPUT -d 192.168.1.111 -p tcp --dport 23 -m iprange --src-range 192.168.2.11-192.168.2.21 -j ACCEPT
//在INPUT鏈中開發多源IP地址
iptables -A OUTPUT -s 192.168.1.111 -p tcp --sport 23 -m iprange --dst-range 192.168.2.11-192.168.2.21 -j ACCEPT
//在OUTPUT鏈中開發多目的IP地址
- time:指定訪問時間範圍
iptables -A INPUT -d 192.168.1.111 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --time-stop 18:00:00 -j ACCEPT
iptables -A OUTPUT -s 192.168.1.111 -p tcp --sport 901 -j ACCEPT
- string:字符串,對報文中的應用層數據做字符串模式匹配檢測 (通過算法實現)
--algo {bm|kmp}:字符匹配查找時使用算法
--string "STRING": 要查找的字符串
--hex-string “HEX-STRING”: 要查找的字符,先編碼成16進制格式
- connlimit:連接限制,根據每個客戶端 IP 作並發連接數量限制
--connlimit-upto n 連接數小於等於n時匹配
--connlimit-above n 連接數大於n時匹配
- limit:報文速率限制
- state:
- 追蹤本機上的請求和響應之間的數據報文的狀態。狀態有五種:INVALID, ESTABLISHED, NEW, RELATED,UNTRACKED
--state state
NEW 新連接請求
ESTABLISHED 已建立的連接
INVALID 無法識別的連接
RELATED 相關聯的連接,當前連接是一個新請求,但附屬於某個已存在的連接
UNTRACKED 未追蹤的連接
3.8 iptables 規則中的動作#
iptables 規則中的動作常稱為 target,分為基本動作和擴展動作
- ACCEPT: 允許數據包通過
- DROP: 直接丟棄數據包,不給任何回應信息
- REJECT: 拒絕數據包通過,發送回應信息給客戶端
- SNAT: 源地址轉換
- 解釋 1:數據包從網卡發送出去的時候,把數據包中的源地址部分替換為指定的 IP,接收方認為數據包的來源是被替換的那個 IP 主機,返回響應時,也以被替換的 IP 地址進行。
- 解釋 2:修改數據包源地址,當內網數據包到達防火牆後,防火牆會使用外部地址替換掉數據包的源 IP 地址(目的 IP 地址不變),使網絡內部主機能夠與網絡外部主機通信
- MASQUERADE: 偽裝,類似於 SNAT,適用於動態的、臨時會變的 ip 地址上,例如:家庭使用的寬帶。用發送數據的網卡上的 IP 來替換源 IP,對於 IP 地址不固定場合使用
- DNAT: 目標地址轉換
- 解釋 1:數據包從網卡發出時,修改數據包中的目的 IP,表現為你想訪問 A,但因網關做了 DNAT,把所有訪問 A 的數據包中的目的 IP 地址全部修改為 B, 實際最終訪問的是 B。
- 解釋 2:改變數據包目的地址,當防火牆收到來自外網的數據包後,會將該數據包的目的 IP 地址進行替換(源 IP 地址不變),重新轉發到內網的主機
- REDIRECT: 在本機做端口映射
- LOG: 在 /var/log/message 文件中記錄日誌信息,然後將數據包傳遞給下一條規則
注意:路由是按照目的地址進行路由選擇的,因此,DNAT 是在 PREROUTING 鏈上進行的,SNAT 是在數據包發出的位置進行的,因此是在 POSTROUTING 鏈上進行的
3.9 iptables 規則策略 / 思路#
-
黑名單
沒有被拒絕的流量都可以通過,這種策略下管理員必須針對每一種新出現的攻擊,制定新的規則,因此不推薦
-
白名單
沒有被允許的流量都要拒絕,這種策略比較保守,根據需要,主機主機逐漸開放,目前一般都採用白名單策略,推薦
- 選擇一張表,此表決定了數據報文 處理的方式
- 選擇一條鏈,此鏈決定了數據報文 流經哪些位置
- 選擇合適的條件,此條件決定了對數據報文 做何種條件匹配
- 選擇處理數據報文的動作,制定相應的防火牆規則
3.10 iptables 基礎語法結構#
iptables [-t 表名] 管理選項 [鏈名] [條件匹配] [-j 目標動作或跳轉]
不指定表名時,默認表示 filter 表,不指定鏈名時,默認表示該表內所有鏈,除非設置規則鏈的默認策略,否則需要指定匹配條件
3.11 iptables 常用命令#
參數 | 作用 |
---|---|
-P | 設置默認策略 -P INPUT (DROP|ACCEPT) |
-F | 清空規則鏈 |
-L | 查看規則鏈 |
-A | 在規則鏈的末尾加入新規則 |
-I num | 在規則鏈的頭部加入新規則 |
-D num | 刪除某一條規則 |
-s | 匹配來源地址 IP/MASK,加叹號 "!" 表示除這個 IP 外。 |
-d | 匹配目標地址 |
-i 網卡名稱 | 匹配從這塊網卡流入的數據 |
-o 網卡名稱 | 匹配從這塊網卡流出的數據 |
-p | 匹配協議,如 tcp,udp,icmp |
--dport num | 匹配目標端口號 |
--sport num | 匹配來源端口號 |
3.11.1 iptables 鏈管理#
-N, --new-chain chain:新建一個自定義的規則鏈
-X, --delete-chain [chain]:刪除用戶自定義的引用計數為0的空鏈
-F, --flush [chain]:清空指定的規則鏈上的規則
-E, --rename-chain old-chain new-chain:重命名鏈;
-Z, --zero [chain [rulenum]]:置零計數器,注意:每個規則都有兩個計數器(packets:被本規則所匹配到的所有報文的個數
bytes:被本規則所匹配到的所有報文的大小之和)
-P, --policy chain target 制定鏈表的策略(ACCEPT|DROP|REJECT)
3.11.2 iptables 規則管理#
-A, --append chain rule-specification:追加新規則於指定鏈的尾部
-I, --insert chain [rulenum] rule-specification:插入新規則於指定鏈的指定位置,默認為首部
-R, --replace chain rulenum rule-specification:替換指定的規則為新的規則
-D, --delete chain rulenum:根據規則編號刪除規則
-D, --delete chain rule-specification:根據規則本身刪除規則
3.11.3 iptables 規則顯示#
-L, --list [chain]:列出規則
-v, --verbose:詳細信息
-vv 更詳細的信息
-n, --numeric:數字格式顯示主機地址和端口號
-x, --exact:顯示計數器的精確值,而非圓整後的數據
--line-numbers:列出規則時,顯示其在鏈上的相應的編號
-S, --list-rules [chain]:顯示指定鏈的所有規則
3.12 iptables 應用例子#
iptables-services 安裝 / 配置:
sudo apt-get install iptables* //安裝
sudo systemctl start iptables.service //啟動
sudo systemctl enable iptables.service //設置開機自啟
sudo rpm -ql iptables-services //查看配置文件
iptables-save > /etc/sysconfig/iptables //保存規則
iptables-restore < /etc/sysconfig/iptables //重載
基本配置:
iptables -F
//刪除現有規則
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
//配置默認鏈策略
配置白名單:
iptables -t filter -F
iptables -P INPUT DROP
iptables -t filter -I INPUT -p tcp --dport=22 -j ACCEPT
iptables -t filter -I INPUT -p tcp --dport=80 -j ACCEPT
配置黑名單:
iptables -P INPUT ACCEPT
iptables -F
iptables -t filter -A INPUT -s 192.168.2.20/24 -p tcp --dport 80 -j DROP
通過 lo 訪問本機數據:
iptables -I INPUT -d 127.0.0.1 -p tcp --dport=9000 -i lo -j ACCEPT
iptables -I INPUT -i lo -j ACCEPT
//允許通過本地回環網卡訪問本機
允許連接態產生衍生態:
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
3.12.1 filter 表應用案例#
yum -y install httpd vsftpd sshd
systemctl start httpd vsftpd sshd
iptables -t filter -F
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j REJECT
iptables 標準流程:
iptables -F
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 192.168.2.0/24 -j ACCEPT #允許內網任何訪問
iptables -A INPUT -p tcp --syn --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --syn --dport 21 -j ACCEPT
iptables -A INPUT -j REJECT
modprobe nf_conntrack_ftp
iptables-save > /etc/sysconfig/iptables
vim /etc/sysconfig/iptables-config
// IPTABLES_MODULES="nf_conntrack_ftp
4. firewalld#
4.1 什麼是 firewalld#
FireWalld 僅僅替代了 iptables service 部分,其底層還是使用 iptables 做為防火牆規則管理入口
- 動態防火牆
- 用於管理 netfilter 用戶空間的工具
- 調用了 iptables 命令
4.2 zone 概念及作用#
區域 (zone) 是 firewalld 預先準備好的防火牆策略集合,即 可策略模板 ,可以根據不同的應用場景進行切換
4.3 FireWalld 中 zone 分類#
FireWalld 不同區域之間的差異主要是每個區域對待數據包的默認行為不同
Firewalld 默認共 9 個 zone,分別為:
- block(拒絕)
- dmz(非軍事化)
- drop(丟棄)
- external(外部)
- home(家庭)
- internal(內部)
- public(公開) Firewalld 默認區域
- trusted(信任)
- work(工作區)
4.4 Firewalld 語法#
firewall-cmd [--zone=zone] 動作 [--permanent]
注意:如果不指定 --zone 選項,則為當前所在的默認區域,--permanent 選項為是否將改動寫入到區域配置文件中
4.5 Firewalld 常用命令#
參數 | 作用 |
---|---|
--get-default-zone | 查詢默認的區域名稱 |
--set-default-zone=<區域名稱> | 設置默認的區域,永久生效 |
--get-zones | 顯示可用的區域 |
--get-services | 顯示預先定義的服務 |
--get-active-zones | 顯示當前正在使用的區域與網卡名稱 |
--add-source= | 將來源於此 IP 或子網的流量導向指定的區域 |
--remove-source= | 不再將此 IP 或子網的流量導向某個指定區域 |
--add-interface=<網卡名稱> | 將來自於該網卡的所有流量都導向某個指定區域 |
--change-interface=<網卡名稱> | 將某個網卡與區域做關聯 |
--list-all | 顯示當前區域的網卡配置參數,資源,端口以及服務等信息 |
--list-all-zones | 顯示所有區域的網卡配置參數,資源,端口以及服務等信息 |
--add-service=<服務名> | 設置默認區域允許該服務的流量 |
--add-port=<端口號 / 協議> | 允許默認區域允許該端口的流量 |
--remove-service=<服務名> | 設置默認區域不再允許該服務的流量 |
--remove-port=<端口號 / 協議> | 允許默認區域不再允許該端口的流量 |
--reload | 讓 “永久生效” 的配置規則立即生效,覆蓋當前的 |
4.6 Firewall 的狀態#
firewall-cmd --state
running
//查看狀態
firewall-cmd --reload
success
//重新加載防火牆,中斷用戶連接,臨時配置清除掉,加載配置文件中的永久配置
firewall-cmd --complete-reload
success
//重新加載防火牆,不中斷用戶的連接(防火牆出嚴重故障時使用)
firewall-cmd --panic-on
//緊急模式,強制關閉所有網絡連接
4.7 FireWalld 中動作#
4.7.1 動作中查看操作#
firewall-cmd xxx
--get-icmptypes //查看支持的所有ICMP類型
--get-zones //查看所有區域
--get-default-zone //查看當前的默認區域
--get-active-zones //查看當前正在使用的區域
--get-services //查看當前區域支持的服務
--list-services //查看當前區域開放的服務列表
--list-services --zone=home //查看指定域開放的服務列表
--list-all //查看默認區域內的所有配置,類似與iptables -L -n
--list-all-zones //查看所有區域所有配置
4.7.2 更改區域操作#
firewall-cmd xxx
--set-default-zone=work //更改默認的區域
4.7.3 新建規則#
firewall-cmd xxx
--add-interface=eth0 //將網絡接口添加到默認的區域內
--add-port=12222/tcp --permanent //添加端口到區域開放列表中
--add-port=5000-10000/tcp --permanent //將端口範圍添加到開放列表中;
--add-service=ftp --permanent //添加服務到區域開放列表中(注意服務的名稱需要與此區域支持的服務列表中的名稱一致)
--add-source=192.168.1.1 //添加源地址的流量到指定區域
--add-masquerade //開啟SNAT(源地址轉換
4.7.4 刪除規則#
firewall-cmd xxx
--remove-service=http //在home區域內將http服務刪除在開放列表中刪除
--remove-interface=eth0 //將網絡接口在默認的區域內刪除
--remove-source=192.168.1.1 //刪除源地址的流量到指定區域
4.7.5 改變規則#
firewall-cmd xxx
--change-interface=eth1 //改變指定的接口到其他區域
4.7.6 查詢規則#
firewall-cmd xxx
--query-masquerade //查詢SNAT的狀態
--query-interface=eth0 //確定該網卡接口是否存在於此區域
4.7.7 端口轉發#
端口轉發可以將指定地址訪問指定的端口時,將流量轉發至指定地址的指定端口。轉發的目的如果不指定 ip 的話就默認為本機,如果指定了 ip 卻沒指定端口,則默認使用來源端口
//通過firewalld實現SNAT
firewall-cmd --add-masquerade --permanent
firewall-cmd --reload
//將80端口的流量轉發至8080
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
//80端口的流量轉發至
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.2.20
//刪除
firewall-cmd --remove-forwardport=port=80:proto=tcp:toaddr=192.168.2.20 --permanent
//將80端口的流量轉發至192.168.2.20的8080端口
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.2.20:toport=8080
5. iptables 與 firewalld 對比#
- firewalld 是 iptables 的前端控制器
- iptables 靜態防火牆,任一策略變更需要 reload 所有策略,丟失現有鏈接
- firewalld 動態防火牆,任一策略變更不需要 reload 所有策略 將變更部分保存到 iptables, 不丟失現有鏈接
- firewalld 提供一個 daemon 和 service,底層使用 iptables
- firewalld 在使用上要比 iptables 人性化很多,即使不明白 “五張表五條鏈” 而且對 TCP/IP 協議也不理解也可以實現大部分功能
- firewalld 使用區域和服務而不是鏈式規則
- firewalld 默認是拒絕的,需要設置以後才能放行
- iptables 默認是允許的,需要拒絕的才去限制
6. 總結#
本文記錄了防火牆的一些內容,包括防火牆的概念,iptables 和 firewalld,重點介紹了 iptables 和 firewalld,命令較多,不用全部記住。