切換菜單
切換偏好設定選單
切換個人選單
尚未登入
若您做出任何編輯,會公開您的 IP 位址。
於 2026年1月24日 (六) 23:16 由 EliToviyah對話 | 貢獻 所做的修訂 (新增防火墙nftables)
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)

什麼是防火牆

網絡中的數據 就像在水管中運行的水 而防火牆是可以監控和控制網絡流量進入流出的一個工具

為什麼使用防火牆

攔截進入系統且具有惡意的網絡請求 防止他們進入系統後利用軟件或內核漏洞獲取伺服器控制權

防火牆的主要功能

  • 流量過濾: 根據IP位址、端口號、協議類型等標識控制網絡流量的進入和流出或轉發等其他行動
  • 日誌記錄: 記錄網絡流量進入和流出或其他的的動作以便審計和分析

常見的詞語

  • ip地址 分為ipv4和ipv6兩種 ipv4 1.1.1.1 ipv6 2606:4700:4700::11·11 用來在網上找到你的電腦手機等
  • 端口號 0-65535 用ip地址+端口號 找到你的電腦或是手機上的 哪個軟件 就像是 手機有軟件瀏覽器 有聊天軟件 IP是一樣的比如 2.2.2.2 如果只用ip 2.2.2.2不知道是瀏覽器還是聊天軟件 所以 用ip地址+端口號來確定 比如ip+端口號是2.2.2.2:50000 瀏覽器是60000 聊天軟件是50000 就知道是聊天軟件的信息了
  • tcp協議 udp協議 流量傳輸的方式….傳輸不同就有不同的處理方式

進入(input)和流出(output)

想像一下 當你用瀏覽器 訪問某個網站時的動作 按下回車或確定的時候 你就相當於 流出 了 一個網絡流量 這個 網絡流量 經過多個節點 最終 進入 了 伺服器

伺服器處理完後把數據返回 就是流出了一個網絡流量這個網絡流量經過多個伺服器最終進入了你的電腦或手機或者vps等

關鍵點來了: 這時候,這股進入的流量對於電腦或者手機或者vps來說,如果不加辨別,它就是一個「外來闖入者」。 如果你的 INPUT 規則是默認拒絕(DROP),防火牆會無情地把這個網絡流量(網頁內容)擋在門外——這就導致了「雖然我發出了請求,但我收不到回復」

請記住這個 後面有一條防火牆規則就是為了解決它的

四種防火牆工具 四選一 本文選擇的是nftables

四種防火牆工具的規則最終都會變成內核Netfilter的規則

近原生引擎

  • nftables: 是目前 Linux 內核官方推薦的新一代數據包過濾框架。它旨在取代舊的 iptables 框架,擁有更高效的虛擬機指令集和更簡潔的代碼結構。
  • iptables (Legacy): 是老牌的內核框架,nftables之前也就是舊版本Linux所使用的。

方便個人用戶和初學者使用的

  • ufw:Ubuntu/Debian 系默認。
  • firewalld:RHEL/CentOS 系默認。

使用防火牆的風險

  • 會把正常進入伺服器的流量關在防火牆外面.比如:自己的ssh流量 或 其他的流量
  • 和docker使用時 使用 清空全部防火牆 的指令 會導致docker的防火牆規則被清除

風險的解決辦法

  • 被關在防火牆外
  • 和docker使用時
    • 不要使用 清空全部防火牆 的指令 應改為 清空某個表 避免docker的防火牆規則被清空
    • 不慎使用 只需要systemctl restart docker 重啟docker就可以讓docker重新把規則寫入防火牆了

使用防火牆前

切換到擁有權限的用戶

如何檢查我是不是 root?

輸入命令whoami如果返回不是root請務必使用sudo

  • 如果你是直接登錄的 root 賬號: 直接輸入命令即可。
  • 如果你使用的是非 root 賬號(如 admin/ubuntu): 請在所有命令前加上 sudo(例如 sudo nft list ruleset),或者先執行 sudo -i 切換到 root 模式。

輸入當前用戶的密碼

提示這個說明用戶沒有權限

你需要切回 Root 賬號,給 [用戶名] (文本是haidao)授權。

步驟如下:

  1. 切回 Root 身份: 輸入:su - (輸入 Root 密碼)
  2. 給 用戶 授權(把 user 加入 sudo 組): 輸入: 如果你是 Debian/Ubuntu 用戶,請執行: usermod -aG sudo [用户名] 如果你是 CentOS/AlmaLinux 用戶,請執行: usermod -aG wheel [用户名]
    • usermod: 修改用戶屬性
    • aG: append to Group (追加到組)
    • sudo 或是 wheel: 組名(Debian系叫 sudo,CentOS系叫 wheel)
    • 用户名: 你的用戶名 就是whoami 輸出的那個
  3. 退出 Root,回到 你自己的用戶名 : 輸入:exit
  4. 再次嘗試: 現在你是 你自己的用戶名 了,再次輸入: sudo nft list ruleset 這次它就會讓你輸密碼,然後成功執行了。

其他的組怎麼查看

grep -E '^(sudo|wheel):' /etc/group
sudo:x:27: #这说明是 sudo
wheel:x:10: #这说明是 wheel
如果輸入sudo -i 顯示 -bash: sudo: command not found

說明系統提示找不到 sudo 命令

你可以使用傳統的 su (Switch User) 命令臨時切換回 Root 身份來操作防火牆 然後下文中就不要在指令中使用sudo 比如sudo nft list ruleset 就要變成 nft list ruleset

  • 輸入命令:su -(注意:su 後面有個空格和減號,這很重要,代表同時切換環境變量)
  • 輸入 Root 密碼(輸入時看不見)。
  • 此時你的提示符會變成 #,代表你又是 Root 了。
  • 直接輸入防火牆命令(不需要加 sudo),例如 nft list ruleset

(可選)切換到root賬戶後 安裝sudo

Debian / Ubuntu / Armbian 系

apt update && apt install sudo -y

Red Hat / AlmaLinux / Rocky / CentOS 系

yum install sudo -y

(註:在較新的 Red Hat 系中也可以用 dnf install sudo -y,效果是一樣的。)

檢查是否安裝了其他的防火牆

多個防火牆可能造成衝突所以要先關閉其他的防火牆..如果你正在使用其他的防火牆..關閉了的話 會導致防火牆規則失效..可能造成連接中斷等問題 中斷無法連接的話請參考上面風險的解決辦法

輸入 sudo systemctl status firewalld ufw iptables nftables

如果顯示 -bash: systemctl: command not found

就是沒有安裝systemctl 可能是因為系統版本老..或者不是用systemctl管理系統服務的..那麼本文可能不適合你..因為防火牆指令可能有略微差距…輸入ufw或者firewalld或者iptables或者nftables看看還會-bash: 你輸入的名字: command not found 這樣麼 這樣就是沒有安裝的意思….


關閉所有防火牆的持久化 如果你正在使用其他的防火牆 關閉可能造成連接中斷 中斷無法連接的話請參考上面風險的解決辦法

  1. Unit ufw.service cloud not be found 沒有安裝ufw的意思
  2. firewalld.service 前面的那個圓圈是灰色的 證明沒有啟動 disabled 不會開機自動啟動
  3. iptables.service 同上
  4. nftables.service 綠色的圓圈正在運行 enabled 開機自動啟動

輸入sudo systemctl stop firewalld ufw iptables nftables 關閉所有的防火牆

輸出這個 沒關係..失敗停止ufw.service 因為它沒安裝 不會影響其他的 如果Failed to stop nftables.service:Unit nftables.service not loaded也這樣的話那就是nftables沒有安裝

如果此時後悔不想弄了.重新啟動就可以了 因為沒有改變它的 開機設定就是 disable和enabled 就是圖片中藍色圓圈的地方 sudo systemctl stop firewalld ufw iptables nftables 這個指令只是暫時關閉了

重新啟動後 它會回到原本的設定(這裏指 防火牆的設定,不包括上面用戶的設定)

如果沒有安裝nftables

Debian / Ubuntu 系統

# 更新软件源 
sudo apt update
#安装 nftables
sudo apt install nftables -y

CentOS / AlmaLinux / Rocky Linux 系統

# CentOS 7 使用 yum 
sudo yum install nftables -y

CentOS 8/9, AlmaLinux, Rocky 使用 dnf (yum 也行)

sudo dnf install nftables -y

檢查是否安裝成功

sudo nft --version

  • 如果顯示類似 nftables v0.9.8 (E.G.O.),說明安裝成功。
  • 如果提示 command not found,請檢查上面的安裝步驟是否報錯

使用nft查看防火牆規則與添加

輸入sudo nft list ruleset 查看全部規則

默認情況下應該沒有內容…如果有的話…..可能是其他防火牆工具帶的…一般情況下防火牆默認規則不會干擾…


先來看一個基礎的防火牆配置

  • table inet filter 定義一個名字叫做filter 管理 ipv4 和ipv6 的 表
    • table 代表它是一個表 表中有很多鏈(chain) 鏈中有很多規則(rule)
    • inet 代表它是ipv4和ipv6的混合表 還有其他可選項 ip 代表ipv4 只管ipv4 ip6代表ipv6 只管ipv6
    • filter 自己給這個表起的名字 可以改成別的
    • 表的類型inet + filter 名字 代表了唯一的表名 不能重複 但是可以ip filter ip6 filter 輸入指令 sudo nft add table inet my_firewall 創建表
    • sudo 高權限
    • nft nftables工具的縮寫
    • add 添加
    • table 表
    • inet 代表 可以同時管理ipv4和ipv6
    • my_firewall 自己起的名字

  • chain input 在表中 定義了 一個 名字叫做input的鏈 可以定義多個鏈 在同一個表中名字不要重複
    • chain 固定寫法 表示 它是一個 鏈
    • input 鏈的名字 可以叫別的比如 my_input
    • 其他的chain allowed_ip chain allowed_mobile和它一樣就不多介紹了
  • type filter hook input priority filter; policy accept; 設定鏈的默認規則等 …一般管理進入的網絡流量都這樣寫 只有寫了的這個chain 的規則才生效 並不是所有的chain都需要寫一條這個 像chain allowed_ip chain allowed_mobile 原本是不生效的 但是因為在chain input裏面有jump allowed_ip jump allowed_mobile 這兩個鏈才生效 jump代表 調用或者跳轉到另外一個chain 所以不用每個chain都寫 寫的了那個就是 檢查進入流量的入口 然後可以在入口(chain)中調用別的入口(chain)
    • type filter 代表這個鏈是過濾的
    • hook input 代表 過濾 的 位置 在input input就是進入流量的門口
    • priority filter 執行的優先級(順序)。filter 在這裏其實代表一個數字(0)。
    • policy accept 默認策略 如果所有規則都走完(從上到下)沒有對應的 默認就是policy後面的 可以是accept[接受] 或者 drop[丟棄] 或別的

輸入指令 sudo nft 'add chain inet my_firewall my_input { type filter hook input priority 0; policy accept; }' 創建my_input鏈的同時添加那條 設定鏈的默認規則等 『』單引號是防止shell轉義問題..


輸入指令 sudo nft add chain inet my_firewall allowed_ip 單獨創建一個鏈


  • iifname "lo" accept comment "Allow loopback traffic”
    • iifname 檢查流量是從哪個網卡進入的
    • lo 它專門用於本機內部通信。也就是大家常說的 127.0.0.1 或者 localhost
    • accept 允許通過防火牆
    • comment 註釋的意思 要自己寫 表示它規則是幹嘛的

輸入 sudo nft 'add rule inet my_firewall my_input iifname "lo" accept comment "Allow loopback traffic"' 創建一條允許系統內部 自己 進入 自己 的流量 比如curl 訪問自己的127.0.0.1服務


  • ct state established,related accept comment "Allow established/related connections” 還記得上面說的關鍵點麼 這時候,這股進入的流量對於電腦或者手機或者vps來說,如果不加辨別,它就是一個「外來闖入者」**。 如果你的 INPUT 規則是默認拒絕(DROP),防火牆會無情地把這個網絡流量(網頁內容)擋在門外——這就導致了「雖然我發出了請求,但我收不到回復」 這個規則就是解決這個問題的 「這條規則的核心作用,就是允許伺服器『主動發起(訪問/流出)』的連接,能夠順利收到『回信』(返回的內容)。」
    • ct (Connection Tracking): 意思是啟用內核的「記性」。防火牆不再是死板地只看 IP,而是會去查閱「記錄本」,看看這個包是不是屬於之前某個流出的那個目標ip。
    • state established: 代表「已建立連接」。即:雙方已經打過招呼了,不是新來的騷擾電話,而是正在進行的通話。
    • state related: 代表「衍生連接」。比如你用 FTP 下載文件,控制命令走一個通道,數據傳輸走另一個通道。雖然數據通道是新的,但它是由控制通道派生出來的,所以也算「自己人」。

輸入 sudo nft 'add rule inet my_firewall my_input ct state established,related accept comment "Allow established/related connections"'

  • ip protocol icmp icmp type echo-request accept comment "Allow IPv4 Ping"只允許ping請求 就是用ping vpsip的那個
    • ip 代表 用ipv4的方式管理
    • protocol icmp 代表他是icmp協議
    • type echo-request icmp協議包含很多類型(比如差錯控制、時間戳等),而 echo-request 專指ping
    • accept 允許
    • comment 註釋 註釋的內容是允許ipv4ping

輸入 sudo nft 'add rule inet my_firewall my_input ip protocol icmp icmp type echo-request accept comment "Allow IPv4 Ping"'

最重要的允許ssh端口

最開始的規則圖片裏面沒有允許ssh端口這個 因為我圖片裏面 用的是白名單模式…

首先 你應該輸入 ss -tlnp | grep sshd

查看ssh端口用的是哪個

然後先將22 換成你的端口號 再輸入 sudo nft 'add rule inet my_firewall my_input tcp dport 22 accept comment "Allow SSH"'

這樣就開放了22端口號

  • sudo 使用高權限
  • nft nftables工具
  • ‘’引號是防止」」被命令行破壞…
  • add 添加
  • rule 代表 添加的是 規則
  • inet my_firewall 表的類型+表的名字 組成 的唯一表 這就意味着可以有ip my_firewall ip6 my_firewall…..
  • my_input 代表 唯一表中的那個鏈
  • tcp 代表進入的網絡流量協議是tcp ssh是tcp 但是你要允許別的伺服器可以把他改成udp之類的
  • dport 代表 要進入我的端口號 還有一個sport是代表 來自的端口號 就是 從它的哪個端口號流出的
  • 22 代表 端口號
  • accept是允許
  • comment是註釋
  • 合起來就是 在inet my_firewall表my_input鏈中 添加一個規則 規則是 允許任何ip(因為沒有做限制,nftables可以做限制)用tcp協議進入我的22端口

這裏沒有設置 來自哪個ip用Tcp訪問我的22端口號 所以其實還是有風險的,因為世界上任何一個ip仍然可以通過知道你的ssh端口然後嘗試..請結合更多的安全方式 例如:修改只允許密鑰登錄ssh SSH KEY LOGIN 或 使用白名單(只允許特定的ip的所有進入流量)

危險操作 把input默認策略修改為drop(丟棄)

type filter hook input priority filter; policy accept 之前說到最後這個policy accept是默認允許 就是所有的規則走完(從上到下的尋找) 沒找到匹配的 就會允許 所以相當於和沒開防火牆一樣(防火牆默認也是全部允許) 現在我們把它改成drop 如果規則錯誤就有失去連接的可能.所以在此之前我們要先做一個保險

請先看完整段在輸入指令 因為60秒後會自動把policy drop 恢復成 accept 允許 就無法驗證了

輸入 (sleep 60 && sudo nft add chain inet my_firewall my_input { policy accept\\; } && echo "救援生效:策略已恢复为 Accept") & disown

出現這樣的數字 你就可以繼續把默認指令修改為drop了

這個意思是 暫停60秒 然後 把默認策略修改為允許

& disown 意思是 放到後台和ssh斷開連接 防止因為防火牆設置錯誤導致的結束此指令


然後輸入 sudo nft add chain inet my_firewall my_input { policy drop\\; }

將默認策略修改為drop

因為這條規則原因 ct state established,related accept comment "Allow established/related connections” 你不會被斷開連接 所以需要手動輸入exit或關閉ssh軟件從而斷開ssh連接 如果順利的話 你應該可以立刻用ssh登錄 如果無法重新連接 等待60秒後再連接

如果成功了的話 你也要等待60秒後..再次輸入 sudo nft add chain inet my_firewall my_input { policy drop\\; } 就可以把默認策略修改為drop也不會把自己關在外面了

好啦 可以去準備好代碼 然後在執行 驗證就可以輕鬆的在60秒內解決

繼續查看規則 我把drop改回accept了…下圖里都是accept

  • ip6 nexthdr ipv6-icmp accept 允許ipv6的icmp協議 如果你有ipv6地址就必須加 沒有ipv6地址可以不加 它影響ipv6很多東西 不知道有沒有ipv6可以加上
    • 使用 sudo nft 'add rule inet my_firewall my_input ip6 nexthdr ipv6-icmp accept comment "Allow IPv6 ICMP"'


  • ip6 saddr fe80::/64 udp sport 547 udp dport 546 accept 也和ipv6相關重要 ipv6必須加 如果不知道有沒有ipv6也可以直接加上
    • ip6 代表防火牆用ipv6的方式去處理這條規則
    • saddr 代表流出的ip地址
    • fe80::/64 ipv6的本地ip就像ipv4的127.0.0.1
    • udp sport 547 udp代表udp協議 sport代表流出的端口號
    • udp dport 546 udp還是代表udp協議 dport代表 要進入的端口號
    • accept 允許
    • 合起來就是允許 來自從fe80::/64(本地)流出使用udp協議端口號是547的網絡流量 進入 我的udp的546端口
    • 使用 sudo nft 'add rule inet my_firewall my_input ip6 saddr fe80::/64 udp sport 547 udp dport 546 accept comment "Allow DHCPv6"'

  • jump allowed_ip意思是 跳轉到其他鏈 本來應該去找默認規則accept或drop了 但是主動讓它跳轉到別的鏈中尋找其他規則 如果在其他鏈中找到就走那個規則 沒找到還是回來找默認的規則accept或drop
    • 既然如此為什麼還要寫多個chain 直接寫一個不就行了?
      • 可以用chain 管理 用於不同目的的規則
      • 可以使用 sudo nft flush chain inet my_firewall allowed_ip 只清空這一個chain 把永遠不會變的且總是被觸發的(防火牆遵循從上到下上面的最好放經常觸發的這樣快) 清空chain 不會清空 默認策略 如果你的默認策略是drop 清空了包含允許ssh端口號的鏈 也就是 sudo nft 'add rule inet my_firewall my_input tcp dport 22 accept comment "Allow SSH"' 這個鏈是my_input 那麼你就失聯了 因為允許進入22端口規則清空了 默認策略又是drop 所以可以考慮不要清空 主要的chain 把永遠不會變的放在那裏
      • 配合 清空鏈 可以做一個白名單機制
    • 使用 sudo nft add rule inet my_firewall my_input jump allowed_ip 添加規則

以下2個 可以不加 要了解指令的意思

  • ip saddr [xxx.xxx.xx.xxx](<http://xxx.xxx.xx.xxx/>) accept 意思是 允許從ipv4地址xxx.xxx.xx.xxx流出 進入我的 流量。 沒有其他限制 這個ip的任何流量都會被允許 不管是tcp還是udp 所有端口(從0到65535) 都會被允許的 只要符合這個條件(網絡流量是從ip xxx.xxx.xx.xx流出進入我的)就允許 反過來如果是 ip saddr xxx.xxx.xx.xxx drop 就是只要是從ip xxx.xxx.xx.xxx流出進入我的 就丟棄(不允許) 當然如果你默認策略是policy accept 這條規則沒有找到 往下走繼續找 找完所有規則都沒找到就會走默認的accept允許了…
    • ipipv4協議 表示 防火牆用ipv4的方式去處理這條規則
    • saddr xxx.xxx.xx.xxx 從xxx.xxx.xx.xxx流出
    • accept 允許
    • 使用 sudo nft add rule inet my_firewall allowed_ip ip saddr 1.1.1.1 accept 可選(允許1.1.1.1)的流量..理論上這裏應該替換成你自己的ipv4


  • ip6 saddr xxxx:xxxx:xxxx:xxxx::/128 accept 允許從ipv6地址 xxxx:xxxx:xxxx:xxxx::/128 流出 進入我的流量
    • ip6 ipv6協議 表示讓防火牆用ipv6的方式去處理這條規則
    • saddr xxxx:xxxx:xxxx:xxxx::/128xxxx:xxxx:xxxx:xxxx::/128 流出
      • /64和/128的區別
        • /128:代表只放行一台設備
        • /64:代表放行整個子網。相當於 64長度的ip一樣就可以 一般你要是想讓連接家庭路由器的所有設備都允許 選這個
    • accept 允許
    • 使用 sudo nft add rule inet my_firewall allowed_ip ip6 saddr 2606:4700:4700::1111/128 accept 可選(允許2606:4700:4700::1111/128)的流量..理論上這裏應該替換成你自己的ipv6

另外查看防火牆規則的指令

sudo nft list table inet my_firewall 查看表my_firewall

從nft list ruleset(全部) 把ruleset改成 table 表示查看表 後面inet my_firewall 是看哪個表


sudo nft list chain inet my_firewall my_input 查看指定的鏈 不顯示其他的鏈 在inet my_firewall中的my_input鏈

把table又變成了chain 表示查看 鏈 inet my_firewall 要先告訴它 這個鏈 在那個表中 最後在告訴它 鏈的名字

sudo nft list chain inet my_firewall allowed_ip

同上 這次看allowed_ip

關於註釋

  • sudo nft 'add rule inet my_firewall my_input tcp dport 22 accept comment "Allow SSH"' sudo nft add rule inet my_firewall my_input tcp dport 22 accept
    • nft(工具) add(添加的動作) rule(代表是添加規則) inet my_firewall(添加到表的唯一名) my_input(inet my_firewall表中的鏈) tcp(協議名) dport(進入我的哪個端口號) 22(端口號) accept(允許)
      • 順序是這樣的,可以從中添加別的指令進行組合 比如 sudo nft add rule inet my_firewall my_input ip saddr 1.1.1.1 tcp dport 22 accept 增加了ip saddr 1.1.1.1 那麼在原始的基礎上限制了 只有從1.1.1.1流出的網絡流量並且是tcp協議進入我的22端口 才允許 如果是相反的 ip saddr 1.1.1.1 tcp dport 22 drop 那麼就是只有 從1.1.1.1流出的進入我的22端口的就丟棄(不允許) 如果它是要進入我的23 因為這條規則不是23 就會往下找 找完所有沒有23的 就要看默認策略(policy accpet) 如果是accept就會允許 drop就不允許
    • 第一條需要單引號是因為雙引號 在命令行執行可能會破壞結構..所以用單引號括起來,如果你不需要註釋 你可以像第二條那樣 去掉comment之後的 也可以去掉單引號了

刪除規則

如果最後兩條ip不是自己的ip或者錯誤的允許了別的ip 我現在不想允許它了怎麼辦呢

先輸入

sudo nft -a list ruleset

可以看到加上-a後 每個後面都多出來 # handle 數字 我們需要得到這個數字才能刪除

然後輸入

sudo nft delete rule inet my_firewall allowed_ip handle 11

delete 刪除的意思 rule 規則 inet my_firewall 表的唯一名 allowed_ip 鏈的名 handle 11 handle固定寫法.. 11就是那條規則的id

修改規則

你可以先刪除 再添加對吧…..

還是像刪除那樣 獲取handle id 輸入 sudo nft -a list ruleset

sudo nft replace rule inet my_firewall allowed_ip handle 12 ip6 saddr 2606:4700:4700::1001 accept

replace 替換 rule 規則 inet my_firewall 表的名字 allowed_ip 表中鏈的名字 handle 12 規則的id 後面就是新的規則

把當前的防火牆規則保存到文件中

現在可以輸入 sudo nft list ruleset 查看一下應該就不是空的了

在沒有設置的情況下 每次重啟都會丟失這些規則

我們先把防火牆規則保存到一個文件 每次重啟的時候讓防火牆 自動讀取 加載 這個文件 就可以了

輸出 sudo nft list ruleset > backup.nft 導出到當前文件夾下 輸入 ls 查看導出的文件

輸入 cat backup.nft 查看文件內容

可以看到文件中是不包含sudo nft add rule inet my_firewall之類的

你可以直接這裏面填寫 ..我想你應該明白指令都是啥意思了吧…..如果你要直接修改的話最好先備份一下 執行

sudo cp backup.nft backup.nft_bak

然後你就可以在這裏面修改了輸入

nano backup.nft

用方向鍵 移動光標

如果你輸入nano backup.nft提示 -bash: nano: command not found

說明你沒有安裝nano.. nano 是一個文本編輯器 以下命令安裝nano

Debian / Ubuntu / Armbian 系

sudo apt update && sudo apt install nano -y

Red Hat / AlmaLinux / Rocky / CentOS 8+ 系

sudo dnf install nano -y


ctrl+o 保存


這裏是問你保存的文件名 直接保存到原文件就直接回車就行

ctrl+x 退出

從文件中讀取規則

先輸入 sudo nft -c -f backup.nft

正常情況下什麼都不會發生

如果有錯誤的話

就會這樣了 他會指出你哪裏有錯誤

backup.nft:16:1-1: Error:syntax error, unexpected end of file

我的這個錯誤的意思是

backup.nft有錯誤 錯誤從第16行的第一個字符開始到第一個字符結束 錯誤:語法錯誤,意外的文件結束」。 前面的16:1-1是錯誤坐標

就是我的文件最後少了一個右括號 } 每個括號都是一對{} 成對出現的


backup.nft:6:3-7:Error:syntax error, unexpected dport

「語法錯誤,這裏不該出現 dport 這個詞」

這個就是缺少了一個指令 tcp

tcp的順序不對..你可以看到這兩個 錯誤信息是一樣的都是

backup.nft:6:3-7: Error: syntax error, unexpected dport 原因類似 具體不同

這個就是tcp應該在前面 tcp dport 22 accept comment 「Allow SSH」

一般都是 指令的順序或者是缺少指令或者是多了指令或者是拼寫錯誤


檢測無誤後 什麼事情也沒有發生 什麼也沒有輸出

清空規則集 sudo nft flush ruleset 清空規則集 不會像清空鏈引發默認drop擋在防火牆外的

然後執行 sudo nft -f backup.nft

防火牆規則就回來了

編輯防火牆規則文件

比如說你有另外一個防火牆規則完整的片段從table開始的

define INGRESS_INTERFACE="eth0"
define PORT_RANGE=20000-45000
define PORT=8663
table inet portopping{
  chain prerouting {
    type nat hook prerouting priority dstnat; policy accept;
    iifname $INGRESS_INTERFACE udp dport $PORT_RANGE counter redirect to :$PORT
  }
}

你可以直接複製到backup.nft末尾

當然你也可以對 表的類型 inet 表的名字my_firewall 和表中 鏈的名字 my_input進行修改 修改好後

ctrl+o 保存 然後回車就是直接保存到原文件上

然後先測試sudo nft -c -f backup.nft 沒問題就清空 sudo nft flush ruleset

讀取 sudo nft -f backup.nft

查看 sudo nft list ruleset


配置開機自動啟動

  1. 備份原文件(給自己留條後路): sudo cp /etc/nftables.conf /etc/nftables.conf.bak
  2. 將當前規則寫入系統配置:
    • 由於權限問題,直接用 sudo ... > ... 可能會報權限不足,建議用下面這句「萬能命令」: sudo sh -c "nft list ruleset > /etc/nftables.conf" 這個是把當前防火牆的規則寫入默認的配置文件中 每次開機自動啟動用的就是當前防火牆的規則. 執行一次sudo nft flush ruleset 以後就不需要了 不然規則會重複的 規則重複 因為你的防火牆有規則 在運行sudo systemctl start nftables它又去讀取了一邊 所有規則重複了..可以在sudo systemctl start nftables


3.啟用開機自啟(如果還沒開的話):

開啟開機自啟

sudo systemctl enable nftables

立刻啟動nftables服務(執行的內容就是立刻加載/etc/nftables.conf 文件中的防火牆規則)

sudo systemctl start nftables

恭喜...走完這寫你已經有了一個基礎的防火牆了…

如果還需要進階 可以參考 使用搬瓦工api操作nftables實現更新白名單ip 實現後就可以關閉ssh端口了