CentOS 7下使用FirewallD構建動態防火牆

FirewallD介紹

FirewallD提供了支持網絡/防火牆區域(zone)定義網絡鏈接以及接口安全等級的動態防火牆管理工具。它支持IPv4, IPv6 防火牆設置以及以太網橋接,也支持允許服務或者應用程序直接添加防火牆規則的接口。FirewallD擁有運行時配置和永久配置選項。

採用firewall-cmd(command)或firewall-config(gui)來動態的管理kernel netfilter的臨時或永久的接口規則,並實時生效而無需重啓服務。

FirewallD特性

  • Zone

FirewallD使用區域(zone)的概念來管理,網絡區域定義了網絡連接的可信等級。這是一個一對多的關係,這意味着一次連接可以僅僅是一個區域的一部分,而一個區域可以用於很多連接。每個網卡對應一個zone,這些zone的配置文件可在/usr/lib/firewalld/zones/下看到,默認的是public。

Zone提供了以下幾個區域

drop

任何流入網絡的包都被丟棄,不作出任何響應,只允許流出的網絡連接。即使開放了某些服務(比如http),這些服務的數據也是不允許通過的。

block
任何進入的網絡連接都被拒絕,並返回IPv4的icmp-host-prohibited報文或者IPv6的icmp6-adm-prohibited報文。只允許由該系統初始化的網絡連接。

public(默認)
用以可以公開的部分。你認爲網絡中其他的計算機不可信並且可能傷害你的計算機,只允許選中的服務通過。

external
用在路由器等啓用僞裝的外部網絡。你認爲網絡中其他的計算機不可信並且可能傷害你的計算機,只允許選中的服務通過。

dmz
用以允許隔離區(dmz)中的電腦有限地被外界網絡訪問,只允許選中的服務通過。

work
用在工作網絡。你信任網絡中的大多數計算機不會影響你的計算機,只允許選中的服務通過。

home
用在家庭網絡。你信任網絡中的大多數計算機不會影響你的計算機,只允許選中的服務通過。

internal
用在內部網絡。你信任網絡中的大多數計算機不會影響你的計算機,只允許選中的服務通過。

trusted
允許所有網絡連接,即使沒有開放任何服務,那麼使用此zone的流量照樣通過(一路綠燈)。

  • 預定義的服務

服務是端口和/或協議入口的組合。備選內容包括netfilter助手模塊以及 IPv4、IPv6地址。

  • 端口和協議

定義了tcp或udp端口,端口可以是一個端口或者端口範圍。

  • ICMP阻塞

可以選擇Internet控制報文協議的報文。這些報文可以是信息請求亦可是對信息請求或錯誤條件創建的響應。

  • 僞裝

私有網絡地址可以被映射到公開的IP地址。這是一次正規的地址轉換。

  • 端口轉發

端口可以映射到另一個端口以及/或者其他主機。

FirewallD安裝

安裝FirewallD和管理工具

$ yum install firewalld firewall-config

運行、停止、禁用FirewallD

$ systemctl start firewalld         # 啓動
$ systemctl enable firewalld        # 開機啓動
$ systemctl stop firewalld          # 關閉
$ systemctl disable firewalld       # 取消開機啓動
$ systemctl status firewalld        # 查看狀態

使用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靜態防火牆

對於用慣了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。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章