初探Firewalld

小米運維發表於2019-01-11
本文主要從概念及架構、核心組成、常用命令等幾個方面詳細介紹了Firewalld,並附加介紹了iptables四表五鏈和netfilter的知識。
上篇文章回顧:Linux日誌服務初識


一、簡介

1、Firewalld提供更加智慧化的防火牆管理規則,優化策略配置方案,支援網路“zones(域)”,併為網路及其關聯的連結、介面或源分配信任級別,不同信任級別預設開放服務不同。

2、支援IPV4,IPV6,乙太網橋以及IPSET防火牆設定。

3、執行時態與永久配置分離,執行時態可手動更改,重置後回到永久配置(檔案配置)

4、優化iptables新增規則,還支援圖形介面(本文不介紹),除了iptables,還有ip6tables和ebtables規則。

二、概念及架構

空間架構分為上下兩層。

1、上層:firewalld D-Bus:命令主介面,修改防火牆配置主要方式。

firewall-cmd:主要命令列操作方式。

firewall-config:離線命令列操作模式,因為直接作用於firewalld永久配置中,所以在firewall執行時不建議直接操作。

firewall-config:圖形配置模式。

firewall-applet:防火牆小程式。

2、下層(核心層):負責處理配置和後端,並含有iptables,ip6tables,ebtables,ipset模組載入器。

初探Firewalld

空間結構圖示

建議使用NetworkManager,雖然firewalld不依賴它,但是NetworkManager會解決一些網路裝置重新命名的通知等問題。

3、Firewalld支援zones,services,IPsets和ICMP型別。

三、核心組成

1、ZONE(防火牆區域定義連結、介面或源地址繫結的信任級別),共10(還有一種為default)種,直接為網域種的其他計算機建立信任關係度,不用進行麻煩的配置操作,只需要選擇一個zone即可,如若不滿足需要,還可手動新增信任服務。

Drop : 任何傳入的網路的資料包都被丟棄

Block : 任何傳入網路的資料包都被拒絕(包括ICMP),只能啟動網路連結

Public : 在公共區域內使用,近接受選定的傳入連結(預設:僅ssh或dhcpv6-client服務連結)

External : 用於偽裝,出去的ipv4網路連結通過此區域偽裝和轉發(預設:僅接受ssh服務連結)

Dmz : 對內部網路訪問許可權限制(預設:僅接受ssh服務連結)

Work : 用於工作區(預設:僅接受ssh,ipp-client或dhcpv6-client服務連結 )

Home : 用於家庭區(預設:僅接受ssh,mdns,ipp-client,samba-client或dhcpv6-client服務連結)

Internal : 內部,對網路上的其他計算機信任的較高,預設大部分服務

Trusted : 最高信任級別,接受所有網路連結

初探Firewalld

public 配置(/etc/firewalld/zones)

2、NetworkManager存在的意義

1)NetworkManager(介面管理者)不能處理網路連結,它的作用是告訴firewalld將用於此連結的網路介面分配給該連結的配置中定義的區域,當然存在網路配置的系統都支援ifcfg檔案的系統

2)網路連結由網路指令碼處理

3、配置規則(當然,規則這種東西都是看起來繁雜冗長,常用的就幾個)

規則介紹:

  • version=”string” 版本提供

  • target=”ACCEPT|%%REJECT%%|DROP” 接受,拒絕或丟棄與任何規則(埠,服務等)不匹配的每個資料包

  • short 可選開始和結束的標記,用於名稱備註

  • description 可選的開始和結束的標記,用於描述備註

  • interface 可選的空元素標記 ,只有一個name屬性,一般使name=”string”方式繫結服務到zone的介面上

  • source 可選的空元素標記,可多次使用。它可用於將源地址、地址反饋、MAC地址或ipset繫結到區域。屬性如下:

    address=”address[/mask]” 源是IP地址或具有IPv4、IPv6掩碼的網路IP地址;

    mac=”MAC” 源是MAC地址。它必須是xx:xx:xx:xx:xx:xx形式;

    ipset=”ipset” 源是一個ipset;

  • port 可選的空元素標記,可以多次使用具有多個埠條目。屬性如下:

    port=”portid[-portid]” 埠可以是單個埠號portid,也可以是埠範圍portid-portid

    protocol=”tcp|udp” 協議可分為TCP/UDP

  • protocol 可選的空元素標記,可以多次使用具有多個協議條目。屬性如下:

    value=”string”

  • icmp-block 可選的空元素標記,可以多次使用具有多個條目,每個icmp-block標記只有一個強制屬性:

    name=”string”

  • icmp-block-inversion 可選的空元素標記,只能在區域配置中使用一次。該標誌反轉icmp塊處理。僅接受啟用的ICMP型別,並在區域中拒絕所有其他型別

  • masquerade 偽裝,可選的空元素標記。它只能在區域配置中使用一次,不能用於IPV6。

  • forward-port 可選的空元素標記,可以多次使用具有多個埠或資料包轉發條目。forward-port有強制和可選屬性:

    強制屬性: port=”portid[-portid]”,protocol=”tcp|udp”

    可選屬性: 用於本地轉發,僅新增到埠。

to-port=”portid[-portid]” 要轉發到的目標埠或埠範圍。

to-addr=”address” 目標IPv4地址

  • source-port 可選的空元素標記,可多次使用具有多個源埠條目。源埠所有屬性都是必需的:

    port=”portid[-portid]”

    protocol=”tcp|udp”

常用規則示例:

  • 規則示例

<?xml version="1.0" encoding="utf-8"?>
<zone>
      <short>Home</short>
      <description>For use in home areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
      <service name="ssh"/>
      <service name="mdns"/>
      <service name="samba-client"/>
      <service name="dhcpv6-client"/>
</zone>複製程式碼
  • 服務示例

<?xml version="1.0" encoding="utf-8"?>
<service>
         <short>FTP</short>
         <description>FTP is a protocol used for remote file transfer. If you plan to make your FTP server publicly available, enable this option. You need the vsftpd package installed for this option to be useful.</description>
         <port protocol="tcp" port="21"/>
         <module name="nf_conntrack_ftp"/>
</service>複製程式碼
  • IPSet示例

 <?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:mac">
           <short>mac-list</short>
           <entry>00:11:22:33:44:55</entry>
</ipset>複製程式碼
  • Helper(助手示例)用於安全地使用連結跟蹤幫助程式

 <?xml version="1.0" encoding="utf-8"?>
<helper module="nf_conntrack_ftp">
              <port protocol="tcp" port="21"/>
</helper>複製程式碼
  • ICMP型別,限制ICMP在Internet協議(IP)中的資訊交換,迴應或者不迴應等等

<?xml version="1.0" encoding="utf-8"?>
<icmptype>
          <short>Echo Request (ping)</short>
          <description>This message is used to test if a host is reachable mostly with the ping utility.</description>
</icmptype>複製程式碼
  • 一般來說,不用進行配置中的規則修改。如若需要修改,可使用常用命令進行規則指定。

更多規則:

詳見https://firewalld.org/documentation/man-pages/firewalld.richlanguage

四、常用命令

1、基礎命令

firewall-cmd --state           #檢視firewalld的狀態
firewall-cmd --get-active-zones       #檢視當前活動的區域,並附帶一個目前分配給他們的介面列表  
firewall-cmd --get-defailt-zone       #檢視預設區域
firewall-cmd --set-default-zone=dmz    #設定預設區域
firewall-cmd --get-zones           #檢視所有可用域區
firewall-cmd --permanent --zone=internal --add-source=172.25.254.60/24          #設定源地址的所屬zone (--permanent參數列示永久生效設定,如果沒有指定--zone引數,則表示加入到預設區域)
firewall-cmd --permanent --zone=internal --remove-source=172.25.254.60/24       #刪除網路地址
firewall-cmd --reload          #過載配置,並不會中斷服務
firewall-cmd --complete-reload      #完全過載,會中斷服務複製程式碼

2、新增服務

firewall-cmd --zone=public --add-service=http                  #在執行時環境的公共區域開啟http服務
firewall-cmd --permanent --zone=public --add-service=http      #永久設定,在公共區域開啟http服務複製程式碼

3、使用 –direct選項,在執行時裡新增或移除鏈(iptables四表五鏈)

firewall-cmd --direct --add-rule ipv4filter IN_public_allow 0 -p tcp --dport 80 -j ACCEP      #新增規則,指定執行所有連結進入80埠
firewall-cmd --direct --remove-ruleipv4 filter IN_public_allow 0 -p tcp --dport 80 -j ACCEPT   #刪除規則
firewall-cmd --direct--get-all-rules              #列出規則複製程式碼

4、使用現有檔案建立新服務(在不熟悉配置命令及其規則的情況下,不建議使用這種方式)

 firewall-cmd --permanent --new-service-from-file=myservice.xml --name=mynewservice複製程式碼

五、附加知識點(iptables四表五鏈,netfilter)

1、防火牆於iptables的內在關聯

簡而言之,iptables算是防火牆的基石,火牆在做資料包過濾決定時,有一套遵循和組成的規則,這些規則儲存在專門的資料包過濾表中,這些表整合在Linux核心中。在資料包過濾表中,規則被分組放在我們所謂的鏈(chain)中。

而netfilter/iptables進行IP過濾規則的新增,編輯和移除規則。

netfilter元件也稱為核心空間,是核心的一部分,由一些資訊包過濾表組成,這些表包含核心用來控制資訊包過濾處理的規則集。

Iptables元件是一種工具,也成為使用者空間,它使插入、修改和除去資訊包過濾表中的規則變得容易。

初探Firewalld

Linux核心過濾結構

2、iptables四表五鏈

  • Filter表 —— 三個鏈:INPUT、FORWARD、OUTPUT

    作用:過濾資料包 核心模組:iptables_filter.

  • Nat表 —— 三個鏈:PREROUTING、POSTROUTING、OUTPUT

    作用:用於網路地址轉換(IP、埠) 核心模組:iptable_nat

  • Mangle表——五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

    作用:修改資料包的服務型別、TTL、並且可以配置路由實現QOS核心模組:iptable_mangle(別看這個表這麼麻煩,我們們設定策略時幾乎都不會用到它)

  • Raw表 —— 兩個鏈:OUTPUT、PREROUTING

    作用:決定資料包是否被狀態跟蹤機制處理 核心模組:iptable_raw

初探Firewalld

四表五鏈對應關係

3、連結串列處理邏輯

  • INPUT —— 進來的資料包應用此規則鏈中的策略

  • OUTPUT —— 外出的資料包應用此規則鏈中的策略

  • FORWARD —— 轉發資料包時應用此規則鏈中的策略

  • PREROUTING —— 對資料包作路由選擇前應用此鏈中的規則

    (記住!所有的資料包進來的時侯都先由這個鏈處理)

  • POSTROUTING —— 對資料包作路由選擇後應用此鏈中的規則

    (所有的資料包出來的時侯都先由這個鏈處理)

初探Firewalld

連結串列處理邏輯


參考資料:

https://firewalld.org/documentation/

https://www.cnblogs.com/clouders/p/6544584.html


本文首發於公眾號“小米運維”,點選檢視原文


相關文章