1. 程式人生 > >firewalld防火墻詳解

firewalld防火墻詳解

eject XML str mar nes 系統配置 ports lin options

眾所周知,在RHEL7系統中,firewalld防火墻取代了iptables防火墻。我們都知道iptables的防火墻策略是交由內核層面的netfilter網絡過濾器來處理的,而firewalld則是交由內核層面的nftables包過濾框架來處理。
相較於iptables防火墻而言,firewalld支持動態更新技術並加入了區域(zone)的概念。簡單來說,區域就是firewalld預先準備了幾套防火墻策略集合(策略模板),用戶可以根據生產場景的不同而選擇合適的策略集合,從而實現防火墻策略之間的快速切換。
表1:firewalld中常用的區域名稱及策略規則

區域(noze) 默認策略規則
trusted 允許所有的數據包進出
home 拒絕進入的流量,除非與出去的流量相關;而如果流量與ssh、mdns、ipp-client、amba-client與dhcpv6-client服務相關,則允許進入
Internal 等同於home區域
work 拒絕進入的流量,除非與出去的流量相關;而如果流量與ssh、ipp-client與dhcpv6-client服務相關,則允許進入
public 拒絕進入的流量,除非與出去的流量相關;而如果流量與ssh、dhcpv6-client服務相關,則允許進入
external 拒絕進入的流量,除非與出去的流量相關;而如果流量與ssh服務相關,則允許進入
dmz 拒絕進入的流量,除非與出去的流量相關;而如果流量與ssh服務相關,則允許進入
block 拒絕進入的流量,除非與出去的流量相關
drop 拒絕進入的流量,除非與出去的流量相關

從上圖我們可以看到,firewalld默認出口是全放開的。
動靜態更新技術之間的區別:iptables每一個更改都需要先清除所有舊有的規則,然後重新加載所有的規則(包括新的和修改後的規則);而firewalld任何規則的變更都不需要對整個防火墻規則重新加載。
firewalld服務的主配置文件是firewalld.conf,防火墻策略的配置文件是以xml格式為主,存放在以下兩個目錄裏。
/etc/firewalld # 用戶配置文件

/usr/lib/firewalld #系統配置文件,預定義配置文件
firewalld有基於CLI(命令行界面)和基於GUI(圖形用戶界面)兩種管理方式,即:firewall-cmd(終端管理工具)和firewall-config(圖形管理工具)。

一、終端管理工具

firewalld的參數一般都是以“長格式”來提供的,但是在RHEL7系統裏支持部分命令的參數補齊,其中就包括firewall-cmd命令,也就是說可以用Tab鍵來補齊長格式參數,很酷吧。
表2:firewall-cmd命令中使用的參數以及作用

參數 作用
--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 讓“永久生效”的配置規則立即生效,並覆蓋當前的配置規則
--panic-on 開啟應急狀況模式
--panic-off 關閉應急狀況模式

firewalld配置的防火墻策略默認為運行時(Runtime)模式,又稱為當前生效模式,而且隨著系統的重啟會失效。如果想讓配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在firewall-cmd命令後面添加--permanent參數,這樣配置的防火墻策略就可以永久生效了。但是,永久生效模式有一個“不近人情”的特點,就是使用它設置的策略只有在系統重啟後才會生效。如果想讓配置的永久策略立即生效,需要手動執行firewall-cmd --reload命令。
註:remove掉ssh服務或者ssh端口,當前遠程登陸會話不會斷開,退出後就無法遠程連接了。
firewalld服務啟動、重啟、停止

systemctl start firewalld
systemctl restart firewalld
systemctl stop firewalld

重新加載防火墻配置
firewall-cmd --reload
查看firewalld的運行狀態
firewall-cmd --state
查看默認當前使用的區域
firewall-cmd --get-default-zone
查看系統默認活動區域名稱、來源地址和關聯的網卡
firewall-cmd --get-active-zones
技術分享圖片
查看所有可用區域
firewall-cmd --get-zones
查看區域的所有設置

firewall-cmd --zone=internal --list-all   # 查看指定區域設置
firewall-cmd --list-all   # 查看默認區域設置

技術分享圖片
Target:目標
icmp-block-inversion:ICMP協議類型黑白名單開關(yes/no)
Interfaces:關聯的網卡接口
sources:來源,可以是IP地址,也可以是mac地址
services:允許的服務
ports:允許的目標端口,即本地開放的端口
protocols:允許通過的協議
masquerade:是否允許偽裝(yes/no),可改寫來源IP地址及mac地址
forward-ports:允許轉發的端口
source-ports:允許的來源端口
icmp-blocks:可添加ICMP類型,當icmp-block-inversion為no時,這些ICMP類型被拒絕;當icmp-block-inversion為yes時,這些ICMP類型被允許。
rich rules:富規則,即更細致、更詳細的防火墻規則策略,它的優先級在所有的防火墻策略中也是最高的。
查看所有預設的服務
firewall-cmd --get-services
此時將會列出/usr/lib/firewalld/services/目錄中所有的服務名稱。
查看所有區域的設置
firewall-cmd --list-all-zones
查看指定網卡所在的區域
firewall-cmd --get-zone-of-interface=ens32
把firewalld的當前默認區域設置為drop,此為永久設置
firewall-cmd --set-default-zone=drop
把ens32網卡關聯的區域修改為drop

firewall-cmd --permanent --zone=drop --change-interface=ens32   # 永久設置
firewall-cmd --zone=drop --change-interface=ens32   # 當前生效

技術分享圖片
我們後面的設置命令將全部使用運行時模式,即當前生效模式。
將來自ens33網卡的流量都作用到默認的drop區域

firewall-cmd --zone=drop -add-interface=ens33   # 作用在指定區域
firewall-cmd -add-interface=ens33   # 作用在默認區域
firewall-cmd -remove-interface=ens33  # 禁止ens33網卡作用在drop區域

註:不指定--zone參數的話,將會對默認區域進行設置
啟動關閉firewalld防火墻服務的應急狀況模式,遠程連接服務器時請慎用

firewall-cmd --panic-on  # 拒絕所有流量,遠程連接會立即斷開,只有本地能登陸
firewall-cmd --panic-off  # 取消應急模式,但需要重啟firewalld後才可以遠程ssh
firewall-cmd --query-panic  # 查看是否為應急模式

設置一個來源地址作用在drop區域上面

firewall-cmd --zone=drop --add-source=192.168.1.12  # 作用在指定區域
firewall-cmd --add-source=192.168.1.12  # 作用在默認區域
firewall-cmd --remove-source=192.168.1.12  # 取消源IP為192.168.1.12的包作用在drop區域

說明:凡是IP為192.168.1.12發來包將會使用drop區域設置的規則
對於一個接收到的請求具體使用哪個zone,firewalld是通過三種方式來判斷的:
1、source,來源地址
2、Interface,接收請求的網卡
3、firewalld配置的默認區域(zone)
這三個方式的優先級按順序依次降低,也就是說如果按照source可以找到就不會再按interface去找,如果前兩個都找不到才會使用第三個默認區域。
查詢drop區域是否允許請求ssh和https服務的流量

firewall-cmd --zone=drop --query-service=ssh
firewall-cmd --zone=drop --query-service=https

在drop區域開放https服務
firewall-cmd --zone=drop --add-service=https
取消開放https服務,即禁止https服務
firewall-cmd --zone=drop --remove-service=https
開放22端口
firewall-cmd --zone=drop --add-port=22/tcp
取消開放22端口
firewall-cmd --zone=drop --remove-port=22/tcp
開放8080和8081端口
firewall-cmd --zone=drop --add-port=8080-8081/tcp
查詢drop區域開放了哪些端口
firewall-cmd --zone=drop --list-ports
允許icmp協議流量,即允許ping
firewall-cmd --zone=drop --add-protocol=icmp
取消允許icmp協議的流量,即禁ping
firewall-cmd --zone=drop --remove-protocol=icmp
查詢drop區域開放了哪些協議
firewall-cmd --zone=drop --list-protocols
將原本訪問本機888端口的流量轉發到本機22端口
firewall-cmd --zone=drop --add-forward-port=port=888:proto=tcp:toport=22
將原本訪問本機888端口的流量轉發到ip為192.168.2.208的主機的22端口,需要開啟masquerade

firewall-cmd --zone=drop --add-masquerade
firewall-cmd --zone=drop --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.2.208

測試端口轉發功能是否生效
在客戶端嘗試訪問192.168.2.210主機的888端口,連上去後發現實際連接的是192.168.2.208主機,測試OK。
技術分享圖片
技術分享圖片
接下來我們來看富規則的設置,即rich rules
允許192.168.2.208主機的所有流量
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" accept"
允許192.168.2.208主機的icmp協議,即允許192.168.2.208主機ping
firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.208" protocol value="icmp" accept"
取消允許192.168.2.208主機的所有流量
firewall-cmd --zone=drop --remove-rich-rule="rule family="ipv4" source address="192.168.2.208" accept"
允許192.168.2.208主機訪問ssh服務
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" service name="ssh" accept"
禁止192.168.2.208訪問https服務,並返回錯誤信息
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" service name="https" reject"
註:如果是drop的話是直接丟棄,會返回timeout(連接超時)
允許192.168.2.0/24網段的主機訪問22端口
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="22" accept"
每分鐘允許2個新連接訪問ftp服務
firewall-cmd --add-rich-rule="rule service name=ftp limit value=2/m accept"
允許新的ipv4和ipv6連接ftp,並使用日誌和審核,每分鐘允許訪問一次
firewall-cmd --add-rich-rule="rule service name=ftp log limit value="1/m" audit accept"
拒絕來自192.168.2.0/24網段的連接,10秒後自動取消
firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 reject" --timeout=10
允許ipv6地址為2001:db8::/64子網的主機訪問dns服務,並且每小時審核一次,300秒後自動取消
firewall-cmd --add-rich-rule="rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject" --timeout=300
將來自192.168.2.0/24網段訪問本機80端口的流量轉發到本機的22端口
firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 forward-port port=80 protocol=tcp to-port=22"
將來自192.168.2.0/24網段訪問本地80端口的流量轉發到192.168.2.208主機的22端口
firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 forward-port port=80 protocol=tcp to-port=22 to-addr=192.168.2.208"
偽裝,將來自局域網192.168.2.0/24網段訪問外網的流量映射為網絡出口公網IP,即修改源IP地址

firewall-cmd --zone=drop --add-masquerade
firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 masquerade"

好了,寫的差不多了,工作中基本上夠用了

二、圖形管理工具

在RHEL7之前的發行版本默認的防火墻中,幾乎沒有圖形化的防火墻管理工具,但是firewalld卻有,firewall-config是firewalld防火墻配置管理工具的GUI(圖開用戶界面)版本,幾乎可以實現所有命令行執行的操作。即使沒有紮實的Linux命令基礎,也完合可以通過它來妥善配置firewalld防火墻策略。Firewall-config的界面如下圖所示,功能具體如下:
技術分享圖片
1、選擇運行時(Runtime)模式或永久(Permanent)模式。
2、可選的策略集合區域列表。
3、常用的系統服務列表。
4、當前正在使用的區域。
5、管理當前被選中區域中的服務。
6、管理當前被選中區域中的端口。
7、開啟或關閉SNAT(源地址轉換協議)技術。
8、設置端口轉發策略。
9、控制請求icmp服務的流量。
10、管理防火墻的富規則。
11、管理網卡設備。
12、被選中區域的服務,若勾選了相應服務前面的復選框,則表示允許與之相關的流量。
13、Firewall-config工具的運行狀態。
對外開放http服務,如下圖
技術分享圖片
添加一條防火墻規則,使其放行訪問8080-8088端口(TCP協議)的流量,並且永久生效
技術分享圖片
單擊Options菜單中的Reload Firewalld選項,讓上面配置的永久規則立即生效,這與在命令行中執行--reload參數的效果一樣。
技術分享圖片
SNAT技術相信很多人都知道,那現在我們來開啟SNAT技術,其實就是命令行下的masquerade。
技術分享圖片
下面我們來配置一個端口轉發規則,將888端口的流量轉發到其他主機的22端口上。
註:轉發本機端口不需要開啟masquerade,轉發到別的主機才需要開啟masquerade。
技術分享圖片
配置富規則,允許192.168.2.206主機訪問本機的1234端口號
技術分享圖片
最後來看一下區域和網卡的關聯,增加網卡的話只需要輸入網卡名稱即可。
技術分享圖片

三、防火墻腳本實例

下面是我自己寫的一個簡單的防火墻初始化腳本,5210是ssh端口號,192.168.2.208是保壘機,192.168.2.206是備用ssh機器。

#!/bin/bash
systemctl stop firewalld
\cp -p /usr/lib/firewalld/zones/drop.xml /etc/firewalld/zones/
systemctl start firewalld
firewall-cmd --set-default-zone=drop
firewall-cmd --permanent --zone=drop --change-interface=ens32
firewall-cmd --permanent --zone=drop --add-service=https
firewall-cmd --permanent --zone=drop --add-protocol=icmp
firewall-cmd --permanent --zone=drop --add-masquerade
firewall-cmd --permanent --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" port protocol="tcp" port="5210" accept"
firewall-cmd --permanent --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.206" port protocol="tcp" port="5210" accept"
firewall-cmd --permanent --zone=drop --add-rich-rule="rule family="ipv4" source address="116.226.230.115" port protocol="tcp" port="8023" accept"
firewall-cmd --reload

firewalld防火墻詳解