Iptables 是大多數 Linux 發行版預設隨附的主要防火牆。它負責處理網路安全。它的工作原理是將資料封包與一組規則進行比對,並根據規則指示系統接受、拒絕或轉發連線。在本教學中,我們將向您展示如何列出和刪除規則、檢查和清除封包與位元組計數器,以及清除鏈。準備好了嗎?讓我們開始吧!
先決條件
在開始本教學之前,讓我們明確一些事情。本指南中演示的所有技巧和竅門都是在獨立的虛擬機器上進行的。建議您也這樣做,因為這可以消除將您的系統搞得一團糟的任何可能性。只有在您掌握了這些過程之後,才應該嘗試在實際情況中應用它們。
在本教學中,我們將使用 Ubuntu 來演示所有步驟。然而,無論使用哪種發行版,它們的操作方式都應該類似。
列出規則
按規格列出規則
首先,讓我們按規格檢查所有作用中的規則。執行以下命令:
|
1 |
sudo iptables -S |

如果您以前曾使用過 iptables 規則建立,您可能已經注意到其相似之處。除了「iptables」部分之外,輸出結果與用於建立它們的命令非常相似。它們也與 iptables 規則設定檔具有相似的結構。
列出特定鏈
讓我們嘗試一些更精確的操作。與其報告所有的 iptables 規則,不如讓 iptables 報告特定鏈的規則。例如:TCP、INPUT、OUTPUT 等。為此,請在「-S」旗標後指定鏈名稱:
|
1 |
sudo iptables -S <chain> |

以表格形式列出規則
在比較不同的規則時,表格檢視非常有用。使用「-L」旗標來指示 iptables 以表格格式報告所有作用中的規則:
|
1 |
sudo iptables -L |

輸出包含按鏈排序的所有目前規則。與上一節類似,也可以按特定鏈(如 INPUT、TCP 和 OUTPUT 等)過濾列表輸出。為此,請在「-L」旗標後指定鏈:
|
1 |
sudo iptables -L <chain> |

讓我們稍微解析一下輸出。在我們的情況下,由於規則的關係,輸出會顯得有點混亂。輸出的第一行宣告了鏈名稱 (INPUT) 及其預設策略 (DROP)。下一行指定了表格欄位的標頭。其餘的是該鏈的規則。讓我們來看看這些標頭表示什麼:
- target:如果封包與規則相符,此部分定義應執行的動作。它可以是接受封包、捨棄、記錄或將其傳送到另一個鏈。
- prot:定義協定,例如 udp、tcp、icmp 或 all。
- opt:此欄位表示 IP 選項。極少使用。
- source:封包的來源(IP 位址或子網路)。值可以是特定的或 anywhere(任何地方)。
- destination:封包的目的地(IP 位址或子網路)。值可以是特定的或 anywhere(任何地方)。
如果您注意到的話,最後一欄沒有標籤。這是因為它用於表示規則的選項。它將包含規則中不適合前述欄位的所有部分。它可能包含從來源/目的地連接埠到封包連線狀態等任何內容。
封包計數和累計大小
清除封包和位元組計數器
當我們列出 iptables 規則時,我們還可以檢查與每個特定規則相符的封包數量以及封包的累計大小(以位元組為單位)。當您需要大致了解哪些規則正在與封包進行比對時,這是一個非常有用的指標。
在此範例中,我們將使用 INPUT 鏈。這一次,加入代表詳細模式(verbose mode)的「-v」旗標:
|
1 |
sudo iptables -L INPUT -v |

您會注意到表格輸出現在包含兩個額外的欄位:pkts 和 bytes。
重設封包計數和累計大小
在某些情況下,您可能希望重設我們之前示範的計數器。如果系統重新啟動,計數器將會自動清除。您也可以手動強制重設。我們將使用「-Z」旗標來重設封包計數和累計大小:
|
1 |
sudo iptables -v -Z |

請注意,此命令將重設所有鏈的計數器。與其他命令一樣,也可以重設特定鏈的計數器。例如,下一個命令將重設 INPUT 鏈的計數器:
|
1 |
sudo iptables -v -Z <chain> |

您可以讓計數器重設動作更加精確。您可以重設特定鏈下特定規則的計數器。若要這樣做,請在鏈名稱後加上規則編號:
|
1 |
sudo iptables -v -Z <chain> <rule_number> |
刪除規則
依規格刪除規則
刪除 iptables 規則有幾種方法。第一種刪除規則的方法是透過規則規格。若要刪除,我們將使用「-D」旗標,後跟規則規格:
|
1 |
sudo iptables -v -D INPUT -s 172.217.194.113 -j DROP |

如果您之前新增過任何 iptables 規則,您會注意到其相似之處。這裡唯一改變的是使用「-D」旗標而不是「-A」旗標。
依鏈和編號刪除規則
依規格刪除規則需要多花一點功夫,對吧?如果我們不需要記住規則規格就能刪除它們呢?讓我們依鏈和編號來刪除規則吧!與第一種方法(依規格刪除)相比,這種方法相對容易,因為您不需要手頭上有完整的規格。
此方法需要目標規則的鏈和行號。我們從哪裡取得行號?執行以下命令來確定:
|
1 |
sudo iptables -L --line-numbers |

您將會看到包含所有規則及其行號的大量輸出。若要縮小輸出範圍,請在「-L」旗標後使用鏈名稱:
|
1 |
sudo iptables -L <chain> --line-numbers |

在輸出中,您會注意到多了一個名為 num 的欄位。它表示每個規則的行號。一旦我們確定了目標編號,即可執行刪除:
|
1 |
sudo iptables -v -D <chain> <line_number> |
清除鏈
在 iptables 的情況下,什麼是清除鏈?這是刪除某個鏈下所有規則的過程。如果您需要大量刪除規則,則可以使用此方法。在執行鏈清除之前,我們強烈建議您使用 iptables-save 備份現有規則。這是一個內建的 iptables 工具,會輸出所有目前的鏈和規則。輸出可以匯出到文字檔案:
|
1 |
sudo iptables-save > ~/Desktop/iptables-backup.txt |
![]()
清除單一鏈
讓我們來看看如何清除鏈。使用「-F」旗標,後跟目標鏈:
|
1 |
sudo iptables -v -F <chain> |

清除所有鏈
在清除所有鏈之前,請確保您了解自己在做什麼。這將會刪除 iptables 防火牆的所有規則。您應該確保事先建立 iptables 規則備份。
準備好了嗎?執行以下命令來清除所有 iptables 鏈:
|
1 |
sudo iptables -v -F |

清除規則、刪除鏈並接受所有連線
執行本節中說明的步驟將有效停用防火牆,允許不受限制的網路流量。與前一節類似,我們建議在繼續之前先備份 iptables。首先,我們將把每個內建鏈的預設策略變更為 ACCEPT。這是為了確保 iptables 不會透過 SSH 將您鎖在伺服器之外:
|
1 |
sudo iptables -v -P INPUT ACCEPT && sudo iptables -v -P FORWARD ACCEPT && sudo iptables -v -P OUTPUT ACCEPT |

現在,清除 nat 和 mangle 表:
|
1 2 |
sudo iptables -v -t nat -F sudo iptables -v -t mangle -F |


清除所有鏈並刪除所有非預設鏈:
|
1 2 |
sudo iptables -v -F sudo iptables -v -X |


接下來,讓我們查看結果:
|
1 |
sudo iptables -L --line-numbers |
結語
Iptables 是一款功能強大的防火牆。希望本指南對您有所幫助,讓您學會如何列出和刪除 iptables 防火牆規則。在將它們應用於實際環境之前,請不要忘記進行練習。
祝您使用愉快!



留言
目前尚無留言。成為第一個留言的人吧。