開源世界中的每一個主要發行版都在演進,逐漸將 nftables 做爲了默認防火牆。換言之,古老的 iptables 如今已經消亡。本文是有關如何構建 nftables 的教程。linux
當前,有一個與 nftables 兼容的 iptables-nft 後端,可是很快,即便是它也再也不提供了。另外,正如 Red Hat 開發人員所指出的那樣,有時它可能會錯誤地轉換規則。咱們須要知道如何構建本身的 nftables,而不是依賴於 iptables 到 nftables 的轉換器。git
在 nftables 中,全部地址族都遵循一個規則。與 iptables 不一樣,nftables 在用戶空間中運行,iptables 中的每一個模塊都運行在內核(空間)中。它不多須要更新內核,並帶有一些新功能,例如映射、地址族和字典。github
地址族肯定要處理的數據包的類型。在 nftables 中有六個地址族,它們是:後端
在 nftables 中,ipv4 和 ipv6 協議能夠被合併爲一個稱爲 inet 的單一地址族。所以,咱們不須要指定兩個規則:一個用於 ipv4,另外一個用於 ipv6。若是未指定地址族,它將默認爲 ip 協議,即 ipv4。咱們感興趣的領域是 inet 地址族,由於大多數家庭用戶將使用 ipv4 或 ipv6 協議。bash
典型的 nftables 規則包含三個部分:表、鏈和規則。網絡
表是鏈和規則的容器。它們由其地址族和名稱來標識。鏈包含 inet/arp/bridge/netdev 等協議所需的規則,並具備三種類型:過濾器、NAT 和路由。nftables 規則能夠從腳本加載,也能夠在終端鍵入,而後另存爲規則集。tcp
對於家庭用戶,默認鏈爲過濾器。inet 系列包含如下鉤子:工具
最大的問題之一是咱們是否可使用防火牆腳本。答案是:這是你本身的選擇。這裏有一些建議:若是防火牆中有數百條規則,那麼最好使用腳本,可是若是你是典型的家庭用戶,則能夠在終端中鍵入命令,而後(保存並在重啓時)加載規則集。每種選擇都有其自身的優缺點。在本文中,咱們將在終端中鍵入它們以構建防火牆。post
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 的任未嘗試都是不明智的,由於它還會致使中止向咱們提供錯誤消息。僅啓用最重要的控制消息,例如回聲請求、回聲應答、目的地不可達和超時等消息,並拒絕其他消息。回聲請求和回聲應答是 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
複製代碼
當你記錄丟棄的數據包時,它們直接進入 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: opensourceforu.com/2019/10/tra…
做者:Vijay Marcel D 選題:lujun9972 譯者:wxy 校對:wxy