Linux 防火墻 firewalld 實戰配置
最近工作上處理了很多關系配置服務器防火墻的操作,于是想寫一篇理論與實踐并存的文章,在這里分享給大家,希望對您有所幫助!
主要包括以下幾部分內容(文章比較長,請耐心讀完):
- 防火墻概述
- firewalld原理框架
- 與iptables的異同點
- firewalld常用操作
- firewalld富規則實戰
一、防火墻概述
Firewalld是一種提供了支持網絡/防火墻區域(zone)定義網絡鏈接以及接口安全等級的動態防火墻管理工具,它自身并不具備防火墻的功能,而是和iptables一樣需要通過內核的netfilter來實現。
他們的作用是維護規則,而真正使用規則干活的是內核netfilter,firewalld和iptables的結構以及使用方法會有點不一樣。
從邏輯上可分為:主機防火墻和網絡防火墻 從物理上可分為:硬件防火墻和軟件防火墻
firewalld和iptables就屬于主機層面的防火墻。
主機防火墻主要通過netfilter和TCP Wrappers兩個機制來管理的:
- Netfilter:數據包過濾機制
- TCP Wrappers:程序管理機制
關于數據包過濾機制(Netfilter)兩個軟件:firewalld與iptables
注意:在RHEL7系列中,默認使用firewalld作為防火墻。在7系列之前使用的是iptables作為默認防火墻。
二、Firewalld原理架構
1. Firewalld區域管理
通過將網絡劃分成不同的區域,制定出不同區域之間的訪問控制策略來控制不同程序區域間傳送的數據流。
【例如】互聯網是不可信任的區域,而內部網絡是高度信任的區域。網絡安全模型可以在安裝, 初次啟動和首次建立網絡連接時選擇初始化。該模型描述了主機所連接的整個網絡環境的可信級別,并定義了新連接的處理方式。
2. Firewalld域
網絡區名稱 | 默認配置 |
trusted | 可接受所有的網絡連接 |
home | 用于家庭網絡 |
internal | 用于內部網絡,僅接受ssh,mdns,gp-client,samba-client,dhcpv6-client連接 |
work | 用于工作區,僅接受sshjpp-client,dhcpv6-client服務連接 |
public | 用于工作區, 僅接受ssh,ipp-client,dhcpv6-client服務連接,在公共區域內使用,僅接受ssh或dhcpv6-client服務連接,是firewalld的默認區域 |
dmz | 僅接受ssh服務的連接 |
【溫馨提示】firewalld的默認區域是 public
3. Firewalld配置文件
firewalld默認提供了九個zone配置文件: block.xml、 dmz.xml、 drop.xml、 external.xml、 home.xml、 internal.xml、 public.xml、 trusted.xml、 work.xml,都保存在 /usr/lib/firewalld/zones/目錄下。
三、與ptables 的異同
1. 相同點
firewalld與 iptables 都是 linux 中防火墻的管理程序,但其實其角色主要為對于防火墻策略的管理,真正的防火墻執行者是位于內核中的 netfilter。
2. 不同點
- iptables 僅能通過命令行進行配置;而 firewalld 提供了圖形接口,類似windows防火墻的操作方式;
- iptables 每一個單獨更改意味著清除所有舊的規則,并從 /etc/sysconfig/iptables 中讀取所有新的規;則;而 firewalld 在有規則變動后,可以僅僅運行規則中的不同之處,即在 firewalld 運行時間內,改變設置時可以不丟失現行鏈接;
- iptables 的配置文件在 /etc/sysconfig/iptables 中;而 firewalld 的配置文件在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各種 XML 文件中;
- iptables 沒有守護進程,并不能算是真正意義上的服務;而 firewalld 有守護進程;
- iptables 通過控制端口來控制服務,而 firewalld 則是通過控制協議來控制端口;
- 【firewalld】默認是拒絕;而【iptables】默認是允許。
溫馨提示:
service說明: 在 /usr/lib/firewalld/services/ 目錄中,還保存了另外一類配置文件,每個文件對應一項具體的網絡服務,如 ssh 服務等。這個目錄下的服務配置默認是放通的,不受firewalld-cmd 規則控制,除非把這個目錄下的服務配置文件刪掉,就恢復了默認了(默認拒絕),當然也可以添加一些服務配置文件。
四、Firewalld常用操作
firewall-config(需要有圖形化界面的才能使用), firewall-cmd是命令行工具,實際生產環境主要使用firewall-cmd來操作
1. Firewalld規則的兩種狀態
運行時( runtime):修改規則馬上生效,但是臨時生效,默認是運行時狀態 持久配置( permanent): 修改后需要重載才會生效
firewall-cmd --permanent [RULE]
firewall-cmd --reload
2. Firewalld常見選項
可以通過 man firewall-cmd或者 firewall-cmd --help查看幫助,firewalld的選項很多,下面列出一些比較常用的
firewall-cmd --help
--permanent # 配置寫入到配置文件,永久生效
--reload # 重載配置文件,永久生效
--zone= # 指定區域,默認是public
--get-default-zone # 查看默認區域
--set-default-zone= # 設置默認區域
--get-zones # 獲取所有可用的區域
--get-active-zones # 獲取當前激活(活躍)的區域
--add-source= # 添加地址,可以是主機或網段,遵循當前區域的target
--remove-source # 移除地址,可以是主機或網段,遵循當前區域的target
--add-service= # 添加服務
--remove-service= # 移除服務
--list-services # 顯示當前區域內允許訪問的所有服務
--add-port=xx/tcp # 添加端口,后面要指定是TCP還是UDP
--remove-port= # 移除端口,遵循當前區域的target
--list-ports # 顯示指定區域內允許訪問的所有端口號
--list-all # 列出當前使用的區域的配置
--list-all-zones # 列出所有區域的配置
--get-zone-of-interface= # 獲取指定接口所在的區域
--list-icmp-blocks # 顯示指定區域內拒絕訪問的所有ICMP類型
--list-protocols --列出在指定區域中允許通過的協議
3. 常用的增刪改查操作
(1) 查看規則
查看當前區域的配置信息詳解:
[root@localhost ]# firewall-cmd --list-all
public (active) # 活動的區域
target: default # 默認啟動的區域
icmp-block-inversion: no # ICMP協議類型黑白名單開關(yes/no)
interfaces: eth0 # 關聯的網卡接口
sources: # 來源,可以是IP地址,也可以是mac地址
services: dhcpv6-client ssh # 列出允許通過這個防火墻的服務
ports: 80/tcp # 列出允許通過這個防火墻的目標端口。(即 需要對外開放的端口)
protocols: # 協議值可以是一個協議 ID 數字,或者一個協議名
masquerade: no # 表示這個區域是否允許 IP 偽裝。如果允許,它將允許 IP 轉發,它可以讓你的計算機作為一個路由器
forward-ports: # 列出轉發的端口
source-ports: # 允許的來源端口
icmp-blocks: # 可添加ICMP類型,當icmp-block-inversion為no時,這些ICMP類型被拒絕;當icmp-block-inversion為yes時,這些ICMP類型被允許
rich rules: # 富規則,即更細致、更詳細的防火墻規則策略,它的優先級在所有的防火墻策略中也是最高的
rule family="ipv4"source address="192.168.250.0/24" accept
常用的查看信息:
# 查詢默認區域配置信息
firewall-cmd --list-all
# 查看區域配置信息
firewall-cmd --list-all --zone=work
# 查詢所有端口
firewall-cmd --list-ports
# 查詢指定端口
firewall-cmd --zone=public --query-port=22/tcp
# 查詢放通IP段
firewall-cmd --list-sources
# 查看默認區域
firewall-cmd --get-default-zone
# 查看所有可以使用的區域
firewall-cmd --get-zones
# 查看活躍的區域
firewall-cmd --get-active-zones
# 查看網卡綁定在了哪個區域
firewall-cmd --get-zone-of-interface=[IFACE]
# 查看所有服務
firewall-cmd --get-services
(2) 添加規則
開放特定端口:
# 開放3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 開放snmp的161的UDP端口,默認的zone是public,可以不指定zone
firewall-cmd --add-port=161/udp --permanent
# 讓配置生效
firewall-cmd --reload
# 查看規則
firewall-cmd --list-ports
firewall-cmd --list-all
放通某個服務:
# 放通nfs服務的所有端口
firewall-cmd --zone=public --add-service=nfs --permanent
# 放通ssh服務
firewall-cmd --zone=public --add-service=ssh --permanent
# 放通snmp服務
firewall-cmd --zone=public --add-service=ssh --permanent
# 重載防火墻
firewall-cmd --reload
# 查看放通了哪些服務訪問
firewall-cmd --list-services
放通某個網段訪問:
firewall-cmd --add-source=10.10.10.0/24 --zone=public
firewall-cmd --reload
# 查看
firewall-cmd --list-sources
(3) 刪除規則
# 刪除開放的3306端口
firewall-cmd --permanent --remove-port=3306/tcp
firewall-cmd --reload
# 刪除nfs服務
firewall-cmd --permanent --remove-service=nfs
# 刪除某個網段訪問
firewall-cmd --permanent --zone=public --remove-source=10.10.10.0/24
firewall-cmd --reload
五、Firewalld防火墻富規則
富規則是為了更細粒度的管控,在生產環境用的比較多,重點掌握。
1. 富規則常用的選項
firewall-cmd
--list-rich-rules --列出富規則
--add-rich-rule=<rule> --添加富規則
--remove-rich-rule=<rule> --移除富規則
--list-all 和 --list-all-zones --也能列出存在的富規則
2. 富規則語法
規則的幾乎每個單一元素都能夠以option=value形式來采用附加參數:
rule
[source]
[destination]
service|port|protocol|icmp-block|masquerade|forward-port
[log]
[audit]
[accept|reject|drop]
格式:
rule [family="ipv4|ipv6"]
source address="address[/mask]" [invert="True"]
destination address="address[/mask]" invert="True"
service name="service name"
port port="port value" protocol="tcp|udp"
protocol value="protocol value"
forward-port port="port value" protocol="tcp|udp" to-port="port value
" to-addr="address"
log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"]
accept | reject [type="reject type"] | drop
3. 常用的富規則配置
(1)對特定IP訪問特定端口
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.10.10.110/32" port port="1521" protocol="tcp" accept"
firewall-cmd --reload
(2)批量加端口,允許某個網段訪問多個端口
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.10.10.0/24 port port=8080-8090 protocol=tcp accept'
firewall-cmd --reload
(3) 開通某個IP訪問某個服務
firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 service name=nfs source address="10.10.10.101/32" accept'
firewall-cmd --reload
(4) 拒絕某個IP訪問所有端口
firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=10.10.10.110/32 reject'
firewall-cmd --reload
(5)允許某個IP訪問所有端口
firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=10.10.10.110/32 allow'
firewall-cmd --reload