Firewalld

      RHEL 7系統中整合了多款防火牆管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems,Linux系統的動態防火牆管理器)服務是預設的防火牆配置管理工具,它擁有基於CLI(命令列介面)和基於GUI(圖形使用者介面)的兩種管理方式。
      相較於傳統的防火牆管理配置工具,firewalld支援動態更新技術並加入了區域(zone)的概念。簡單來說,區域就是firewalld預先準備了幾套防火牆策略集合(策略模板),使用者可以根據生產場景的不同而選擇合適的策略集合,從而實現防火牆策略之間的快速切換。例如,我們有一臺膝上型電腦,每天都要在辦公室、咖啡廳和家裡使用。按常理來講,這三者的安全性按照由高到低的順序來排列,應該是家庭、公司辦公室、咖啡廳。當前,我們希望為這檯膝上型電腦指定如下防火牆策略規則:在家中允許訪問所有服務;在辦公室內僅允許訪問檔案共享服務;在咖啡廳僅允許上網瀏覽。在以往,我們需要頻繁地手動設定防火牆策略規則,而現在只需要預設好區域集合,然後只需輕點滑鼠就可以自動切換了,從而極大地提升了防火牆策略的應用效率。firewalld中常見的區域名稱(預設為public)以及相應的策略規則如下表所示。

                                firewalld中常用的區域名稱及策略規則
區域預設規則策略
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-cmd是firewalld防火牆配置管理工具的CLI(命令列介面)版本。它的引數一般都是以“長格式”來提供的,大家不要一聽到長格式就頭大,因為RHEL 7系統支援部分命令的引數補齊,其中就包含這條命令(很酷吧)。也就是說,現在除了能用Tab鍵自動補齊命令或檔名等內容之外,還可以用Tab鍵來補齊。

                               firewalld-cmd命令中使用的引數以及作用
引數作用
–get-default-zone查詢預設的區域名稱
–set-default-zone=<區域名稱>設定預設的區域,使其永久生效
–get-zones顯示可用的區域
–get-services顯示預先定義的服務
–get-active-zones顯示當前正在使用的區域與網絡卡名稱
–remove-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關閉應急狀況模式

      與Linux系統中其他的防火牆策略配置工具一樣,使用firewalld配置的防火牆策略預設為執行時(Runtime)模式,又稱為當前生效模式,而且隨著系統的重啟會失效。如果想讓配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在用firewall-cmd命令正常設定防火牆策略時新增–permanent引數,這樣配置的防火牆策略就可以永久生效了。但是,永久生效模式有一個“不近人情”的特點,就是使用它設定的策略只有在系統重啟之後才能自動生效。如果想讓配置的策略立即生效,需要手動執行firewall-cmd –reload命令。

      提醒大家一定要仔細檢視是Runtime模式還是Permanent模式。如果不關注這個細節,就算是正確配置了防火牆策略,也可能無法達到預期的效果。

1、檢視firewalld服務當前所使用的區域

[[email protected] ~]# firewall-cmd --get-default-zone
public

2、查詢eno16777728網絡卡在firewalld服務中的區域

[[email protected] ~]# firewall-cmd --get-zone-of-interface=eno16777728
public

3、把firewalld服務中eno16777728網絡卡的預設區域修改為external,並在系統重啟後生效。分別檢視當前與永久模式下的區域名稱

[[email protected] ~]# firewall-cmd --permanent --zone=external --change-interface=eno16777728
success
[[email protected] ~]# firewall-cmd --get-zone-of-interface=eno16777728
public
[[email protected] ~]# firewall-cmd --permanent --get-zone-of-interface=eno16777728
external

4、把firewalld服務的當前預設區域設定為public

[[email protected] ~]# firewall-cmd --set-default-zone=public
success
[[email protected] ~]# firewall-cmd --get-default-zone 
public

5、啟動/關閉firewalld防火牆服務的應急狀況模式,阻斷一切網路連線(當遠端控制伺服器時請慎用)

[[email protected] ~]# firewall-cmd --panic-on
success
[[email protected] ~]# firewall-cmd --panic-off
success

6、查詢public區域是否允許請求SSH和HTTPS協議的流量

[[email protected] ~]# firewall-cmd --zone=public --query-service=ssh
yes
[[email protected] ~]# firewall-cmd --zone=public --query-service=https
no

7、把firewalld服務中請求HTTPS協議的流量設定為永久允許,並立即生效

[[email protected] ~]# firewall-cmd --zone=public --add-service=https
success
[[email protected] ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[[email protected] ~]# firewall-cmd --reload
success

8、把firewalld服務中請求HTTP協議的流量設定為永久拒絕,並立即生效

[[email protected] ~]# firewall-cmd --permanent --zone=public --remove-service=http 
success
[[email protected] ~]# firewall-cmd --reload 
success

9、把在firewalld服務中訪問8080和8081埠的流量策略設定為允許,但僅限當前生效

[[email protected] ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[[email protected] ~]# firewall-cmd --zone=public --list-ports 
8080-8081/tcp

10、把原本訪問本機888埠的流量轉發到22埠,要且求當前和長期均有效

流量轉發命令格式為firewall-cmd –permanent –zone=<區域> –add-forward-port=port=<源埠號>:proto=<協議>:toport=<目標埠號>:toaddr=<目標IP地址>

[[email protected] ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10
success
[[email protected] ~]# firewall-cmd --reload
success

11、在客戶端使用ssh命令嘗試訪問192.168.10.10主機的888埠

[[email protected] A ~]# ssh -p 888 192.168.10.10
The authenticity of host '[192.168.10.10]:888 ([192.168.10.10]:888)' can't be established.
ECDSA key fingerprint is b8:25:88:89:5c:05:b6:dd:ef:76:63:ff:1a:54:02:1a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.10.10]:888' (ECDSA) to the list of known hosts.
[email protected]'s password:此處輸入遠端root管理員的密碼
Last login: Sun Jul 19 21:43:48 2017 from 192.168.10.10

      firewalld中的富規則表示更細緻、更詳細的防火牆策略配置,它可以針對系統服務、埠號、源地址和目標地址等諸多資訊進行更有針對性的策略配置。它的優先順序在所有的防火牆策略中也是最高的。比如,我們可以在firewalld服務中配置一條富規則,使其拒絕192.168.10.0/24網段的所有使用者訪問本機的ssh服務(22埠)

[[email protected] ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"
success
[[email protected] ~]# firewall-cmd --reload
success

在客戶端使用ssh命令嘗試訪問192.168.10.10主機的ssh服務(22埠)

[[email protected] A ~]# ssh 192.168.10.10
Connecting to 192.168.10.10:22...
Could not connect to '192.168.10.10' (port 22): Connection failed.

二、圖形管理工具
      在各種版本的Linux系統中,幾乎沒有能讓劉遄老師欣慰並推薦的圖形化工具,但是firewall-config做到了。它是firewalld防火牆配置管理工具的GUI(圖形使用者介面)版本,幾乎可以實現所有以命令列來執行的操作。毫不誇張的說,即使讀者沒有紮實的Linux命令基礎,也完全可以通過它來妥善配置RHEL 7中的防火牆策略。firewall-config的功能具體如下。

1:選擇執行時(Runtime)模式或永久(Permanent)模式的配置。
2:可選的策略集合區域列表。
3:常用的系統服務列表。
4:當前正在使用的區域。
5:管理當前被選中區域中的服務。
6:管理當前被選中區域中的埠。
7:開啟或關閉SNAT(源地址轉換協議)技術。
8:設定埠轉發策略。
9:控制請求icmp服務的流量。
10:管理防火牆的富規則。
11:管理網絡卡裝置。
12:被選中區域的服務,若勾選了相應服務前面的核取方塊,則表示允許與之相關的流量。
13:firewall-config工具的執行狀態。

這裡寫圖片描述

      在使用firewall-config工具配置完防火牆策略之後,無須進行二次確認,因為只要有修改內容,它就自動進行儲存。下面進行動手實踐環節。
      我們先將當前區域中請求http服務的流量設定為允許,但僅限當前生效。具體配置如下。
這裡寫圖片描述

      嘗試新增一條防火牆策略規則,使其放行訪問8080~8088埠(TCP協議)的流量,並將其設定為永久生效,以達到系統重啟後防火牆策略依然生效的目的。在圖形化的介面配置完畢之後,還需要在Options選單中單擊Reload Firewalld命令,讓配置的防火牆策略立即生效。這與在命令列中執行–reload引數的效果一樣。
這裡寫圖片描述

這裡寫圖片描述

      前面在講解firewall-config工具的功能時,曾經提到了SNAT(Source Network Address Translation,源網路地址轉換)技術。SNAT是一種為了解決IP地址匱乏而設計的技術,它可以使得多個內網中的使用者通過同一個外網IP接入Internet。該技術的應用非常廣泛,甚至可以說我們每天都在使用,只不過沒有察覺到罷了。
      大家可以看一下在網路中不使用SNAT技術和使用SNAT技術時的情況。在不使用SNAT技術的區域網中有多臺PC,如果閘道器伺服器沒有應用SNAT技術,則網際網路中的網站伺服器在收到PC的請求資料包,並回送響應資料包時,將無法在網路中找到這個私有網路的IP地址,所以PC也就收不到響應資料包了。在圖8-7所示的區域網中,由於閘道器伺服器應用了SNAT技術,所以網際網路中的網站伺服器會將響應資料包發給閘道器伺服器,再由後者轉發給區域網中的PC。
這裡寫圖片描述

這裡寫圖片描述

      使用iptables命令實現SNAT技術是一件很麻煩的事情,但是在firewall-config中卻是小菜一碟了。使用者只需按照下圖進行配置,並選中Masquerade zone核取方塊,就自動開啟了SNAT技術。
這裡寫圖片描述

      為了讓大家直觀檢視不同工具在實現相同功能的區別,這裡使用firewall-config工具重新演示了前面使用firewalld-cmd來配置防火牆策略規則,將本機888埠的流量轉發到22埠,且要求當前和長期均有效,具體如下。
這裡寫圖片描述

這裡寫圖片描述

      配置富規則,讓192.168.10.20主機訪問到本機的1234埠號
這裡寫圖片描述

      如果生產環境中的伺服器有多塊網絡卡在同時提供服務(這種情況很常見),則對內網和對外網提供服務的網絡卡要選擇的防火牆策略區域也是不一樣的。也就是說,可以把網絡卡與防火牆策略區域進行繫結(如圖所示),這樣就可以使用不同的防火牆區域策略,對源自不同網絡卡的流量進行針對性的監控,效果會更好。
      firewall-config工具真的非常實用,很多原本複雜的長命令被用圖形化按鈕替代,設定規則也簡單明瞭,足以應對日常工作。所以再次向大家強調配置防火牆策略的原則—只要能實現所需的功能,用什麼工具請隨便。
這裡寫圖片描述