Linux IPTables:如何新增防火牆規則

華為雲開發者社群發表於2021-09-29
摘要:本文介紹瞭如何使用“iptables -A”命令新增 iptables 防火牆規則。

本文分享自華為雲社群《Linux IPTables:如何新增防火牆規則(使用允許 SSH 示例)》,作者:Tiamo_T 。

本文介紹瞭如何使用“iptables -A”命令新增 iptables 防火牆規則。

“-A”用於追加。如果它讓你更容易記住“-A”作為新增規則(而不是附加規則),那就沒問題了。但是,請記住,“-A”在鏈的末尾新增了規則。

同樣,記住 -A 在末尾新增規則非常重要。

通常,最後一條規則是丟棄所有資料包。如果您已經有一個丟棄所有資料包的規則,並且如果您嘗試在命令列中使用“-A”來建立新規則,您最終會在當前的“丟棄所有資料包”規則之後新增新規則,這將使您的新規則幾乎毫無用處。

一旦您掌握了 iptables,並且當您在生產中實現它時,您應該使用 shell 指令碼,您可以在其中使用 -A 命令新增所有規則。在那個 shell 指令碼中,你的最後一行應該總是“丟棄所有資料包”規則。當您想要新增任何新規則時,請修改該 shell 指令碼並將您的新規則新增到“丟棄所有資料包”規則之上。

句法:

iptables -A chain firewall-rule
• -A 鏈 - 指定應附加規則的鏈。例如,對傳入資料包使用 INPUT 鏈,對傳出資料包使用 OUTPUT。
• firewall-rule – 各種引數構成防火牆規則。

如果您不知道鏈是什麼意思,最好先閱讀iptables 基礎知識。

防火牆規則引數

以下引數可用於所有型別的防火牆規則。

-p 用於協議

• 指示規則的協議。
• 可能的值為 tcp、udp、icmp
• 使用“all”允許所有協議。當您不指定 -p 時,預設情況下將使用“所有”協議。使用“all”並始終指定協議並不是一個好習慣。
• 使用名稱(例如:tcp)或編號(例如:6 表示 tcp)作為協議。
• /etc/protocols 檔案包含所有允許的協議名稱和編號。
• 你也可以使用--protocol

-s 是源

• 指示資料包的來源。
• 這可以是 IP 地址、網路地址或主機名
• 例如:-s 192.168.1.101 表示具體的ip地址
• 對於網路掩碼,使用 /mask。例如:“-s 192.168.1.0/24”表示該網路的網路掩碼為 255.255.255.0。這匹配 192.168.1.x 網路。
• 當您不指定來源時,它將匹配所有來源。
• 您還可以使用 –src 或 –source

-d 是目的地

• 指示資料包的目的地。
• 這與“-s”相同(除了它代表目標主機、IP 地址或網路)
• 您還可以使用 –dst 或 –destination

-j 是目標

• j 代表“跳轉到目標”
• 這指定了匹配此防火牆規則的資料包需要發生什麼。
• 可能的值為 ACCEPT、DROP、QUEUE、RETURN
• 您還可以指定其他使用者定義的鏈作為目標值。

-i 用於介面

• i 代表“輸入介面”
• 您可能會忽略這一點並假設“-i”用於介面。請注意 -i 和 -o 都用於介面。但是,-i 用於輸入介面,-o 用於輸出介面。
• 指示傳入資料包通過 INPUT、FORWARD 和 PREROUTING 鏈進入的介面。
• 例如:-i eth0 表示此規則應考慮通過介面 eth0 傳入的資料包。
• 如果您不指定 -i 選項,則系統上所有可用的介面都將被考慮用於輸入資料包。
• 您也可以使用 –in-interface

-o 用於輸出介面

• o 代表“輸出介面”
• 指示通過 INPUT、FORWARD 和 PREROUTING 鏈傳送傳出資料包的介面。
• 如果您不指定 -o 選項,則系統上所有可用的介面都將被視為輸出資料包。
• 你也可以使用--out-interface

防火牆引數的附加選項

上面的一些防火牆引數依次具有可以與它們一起傳遞的自己的選項。以下是一些最常見的選項。

要使用這些引數選項,您應該在防火牆規則中指定相應的引數。例如,要使用“–sport”選項,您應該在防火牆規則中指定“-p tcp”(或“-p udp”)引數。

注意:所有這些選項前面都有兩個破折號。例如,sport 前面有兩個連字元。

–sport 用於源埠(用於 -p tcp 或 -p udp)

• 預設情況下,所有源埠都匹配。
• 您可以指定埠號或名稱。例如,要在防火牆規則中使用 SSH 埠,請使用“–sport 22”或“–sport ssh”。
• /etc/services 檔案包含所有允許的埠名稱和編號。
• 在規則中使用埠號比使用埠名更好(為了效能)。
• 要匹配埠範圍,請使用冒號。例如,22:100 匹配從 22 到 100 的埠號。
• 您也可以使用 –source-port

–dport 用於目標埠(用於 -p tcp 或 -p udp)

• 一切都與 –sport 相同,除了這是針對目標埠。
• 您也可以使用 –destination-port

–tcp-flags 用於 TCP 標誌(用於 -p tcp)

• 這可以包含以逗號分隔的多個值。
• 可能的值有:SYN、ACK、FIN、RST、URG、PSH。您也可以使用 ALL 或 NONE

–icmp-type 用於 ICMP 型別(用於 -p icmp)

• 當您使用icmp協議“-p icmp”時,您還可以使用“-icmp-type”引數指定ICMP型別。
• 例如:“-icmp-type 0”用於“Echo Reply”,“-icmp-type 8”用於“Echo”。

允許傳入 SSH 連線的示例防火牆規則

現在您瞭解了防火牆規則的各種引數(及其選項),讓我們構建一個示例防火牆規則。

在這個例子中,讓我們只允許傳入的 SSH 連線到伺服器。所有其他連線都將被阻止(包括 ping)。

警告:使用防火牆規則可能會導致您的系統無法訪問。如果您不知道自己在做什麼,您可能會將自己(和其他所有人)鎖定在系統之外。因此,僅在沒有人使用的測試系統上進行所有學習,並且如果您被鎖定,您可以訪問控制檯以重新啟動 iptables。

1. 刪除現有規則

如果您已經有一些 iptables 規則,請在刪除現有規則之前進行備份。

刪除所有現有規則並允許防火牆接受所有內容。使用我們之前討論過的iptables flush清理所有現有規則並從頭開始。

測試以確保您能夠從外部 ssh 和 ping 此伺服器。

完成此示例後,您將只能通過 SSH 連線到此伺服器。您將無法從外部 ping 此伺服器。

2. 只允許 SSH

僅允許與此伺服器的傳入 SSH 連線。您可以從任何地方通過 ssh 連線到此伺服器。

iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT

上面的 iptables 命令有以下 4 個元件。

• “-A INPUT”——這表明我們正在向 INPUT 鏈追加(或新增)一條新規則。因此,此規則適用於傳入流量。
• “-i eth0” – 將根據此規則檢查通過介面 eth0 的傳入資料包。
• “-p tcp –dport 22” – 此規則適用於 TCP 資料包。這有一個名為“-dport 22”的 tcp 選項,它表示伺服器上此規則的目標埠是 22(即 ssh)。
• “-j ACCEPT”——跳轉到接受,它只是接受資料包。

簡單來說,上述規則可以表述為:所有通過 eth0 for ssh 傳入的資料包都將被接受。

3.丟棄所有其他資料包

一旦您指定了接受資料包的自定義規則,您還應該有一個預設規則來丟棄任何其他資料包。

這應該是您在 INPUT 鏈中的最後一條規則。

要丟棄所有傳入的資料包,請執行以下操作。

iptables -A INPUT -j DROP

4.檢視SSH規則和測試

要檢視當前的 iptables 防火牆規則,請使用“iptables -L”命令。

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
DROP       all  --  anywhere             anywhere

從上面的輸出中可以看出,它依次具有以下兩條規則。

• 接受所有傳入的 ssh 連線
• 丟棄所有其他資料包。

與其從命令列新增防火牆規則,不如建立一個包含規則的 shell 指令碼,如下所示。

# vi iptables.sh
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP

# sh -x iptables.sh
+ iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
+ iptables -A INPUT -j DROP

# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
DROP       all  --  anywhere             anywhere

與 iptables append/add 命令類似,iptables 可用的其他命令很少。

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章