FirewallD提供了支持網絡/防火牆區域(zone)定義網絡連接以及接口安全等級的動態防火牆管理工具。它支持IPv4, IPv6 防火牆設置以及以太網橋接,也支持容許服務或者應用程序直接添加防火牆規則的接口。FirewallD擁有運行時配置和永久配置選項。安全
採用firewall-cmd
(command)或firewall-config
(gui)來動態的管理kernel netfilter的臨時或永久的接口規則,並實時生效而無需重啓服務。網絡
FirewallD特性app
Zonessh
FirewallD使用區域(zone)的概念來管理,網絡區域定義了網絡鏈接的可信等級。這是一個一對多的關係,這意味着一次鏈接能夠僅僅是一個區域的一部分,而一個區域能夠用於不少鏈接。每一個網卡對應一個zone,這些zone的配置文件可在/usr/lib/firewalld/zones/
下看到,默認的是public。tcp
Zone提供瞭如下幾個區域ide
drop工具
任何流入網絡的包都被丟棄,不做出任何響應,只容許流出的網絡鏈接。即便開放了某些服務(好比http),這些服務的數據也是不容許經過的。ui
block
任何進入的網絡鏈接都被拒絕,並返回IPv4的icmp-host-prohibited報文或者IPv6的icmp6-adm-prohibited報文。只容許由該系統初始化的網絡鏈接。spapublic(默認)
用以能夠公開的部分。你認爲網絡中其餘的計算機不可信而且可能傷害你的計算機,只容許選中的服務經過。命令行external
用在路由器等啓用假裝的外部網絡。你認爲網絡中其餘的計算機不可信而且可能傷害你的計算機,只容許選中的服務經過。dmz
用以容許隔離區(dmz)中的電腦有限地被外界網絡訪問,只容許選中的服務經過。work
用在工做網絡。你信任網絡中的大多數計算機不會影響你的計算機,只容許選中的服務經過。home
用在家庭網絡。你信任網絡中的大多數計算機不會影響你的計算機,只容許選中的服務經過。internal
用在內部網絡。你信任網絡中的大多數計算機不會影響你的計算機,只容許選中的服務經過。trusted
容許全部網絡鏈接,即便沒有開聽任何服務,那麼使用此zone的流量照樣經過(一路綠燈)。
預約義的服務
服務是端口和/或協議入口的組合。備選內容包括netfilter助手模塊以及 IPv四、IPv6地址。
端口和協議
定義了tcp或udp端口,端口能夠是一個端口或者端口範圍。
ICMP阻塞
能夠選擇Internet控制報文協議的報文。這些報文能夠是信息請求亦但是對信息請求或錯誤條件建立的響應。
假裝
私有網絡地址能夠被映射到公開的IP地址。這是一次正規的地址轉換。
端口轉發
端口能夠映射到另外一個端口以及/或者其餘主機。
安裝FirewallD和管理工具
$ yum install firewalld firewall-config
運行、中止、禁用FirewallD
$ systemctl start firewalld # 啓動 $ systemctl enable firewalld # 開機啓動 $ systemctl stop firewalld # 關閉 $ systemctl disable firewalld # 取消開機啓動 $ systemctl status firewalld # 查看狀態
FirewallD規則管理能夠直接修改配置文件(/etc/firewalld/firewalld.conf
)進行配置,也能夠經過圖形界面工具firewall-config
或者命令行客戶端firewall-cmd
來啓用或者關閉防火牆特性。手動編輯配置文件相對仍是比較麻煩,推薦使用工具進行配置。
查看規則
$ firewall-cmd --help
查看運行狀態
$ firewall-cmd --state
查看已被激活的Zone信息
$ firewall-cmd --get-active-zones public interfaces: eth0 eth1
獲取活動的區域
$ firewall-cmd --get-active-zones
查看指定接口的Zone信息
$ firewall-cmd --get-zone-of-interface=eth0
這條命令將輸出接口所屬的區域名稱。
查看指定級別的接口
$ firewall-cmd --zone=public --list-interfaces eth0
獲取支持的區域列表
$ firewall-cmd --get-zones
查看指定級別的全部信息,譬如public
$ firewall-cmd --zone=public --list-all public (default, active) interfaces: eth0 sources: services: dhcpv6-client http ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:
查看全部級別被容許的服務
$ firewall-cmd --get-service
查看重啓後全部Zones級別中被容許的服務,即永久放行的服務
$ firewall-cmd --get-service --permanent
更新規則,不重啓服務
$ firewall-cmd --reload
更新規則,重啓服務。狀態信息將會丟失。
$ firewall-cmd --complete-reload
這個選項應當僅用於處理防火牆問題時,例如,狀態信息和防火牆規則都正常,可是不能創建任何鏈接的狀況。
添加某接口至某信任等級,譬如添加eth0至public,再永久生效
$ firewall-cmd --zone=public --add-interface=eth0 --permanent
修改接口所屬區域
$ firewall-cmd [--zone=<zone>] --change-interface=<interface>
這個選項與--add-interface
選項類似,可是當接口已經存在於另外一個區域的時候,該接口將被添加到新的區域。
將接口增長到區域
$ firewall-cmd [--zone=<zone>] --add-interface=<interface>
若是接口不屬於區域,接口將被增長到區域。若是區域被省略了,將使用默認區域。接口在從新加載後將從新應用。
設置public爲默認的信任級別
$ firewall-cmd --set-default-zone=public
設置默認區域
$ firewall-cmd --set-default-zone=<zone>
獲取全部支持的服務
$ firewall-cmd --get-services
獲取全部支持的ICMP類型
$ firewall-cmd --get-icmptypes
列出所有啓用的區域的特性
$ firewall-cmd --list-all-zones
輸出格式是
<zone> interfaces: <interface1> .. services: <service1> .. ports: <port1> .. forward-ports: <forward port1> .. icmp-blocks: <icmp type1> ..
輸出區域所有啓用的特性。若是省略區域,將顯示默認區域的信息。
$ firewall-cmd [--zone=<zone>] --list-all
獲取默認區域的網絡設置
$ firewall-cmd --get-default-zone
流入默認區域中配置的接口的新訪問請求將被置入新的默認區域。當前活動的鏈接將不受影響。
從區域中刪除一個接口
$ 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
在0.3.0以前的FirewallD版本中, panic選項是--enable-panic
與--disable-panic
。
查詢應急模式
$ firewall-cmd --query-panic
運行時模式下對區域進行的修改不是永久有效的。從新加載或者重啓後修改將失效。
管理端口
列出dmz級別的被容許的進入端口
$ firewall-cmd --zone=dmz --list-ports
容許tcp端口8080至dmz級別
$ firewall-cmd --zone=dmz --add-port=8080/tcp
管理服務
啓用區域中的一種服務
$ firewall-cmd [--zone=<zone>] --add-service=<service> [--timeout=<seconds>]
此舉啓用區域中的一種服務。若是未指定區域,將使用默認區域。若是設定了超時時間,服務將只啓用特定秒數。若是服務已經活躍,將不會有任何警告信息。
添加smtp服務至work zone
$ firewall-cmd --zone=work --add-service=smtp
使區域中的ipp-client服務生效60秒
$ firewall-cmd --zone=home --add-service=ipp-client --timeout=60
啓用默認區域中的http服務
$ firewall-cmd --add-service=http
禁用區域中的某種服務
$ firewall-cmd [--zone=<zone>] --remove-service=<service>
此舉禁用區域中的某種服務。若是未指定區域,將使用默認區域。
移除work zone中的smtp服務
$ firewall-cmd --zone=work --remove-service=smtp
禁止home區域中的http服務
$ firewall-cmd --zone=home --remove-service=http
區域種的服務將被禁用。若是服務沒有啓用,將不會有任何警告信息。
查詢區域中是否啓用了特定服務
$ firewall-cmd [--zone=<zone>] --query-service=<service>
若是服務啓用,將返回1,不然返回0。沒有輸出信息。
啓用區域端口和協議組合
$ firewall-cmd [--zone=<zone>] --add-port=<port>[-<port>]/<protocol> [--timeout=<seconds>]
此舉將啓用端口和協議的組合。端口能夠是一個單獨的端口<port>
或者是一個端口範圍<port>-<port>
。協議能夠是tcp或udp。
禁用端口和協議組合
$ firewall-cmd [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>
查詢區域中是否啓用了端口和協議組合
$ firewall-cmd [--zone=<zone>] --query-port=<port>[-<port>]/<protocol>
若是啓用,此命令將有返回值。沒有輸出信息。
啓用區域中的IP假裝功能
$ firewall-cmd [--zone=<zone>] --add-masquerade
此舉啓用區域的假裝功能。私有網絡的地址將被隱藏並映射到一個公有IP。這是地址轉換的一種形式,經常使用於路由。因爲內核的限制,假裝功能僅可用於IPv4。
禁用區域中的IP假裝
$ firewall-cmd [--zone=<zone>] --remove-masquerade
查詢區域的假裝狀態
$ firewall-cmd [--zone=<zone>] --query-masquerade
若是啓用,此命令將有返回值。沒有輸出信息。
啓用區域的ICMP阻塞功能
$ firewall-cmd [--zone=<zone>] --add-icmp-block=<icmptype>
此舉將啓用選中的Internet控制報文協議(ICMP)報文進行阻塞。 ICMP 報文能夠是請求信息或者建立的應答報文,以及錯誤應答。
禁止區域的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> }
端口能夠映射到另外一臺主機的同一端口,也能夠是同一主機或另外一主機的不一樣端口。端口號能夠是一個單獨的端口<port>
或者是端口範圍<port>-<port>
。協議能夠爲tcp或udp 。目標端口能夠是端口號<port>
或者是端口範圍<port>-<port>
。目標地址能夠是IPv4地址。受內核限制,端口轉發功能僅可用於IPv4。
禁止區域的端口轉發或者端口映射
$ firewall-cmd [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
查詢區域的端口轉發或者端口映射
$ firewall-cmd [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
若是啓用,此命令將有返回值。沒有輸出信息。
端口轉發實例
要打開端口轉發,則須要先
$ firewall-cmd --zone=external --add-masquerade
而後轉發tcp 22端口至3753
$ firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=3753
轉發22端口數據至另外一個ip的相同端口上
$ firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toaddr=192.168.1.100
轉發22端口數據至另外一ip的2055端口上
$ firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=2055:toaddr=192.168.1.100
將區域home的ssh轉發到127.0.0.2
$ firewall-cmd --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2
永久選項不直接影響運行時的狀態。這些選項僅在重載或者重啓服務時可用。爲了使用運行時和永久設置,須要分別設置二者。 選項--permanent
須要是永久設置的第一個參數。
獲取永久選項所支持的服務
$ firewall-cmd --permanent --get-services
獲取永久選項所支持的ICMP類型列表
$ firewall-cmd --permanent --get-icmptypes
獲取支持的永久區域
$ firewall-cmd --permanent --get-zones
啓用區域中的服務
$ firewall-cmd --permanent [--zone=<zone>] --add-service=<service>
此舉將永久啓用區域中的服務。若是未指定區域,將使用默認區域。
例: 永久啓用home區域中的ipp-client服務
$ firewall-cmd --permanent --zone=home --add-service=ipp-client
禁用區域中的一種服務
$ firewall-cmd --permanent [--zone=<zone>] --remove-service=<service>
查詢區域中的服務是否啓用
$ firewall-cmd --permanent [--zone=<zone>] --query-service=<service>
若是服務啓用,此命令將有返回值。此命令沒有輸出信息。
永久啓用區域中的一個端口-協議組合
$ firewall-cmd --permanent [--zone=<zone>] --add-port=<port>[-<port>]/<protocol>
例如
容許某範圍的udp端口至public級別,並永久生效
$ firewall-cmd --zone=public --add-port=5060-5059/udp --permanent
永久啓用home區域中的https(tcp 443)端口
$ firewall-cmd --permanent --zone=home --add-port=443/tcp
永久禁用區域中的一個端口-協議組合
$ firewall-cmd --permanent [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>
查詢區域中的端口-協議組合是否永久啓用
$ firewall-cmd --permanent [--zone=<zone>] --query-port=<port>[-<port>]/<protocol>
若是服務啓用,此命令將有返回值。此命令沒有輸出信息。
永久啓用區域中的假裝
$ firewall-cmd --permanent [--zone=<zone>] --add-masquerade
此舉啓用區域的假裝功能。私有網絡的地址將被隱藏並映射到一個公有IP。這是地址轉換的一種形式,經常使用於路由。因爲內核的限制,假裝功能僅可用於IPv4。
永久禁用區域中的假裝
$ firewall-cmd --permanent [--zone=<zone>] --remove-masquerade
查詢區域中的假裝的永久狀態
$ firewall-cmd --permanent [--zone=<zone>] --query-masquerade
若是服務啓用,此命令將有返回值。此命令沒有輸出信息。
永久啓用區域中的ICMP阻塞
$ firewall-cmd --permanent [--zone=<zone>] --add-icmp-block=<icmptype>
此舉將啓用選中的 Internet 控制報文協議(ICMP)報文進行阻塞。 ICMP 報文能夠是請求信息或者建立的應答報文或錯誤應答報文。
永久禁用區域中的ICMP阻塞
$ firewall-cmd --permanent [--zone=<zone>] --remove-icmp-block=<icmptype>
例: 阻塞公共區域中的響應應答報文
$ firewall-cmd --permanent --zone=public --add-icmp-block=echo-reply
查詢區域中的ICMP永久狀態
$ firewall-cmd --permanent [--zone=<zone>] --query-icmp-block=<icmptype>
若是服務啓用,此命令將有返回值。此命令沒有輸出信息。
在區域中永久啓用端口轉發或映射
$ firewall-cmd --permanent [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
端口能夠映射到另外一臺主機的同一端口,也能夠是同一主機或另外一主機的不一樣端口。端口號能夠是一個單獨的端口<port>
或者是端口範圍<port>-<port>
。協議能夠爲tcp或udp 。目標端口能夠是端口號<port>
或者是端口範圍<port>-<port>
。目標地址能夠是IPv4 地址。受內核限制,端口轉發功能僅可用於IPv4。
例: 將home區域的ssh服務轉發到127.0.0.2
$ firewall-cmd --permanent --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2
永久禁止區域的端口轉發或者端口映射
$ firewall-cmd --permanent [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
查詢區域的端口轉發或者端口映射狀態
$ firewall-cmd --permanent [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
若是服務啓用,此命令將有返回值。此命令沒有輸出信息。
IP封禁
$ firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='222.222.222.222' reject"
直接選項主要用於使服務和應用程序可以增長規則。 規則不會被保存,在從新加載或者重啓以後必須再次提交。傳遞的參數<args>
與iptables, ip6tables以及ebtables一致。
選項--direct
須要是直接選項的第一個參數。
將命令傳遞給防火牆。參數<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>
對於用慣了iptables的用戶,FirewallD的使用起來須要熟悉一段時間。若是你想使用熟悉的iptables和ip6tables靜態防火牆規則, 方法以下
安裝iptables-services
$ yum install iptables-services
禁用firewalld
$ systemctl mask firewalld.service $ systemctl stop firewalld.service
啓用iptables和ip6tables
$ systemctl enable iptables.service $ systemctl enable ip6tables.service
靜態防火牆規則配置文件是/etc/sysconfig/iptables
以及/etc/sysconfig/ip6tables
。
注:iptables與iptables-services軟件包不提供與服務配套使用的防火牆規則. 這些服務是用來保障兼容性以及供想使用本身防火牆規則的人使用的. 你能夠安裝並使用system-config-firewall
來建立服務所須要的規則. 爲了能使用system-config-firewall
, 你必須中止firewalld。