Linux 防火墻 firewalld 實(shí)戰(zhàn)配置
最近工作上處理了很多關(guān)系配置服務(wù)器防火墻的操作,于是想寫一篇理論與實(shí)踐并存的文章,在這里分享給大家,希望對(duì)您有所幫助!
主要包括以下幾部分內(nèi)容(文章比較長,請(qǐng)耐心讀完):
- 防火墻概述
 - firewalld原理框架
 - 與iptables的異同點(diǎn)
 - firewalld常用操作
 - firewalld富規(guī)則實(shí)戰(zhàn)
 

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














 
 
 
 
 
 
 