- RHEL7 預設使用 firewalld 服務管理主機層級的防火牆服務
- firewalld 管理核心的 netfilter 功能,下轄三個指令與服務:
- iptables
- ip6tables
- ebtables
※PS:以上三種服務會互相干擾,須要使用 systemctl mask 指令來隔開! - firewalld 區分所有的流量進到 zone (區域)裡面,而每個 zone 裡面,均有不同的 rule (規則)!
- firewalld 區分進來的封包該進到哪一個 zone,其運作邏輯如下列順序:
- 若進來的封包,其來源位址符合某一 zone 內的某一針對來源位址所設定的規則,則該封包將被繞送經過該 zone !
- 若接受封包進來的介面符合某一 zone 內所設定的過濾器,則使用該 zone 進行封包過濾!
- 其他狀況,使用 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 有下列三種方式:
- 使用 firewall-cmd 文字指令!
- 使用 firewall-config 圖形介面!
- 使用 /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 內的判斷順序均相同!
- 為該 zone 所設定的任何 port 轉換與偽裝規則!
- 針對該 zone 所設定的記錄規則!
- 為該 zone 所設定的允許規則!
- 為該 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 :
- 可以做限制,避免檔案空間被塞滿!
- 使用 syslogd :
使用 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 標籤