Firewalld - Arch Linux 中文维基

跳至內容

# Firewalld

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Firewalld，最近一次同步於 2024-01-20，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- nftables

firewalld 是由紅帽開發的防火牆守護進程。 默認使用 nftables 。據項目主頁：

  Firewalld 提供了一個動態管理的防火牆，支持使用區域來標識網絡連接/接口的可信等級。支持 IPv4、IPv6 防火牆設置、以太網橋接和 IP sets。使用分離的運行時配置和永久設置。也提供了一個接口用來直接為服務或應用添加防火牆規則。

## 安裝

安裝 firewalld包。

## 使用

啟用並啟動 `firewalld.service`.

你可以使用控制台工具 `firewall-cmd` 來控制防火牆規則。

`firewall-offline-cmd` 可在 firewalld 未運行時進行配置，與 `firewall-cmd` 類似。

隨 firewalld包 帶的 `firewall-config` 命令提供了一個圖形界面。

## 配置

使用 `firewall-cmd` 可用於運行時更改配置

注意：大部分命令只會改變運行時配置而其將會在重啟後丟失，要想進行永久配置有兩種方式：

- 使用 `--permanent` 參數。這 不會 更改運行時配置直至防火牆服務重啟，或使用 `--reload` 重載規則。
- 持久化規則可見：#將運行時配置設為永久

### 區域

區域是一系列可用於指定接口的規則。

要查看當前區域及其應用的接口，使用：

    # firewall-cmd --get-active-zones

一些命令（例如 add/remove port/service） 需要指定區域/

區域可以通過 `--zone=zone_name` 參數傳遞。

若未指定一個確切的區域，則使用默認區域。

#### 區域信息

你可以列出所有區域的配置：

    # firewall-cmd --list-all-zones

或指定一個區域

    # firewall-cmd --info-zone=zone_name

#### 更改接口區域

    # firewall-cmd --zone=zone --change-interface=interface_name

此處 `zone` 是你想分配給接口的區域。

##### 使用 NetworkManager 管理區域

NetworkManager 能夠為不同的連接分配不同的區域。例如：將一個家庭 WiFi 分配到 "home" 區域， 將工作室 WiFi 分配到 "work" 區域，並將剩餘 WiFi 分配到 "public" 區域。

列出連接配置：

    $ nmcli connection show

將 "myssid" 設置為 "home" 區域：

    $ nmcli connection modify myssid connection.zone home

#### 默認區域

默認區域將會被自動應用到新的接口上，查詢默認區域使用：

    # firewall-cmd --get-default-zone

更改默認區域使用：

    # firewall-cmd --set-default-zone=zone

注意：此改變是臨時的

### 服務

服務是為特定守護程序預配置的規則。例如匹配 SSH 的 服務 {{ic|ssh} 在被分配到一個區域後會開放 22 埠。

使用下面的命令列出所有可用的服務：

    # firewall-cmd --get-services

查詢特定服務的信息：

    # firewall-cmd --info-service service_name

#### 從區域中添加或移除服務

添加一個服務到區域：

    # firewall-cmd --zone=zone_name --add-service service_name

移除服務：

    # firewall-cmd --zone=zone_name --remove-service service_name

### 埠

可以直接在指定區域上開放埠：

    # firewall-cmd --zone=zone_name --add-port port_num/protocol

此處 `protocol` 應為 `tcp` 或 `udp` 之一。

關閉埠使用帶有相同的埠號和協議的 `--remove-port` 選項。

### NAT 地址偽裝

此命令與 `iptables -t nat -A POSTROUTING -j MASQUERADE` 具有相同的效果：

    # firewall-cmd --zone=public --add-masquerade

從版本 1.0.0 開始，如果想要 NAT 地址偽裝在不同的防火牆區域之間工作，您必須創建一個新的策略對象，用於過濾它們之間的流量：

    # firewall-cmd --new-policy NAT_int_to_ext --permanent
    # firewall-cmd --permanent --policy NAT_int_to_ext --add-ingress-zone internal
    # firewall-cmd --permanent --policy NAT_int_to_ext --add-egress-zone public
    # firewall-cmd --permanent --policy NAT_int_to_ext --set-target ACCEPT

### 埠轉發

如果你在路由器上配置了 firewalld，而且還如上開啟了 NAT 地址偽裝，則通過 firewalld 設置埠轉發很簡單：

    # firewall-cmd --zone=public --add-forward-port=port=12345:proto=tcp:toport=22:toaddr=10.20.30.40

這會將外部埠上的 12345/tcp 埠轉發到內部網絡 10.20.30.40 的 22 （標準 SSH） 埠。移除此埠轉發：

    # firewall-cmd --zone=public --remove-forward-port=port=12345:proto=tcp:toport=22:toaddr=10.20.30.40

不幸的是你必須鍵入完整的轉發聲明以移除它，只指定埠和協議是不行的。

### Rich 規則

通過使用 Rich 規則，可以以一種易於理解的方式創建更複雜的防火牆規則。

要添加 Rich 規則：

    # firewall-cmd [--zone=zone_name] [--permanent] --add-rich-rule='rich_rule'

其中 `rich_rule` 是一條豐富語言規則。

如果要允許來所有的連接自網絡 `192.168.1.0/24` 到 NFS service：

    # firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="nfs" accept'

要允許來自 `192.168.2.3` 到埠 `1234/tcp` 的連接：

    # firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.3" port port="1234" protocol="tcp" accept'

有關更多 Rich 規則語法，請參閱 firewalld.richlanguage(5)。

要刪除 Rich 規則：

    # firewall-cmd  [--zone=zone_name] [--permanent] --remove-rich-rule='rich_rule'

## 提示和技巧

### 埠或服務有效時間

使用 `--timeout=value` 可以設置服務或埠的有效時間。時間默認為秒，`m` 後綴代表分鐘， `h` 後綴代表小時。 例如：為 SSH 開放三小時的使用時間：

    # firewall-cmd --add-service ssh --timeout=3h

注意：超時選項與 --permanent 互斥。也就是說，超時只能是運行時配置，不可能持久化。

### 將運行時配置設為永久

你可以將運行時配置持久化（這意味著重啟後也會保留配置）

    # firewall-cmd --runtime-to-permanent

### 檢查服務配置

`/usr/lib/firewalld/services/` 存儲了默認支持的服務的配置文件，`/etc/firewalld/services/` 存儲了用戶創建的服務文件。

### 移除程序/托盤圖標

托盤圖標與 firewalld包 一起打包。其自啟動腳本位於 `/etc/xdg/autostart/firewall-applet.desktop` 可以被隱藏，參見 XDG Autostart#目錄。另一種方法是，通過將其添加到 `/etc/pacman.conf` 中的 NoExtract 來阻止該文件的安裝。

## 參閱

- firewall-cmd(1)
- Official documentation
- Fedora:Firewalld
- Fedora:Features/FirewalldRichLanguage

分類：​

- 防火牆

Firewalld
新增話題