過渡到 nftables
開源世界中的每個主要發行版都在演進,逐漸將 nftables 作為了預設防火牆。換言之,古老的 iptables 現在已經消亡。本文是有關如何構建 nftables 的教程。
當前,有一個與 nftables 相容的 iptables-nft 後端,但是很快,即使是它也不再提供了。另外,正如 Red Hat 開發人員所指出的那樣,有時它可能會錯誤地轉換規則。我們需要知道如何構建自己的 nftables,而不是依賴於 iptables 到 nftables 的轉換器。
在 nftables 中,所有地址族都遵循一個規則。與 iptables 不同,nftables 在使用者空間中執行,iptables 中的每個模組都執行在核心(空間)中。它很少需要更新核心,並帶有一些新功能,例如對映、地址族和字典。
地址族
地址族確定要處理的資料包的型別。在 nftables 中有六個地址族,它們是:
- ip
- ipv6
- inet
- arp
- bridge
- netdev
在 nftables 中,ipv4 和 ipv6 協議可以被合併為一個稱為 inet 的單一地址族。因此,我們不需要指定兩個規則:一個用於 ipv4,另一個用於 ipv6。如果未指定地址族,它將預設為 ip 協議,即 ipv4。我們感興趣的領域是 inet 地址族,因為大多數家庭使用者將使用 ipv4 或 ipv6 協議。
nftables
典型的 nftables 規則包含三個部分:表、鏈和規則。
表是鏈和規則的容器。它們由其地址族和名稱來標識。鏈包含 inet/arp/bridge/netdev 等協議所需的規則,並具有三種型別:過濾器、NAT 和路由。nftables 規則可以從指令碼載入,也可以在終端鍵入,然後另存為規則集。
對於家庭使用者,預設鏈為過濾器。inet 系列包含以下鉤子:
- Input
- Output
- Forward
- Pre-routing
- Post-routing
使用指令碼還是不用?
最大的問題之一是我們是否可以使用防火牆指令碼。答案是:這是你自己的選擇。這裡有一些建議:如果防火牆中有數百條規則,那麼最好使用指令碼,但是如果你是典型的家庭使用者,則可以在終端中鍵入命令,然後(儲存並在重啟時)載入規則集。每種選擇都有其自身的優缺點。在本文中,我們將在終端中鍵入它們以構建防火牆。
nftables 使用一個名為 nft
的程式來新增、建立、列出、刪除和載入規則。確保使用以下命令將 nftables 與 conntrackd 和 netfilter-persistent 軟體包一起安裝,並刪除 iptables:
apt-get install nftables conntrackd netfilter-persistent
apt-get purge iptables
nft
需要以 root 身份執行或使用 sudo
執行。使用以下命令分別列出、重新整理、刪除規則集和載入指令碼。
nft list ruleset
nft flush ruleset
nft delete table inet filter
/usr/sbin/nft -f /etc/nftables.conf
輸入策略
就像 iptables 一樣,防火牆將包含三部分:輸入(input
)、轉發(forward
)和輸出(output
)。在終端中,為輸入(input
)策略鍵入以下命令。在開始之前,請確保已重新整理規則集。我們的預設策略將會刪除所有內容。我們將在防火牆中使用 inet 地址族。將以下規則以 root 身份新增或使用 sudo
執行:
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; counter \; policy drop \; }
你會注意到有一個名為 priority 0
的東西。這意味著賦予該規則更高的優先順序。掛鉤通常賦予負整數,這意味著更高的優先順序。每個掛鉤都有自己的優先順序,過濾器鏈的優先順序為 0。你可以檢查 nftables Wiki 頁面以檢視每個掛鉤的優先順序。
要了解你計算機中的網路介面,請執行以下命令:
ip link show
它將顯示已安裝的網路介面,一個是本地主機、另一個是乙太網埠或無線埠。乙太網埠的名稱如下所示:enpXsY
,其中 X
和 Y
是數字,無線埠也是如此。我們必須允許本地主機的流量,並且僅允許從網際網路建立的傳入連線。
nftables 具有一項稱為裁決語句的功能,用於解析規則。裁決語句為 accept
、drop
、queue
、jump
、goto
、continue
和 return
。由於這是一個很簡單的防火牆,因此我們將使用 accept
或 drop
處理資料包。
nft add rule inet filter input iifname lo accept
nft add rule inet filter input iifname enpXsY ct state new, established, related accept
接下來,我們必須新增規則以保護我們免受隱秘掃描。並非所有的隱秘掃描都是惡意的,但大多數都是。我們必須保護網路免受此類掃描。第一組規則列出了要測試的 TCP 標誌。在這些標誌中,第二組列出了要與第一組匹配的標誌。
nft add rule inet filter input iifname enpXsY tcp flags \& \(syn\|fin\) == \(syn\|fin\) drop
nft add rule inet filter input iifname enpXsY tcp flags \& \(syn\|rst\) == \(syn\|rst\) drop
nft add rule inet filter input iifname enpXsY tcp flags \& \(fin\|rst\) == \(fin\|rst\) drop
nft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|fin\) == fin drop
nft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|psh\) == psh drop
nft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|urg\) == urg drop
記住,我們在終端中鍵入這些命令。因此,我們必須在一些特殊字元之前新增一個反斜槓,以確保終端能夠正確解釋該斜槓。如果你使用的是指令碼,則不需要這樣做。
關於 ICMP 的警告
網際網路控制訊息協議(ICMP)是一種診斷工具,因此不應完全丟棄該流量。完全阻止 ICMP 的任何嘗試都是不明智的,因為它還會導致停止向我們提供錯誤訊息。僅啟用最重要的控制訊息,例如回聲請求、回聲應答、目的地不可達和超時等訊息,並拒絕其餘訊息。回聲請求和回聲應答是 ping
的一部分。在輸入策略中,我們僅允許回聲應答、而在輸出策略中,我們僅允許回聲請求。
nft add rule inet filter input iifname enpXsY icmp type { echo-reply, destination-unreachable, time-exceeded } limit rate 1/second accept
nft add rule inet filter input iifname enpXsY ip protocol icmp drop
最後,我們記錄並丟棄所有無效資料包。
nft add rule inet filter input iifname enpXsY ct state invalid log flags all level info prefix \”Invalid-Input: \”
nft add rule inet filter input iifname enpXsY ct state invalid drop
轉發和輸出策略
在轉發和輸出策略中,預設情況下我們將丟棄資料包,僅接受已建立連線的資料包。
nft add chain inet filter forward { type filter hook forward priority 0 \; counter \; policy drop \; }
nft add rule inet filter forward ct state established, related accept
nft add rule inet filter forward ct state invalid drop
nft add chain inet filter output { type filter hook output priority 0 \; counter \; policy drop \; }
典型的桌面使用者只需要埠 80 和 443 即可訪問網際網路。最後,允許可接受的 ICMP 協議並在記錄無效資料包時丟棄它們。
nft add rule inet filter output oifname enpXsY tcp dport { 80, 443 } ct state established accept
nft add rule inet filter output oifname enpXsY icmp type { echo-request, destination-unreachable, time-exceeded } limit rate 1/second accept
nft add rule inet filter output oifname enpXsY ip protocol icmp drop
nft add rule inet filter output oifname enpXsY ct state invalid log flags all level info prefix \”Invalid-Output: \”
nft add rule inet filter output oifname enpXsY ct state invalid drop
現在我們必須儲存我們的規則集,否則重新啟動時它將丟失。為此,請執行以下命令:
sudo nft list ruleset. > /etc/nftables.conf
我們須在引導時載入 nftables,以下將在 systemd 中啟用 nftables 服務:
sudo systemctl enable nftables
接下來,編輯 nftables 單元檔案以刪除 Execstop
選項,以避免在每次引導時重新整理規則集。該檔案通常位於 /etc/systemd/system/sysinit.target.wants/nftables.service
。現在重新啟動nftables:
sudo systemctl restart nftables
在 rsyslog 中記錄日誌
當你記錄丟棄的資料包時,它們直接進入 syslog,這使得讀取該日誌檔案非常困難。最好將防火牆日誌重定向到單獨的檔案。在 /var/log
目錄中建立一個名為 nftables
的目錄,並在其中建立兩個名為 input.log
和 output.log
的檔案,分別儲存輸入和輸出日誌。確保系統中已安裝 rsyslog。現在轉到 /etc/rsyslog.d
並建立一個名為 nftables.conf
的檔案,其內容如下:
:msg,regex,”Invalid-Input: “ -/var/log/nftables/Input.log
:msg,regex,”Invalid-Output: “ -/var/log/nftables/Output.log & stop
現在,我們必須確保日誌是可管理的。為此,使用以下程式碼在 /etc/logrotate.d
中建立另一個名為 nftables
的檔案:
/var/log/nftables/* { rotate 5 daily maxsize 50M missingok notifempty delaycompress compress postrotate invoke-rc.d rsyslog rotate > /dev/null endscript }
重新啟動 nftables。現在,你可以檢查你的規則集。如果你覺得在終端中鍵入每個命令很麻煩,則可以使用指令碼來載入 nftables 防火牆。我希望本文對保護你的系統有用。
via: https://opensourceforu.com/2019/10/transition-to-nftables/
作者:Vijay Marcel D 選題:lujun9972 譯者:wxy 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
相關文章
- 從數字化過渡到智慧製造
- 如何優雅絲滑地從Date過渡到LocalDateTimeLDA
- 前端SPA正過渡到MPA多頁應用 - nolanlawson前端
- 從 React Router v5 過渡到 v6React
- 小白觀察:Let's Encrpt 正過渡到 ISRG Root
- 如何成功地過渡到低程式碼平臺?
- firewalld: 背後的原理(nftables)
- 如何將企業資料無縫過渡到雲端
- 單頁面官網-平滑過渡到指的錨點
- tep使用者手冊幫你從unittest過渡到pytest
- 去中心化計算的未來:通過 RPC 從微服務過渡到 WASM中心化RPC微服務ASM
- Nftables漏洞原理分析(CVE-2022-32250)
- 傳統微服務框架如何無縫過渡到服務網格 ASM微服務框架ASM
- 分散式機器學習:如何快速從Python棧過渡到Scala棧分散式機器學習Python
- B3i從區塊鏈聯盟過渡到成熟的公司區塊鏈
- Coinbase如何根據第一性原則從原生App過渡到React Native?APPReact Native
- 【建議收藏】11+實戰技巧,讓你輕鬆從Vue過渡到ReactVueReact
- REHL8.1上配置路由的nftables防火牆策略路由防火牆
- 怎麼從初、中級Java程式設計師過渡到高階Java程式設計師?Java程式設計師
- 法院批准將比特幣洗錢案嫌疑人引渡到法國比特幣
- lst過過過
- js繞過-前端加密繞過JS前端加密
- Vue實列之過渡和動畫,標籤過渡,多元件過渡,列表過渡Vue動畫元件
- JavaMap通過key或者value過濾Java
- 12月看過/聽過的書
- 過濾
- 過去
- 瞭解過、使用過的程式語言及其優勢,瞭解過、使用過的程式設計工具程式設計
- 動詞過去式過去分詞分詞
- 牢獄之災已過,度過大劫
- 過載的奧義之函式過載函式
- Raft協議:通過TermId大的通過Raft協議
- 透過 OKR 進行專案過程管理OKR
- 過濾器過濾器
- filter過濾Filter
- 過濾FilteringFilter
- 今天過節
- javaScript過載JavaScript