閱讀340 返回首頁    go 阿裏雲 go 技術社區[雲棲]


CentOS 上的 FirewallD 簡明指南

FirewallD 是 iptables 的前端控製器用於實現持久的網絡流量規則。它提供命令行和圖形界麵在大多數 Linux 發行版的倉庫中都有。與直接控製 iptables 相比使用 FirewallD 有兩個主要區別

  1. FirewallD 使用區域和服務而不是鏈式規則。
  2. 它動態管理規則集允許更新規則而不破壞現有會話和連接。

FirewallD 是 iptables 的一個封裝可以讓你更容易地管理 iptables 規則 - 它並不是 iptables 的替代品。雖然 iptables 命令仍可用於 FirewallD但建議使用 FirewallD 時僅使用 FirewallD 命令。

本指南將向您介紹 FirewallD 的區域和服務的概念以及一些基本的配置步驟。

安裝與管理 FirewallD

CentOS 7 和 Fedora 20+ 已經包含了 FirewallD但是默認沒有激活。可以像其它的 systemd 單元那樣控製它。

1、 啟動服務並在係統引導時啟動該服務


  1. sudo systemctl start firewalld
  2. sudo systemctl enable firewalld

要停止並禁用


  1. sudo systemctl stop firewalld
  2. sudo systemctl disable firewalld

2、 檢查防火牆狀態。輸出應該是 running 或者 not running


  1. sudo firewall-cmd --state

3、 要查看 FirewallD 守護進程的狀態


  1. sudo systemctl status firewalld

示例輸出


  1. firewalld.service - firewalld - dynamic firewall daemon
  2. Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled)
  3. Active: active (running) since Wed 2015-09-02 18:03:22 UTC; 1min 12s ago
  4. Main PID: 11954 (firewalld)
  5. CGroup: /system.slice/firewalld.service
  6. └─11954 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

4、 重新加載 FirewallD 配置


  1. sudo firewall-cmd --reload

配置 FirewallD

FirewallD 使用 XML 進行配置。除非是非常特殊的配置你不必處理它們而應該使用 firewall-cmd

配置文件位於兩個目錄中

  • /usr/lib/FirewallD 下保存默認配置如默認區域和公用服務。 避免修改它們因為每次 firewall 軟件包更新時都會覆蓋這些文件。
  • /etc/firewalld 下保存係統配置文件。 這些文件將覆蓋默認配置。

配置集

FirewallD 使用兩個配置集“運行時”和“持久”。 在係統重新啟動或重新啟動 FirewallD 時不會保留運行時的配置更改而對持久配置集的更改不會應用於正在運行的係統。

默認情況下firewall-cmd 命令適用於運行時配置但使用 --permanent 標誌將保存到持久配置中。要添加和激活持久性規則你可以使用兩種方法之一。

1、 將規則同時添加到持久規則集和運行時規則集中。


  1. sudo firewall-cmd --zone=public --add-service=http --permanent
  2. sudo firewall-cmd --zone=public --add-service=http

2、 將規則添加到持久規則集中並重新加載 FirewallD。


  1. sudo firewall-cmd --zone=public --add-service=http --permanent
  2. sudo firewall-cmd --reload

reload 命令會刪除所有運行時配置並應用永久配置。因為 firewalld 動態管理規則集所以它不會破壞現有的連接和會話。

防火牆的區域

“區域”是針對給定位置或場景例如家庭、公共、受信任等可能具有的各種信任級別的預構建規則集。不同的區域允許不同的網絡服務和入站流量類型而拒絕其他任何流量。 首次啟用 FirewallD 後public 將是默認區域。

區域也可以用於不同的網絡接口。例如要分離內部網絡和互聯網的接口你可以在 internal 區域上允許 DHCP但在external 區域僅允許 HTTP 和 SSH。未明確設置為特定區域的任何接口將添加到默認區域。

要找到默認區域


  1. sudo firewall-cmd --get-default-zone

要修改默認區域


  1. sudo firewall-cmd --set-default-zone=internal

要查看你網絡接口使用的區域


  1. sudo firewall-cmd --get-active-zones

示例輸出


  1. public
  2. interfaces: eth0

要得到特定區域的所有配置


  1. sudo firewall-cmd --zone=public --list-all

示例輸出


  1. public (default, active)
  2. interfaces: ens160
  3. sources:
  4. services: dhcpv6-client http ssh
  5. ports: 12345/tcp
  6. masquerade: no
  7. forward-ports:
  8. icmp-blocks:
  9. rich rules:

要得到所有區域的配置


  1. sudo firewall-cmd --list-all-zones

示例輸出


  1. block
  2. interfaces:
  3. sources:
  4. services:
  5. ports:
  6. masquerade: no
  7. forward-ports:
  8. icmp-blocks:
  9. rich rules:
  10. ...
  11. work
  12. interfaces:
  13. sources:
  14. services: dhcpv6-client ipp-client ssh
  15. ports:
  16. masquerade: no
  17. forward-ports:
  18. icmp-blocks:
  19. rich rules:

與服務一起使用

FirewallD 可以根據特定網絡服務的預定義規則來允許相關流量。你可以創建自己的自定義係統規則並將它們添加到任何區域。 默認支持的服務的配置文件位於 /usr/lib /firewalld/services用戶創建的服務文件在 /etc/firewalld/services 中。

要查看默認的可用服務


  1. sudo firewall-cmd --get-services

比如要啟用或禁用 HTTP 服務


  1. sudo firewall-cmd --zone=public --add-service=http --permanent
  2. sudo firewall-cmd --zone=public --remove-service=http --permanent

允許或者拒絕任意端口/協議

比如允許或者禁用 12345 端口的 TCP 流量。


  1. sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent
  2. sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent

端口轉發

下麵是在同一台服務器上將 80 端口的流量轉發到 12345 端口。


  1. sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345

要將端口轉發到另外一台服務器上

1、 在需要的區域中激活 masquerade。


  1. sudo firewall-cmd --zone=public --add-masquerade

2、 添加轉發規則。例子中是將本地的 80 端口的流量轉發到 IP 地址為 123.456.78.9 的遠程服務器上的  8080 端口。


  1. sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=123.456.78.9

要刪除規則用 --remove 替換 --add。比如


  1. sudo firewall-cmd --zone=public --remove-masquerade

用 FirewallD 構建規則集

例如以下是如何使用 FirewallD 為你的服務器配置基本規則如果您正在運行 web 服務器。

  1. 將 eth0 的默認區域設置為 dmz。 在所提供的默認區域中dmz非軍事區是最適合於這個程序的因為它隻允許 SSH 和 ICMP。

  1. sudo firewall-cmd --set-default-zone=dmz
  2. sudo firewall-cmd --zone=dmz --add-interface=eth0

2、 把 HTTP 和 HTTPS 添加永久的服務規則到 dmz 區域中


  1. sudo firewall-cmd --zone=dmz --add-service=http --permanent
  2. sudo firewall-cmd --zone=dmz --add-service=https --permanent

3、 重新加載 FirewallD 讓規則立即生效


  1. sudo firewall-cmd --reload

如果你運行 firewall-cmd --zone=dmz --list-all 會有下麵的輸出


  1. dmz (default)
  2. interfaces: eth0
  3. sources:
  4. services: http https ssh
  5. ports:
  6. masquerade: no
  7. forward-ports:
  8. icmp-blocks:
  9. rich rules:

這告訴我們dmz 區域是我們的默認區域它被用於 eth0 接口中所有網絡的源地址端口。 允許傳入 HTTP端口 80、HTTPS端口 443和 SSH端口 22的流量並且由於沒有 IP 版本控製的限製這些適用於 IPv4 和 IPv6。 不允許IP 偽裝以及端口轉發。 我們沒有 ICMP 塊所以 ICMP 流量是完全允許的。沒有豐富Rich規則允許所有出站流量。

高級配置

服務和端口適用於基本配置但對於高級情景可能會限製較多。 豐富Rich規則和直接Direct接口允許你為任何端口、協議、地址和操作向任何區域 添加完全自定義的防火牆規則。

豐富規則

豐富規則的語法有很多但都完整地記錄在 firewalld.richlanguage(5) 的手冊頁中或在終端中 man firewalld.richlanguage。 使用 --add-rich-rule--list-rich-rules 、 --remove-rich-rule 和 firewall-cmd 命令來管理它們。

這裏有一些常見的例子

允許來自主機 192.168.0.14 的所有 IPv4 流量。


  1. sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.0.14 accept'

拒絕來自主機 192.168.1.10 到 22 端口的 IPv4 的 TCP 流量。


  1. sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject'

允許來自主機 10.1.0.3 到 80 端口的 IPv4 的 TCP 流量並將流量轉發到 6532 端口上。


  1. sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=10.1.0.3 forward-port port=80 protocol=tcp to-port=6532'

將主機 172.31.4.2 上 80 端口的 IPv4 流量轉發到 8080 端口需要在區域上激活 masquerade。


  1. sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=172.31.4.2'

列出你目前的豐富規則


  1. sudo firewall-cmd --list-rich-rules

iptables 的直接接口

對於最高級的使用或對於 iptables 專家FirewallD 提供了一個直接Direct接口允許你給它傳遞原始 iptables 命令。 直接接口規則不是持久的除非使用 --permanent

要查看添加到 FirewallD 的所有自定義鏈或規則


  1. firewall-cmd --direct --get-all-chains
  2. firewall-cmd --direct --get-all-rules

原文發布時間為2017-01-07

本文來自雲棲社區合作夥伴“Linux中國”

最後更新:2017-05-31 10:32:25

  上一篇:go  從源代碼編譯 Vim 8.0
  下一篇:go  TaoBeier 的 Vim 配置,支持 Python、Javascript、Golang 等