Logo

.tw活動 CentOS 7 - firewalld防火牆基本概念 前言:

firewalld是CentOS 7的預設防火牆,它在設定上會與原本的iptables有些許不同、也加入了「zone」的概念。它的設定是以XML檔來定義、也能直接使用firewall-cmd指令來控制,本篇說明皆以XML方式示範,希望藉由此簡單說明,以降低大家對升級至CentOS 7的顧忌。

  1. 示範設定的環境:
    OS: CentOS v7
  2. 參考資料:
    firewalld首頁: http://fedorahosted.org/firewalld/
    firewalld說明: http://fedoraproject.org/wiki/FirewallD
    簡單範例:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html

說明:

  1. firewalld目錄
    /etc/firewalld/:存放使用者自訂的資料(以此目錄的設定為優先)
    /usr/lib/firewalld/:這目錄是firewalld預設的設定資料,請勿更動。若要修改,請copy到/etc/firewalld修改。

  2. firewalld zone
    firewalld已定義了9個zone檔,預設使用public zone。詳細的說明,可以使用下列指令查詢
    # man firewalld.zones

    簡單的描述如下
    drop: 任何進入的封包全部丟棄
    block: 任何進入的封包全部拒絕
    public: 在公開的場所使用,只接受部分選擇的連線
    external: 應用在NAT設定時的對外網路
    dmz: 非軍事區
    work: 使用在公司的環境
    home: 使用在家庭環境
    internal: 應用在NAT設定時的對內網路
    trusted: 接受所有的連線

  3. 查看firewalld的各種說明指令
    man firewalld.conf: 說明/etc/firewalld/firewalld.conf的設定資料
    man firewall-cmd: 說明firewall-cmd指令的使用方法
    man firewalld.zone: 說明zones目錄裡的XML檔格式
    man firewalld.service: 說明services目錄裡的XML檔格式
    man firewalld.icmptype: 說明icmptypes目錄裡的XML檔格式
    man firewalld.direct: 說明/etc/firewalld/direct.xml檔格式

範例:

例一. 將原本預設的public zone改成使用dmz zone

  1. 拷貝一份dmz檔
    # cp /usr/lib/firewalld/zones/dmz.xml /etc/firewalld/zones/

  2. 修改firewalld.conf檔
    # vi /etc/firewalld/firewalld.conf
    DefaultZone=dmz
    備註:
    A. 將紅色字改成你預使用的zone
    B. 設定檔的格式說明,可以使用指令「man firewalld.conf」查詢

  3. 重新載入
    # firewall-cmd --complete-reload

例二. 將原本防火牆預設的SSH的通訊埠(22)改至23456

  1. 拷貝一份ssh.xml檔
    # cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/

  2. 修改/etc/firewalld/services/ssh.xml檔
    # vi /etc/firewalld/services/ssh.xml
    <service>
           <short>SSH</short>
           <description>(說明文字省略)</description>
           <port protocol="tcp" port="23456"/>
    </service>
    備註:
    A. 只須將紅色字部分,修改成你需要的通訊埠即可
    B. 設定檔的格式說明,可以使用指令「man firewalld.service」查詢

  3. 修改/etc/firewalld/zones/dmz.xml檔(以使用dmz zone為例)
    # vi /etc/firewalld/zones/dmz.xml
    <?xml version="1.0" encoding="utf-8"?>
    <zone>
           <short>DMZ</short>
           <description>(說明文字省略)</description>
           <service name="ssh"/>
    </zone>
    備註:
    A. 若/etc/firewalld/zones目錄裡無該檔案,可以從/usr/lib/firewalld/zones目錄中拷貝一份
    B. service name就是檔案名稱
    C. 這樣的設法,表示SSH接受任何IP的連線
    D. <service>可以多個
    E. 設定檔的格式說明,可以使用指令「man firewalld.zone」查詢

  4. 重新載入
    # firewall-cmd --complete-reload

 

例三. 限制SSH只能由特定的IP連線

  1. 修改/etc/firewalld/zones/dmz.xml檔(以使用dmz zone為例)
    # vi /etc/firewalld/zones/dmz.xml
    <?xml version="1.0" encoding="utf-8"?>
    <zone>
           <short>DMZ</short>
           <description>(文字說明省略)</description>
           <rule family="ipv4">
                  <source address="211.72.188.188"/>
                  <service name="ssh"/>
                  <!-- <log prefix="sshlog" level="info"/> -->
                  <accept/>
           </rule>
    </zone>
    備註:
    A. 無須考慮ICMP封包的問題,除非有特別想阻擋的ICMP項目
    B. 檔案裡,要註解某一行時,請用<!--   -->
    C. <service>寫在<rule>裡的,只能有一個<service>
    D. 將source address換成你允許開放連線的IP
    E. 上面的例子<log>是無作用,若要記錄此規則的相關連線訊息,可以將<!--  -->刪除,它會將資料記錄在/var/log/messages裡
    F. 若語法有錯誤,重新載入時,會將錯誤寫在/var/log/firewalld裡

  2. 重新載入
    # firewall-cmd --complete-reload

 

例四. 加入一個新服務(例如:OpenVAS)

  1. 新增一個/etc/firewalld/services/openvas.xml
    # vi /etc/firewalld/services/openvas.xml
    <?xml version="1.0" encoding="utf-8"?>
    <service>
           <short>OpenVAS Test</short>
           <description>(文字說明省略)</description>
           <port protocol="tcp" port="9392"/>
    </service>
    備註:
    A. 檔案名稱就是服務名稱
    B. <short>與<description>可自己取名與描述
    C. <port>填入該服務預使用的通訊埠

  2. 修改/etc/firewalld/zones/dmz.xml檔(以使用dmz zone為例)
    # vi /etc/firewalld/zones/dmz.xml

    <?xml version="1.0" encoding="utf-8"?>
    <zone>
           <short>DMZ</short>
           <description>(說明文字省略)</description>
           <service name="ssh"/>
           <service name="openvas"/>
    </zone>

    備註:
    A. 多加入一個<service>,名稱就是檔案名稱
    B. 這樣預設會開放所有IP連線
    C. 若要限制只有特定IP連線,可以參考【例三】,多新增一個<rule>即可

  3. 重新載入
    # firewall-cmd --complete-reload

 

例五. 使用iptable的語法來設定(以使用dmz zone為例)

  1. 檢查/etc/firewalld/zones/dmz.xml檔(以使用dmz zone為例)
    # vi /etc/firewalld/zones/dmz.xml
    <?xml version="1.0" encoding="utf-8"?>
    <zone>
           <short>DMZ</short>
           <description>(說明文字省略)</description>
           <service name="ssh"/>
    </zone>
    備註:
    A. 刪除原本的<service>,全由direct設定的規則來控制即可。

  2. 新增一個/etc/firewalld/direct.xml檔
    # vi /etc/firewalld/direct.xml
    <?xml version="1.0" encoding="utf-8"?>
    <direct>
           <rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-p tcp -s 211.72.188.188/32 --dport 23456 -j ACCEPT</rule>
    </direct>
    備註:
    A. 設定的語法可以參考iptable
    B. 設定檔的格式說明,可以使用指令「man firewalld.direct」查詢

  3. 重新載入
    # firewall-cmd --direct --remove-rules ipv4 filter INPUT
    # firewall-cmd --complete-reload
    備註:
    A. 目前測試發現firewall-cmd重新載入時,不會自動將先前的規則清除,只能手動先清除之前設定的規則後,再重新載入
    B. --remove-rules後面需要3個參數:<ipv> <table> <chain>

  4. 查看目前的Direct規則
    # firewall-cmd --direct --get-all-rules