1、firewalld簡介
在RHEL7/CentOS7.x 版本上,firewalld已經替代iptables成為默認的防火牆軟件,firewalld是centos7的一大特性,最大的好處有兩個:
第一個:支持動態更新,不用重啟服務,隨時添加規則,隨時生效,這個過程不需要重新裝載netfilter內核模塊,但是要求所有的規則都通過firewalld守護進程來實現,以確保守護進程內的防火牆狀態和內核中的防火牆狀態一致;守護進程firewalld,應用程序、守護進程和用戶可以通過D-BUS請求一個防火牆特性,特性可以是預定義的防火牆功能,例如:服務、端口和協議的組合、端口/數據報轉發、偽裝、ICMP攔截或自定義的規則。原有的靜態防火牆規則還可以繼續使用,但是不能和firewalld同時存在,需要使用這兩者中的任何一個時,停止另外一個的使用。
第二個就是加入了區域(zone)的概念
區域定義了網絡連接的可信等級,這是一個一對多的關系,意味着一次連接可以僅僅是一個區域的一部分,一個區域可以用於很多連接。
區域的功能包括如下幾個方面:
預定義的服務:服務是端口和/或協議入口的組合,備選內容包括netfilter助手模塊以及IPv4、IPv6地址。
端口和協議:定義了tcp或udp端口,可以是一個端口或者一個端口范圍;
ICMP阻塞:可以選擇Internet控制報文協議的報文,這些報文可以是信息請求,也可以是對信息請求或錯誤條件創建的響應。
偽裝(masqerading):私有網絡地址可以被映射到公共的IP地址,這是一個正規的IP地址轉換。
端口轉發:端口可以映射到另外一個端口或者另外一台主機上的端口。
firewalld引入這一概念系統默認存在以下區域:
drop:默認丟棄所有包,不作出任何相應,只允許流出的網絡連接
block:拒絕所有外部連接,並返回 IPv4 的 icmp-host-prohibited 報文或者 IPv6 的 icmp6-adm-prohibited 報文。只允許由該系統初始化的網絡連接
public:用以可以公開的部分。你認為網絡中其他的計算機不可信並且可能傷害你的計算機。只允許選中的連接接入
external: 用在路由器等啟用偽裝的外部網絡。你認為網絡中其他的計算機不可信並且可能傷害你的計算機,只允許選中的服務通過。
dmz:用以允許隔離區(dmz)中的電腦有限地被外界網絡訪問,只允許選中的服務通過。
work:用在工作網絡,你新人網絡中的大多數計算機不會影響你的計算機,只接受被選中的連接。
home:你信任網絡中的大多數計算機不會影響你的計算機,只允許選中的服務通過
internal:用在內部網絡。你信任網絡中的大多數計算機不會影響你的計算機,只允許選中的服務通過。
trusted:允許所有網絡連接,即使沒有開放任何服務,那么使用此zone的流量照樣通過(一路綠燈)。
2、安裝firewalld
firewalld有圖形界面和工具界面,本文以字符界面做介紹
firewalld的字符界面管理工具是 firewall-cmd
firewalld默認配置文件有兩個:/usr/lib/firewalld/ (系統配置,盡量不要修改)和 /etc/firewalld/ (用戶配置地址)
/usr/lib/firewalld/zones/用於配置默認和備用區域,/etc/firewalld/zones用於用戶創建和自定義配置區域
root執行
yum install firewalld
3、配置firewalld
(1)為網絡連接設置或者修改區域
在ifcfg-eth文件中修改,添加
zone=public(或者其他區域)
來為網卡指定區域,沒有指定該參數的話就使用默認的區域
(2)使用firewalld
firewall-cmd
通用選項
查看版本
$ firewall-cmd -V | --version
查看幫助
$ firewall-cmd -h | --help
不顯示狀態信息
$ firewall-cmd -q | --quiet
狀態選項
顯示狀態
$ firewall-cmd --state running
重新加載防火牆規則並保留原有的狀態信息,如果不使用永久生效選項,則重啟后規則消失
$ firewall-cmd --reload
重新完全加載防火牆,包括netfilter kernel模塊。會因為丟失連接的狀態信息而斷開已經激活的連接,
僅適用於嚴重的防火牆故障,例如在正確的防火牆規則下但是不能建立有效的連接。
$ firewall-cmd --complete-reload
永久選項
用來設置參數永久生效,這個選項配置的時候不會立即生效,而需要重啟服務或者重啟系統。沒有使用這個參數的話,設置的規則重啟防火牆或者重啟系統后丟失。
$ firewall-cmd --permanent
區域選項(zone options)
獲取默認區域
$ firewall-cmd --get-default-zone public
本機的默認區域是public
設置默認區域,流入默認區域的接口的新請求將由新的默認區域接收,當前已連接的不受影響。
$ firewall-cmd --set-default-zone=zone
顯示出當前激活的zone以及zone綁定的端口和zone中使用的資源。輸出格式如下
$ firewall-cmd --get-active-zone public interfaces: eno16777736
支持的服務(不一定已經啟用),用空格分隔的列表
$ firewall-cmd --get-services RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imaps ipp ipp-client ipsec iscsi-target kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind rsyncd samba samba-client smtp ssh telnet tftp tftp-client transmission-client vdsm vnc-server wbem-https
獲取所有支持的ICMP類型(不一定啟用)
$ firewall-cmd --get-icmptypes destination-unreachable echo-reply echo-request parameter-problem redirect router-advertisement router-solicitation source-quench time-exceeded
可以看到現在firewalld默認支持的服務已經非常多了
列出全部啟用的區域的特性
$ firewall-cmd --list-all-zones
輸出某個區域的全部特性
$ firewall-cmd --zone=zone --list-all
查看指定接口所屬區域
$ firewall-cmd --get-zone-of-interface=eth0
將接口增加到區域,如果接口不屬於區域,接口被增加到這個區域,如果區域被省略,則使用默認區域。接口在小紅心加載后重新應用。此時如果接口已經綁定到相應的zone上面以后,這樣更改會出錯,需要先在對應的zone里面把接口信息刪除,然后才能添加
$ firewall-cmd --zone=zone --add-interface=<interface>
修改接口所屬的區域
$ firewall-cmd --zone=zone --change-interface=<interface>
從區域中刪除一個接口
$ firewall-cmd --zone=zone --remove-interface=<interface>
查詢某個區域中是否包含這個接口
$ firewall-cmd --zone=zone --query-interface=<interface>
列出區域中啟用的服務
$ firewall-cmd --zone=zone --list-services
啟動應急模式阻斷所有網絡連接,以防出現緊急狀況;
$ firewall-cmd --panic-on
禁用應急模式
$ firewall-cmd --panic-off
查看是否啟用應急模式
$ firewall-cmd --query-panic
處理運行時區域
運行時模式下對區域進行的修改不是永久有效的,重新加載或者重啟系統后修改將失效
啟用某個區域中的一種服務,timeout參數設定該服務啟動時間,permanet參數設置該服務永久生效(需要重啟firewalld守護進程),timeout和permanet不可同時使用。
$ firewall-cmd [--permanet] --zone=zone --add-service [--timeout=seconds]
例如:使區域中的http服務生效5min
$ firewall-cmd --zone=public --add-service --timeout=300
禁止區域中的某種服務
$ firewall-cmd --zone=zone --remove-service
查詢區域中是否啟用了特定的服務
$ firewall-cmd --zone=zone --query-service
啟用端口和協議的組合,端口可以是一個單獨的端口或者一個端口范圍,協議可以是tcp或udp
$ firewall-cmd --zone=zone --add-port=<port>/protocol [--timeout=seconds]
禁用端口和協議的組合
$ firewall-cmd --zone=zone --remove-port=<port>[-<port>]/<protocol>
查詢區域中是否啟用了端口和協議的組合,如果啟用有返回值,反之沒有。
$ firewall-cmd --zone=zone --query-port=<port>[-<port>]/<protocol>
啟用區域中的IP偽裝功能,私有網絡地址被隱藏並映射到一個公有IP,常用於路由,由於內核的性質,僅可用於ipv4
$ firewall-cmd --zone=zone --add-masquerade
禁用IP偽裝功能
$ firewall-cmd --zone=zone --remove-masquerade
查詢區域的偽裝狀態
$ firewall-cmd --zone=zone --query-masquerade
啟用區域的ICMP阻塞功能
$ firewall-cmd --zone=zone --add-icmp-block=<icmptype>
禁用區域的ICMP阻塞功能
$ firewall-cmd --zone=zone --remove-icmp-block=<icmptype>
查詢區域的ICMP阻塞狀態
$ firewall-cmd --zone=zone --query-icmp-block=<icmptype>
例如:阻塞區域的響應應答報文
$ firewall-cmd --zone=public --add-icmp-block=echo-reply
在區域中啟用端口轉發或者映射
$ firewall-cmd --zone=zone --add-forward-port=port=<port>-[<port>]:proto=<protocol> {:toport=<port>-[<port>] | :toaddr=<address> | :toport=<port>-[<port>]:toaddr=<address>}
端口映射到另外一個端口,端口映射到另外一個地址上的相同端口,端口映射到另外一台主機上的不同端口,僅限於ipv4使用;
將本機的80端口轉發到8080端口 $ firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
將本機的80端口轉發到后端192.168.1.249主機的80端口上 $ firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.249 success
在區域中禁用端口轉發或者映射
$ firewall-cmd --zone=zone --remove-forward-port=port=<port>-[<port>]:proto=<protocol> {:toport=<port>-[<port>] | :toaddr=<address> | :toport=<port>-[<port>]:toaddr=<address>}
移除本機80到8080端口的轉發 $ firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080
移除本機80端口到后端主機192.168.1.249的80端口的映射 $ firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.249
在區域中查詢端口轉發或者映射
$ firewall-cmd --zone=zone --query-forward-port=port=<port>-[<port>]:proto=<protocol> {:toport=<port>-[<port>] | :toaddr=<address> | :toport=<port>-[<port>]:toaddr=<address>}
處理永久區域
永久選項不直接影響運行時的狀態,這些選項盡在重載或者重啟服務時可用。為了使用運行時和永久設置,需要分別設置兩者,選項--permanent是永久設置的第一個參數,例如:
獲取永久設置支持的服務
$ firewall-cmd --permanent --get-services
獲取永久設置支持的ICMP類型列表
$ firewall-cmd --permanent --get-icmptypes
獲取永久設置支持的區域
$ firewall-cmd --permanent --get-zones
將--permanent設置為第一個參數,即可將臨時性的服務設置為永久性生效的服務(需要重啟/載服務或重啟系統)
直接選項
直接選項給予一個更直接訪問防火牆的能力,這個選項要求用戶知道一些基本的iptables概念,例如tables(filter/mangle/nat/...),chain(INPUT/OUTPUT,FORWARD/...),command(-A/-D/-I/...),參數(-p/-s/-d/-j/...)和目標(ACCEPT/DROP/REJECT/...)。當防火牆不能使用例如--add-service=service 或者 --add-rich-rule='rule'這樣的規則的時候,直接選項只能被用於作為一個最后的手段。每一個選項的第一個參數必須是ipv4或者ipv6或者eb。使用ipv4將適用於IPv4(iptables(8)),ipv6參數適用於IPv6(ipv6tables(8)),eb參數適用於網橋(ebtables(8))。
將命令傳遞給防火牆。參數 <args> 可以是 iptables, ip6tables 以及 ebtables 命令行參數。
$ firewall-cmd --direct --passthrough { ipv4 | ipv6 | eb } <args>
為表 <table> 增加一個新鏈 <chain> 。
$ firewall-cmd --direct --add-chain { ipv4 | ipv6 | eb } <table> <chain>
從表 <table> 中刪除鏈 <chain> 。
$ firewall-cmd --direct --remove-chain { ipv4 | ipv6 | eb } <table> <chain>
查詢 <chain> 鏈是否存在與表 <table>. 如果是,返回0,否則返回1.
$ firewall-cmd --direct --query-chain { ipv4 | ipv6 | eb } <table> <chain>
如果啟用,此命令將有返回值。此命令沒有輸出信息。
獲取用空格分隔的表 <table> 中鏈的列表。
$ firewall-cmd --direct --get-chains { ipv4 | ipv6 | eb } <table>
為表 <table> 增加一條參數為 <args> 的鏈 <chain> ,優先級設定為 <priority>。
$ firewall-cmd --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args>
從表 <table> 中刪除帶參數 <args> 的鏈 <chain>。
$ firewall-cmd --direct --remove-rule { ipv4 | ipv6 | eb } <table> <chain> <args>
查詢 帶參數 <args> 的鏈 <chain> 是否存在表 <table> 中. 如果是,返回0,否則返回1.
$ firewall-cmd --direct --query-rule { ipv4 | ipv6 | eb } <table> <chain> <args>
如果啟用,此命令將有返回值。此命令沒有輸出信息。
獲取表 <table> 中所有增加到鏈 <chain> 的規則,並用換行分隔。
$ firewall-cmd --direct --get-rules { ipv4 | ipv6 | eb } <table> <chain>
當前的firewalld特性
D-BUS接口:提供防火牆狀態信息,使防火牆的啟用、挺有或查詢設置成為可能。
區域:
服務:可以是一系列本地端口、目的端口記憶附加信息,也可以是服務啟動時自動增加的防火牆助手模塊。預定義服務的使用使得對服務的啟用和禁用更加簡單。
ICMP類型:Internet控制報文協議(ICMP)備用阿里交換保本和互聯網協議(ip)的錯誤報文,在firewalld中可以使用ICMP類型來限制報文交換
直接接口:用於服務或者應用程序增加特定的防火牆規則,重載或者重啟時需要重新提交。
運行時配置:
永久配置:
托盤小程序firewall-applet為用戶顯示防火牆狀態和存在的問題,也可以用來配置用戶允許修改的設置。(圖形界面可用)
圖形化配置工具firewall-config,支持防火牆的所有特性(除了直接接口)。
命令行客戶端firewall-cmd
對於ebtables的支持:要滿足libvirt daemon的全部需求,在內核netfilter級上放置iptables和ebtables間訪問問題,ebtables支持是需要的,這些命令是訪問相同的結構,因而不能同時使用。
/usr/lib/firewalld/中的默認/備用配置
/etc/firewalld/中的系統配置設置
正在開發的特性
富語言:提供了一種不需要了解iptables語法的通過高級語言配置復雜IPv4和IPv6防火牆規則的機制
鎖定:為firewalld增加了鎖定本地應用或者服務配置的簡單配置方式,是一種輕量級的應用程序策略。
用就直接規則:能夠提供保存直接規則和直接鏈的功能個
從iptables和ebtables服務遷移:盡可能提供由iptables,ip6tables和ebtables服務配置轉為永久直接規則的腳本。
參考文獻: