防火牆 (iptables、firewalld)
一、iptables
1. iptables概述
Linux系統的防火牆:IP資訊包過濾系統,它實際上由兩個元件netfilter和iptables組成。
主要工作在網路層,針對IP資料包。體現在對包內的IP地址、埠等資訊的處理上。
2. netfilter和iptables
(1)netfilter
netfilter屬於“核心態”(Kernel Space,又稱為核心空間)的防火牆功能體系;
是核心的一部分,由一些資料包過濾表組成,這些表包含核心用來控制資料包過濾處理的規則集。
(2)iptables
iptables屬於“使用者態”(User Space,又稱為使用者空間)的防火牆管理體系;
是一種用來管理Linux防火牆的命令程式,它使插入、修改和刪除資料包過濾表中的規則變得容易,通常位於/sbin/iptables目錄下。
(3)netfile/iptables
netfilter/iptables下文中統一簡稱為iptables。
iptables是基於核心的防火牆,其中內建了raw、mangle、nat和 filter四個規則表。
表中所有規則配置後,立即生效,不需要重啟服務。
3. 四表五鏈
(1)四表
規則表的作用:容納各種規則鏈,即表中有鏈。
規則表 | 說明 |
---|---|
raw表 | 確定是否對該資料包進行狀態跟蹤。包含兩個規則鏈,OUTPUT、PREROUTING |
mangle表 | 修改資料包內容,用來做流量整形的,給資料包設定標記。包含五個規則鏈,INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING |
nat表 | 負責網路地址轉換,用來修改資料包中的源、目標IP地址或埠。包含三個規則鏈,OUTPUT、PREROUTING、POSTROUTING。 |
filter表 | 負責過濾資料包,確定是否放行該資料包(過濾)。包含三個規則鏈,INPUT、FORWARD、OUTPUT |
注:在iptables的四個規則表中,mangle表和raw表的應用相對較少
(2)五鏈
規則鏈的作用:容納各種防火牆規則,即鏈中有規則。
規則鏈 | 說明 |
---|---|
INPUT | 處理入站資料包,匹配目標IP為本機的資料包 |
OUTPUT | 處理出站資料包,一般不在此鏈上做配置 |
FORWARD | 處理轉發資料包,匹配流經本機的資料包 |
PREROUTING | 在進行路由選擇前處理資料包,用來修改目的地址,用來做DNAT。相當於把內網中的80埠對映到路由器外網埠上 |
POSTROUTING鏈 | 在進行路由選擇後處理資料包,用來修改源地址,用來做SNAT。相當於內網通過路由器NAT轉換功能實現內網主機通過一個公網IP地址上網 |
(3)規則表的匹配順序
raw>>mangle>>nat>>filter
(4)規則鏈之間的匹配順序
- 主機型防火牆
1)入站資料(來自外界的資料包,且目標地址是防火牆本機)
PREROUTING --> INPUT --> 本機的應用程式
2)出站資料(從防火牆本機向外部地址傳送的資料包)
本機的應用程式 --> OUTPUT --> POSTROUTING - 網路型防火牆
轉發資料(需要經過防火牆轉發的資料包)
PREROUTING --> FORWARD --> POSTROUTING - 規則鏈內的匹配順序
1)自上向下按順序依次進行檢查,找到相匹配的規則即停止(LOG策略例外,表示記錄相關日誌)
2)若在該鏈內找不到相匹配的規則,則按該鏈的預設策略處理(未修改的狀況下,預設策略為允許)
4. iptables的安裝
CentOS 7預設使用firewalld防火牆,沒有安裝iptables,若想使用iptables防火牆。必須先關閉firewalld防火牆,再安裝iptables
#關閉防火牆
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# systemctl disable firewalld.service
#安裝並開啟iptables服務
[root@localhost ~]# yum -y install iptables iptables-services
[root@localhost ~]# systemctl start iptables.service
5. iptables防火牆的配置
(1)命令列配置格式
(2)注意事項
- 不指定表名時,預設指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 | 檢視規則時,顯示規則的序號 |
(5)匹配條件
匹配條件 | 說明 |
---|---|
-p | 指定要匹配的資料包的協議型別 |
-s | 指定要匹配的資料包的源IP地址 |
-d | 指定要匹配的資料包的目的IP地址 |
-i | 指定資料包進入本機的網路介面 |
-o | 指定資料包離開本機做使用的網路介面 |
–sport | 指定源埠號 |
–dport | 指定目的埠號 |
6. 匹配型別
①通用匹配
直接使用,不依賴於其他條件或擴充套件,包括網路協議、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
②隱含匹配
以特定的協議匹配作為前提,包括埠、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
- TCP標記匹配
--tcp-flags TCP標記
iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT #丟棄SYN請求包,放行其他包
- 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不通其它主機時提示目標不可達
iptables -A INPUT -p icmp -j REJECT #此時其它主機需要配置關於icmp協議的控制型別為 REJECT
③顯示匹配
要求以“-m 擴充套件模組”的形式明確指出型別,包括多埠、MAC地址、IP範圍、資料包狀態等條件
- 多埠匹配
-m multiport --sports 源埠列表
-m multiport --dports 目的埠列表
例:
iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
- 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
- 狀態匹配
-m state --state 連線狀態
常見的連線狀態:
NEW :與任何連線無關的,還沒開始連線
ESTABLISHED :響應請求或者已建立連線的,連線態
RELATED :與已有連線有相關性的(如FTP 主被動模式的資料連線),衍生態,一般與ESTABLISHED 配合使用
INVALID :不能被識別屬於哪個連線或沒有任何狀態
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP #禁止轉發與正常 TCP 連線無關的非--syn 請求資料包(如偽造的網路攻擊資料包)
7. SNAT原理與應用
(1)應用環境
區域網主機共享單個公網IP地址接入Internet(私有IP不能在Internet中正常路由)。
一個IP地址做SNAT轉換,一般可以讓內網 100到200 臺主機實現上網。
(2)原理
修改資料包的源地址
(3)SNAT轉換前提條件
區域網各主機已正確設定IP地址、子網掩碼、預設閘道器地址
Linux閘道器開啟IP路由轉發
(4)路由轉發開啟方式
1.臨時開啟:
echo 1 > /proc/sys/net/ipv4/ip_forward
或
sysctl -w net.ipv4.ip_forward=1
2.永久開啟:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #將此行寫入配置檔案
3.sysctl -p #讀取修改後的配置
(5)SNAT轉換具體格式
- 固定的公網IP地址:
iptables -t nat -A POSTROUTING -s 192.168.80.0/24(內網IP) -o(出站) ens33(外網網絡卡) -j SNAT --to 12.0.0.1(外網IP或地址池)
或
iptables -t nat -A POSTROUTING -s 192.168.80.0/24(內網IP) -o(出站) ens33(外網網絡卡) -j SNAT --to-source 12.0.0.1-12.0.0.10(外網IP或地址池)
- 非固定的公網IP地址(共享動態IP地址):
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j MASQUERADE
8. DNAT原理與應用
(1)應用環境
在Internet中釋出位於區域網內的伺服器。
主機型防火牆:主要使用INPUT、OUTPUT鏈,設定規則時一般要詳細的指定到埠。
網路型防火牆:主要使用FORWARD鏈,設定規則時很少去指定到埠,一般指定到IP地址或者到網段即可。
(2)原理
修改資料包的目的地址
(3)DNAT轉換前提條件
區域網的伺服器能夠訪問Internet
閘道器的外網地址有正確的DNS解析記錄
Linux閘道器開啟IP路由轉發
(4)DNAT轉換
使用DNAT時,同時配合SNAT使用,才能實現響應資料包的正確返回
- 釋出內網的Web服務
#把從ens33進來的要訪問web服務的資料包目的地址轉換為 192.168.80.11
iptables -t nat -A PREROUTING -i(入站) ens33(外網網絡卡) -d 12.0.0.1(外網IP) -p tcp --dport 80 -j DNAT --to 192.168.80.11(內網伺服器Ip)
或
iptables -t nat -A PREROUTING -i(入站) ens33(外網網絡卡) -d 12.0.0.1(外網IP) -p tcp --dport 80 -j DNAT --to-destination 192.168.80.11(內網伺服器IP)
iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j DNAT --to 192.168.80.11-192.168.80.20(地址池)
- 釋出時修改目標埠
#釋出區域網內部的OpenSSH伺服器,外網主機需使用250埠進行連線
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 250 -j DNAT --to 192.168.80.11:22
ssh -p 250 root@12.0.0.1 #在外網環境中使用SSH測試
yum -y install net-tools #若沒有 ifconfig 命令可提前使用 yum 進行安裝
ifconfig ens33
9. 防火牆規則的備份和還原
(1)匯出(備份)所有表的規則
iptables-save > /opt/ipt.txt
(2)匯入(還原)規則
iptables-restore < /opt/ipt.txt
將iptables規則檔案儲存在 /etc/sysconfig/iptables 中,iptables服務啟動時會自動還原規則
iptables-save > /etc/sysconfig/iptables
systemctl stop iptables #停止iptables服務會清空掉所有表的規則
systemctl start iptables #啟動iptables服務會自動還原/etc/sysconfig/iptables 中的規則
10. linux系統抓包
(1)格式
例:tcpdump tcp -i ens33 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
(2)選項
選項 | 說明 |
---|---|
tcp | ip icmp arp rarp和tcp、udp、icmp這些選項等都要放到第一個引數的位置,用來過濾資料包的型別 |
-i ens33 | 只抓經過介面ens33的包 |
-t | 不顯示時間戳 |
-s 0 | 抓取資料包時預設抓取長度為68位元組。加上-s 0後可以抓取完整的資料包 |
-c 100 | 只抓取100個數據包 |
dst port !22 | 不抓取目標埠是22的資料包 |
src net 192.168.1.0/24 | 資料包的源網路地址為192.168.1.0/24 |
-w ./target.cap | 儲存成cap檔案,方便用ethereal(wireshark)分析 |
二、firewalld
1. firewalld防火牆簡介
firewalld防火牆是Centos7系統預設的防火牆管理工具,取代了之前的iptables防火牆,也是工作在網路層,屬於包過濾防火牆
firewalld和iptables都是用來管理防火牆的工具(屬於使用者態)來定義防火牆的各種規則功能,內部結構都指向netfilter網路過濾子系統(屬於核心態)來實現包過濾防火牆功能
firewalld提供了支援網路區域所定義的網路連線以及介面安全等級的動態防火牆管理工具
它支援IPv4、IPv6防火牆設定以及乙太網橋(在某些高階服務可能會用到,比如雲計算),並且擁有兩種配置模式:執行時配置與永久配置
2. firewalld與iptables的區別
區別項 | firewalld | iptables |
---|---|---|
配置檔案 | /usr/lib/firewalld /etc/firewalld |
/etc/sysconfig/iptables |
對規則的修改 | 不需要全部重新整理策略,不丟失現行連線 | 需要全部重新整理策略,丟失連線 |
防火牆型別 | 動態防火牆 | 靜態防火牆 |
- iptables主要是基於介面,來設定規則,從而判斷網路的安全性;firewalld是基於區域,根據不同的區域來設定不同的規則,從而保證網路的安全。與硬體防火牆的設定相類似
- iptables在/etc/ sysconfig/iptables中儲存配置;firewalld將配置儲存在/etc/firewalld/(優先載入)和/usr/lib/ firewalld/ (預設的配置檔案)中的各種XML檔案裡
- 使用iptables每一個單獨更改意味著清除所有舊有的規則和從/etc/sysconfig/iptables裡讀取所有新的規則;使用firewalld卻不會再建立任何新的規則,僅僅執行規則中的不同之處。因此firewalld可以在執行時間內,改變設定而不丟失現行連線
- iptables防火牆型別為靜態防火牆;firewalld防火牆型別為動態防火牆
3. firewalld區域的概念
firewalld防火牆為了簡化管理,將所有網路流量分為多個區(zone),然後根據資料包的源IP地址或傳入的網路介面等條件將流量傳入相應區域。每個區域都定義了自己開啟或者關閉的埠和服務列表
(1)firewalld防火牆9個區域
區域 | 說明 |
---|---|
trusted(信任區域) | 允許所有的傳入流量 |
public(公共區域) | 允許與ssh或dhcpv6-client預定義服務匹配的傳入流量,其餘均拒絕。是新新增網路介面的預設區域 |
external(外部區域) | 允許與 ssh 預定義服務匹配的傳入流量,其餘均拒絕。 預設將通過此區域轉發的IPv4傳出流量將進行地址偽裝,可用於為 路由器啟用了偽裝功能的外部網路 |
home(家庭區域) | 允許與ssh、ipp-client、mdns、samba-client或dhcpv6-client預定義服務匹配的傳入流量,其餘均拒絕 |
internal(內部區域) | 預設值時與home區域相同 |
work(工作區域) | 允許與 ssh、ipp-client、dhcpv6-client 預定義服務匹配的傳入流量,其餘均拒絕 |
dmz(隔離區域也稱為非軍事區域) | 允許與 ssh 預定義服務匹配的傳入流量,其餘均拒絕 |
block(限制區域) | 拒絕所有傳入流量 |
drop(丟棄區域) | 丟棄所有傳入流量,並且不產生包含ICMP的錯誤響應 |
(2)區域介紹
- 最終一個區域的安全程度是取決於管理員在此區域中設定的規則
- 區域如同進入主機的安全門,每個區域都具有不同限制程度的規則,只會允許符合規則的流量傳入
- 可以根據網路規模,使用一個或多個區域,但是任何一個 活躍區域 至少需要關聯 源地址或介面
- 預設情況下,public區域是預設區域,包含所有介面(網絡卡)
4. firewalld資料處理流程
firewalld對於進入系統的資料包,會根據資料包的源IP地址或傳入的網路介面等條件,將資料流量轉入相應區域的防火牆規則。對於進入系統的資料包,首先檢查的就是其源地址
5. firewalld檢查資料包的源地址規則
- 若源地址關聯到特定的區域(即源地址或介面繫結的區域有衝突),則執行該區域所制定的規則
- 若源地址未關聯到特定的區域(即源地址或介面繫結的區域沒有衝突),則使用傳入網路介面的區域並執行該區域所制定的規則
- 若網路介面也未關聯到特定的區域(即源地址或介面都沒有繫結特定的某個區域),則使用預設區域並執行該區域所制定的規則
6. firewalld防火牆的配置方法
(1)使用firewall-cmd命令列工具
常用的firewall-cmd命令選項 | 說明 |
---|---|
--get-default-zone | 顯示當前預設區域 |
--set-default-zone= | 設定預設區域 |
--get-active-zones | 顯示當前正在使用的區域及其對應的網絡卡介面 |
--get-zones | 顯示所有可用的區域 |
--get-zone-of-interface= | 顯示指定介面繫結的區域 |
--zone=--add-interface= | 為指定介面繫結區域 |
--zone=--change-interface= | 為指定的區域更改繫結的網路介面 |
--zone=--remove-interface= | 為指定的區域刪除繫結的網路介面 |
--get-zone-of-source= | 顯示指定源地址繫結的區域 |
--zone=--add-source= | 為指定源地址繫結區域 |
--zone=--change-source= | 為指定的區域更改繫結的源地址 |
--zone=--remove-source= | 為指定的區域刪除繫結的源地址 |
--list-all-zones | 顯示所有區域及其規則 |
[--zone=] --list-all | 顯示所有指定區域的所有規則,省略--zone=時表示僅對預設區域操作 |
[--zone=] --list-services | 顯示指定區域內允許訪問的所有服務 |
[--zone=] --add-service= | 為指定區域設定允許訪問的某項服務 |
[--zone=] --remove-service= | 刪除指定區域已設定的允許訪問的某項服務 |
[--zone=] --list-ports | 顯示指定區域內允許訪問的所有埠號 |
[--zone=] --add-port=[-]/ | 為指定區域設定允許訪問的某個/某段埠號(包括協議名) |
[--zone=] --remove-port=[-]/ | 刪除指定區域已設定的允許訪問的埠號(包括協議名) |
[--zone=] --list-icmp-blocks | 顯示指定區域內拒絕訪問的所有 ICMP 型別 |
[--zone=] --add-icmp-block= | 為指定區域設定拒絕訪問的某項 ICMP 型別 |
[--zone=] --remove-icmp-block= | 刪除指定區域已設定的拒絕訪問的某項ICMP型別 |
firewall-cmd --get-icmptypes | 顯示所有 ICMP 型別 |
(2)使用firewall-config圖形工具
(3)編寫/etc/firewalld/中的配置檔案
7. 區域管理
- 顯示當前系統中的預設區域
firewall-cmd --get-default-zone - 顯示預設區域的所有規則
firewall-cmd --list-all - 顯示當前正在使用的區域及其對應的網絡卡介面
firewall-cmd --get-active-zones - 設定預設區域
firewall-cmd --set-default-zone=home
firewall-cmd --get-default-zone
8. 服務管理
- 檢視預設區域內允許訪問的所有服務
firewall-cmd --list-service - 新增httpd 服務到public 區域
firewall-cmd --add-service=http --zone=public - 檢視public 區域已配置規則
firewall-cmd --list-all --zone=public - 刪除public 區域的httpd 服務
firewall-cmd --remove-service=http --zone=public - 同時新增httpd、https 服務到預設區域,設定成永久生效
firewall-cmd --add-service=http --add-service=https --permanent
firewall-cmd --reload
firewall-cmd --list-all
注: - 新增使用 --permanent選項表示設定成永久生效,需要重新啟動firewalld服務或執行firewall-cmd --reload命令,重新載入防火牆規則時才會生效。若不帶有此選項,表示用於設定執行時規則,但是這些規則在系統或firewalld服務重啟、停止時配置將失效。
- --runtime-to-permanent:將當前的執行時配置寫入規則配置檔案中,使之成為永久性配置
9. 埠管理
- 允許TCP的443埠到internal區域
firewall-cmd --zone=internal --add-port=443/tcp
firewall-cmd --list-all --zone=internal - 從internal 區域將TCP的443埠移除
firewall-cmd --zone=internal --remove-port=443/tcp - 允許UDP的2048~2050埠到預設區域
firewall-cmd --add-port=2048-2050/udp
firewall-cmd --list-all