2015年12月17日 星期四

RHEL7 防火牆設定

firewalld 服務概觀
  • RHEL7 預設使用 firewalld 服務管理主機層級的防火牆服務

  • firewalld 管理核心的 netfilter 功能,下轄三個指令與服務:
    • iptables
    • ip6tables
    • ebtables

    ※PS:以上三種服務會互相干擾,須要使用 systemctl mask 指令來隔開!

  • firewalld 區分所有的流量進到 zone (區域)裡面,而每個 zone 裡面,均有不同的 rule (規則)!

  • firewalld 區分進來的封包該進到哪一個 zone,其運作邏輯如下列順序:
    1. 若進來的封包,其來源位址符合某一 zone 內的某一針對來源位址所設定的規則,則該封包將被繞送經過該 zone !
    2. 若接受封包進來的介面符合某一 zone 內所設定的過濾器,則使用該 zone 進行封包過濾!
    3. 其他狀況,使用 Default Zone !! 通常 Default Zone 名為 public ,但管理者可指定其他的 zone 為 Default Zone!

  • firewalld 預設的 zone:
    名稱 預設內容
    trusted 允許所有進入的流量
    home 退回進入的流量!除了與出去的流量相關封包,或是 ssh, mdns, ipp-client, samba-client, 或者 dhcpv6-client 等預設的服務!
    internal 退回進入的流量!除了與出去的流量相關封包,或是 ssh, mdns, ipp-client, samba-client, 或者 dhcpv6-client 等預設的服務!(預設值與home相同!)
    work 退回進入的流量!除了與出去的流量相關封包,或是 ssh, ipp-client, 或者 dhcpv6-client 等預設的服務!
    public 退回進入的流量!除了與出去的流量相關封包,或是 ssh, 或者 dhcpv6-client 等預設的服務!為所有新增網路卡介面的 Default Zone!
    external 退回進入的流量!除了與出去的流量相關封包,或是 ssh 等預設的服務!要出去的 IPv4 流量封包被轉到這裡,將會進行 IP 來源位置的偽裝!
    dmz 退回進入的流量!除了與出去的流量相關封包,或是 ssh 等預設的服務!
    block 退回所有進入的流量!除了與出去的流量相關封包!
    drop 排除所有進入的流量!除了與出去的流量相關封包!

管理 firewalld 服務
  • 管理 firewalld 有下列三種方式:
    1. 使用 firewall-cmd 文字指令!
    2. 使用 firewall-config 圖形介面!
    3. 使用 /etc/firewalld/ 目錄下的檔案!

  • 當 firewalld 套件被安裝好之後, firewall-cmd 即已經存在!

  • 參數使用須知:
    • 使用的參數中,如未指定 --permanent,則預設會是 runtime 狀態!如未指定 zone 名稱,則所有規則,將用在 public zone 上!
    • 如果使用 --permanent 參數後,要立即生效,則必須下 firewall-cmd --reload 指令,重新導入規則內容!
    • 如果只是暫時使用的規則,可以設定 --timeout= 參數!時間到,自動移除!

  • 常用參數列表:
    參數名稱 內容說明
    --get-default-zone
    --set-default-zone=
    --get-zones 列出所有的 zone !!
    --get-services 列出所有預設的服務!
    --get-active-zones 列出所有正在使用中的 zone ,連同介面以及來源資訊!
    --add-source= [--zone=] 繞送由該 IP address 或 network/netmask 進來的封包,進入指定的 zone !!
    --remove-source= [--zone=] 移除由上項新增的規則!
    --add-interface= [--zone=] 繞送由該介面進來的封包,進入指定的 zone !!
    --change-interface= [--zone=] 將上項新增的規則,更換指定的 zone !!
    --list-all [--zone=] 列出某一 zone 內所有的介面、來源設定、服務設定以及 ports 的設定!
    --list-all-zones 列出所有 zone 內所有的介面、來源設定、服務設定以及 ports 的設定!
    --add-service= [--zone=] 允許流量進入該服務
    --remove-service= [--zone=] 移除由上項新增的規則!
    --add-port= [--zone=] 允許流量進入該埠!協定可以是 tcp、udp、icmp 等等
    --remove-port= [--zone=] 移除由上項新增的規則!

  • 範例:
    • # firewall-cmd --set-default-zone=dmz
    • # firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24
    • # firewall-cmd --permanent --zone=internal --add-service=mysql
    • # firewall-cmd --reload

  • firewalld 設定目錄:
    • /etc/firewalld
    • /usr/lib/firewalld
    • 若兩目錄內有相同檔案名稱,將只使用 /etc/firewalld 目錄內的檔案!

使用 firewalld 客製化規則

  • 管理員還有其他兩項方式,可以滿足管理防火牆的需求:direct rules 以及 rich rules !!

  • Direct Rules
    • 允許管理員直接手動寫 {ip,ip6,eb}tables 規則到 firewalld 所管理的防火牆內容中!
    • 但當強力的規則無法出現在規則列表中,這些規則將很難管理!
    • Direct Rules 的使用彈性比起標準的規則或是 Rich Rules,都是比較差的!
    • Direct Rules 只要不是嵌入在 zone 內,就會在 firewalld 規則之前被導入引用!
    • 範例:
      # firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist
      # firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 192.168.1.0/24 -j blacklist
      # firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix "blacklisted "
      # firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 1 -j DROP

  • Rich Rules
    • Rich Rules 給予管理員一種撰寫防火牆規則的方式!而該方式是無法用基本防火牆的語法來達成。
    • 語法上,不僅可以使用基本的允許/拒絕功能,還可以使用記錄、製作port 轉向、IP 偽裝、或是速率上的限制!
    • 基本語法:
      rule
        [source] 
        [destination]
        service|port|protocol|icmp-block|masquerade|forward-port
        [log]
        [audit]
        [accept|reject|drop]

    • 設定格式:rule option=value
      • family=ipv4 | ipv6
      • source | destination address=<CIDR>
      • service name=http | ftp ...| <SERVICE_NAME>
      • port port=<PORT NUMBER>
      • protocol=tcp | udp |...

    • 規則判斷順序:每個 zone 內的判斷順序均相同!
      1. 為該 zone 所設定的任何 port 轉換與偽裝規則!
      2. 針對該 zone 所設定的記錄規則!
      3. 為該 zone 所設定的允許規則!
      4. 為該 zone 所設定的拒絕規則!
    • 如果有封包不符合任何 zone 內的任何規則,將該封包將會被拒絕!
    • Rich Rules 配合 firewall-cmd 指令的常用參數:
      參數名稱 內容說明
      --add-rich-rule='<RULE>' 新增<RULE>到指定的 zone 內!
      --remove-rich-rule='<RULE>' 移除指定 zone 內的<RULE>!
      --query-rich-rule='<RULE>' 查詢指定 zone 內的<RULE>!
      --list-rich-rule='<RULE>' 列出指定 zone 內的所有<RULE>!

    • 範例:
      # firewall-cmd --permanent --zone=classroom --add-rich-rule='rule family=ipv4 source address=192.168.1.111/32 reject'
      # firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept'
      # firewall-cmd --permanent --add-rich-rule='rule protocol value=esp drop'
      # firewall-cmd --permanent --zone=vnc --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept

  • Rich Rule 的使用記錄
    • 使用 syslogd :
      # log [prefix="<PREFIX TEXT>"] [level=<LOGLEVEL>] [limit value="<RATE/DURATION>"]

    • 使用 auditd :

    • 可以做限制,避免檔案空間被塞滿!



使用 firewalld 網路 NAT 功能

  • 練習:把 4321 port 轉到 80 port (只針對 192.168.1.0/24 網段)
    # firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 forward-port port=4321 protocol=tcp to-port=80'

管理 SELinux Port 標籤