您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關怎么構建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 規則包含三個部分:表、鏈和規則。
表是鏈和規則的容器。它們由其地址族和名稱來標識。鏈包含 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-persistentapt-get purge iptables
nft
需要以 root 身份運行或使用 sudo
運行。使用以下命令分別列出、刷新、刪除規則集和加載腳本。
nft list rulesetnft flush rulesetnft delete table inet filter/usr/sbin/nft -f /etc/nftables.conf
就像 iptables 一樣,防火墻將包含三部分:輸入(input
)、轉發(forward
)和輸出(output
)。在終端中,為輸入(input
)策略鍵入以下命令。在開始之前,請確保已刷新規則集。我們的默認策略將會刪除所有內容。我們將在防火墻中使用 inet 地址族。將以下規則以 root 身份添加或使用 sudo
運行:
nft add table inet filternft 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 acceptnft 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\) dropnft add rule inet filter input iifname enpXsY tcp flags \& \(syn\|rst\) == \(syn\|rst\) dropnft add rule inet filter input iifname enpXsY tcp flags \& \(fin\|rst\) == \(fin\|rst\) dropnft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|fin\) == fin dropnft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|psh\) == psh dropnft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|urg\) == urg drop
記住,我們在終端中鍵入這些命令。因此,我們必須在一些特殊字符之前添加一個反斜杠,以確保終端能夠正確解釋該斜杠。如果你使用的是腳本,則不需要這樣做。
互聯網控制消息協議(ICMP)是一種診斷工具,因此不應完全丟棄該流量。完全阻止 ICMP 的任何嘗試都是不明智的,因為它還會導致停止向我們提供錯誤消息。僅啟用最重要的控制消息,例如回聲請求、回聲應答、目的地不可達和超時等消息,并拒絕其余消息。回聲請求和回聲應答是 ping
的一部分。在輸入策略中,我們僅允許回聲應答、而在輸出策略中,我們僅允許回聲請求。
nft add rule inet filter input iifname enpXsY icmp type { echo-reply, destination-unreachable, time-exceeded } limit rate 1/second acceptnft 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 acceptnft add rule inet filter forward ct state invalid dropnft 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 acceptnft add rule inet filter output oifname enpXsY icmp type { echo-request, destination-unreachable, time-exceeded } limit rate 1/second acceptnft add rule inet filter output oifname enpXsY ip protocol icmp dropnft 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
當你記錄丟棄的數據包時,它們直接進入 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 防火墻。
關于“怎么構建nftables”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。