返回文章列表

Linux防火牆iptables與nftables組態詳解

本文探討 Linux 防火牆組態,比較 iptables 與 nftables 的差異、優缺點及使用方法,並提供實務組態範例與安全加固建議,涵蓋規則設定、網路位址轉換、封包屬性調整等,同時也探討了在雲端環境下的安全考量以及業界常用的安全標準,最後介紹 SELinux 和 AppArmor 等安全性強化工具。

系統管理 資安

Linux 系統管理員必須瞭解防火牆的運作機制與組態方法,才能有效提升系統安全性。本文從 iptables 的規則設定、預設策略、儲存與還原等方面入手,逐步講解其核心概念,並搭配實務操作範例,讓讀者能快速上手。接著,文章深入比較了 iptables 與 nftables 的差異,闡述 nftables 在效能和功能上的優勢,並提供具體的遷移建議和組態示範。此外,文章也涵蓋了網路位址轉換(NAT)和封包屬性調整等進階議題,讓讀者對 Linux 防火牆有更全面的認識。最後,文章也強調了雲端環境的特殊安全考量,並介紹了業界常用的安全標準和 SELinux、AppArmor 等額外安全工具,提供讀者更完整的 Linux 系統安全加固策略。

Linux 防火牆組態深入解析

iptables 規則組態與管理

在 Linux 系統中,iptables 是一個功能強大的防火牆工具,用於控制網路流量的進出。在組態 iptables 時,我們需要了解其規則的設定和管理。

規則設定

首先,我們來看看如何設定 iptables 規則。以下是一個簡單的例子,用於允許特定的網路流量:

sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT -m comment --comment "Permit all Web Access"

這條命令的作用是允許所有進入本機的 TCP 443 連線埠(HTTPS)的流量。#### 內容解密:

  • -A INPUT 表示將規則新增到 INPUT 鏈的末尾。
  • -p tcp 指定協定為 TCP。
  • --dport 443 指定目標連線埠為 443。
  • -j ACCEPT 表示接受符合該規則的封包。
  • -m comment --comment "Permit all Web Access" 新增註解,說明該規則的作用。

相對地,如果我們想要封鎖特定的流量,可以使用以下命令:

sudo iptables -A INPUT -p tcp --dport 443 -j DROP -m comment --comment "Block inbound Web"

這條命令會丟棄所有進入本機的 TCP 443 連線埠的流量。#### 內容解密:

  • -j DROP 表示丟棄符合該規則的封包。

規則列表檢視

要檢視目前的 iptables 規則,可以使用以下命令:

sudo iptables -L INPUT

輸出結果會顯示 INPUT 鏈中的所有規則,包括目標、協定、來源和目的地等資訊。

iptables 預設策略與規則順序

iptables 的規則是按順序處理的,第一個比對的規則將決定封包的命運。如果沒有任何規則比對,預設策略將被應用。預設情況下,預設策略是 ACCEPT,這意味著如果封包未被任何規則比對,它將被接受。

若要更改預設策略,可以使用以下命令:

iptables -P INPUT DENY

這將把 INPUT 鏈的預設策略更改為 DENY,即拒絕所有未被明確允許的流量。#### 內容解密:

  • -P INPUT DENY 將 INPUT 鏈的預設策略設定為 DENY。

儲存與還原 iptables 規則

iptables 的規則預設儲存在記憶體中,重啟系統後會丟失。要儲存規則,可以使用 iptables-save 命令:

iptables-save > /etc/iptables/rules.v4

要還原已儲存的規則,可以使用 iptables-restore 命令:

iptables-restore < /etc/iptables/rules.v4

在某些發行版中,可能需要安裝額外的套件,如 iptables-persistent(Debian/Ubuntu)或 iptables-services(Red Hat/CentOS)。

網路位址轉換(NAT)表

NAT 表用於修改封包的來源或目的地 IP 位址,通常用於閘道器或防火牆裝置,以實作內部網路與外部網路之間的位址轉換。

NAT 組態範例

假設我們有一個內部網路 192.168.10.0/24,並希望透過閘道器的外部介面 eth1 進行 NAT:

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

這條命令會將所有透過 eth1 輸出的封包進行 MASQUERADE(偽裝),即將來源 IP 位址替換為 eth1 的 IP 位址。#### 內容解密:

  • -t nat 指定操作 NAT 表。
  • -A POSTROUTING 將規則新增到 POSTROUTING 鏈。
  • -o eth1 指定輸出介面為 eth1
  • -j MASQUERADE 表示進行 MASQUERADE 操作。

mangle 表

mangle 表用於修改封包的特定屬性,例如 TTL、TOS 等。在某些特殊情況下,例如需要調整 MSS(最大分段大小)以適應特定的網路環境,可以使用 mangle 表。

調整 MSS 範例

對於使用 DSL 或衛星鏈路的網路,可能需要調整 MSS 以避免封包過大導致的問題:

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1412

這條命令會將透過防火牆轉發的 TCP SYN 封包的 MSS 設定為 1412。#### 內容解密:

  • -t mangle 指定操作 mangle 表。
  • -A FORWARD 將規則新增到 FORWARD 鏈。
  • -p tcp --tcp-flags SYN,RST SYN 比對 TCP SYN 封包。
  • -j TCPMSS --set-mss 1412 設定 MSS 為 1412。

Linux 防火牆組態:iptables 與 nftables 詳解

在 Linux 系統中,防火牆組態是網路安全的重要一環。傳統上,iptables 是 Linux 防火牆的主要工具,但隨著技術的發展,nftables 逐漸成為新的標準。本文將探討 iptables 的工作原理、組態方法,以及其侷限性,並介紹 nftables 的優勢及其組態。

iptables 的工作原理與組態

iptables 是 Linux 核心的包過濾框架,用於控制進出網路流量的規則。它透過不同的表(tables)和鏈(chains)來管理網路封包。主要的表包括 filter、nat、mangle 和 raw。

鏈與表的運作順序

在 iptables 中,鏈的順序對於規則的生效至關重要。例如,在進行 NAT 轉換之前,需要先比對特定的流量。這種順序對於確保正確的網路行為是必要的。

下圖展示了 iptables 的運作流程: 此圖示說明瞭封包在 Linux 系統中的處理流程。

使用 iptables 組態防火牆

iptables 的組態涉及定義規則和鏈,以控制網路流量。例如,可以使用以下命令來允許特定的 TCP 流量:

$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

內容解密:

  • -A INPUT 表示將規則新增至 INPUT 鏈。
  • -p tcp 指定協定為 TCP。
  • --dport 22 指定目標埠為 22(SSH)。
  • -j ACCEPT 表示允許符合條件的封包透過。

為何需要關注 iptables 的操作順序

在組態 iptables 時,操作的順序至關重要。錯誤的順序可能會導致規則無法生效或產生非預期的結果。例如,在進行 IPSEC 加密之前,需要先比對相關的流量。此外,策略路由的組態也需要在 NAT 操作之前進行。

路由與 NAT 的順序問題

如果未正確設定順序,可能會導致某些流量未被正確處理。例如,備份流量可能需要透過特定的鏈路傳輸,而一般的流量則需要透過另一條鏈路。這種情況下,正確的比對順序是確保網路正常運作的關鍵。

從 iptables 到 nftables 的轉變

隨著 Linux 核心的發展,iptables 正逐漸被 nftables 取代。nftables 提供了更高效、更靈活的防火牆組態方式。

nftables 的優勢

  1. 更快的佈署速度:nftables 使用單一命令 nft 進行所有操作,並且支援批次處理規則,大幅提高了組態效率。
  2. API 支援:nftables 提供了 API 介面,便於與現代化的網路管理工具(如 Terraform、Ansible)整合,實作自動化佈署。
  3. 更高的效率:nftables 在 Linux 核心中的運作效率更高,能夠減少 CPU 的負擔,特別是在處理大量規則時。

使用 nftables 組態防火牆

nftables 的基本命令為 nft。可以透過以下命令新增規則:

$ sudo nft add rule ip filter input tcp dport 22 accept

內容解密:

  • add rule 表示新增規則。
  • ip filter input 指定表和鏈。
  • tcp dport 22 指定協定和目標埠。
  • accept 表示允許符合條件的封包透過。

設定 nftables 防火牆

在瞭解了基本概念之後,我們將探討如何使用 nft 指令來設定 nftables 防火牆。

nftables 基本設定

首先,建議檢視 nftables 的 man 頁面。同時,也應該檢視主要 nft 指令的 man 頁面。這個手冊甚至比 iptables 更為冗長複雜,超過 600 頁。

讓我們佈署與 iptables 相同的範例設定。大多數資料中心的 Linux 防火牆都是採用單一 INPUT 防火牆來保護主機。

首先,務必記錄現有的 iptables 和 ip6tables 規則(使用 iptables -Lip6tables -L),然後清除兩者(使用 -F 選項)。雖然可以同時執行 iptables 和 nftables,但這並不是一個好主意。考慮到下一個管理此主機的人,他們可能會看到其中一個防火牆並認為這就是全部的設定。因此,總是為下一個人組態事物是明智的!

如果您有現有的 iptables 規則集,尤其是複雜的規則集,那麼 iptables-translate 指令可以將數小時的工作轉化為數分鐘的工作:

robv@ubuntu:~$ iptables-translate -A INPUT -i ens33 -p tcp -s 1.2.3.0/24 --dport 22 -j ACCEPT -m comment --comment "Permit Admin"
nft add rule ip filter INPUT iifname "ens33" ip saddr 1.2.3.0/24 tcp dport 22 counter accept comment \"Permit Admin\"

範例語法解析:

此指令將 iptables 規則轉換為 nftables 規則。以下是轉換後的範例:

sudo nft add table filter
sudo nft add chain filter INPUT
sudo nft add rule ip filter INPUT iifname "ens33" ip saddr 1.2.3.0/24 tcp dport 22 counter accept comment \"Permit Admin\"
sudo nft add rule ip filter INPUT iifname "ens33" tcp dport 22 counter drop comment \"Block Admin\"
sudo nft add rule ip filter INPUT iifname "ens33" ip saddr 1.2.3.5 tcp dport 443 counter drop comment \"Block inbound Web\"
sudo nft add rule ip filter INPUT tcp dport 443 counter accept comment \"Permit all Web Access\"

程式碼作用:

  • 建立一個名為 filter 的表格和一個名為 INPUT 的鏈。
  • 新增多條規則以允許或拒絕特定的網路流量。

輸出規則集:

sudo nft list ruleset
table ip filter {
    chain INPUT {
        iifname "ens33" ip saddr 1.2.3.0/24 tcp dport 22 counter packets 0 bytes 0 accept comment "Permit Admin"
        iifname "ens33" tcp dport 22 counter packets 0 bytes 0 drop comment "Block Admin"
        iifname "ens33" ip saddr 1.2.3.5 tcp dport 443 counter packets 0 bytes 0 drop comment "Block inbound Web"
        tcp dport 443 counter packets 0 bytes 0 accept comment "Permit all Web Access"
    }
}

使規則持久化

如同許多 Linux 網路結構,nftables 規則在此時並非持久化;它們只會在下一次系統重新載入(或服務重新啟動)之前存在。預設的 nftools 規則集位於 /etc/nftools.conf。您可以將新的規則新增至此檔案以使其持久化。

使用 include 檔案

您可以設定一個「case」結構,將防火牆規則分段以符合您的網路段:

nft add rule ip Firewall Forward ip daddr vmap { \
    192.168.21.1-192.168.21.254 : jump chain-pci21, \
    192.168.22.1-192.168.22.254 : jump chain-servervlan, \
    192.168.23.1-192.168.23.254 : jump chain-desktopvlan23 \
}
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Linux防火牆iptables與nftables組態詳解

package "安全架構" {
    package "網路安全" {
        component [防火牆] as firewall
        component [WAF] as waf
        component [DDoS 防護] as ddos
    }

    package "身份認證" {
        component [OAuth 2.0] as oauth
        component [JWT Token] as jwt
        component [MFA] as mfa
    }

    package "資料安全" {
        component [加密傳輸 TLS] as tls
        component [資料加密] as encrypt
        component [金鑰管理] as kms
    }

    package "監控審計" {
        component [日誌收集] as log
        component [威脅偵測] as threat
        component [合規審計] as audit
    }
}

firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成

@enduml

圖示說明:

此圖表示根據目標 IP 地址將流量導向不同的鏈。

分離設定檔

您可以透過使用 include 陳述式將 nft 設定分成邏輯部分,從而簡化設定檔。例如,您可以維護一個適用於所有 web 伺服器的規則檔案、一個適用於 SSH 伺服器的規則檔案等。

# webserver ruleset
include "ipv4-ipv6-webserver-rules.nft"
# admin access restricted to admin VLAN only
include "ssh-admin-vlan-access-only.nft"

清除防火牆設定

在繼續下一章之前,我們應該清除範例防火牆設定:

$ # first remove the iptables INPUT and FORWARD tables
$ sudo iptables -F INPUT
$ sudo iptables -F FORWARD
$ # next this command will flush the entire nft ruleset
$ sudo nft flush ruleset

Linux 安全標準與實務範例

在前一章中,我們探討了 Linux 防火牆的設定與管理,包括 nftablesiptables 的使用。在本章中,我們將進一步討論 Linux 主機的安全加固,包括雲端環境中的特殊考量、業界常見的安全標準,以及如何使用 SELinux 和 AppArmor 提升系統安全性。

為什麼需要加固 Linux 主機?

Linux 安裝過程設計得盡量簡單,以減少安裝過程中的問題。然而,這也意味著預設設定可能不夠安全。例如,防火牆通常預設為關閉狀態,作業系統和套件版本可能不是最新的。在本章中,我們將討論如何透過各種方法來加固 Linux 主機,包括更新管理、防火牆組態和安全標準的遵循。

大多數 Linux 發行版都啟用了自動更新功能,這由 /etc/apt/apt.conf.d/20auto-upgrades 檔案中的兩行設定控制:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

這些設定預設為啟用(1),第一行控制套件列表的更新,第二行則控制是否啟用自動更新。不過,在大多數管理良好的環境中,管理員會選擇手動或透過指令碼進行更新,以確保更新過程可控。

手動更新流程

對於 Ubuntu 系統,手動更新涉及兩個命令,按順序執行:

sudo apt-get update && sudo apt-get upgrade

&& 運算元確保第二個命令只有在第一個命令成功執行後才會執行。這樣可以避免因更新列表失敗而導致的升級問題。

雲端環境中的安全考量

在雲端環境中建立虛擬機器時,有幾點需要特別注意:

  • 雲端映像檔可能未啟用自動更新,或是映像檔本身已過時,因此建立虛擬機器後需要立即進行更新。
  • 大多數雲端服務的映像檔預設啟用了主機防火牆,但可能設定為限制模式,需要檢查 iptablesnftables 的組態。
  • 許多雲端映像檔預設允許從公網直接進行遠端管理存取(例如 SSH),這需要特別注意並根據需求調整。

內容解密:

  1. 雲端虛擬機器的安全性:雲端虛擬機器和本地主機一樣需要更新和安全管理。
  2. iptablesnftables 的檢查:檢查防火牆組態以確保符合安全需求。
  3. 遠端存取的安全性:檢查 SSH 是否對公網開放,並根據需求進行調整。

常見的業界安全標準

業界有多種安全標準和最佳實踐,例如由 Center for Internet Security (CIS) 制定的關鍵控制措施和基準測試。這些標準提供了加固 Linux 系統的具體。

CIS 關鍵控制措施

CIS 關鍵控制措施提供了一系列優先執行的安全控制措施,幫助組織保護其系統和資料。

CIS 基準測試

CIS 基準測試為各種作業系統和應用程式提供了詳細的安全組態,幫助管理員加固系統。

SELinux 和 AppArmor

SELinux 和 AppArmor 是兩種常見的強制存取控制(MAC)系統,用於增強 Linux 系統的安全性。

SELinux

SELinux 提供了一種細粒度的存取控制機制,可以根據策略限制程式的存取許可權。

AppArmor

AppArmor 透過為每個程式定義安全組態檔案,限制程式可以執行的操作,從而增強系統安全性。

問題與討論

  1. 如何選擇適合的防火牆策略?
  2. 如何在組織內實施統一的安全標準?

參考資料