簡介
Iptables 是一個命令列 防火牆 公用程式。這意味著它是一款允許您在系統上設定防火牆的軟體。它通常預設安裝在 Linux 系統上。在本指南中,我們將 討論一些與 iptables 防火牆搭配使用的常見規則和指令。每當有連線嘗試與您的系統建立時,防火牆都會參考這些規則來決定下一步應該採取什麼行動。
Iptables 指令
本指南將介紹一些最基本的 iptables 指令。要遵循本指南,您需要對什麼是 iptables 及其運作方式有基本的了解。這將有助於您更好地掌握使用以下指令所實施的規則。請記住,下面給出的任何指令都可以單獨使用。另一方面,您也可以混合搭配它們以滿足您的特定需求。
注意事項
在您繼續閱讀之前,請記住以下幾點:
- iptables 中規則的順序非常重要。
- 要在鏈的末尾附加新規則,您的
iptables指令必須使用-A。 - 如果您想在其他位置附加規則,則必須使用
-I選項。此選項使您能夠指定規則的確切位置。如果您想將規則放在鏈的開頭,只需不提供規則編號即可。 - 為了確保您能持續存取伺服器,請預設封鎖連接埠 22 上的 SSH 流量。
- 如果您未能這樣做並失去對伺服器的存取權限,您可以使用主控台重新連線。允許 SSH 流量以變更防火牆設定。
- 如果您想查看目前生效的規則集,請使用指令
sudo iptables -S 和 sudo iptables -L。
此外,我們有一份 關於如何列出和刪除 iptables 防火牆規則的詳細指南, 這將進一步幫助您充分利用您的 iptables 防火牆。
現在我們已經完成了準備工作,讓我們深入了解一些 常見的 iptables 指令:
如何儲存您的規則
我們將首先確定如何儲存您的規則。請務必注意,iptables 規則是暫時的。這意味著除非您儲存它們,否則它們將在您重新啟動系統後遺失。以下是您分別在 Ubuntu 和 CentOS 伺服器上手動儲存新規則的方法:
-
Ubuntu
在 Ubuntu 伺服器上儲存新規則最簡單的方法是使用 iptables-persistent 套件。您可以輕鬆地 按照本教學建立 Ubuntu 伺服器。
現在,儲存新 iptables 規則的第一步是使用 apt-get 安裝 iptables-persistent 套件。以下是獲取它的方法:
|
1 |
sudo apt-get install iptables-persistent |

在安裝過程中,您需要決定是否要儲存目前生效的防火牆規則。若要改為更新規則並儲存變更,請使用以下指令:
|
1 |
sudo netfilter-persistent save |

上述指令通常適用於 16.04 之後的 Ubuntu 版本。如果您使用的是較早的版本,請改用以下指令:
|
1 |
sudo invoke-rc.d iptables-persistent save |
-
CentOS
您可以在 CentOS 6 或更舊的版本上使用 iptables 設定防火牆。CentOS 7 則改用 FirewallD。請遵循此 教學以了解如何在 CentOS 7 上設定 FirewallD.
您可以使用 iptables 初始化指令碼在 CentOS 上儲存新規則。請參閱以下指令:
|
1 |
sudo service iptables save |
此指令將儲存您的 iptables 防火牆新規則。目前作用中的 iptables 規則可以在 /etc/sysconfig/iptables 檔案中。
實用的 Iptables 指令
現在,讓我們繼續介紹一些您可能需要在伺服器上使用的非常實用的 iptables 防火牆指令。
-
環迴連線
首先,我們將探討如何允許環迴連線。您的系統使用環迴介面來向自身傳送連線。例如,假設您執行了以下指令:ping localhost 或 ping 127.0.0.1。您的伺服器將使用環回介面,或 lo,本質上是 ping 自身。其他時候,如果您的應用程式伺服器配置為連接到「localhost」位址,伺服器也可能會使用它。
無論情況如何,您都需要確保您的 iptables 防火牆不會阻擋這些連線。因此,您必須允許環回連線以使這些功能得以運作。
以下是您要執行以允許所有進入環回介面之流量的指令:
|
1 2 |
sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT |

-
已建立和相關的傳入連線
另一種您可能需要允許的連線類型是傳出連線。為了確保您的伺服器分別接收和發送傳入和傳出流量,您需要允許已建立和相關的傳入連線。這允許伺服器將返回流量發送到傳出連線。使用此指令來允許已建立以及相關的傳入連線:
|
1 |
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
![]()
-
已建立的傳出連線
伺服器通常會以已建立連線的傳出流量形式,向傳入連線發送回應。要允許這些,請使用以下指令:
|
1 |
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT |
![]()
-
內部到外部
有時,您甚至可能需要配置防火牆以提供內部存取外部的權限。預設情況下,您的外部網路應該是 eth0 和 eth1 應該是您的內部網路。如果是這種情況,請使用此指令來啟用存取:
|
1 |
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT |

-
捨棄無效封包
有時,某些網路流量封包會被標記為無效。大多數時候,您只需捨棄這些無效封包即可。為此,請使用以下指令:
|
1 |
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP |
封鎖 IP 位址的規則
接下來,我們將介紹一些可用於封鎖來自特定 IP 位址之連線的指令。為了簡化說明,我們將在指令中使用 15.15.15.51 IP 位址作為範例。您可以用您特定的 IP 位址替換此值。
|
1 |
sudo iptables -A INPUT -s 15.15.15.51 -j DROP |
在 -s 15.15.15.51 中,-s 代表來源(source)。因此,該指令指定了來源 IP 位址「15.15.15.51」。同樣地,您可以在任何防火牆規則中指定來源 IP 位址。這包括允許和拒絕規則。
如果您想拒絕連線,您將在指令中用 REJECT 代替 DROP,如下所示:
|
1 |
sudo iptables -A INPUT -s 15.15.15.51 -j REJECT |
因此,每當該特定 IP 位址發送連線請求時,您的伺服器都會給出「連線被拒(connection refused)」錯誤。
-
封鎖到特定介面的連線
您可以封鎖從特定 IP 位址到特定網路介面的所有連線請求。在我們的範例中,IP 位址是 15.15.15.51,而網路介面是 eth0。使用此指令來封鎖連線:
|
1 |
iptables -A INPUT -i eth0 -s 15.15.15.51 -j DROP |
極佳的一點是,您可以在任何規則中指定網路介面。這意味著任何規則都可以套用並僅限於特定的網路。
服務規則:SSH
SSH 在您使用雲端伺服器時會變得非常重要。在這種情況下,您需要允許連接埠 22 上的傳入 SSH 連線。啟用這些連線可讓您連接並管理您的伺服器。在這裡,我們將討論一些與 SSH 相關的常見規則。
-
允許所有傳入的 SSH
以下指令可啟用所有傳入的 SSH 連線:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
在上述設定中,只有在 OUTPUT 策略未設定為 ACCEPT。它允許已建立之 SSH 連線的傳出流量。
-
允許來自特定子網路的傳入 SSH
前一個指令允許所有傳入連線。您可以使用以下指令,僅允許來自特定 IP 位址或子網路的傳入連線。假設您只想允許來自 15.15.15.0/24 子網路:
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
與之前相同,只有在 OUTPUT 策略未設定為 ACCEPT。它允許已建立之 SSH 連線的傳出流量。
-
允許傳出 SSH
如果防火牆的 OUTPUT 策略未設定為 ACCEPT 且您想要啟用 SSH 連線,請使用這些指令。這將允許您的伺服器向其他伺服器發起 SSH 連線:
|
1 2 |
sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
若要進一步在您的雲端伺服器上利用 SSH,請參閱我們關於 如何在 Ubuntu 中使用 SSH 連線至遠端伺服器 以及 如何設定您的 Linux 伺服器以使用金鑰型 SSH 驗證.
-
允許來自特定子網路的傳入 Rsync
Rsync 是一項可用於在系統之間傳輸檔案的功能。它在連接埠 873 上執行。因此,如果您想允許來自特定 IP 位址或子網路在連接埠 873 上的傳入 Rsync 連線,請使用以下指令:
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
如您所見,我們指定了來源 IP 位址以及目的地連接埠。只有在防火牆的 OUTPUT 策略未設定為 ACCEPT。它允許已建立之 Rsync 連線的傳出流量。此外,您可以參閱我們的 關於如何利用 Rsync 同步 VPS 上的本機與遠端目錄的教學課程.
服務規則:網頁伺服器
HTTP 連線通常在連接埠 80 上接收。同樣地,HTTPS 通常使用連接埠 443。網頁伺服器如 Apache 與 Nginx 會監聽這些連接埠以接收連線請求。有時,預設設定可能會使您的伺服器拒絕或捨棄這些傳入請求。這就是為什麼您需要設定新規則以允許流量通過的原因。
-
允許所有傳入的 HTTP 連線
您可以使用以下指令允許連接埠 80 上的所有傳入 HTTP 連線:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
只有在防火牆的 OUTPUT 策略未設定為 ACCEPT。它允許已建立之 HTTP 連線的傳出流量。
-
允許所有傳入的 HTTPS 連線
使用以下命令以允許連接埠 443 上的所有傳入 HTTPS 連線請求:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
只有在 iptables 防火牆的 OUTPUT 策略未設定為 ACCEPT 時,您才需要使用第二條命令。它允許已建立的 HTTP 連線的傳出流量。
-
允許來自 HTTP 和 HTTPS 的所有傳入連線
如果您想同時允許來自 HTTP 和 HTTPS 連接埠的流量,可以使用 multiport 模組。在這種情況下,請使用以下命令:
|
1 2 |
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
只有在防火牆的 OUTPUT 策略未設定為 ACCEPT。它允許已建立的 HTTP 和 HTTPS 連線的傳出流量。
服務規則:MySQL
有時用戶端可能會使用遠端伺服器來存取您的 MySQL 資料庫伺服器。在這種情況下,您需要手動允許來自相關連接埠的傳入流量。MySQL 會接聽來自連接埠 3306 的連線請求。
-
允許來自子網路的傳入 MySQL 連線
如果您想允許來自特定子網路的 MySQL 連線,則必須指定來源。在我們的範例中,我們將使用以下命令允許來自 15.15.15.0/24 子網路的傳入流量:
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
只有在防火牆的 OUTPUT 策略未設定為 ACCEPT 時,您才需要使用第二條命令。它允許已建立的 MySQL 連線的傳出流量。
-
啟用至介面的 MySQL 連線
如果您還想指定哪個網路介面應該接收 MySQL 連線,可以使用以下命令:
|
1 2 |
sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
在這種情況下,我們允許連線到名為 eth1.
只有在防火牆的 OUTPUT 策略未設定為 ACCEPT 時,您才需要使用第二條命令。它允許已建立的 MySQL 連線的傳出流量。
您可以參考我們的 在伺服器上輕鬆設定 MySQL 的教學課程.
服務規則:PostgreSQL
您的用戶端可能會使用遠端伺服器來存取您的 PostgreSQL 資料庫伺服器。在這種情況下,您需要允許這些傳入連線。這些連線將通過連接埠 5432。
-
允許來自子網路的傳入 PostgreSQL 連線
您可以使用以下命令來允許來自特定子網路或 IP 位址的傳入 PostgreSQL 連線。如您所見,我們指定了來源,即 15.15.15.0/24 子網路。
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
只有在防火牆的 OUTPUT 策略未設定為 ACCEPT。它允許已建立的 PostgreSQL 連線的傳出流量。
-
啟用特定介面的 PostgreSQL 連線
如果您只想允許特定網路介面的 PostgreSQL 連線,請使用以下命令:
|
1 2 |
sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
在這種情況下,我們允許連線到名為 eth1 的私有網路介面。只有在防火牆 OUTPUT 策略未設置為 ACCEPT 時,您才需要使用第二個命令。它允許已建立的 PostgreSQL 連線的傳出流量。
請遵循此 教學課程在您的 Ubuntu 伺服器上安裝 PostgreSQL.
服務規則:郵件
您可能還需要根據您使用的任何郵件伺服器來設定防火牆。例如,Sendmail 和 Postfix 可以在許多不同的連接埠上接收連線。這取決於您用於郵件傳遞的協定。要封鎖和允許某些郵件連線,您需要知道您使用的是什麼協定。
-
允許傳入的 SMTP 連線
SMTP 連線通常使用連接埠 25 傳入。雖然 SMTP 也常用連接埠 587 傳送外寄郵件。要允許您的伺服器回應這些連線,請使用以下命令:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
只有在防火牆 OUTPUT 策略未設置為 ACCEPT 時,您才需要使用第二個命令。它允許已建立的 SMTP 連線的傳出流量。
-
允許所有傳入的 IMAP
要允許您的伺服器回應連接埠 143 上的所有傳入 IMAP 連線,只需輸入並執行以下命令:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
只有在防火牆 OUTPUT 策略未設置為 ACCEPT 時,您才需要使用第二個命令。它允許已建立的 IMAP 連線的傳出流量。
-
允許所有傳入的 IMAPS
使用以下命令讓您的伺服器回應連接埠 993 上的 IMAPS 連線:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
只有在防火牆 OUTPUT 策略未設置為 ACCEPT 時,您才需要使用第二個命令。它允許已建立的 IMAPS 連線的傳出流量。
-
允許所有傳入的 POP3
這些連線將在連接埠 993 上傳入。如果您希望您的伺服器回應 IMAPS 連線請求,請使用以下命令:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
只有在防火牆 OUTPUT 策略未設置為 ACCEPT 時,您才需要使用第二個命令。它允許已建立的 POP3 連線的傳出流量。
-
允許所有傳入的 POP3S
使用以下命令允許您的伺服器與在連接埠 995 上傳入的 POP3S 請求建立連線:
|
1 2 |
sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
只有在防火牆的 OUTPUT 策略未設置為 ACCEPT。它允許已建立的 POP3S 連線的傳出流量。
-
如何阻止傳出 SMTP 郵件
與其允許傳入連線並啟用伺服器回應,您可能更想完全阻止傳出郵件。您可以使用此命令阻止連接埠 25 上的所有傳出 SMTP 郵件:
|
1 |
sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT |
因此,所有在連接埠 25 上的傳出流量都將被 iptables 防火牆拒絕。如果您想拒絕任何其他服務,可以使用相同的命令結構。您只需要將連接埠 25 替換為相關的連接埠號碼即可。
結論
本指南涵蓋了基本的 iptables 防火牆命令。它為您提供了有效配置 iptables 防火牆所需的基本工具。請記住,沒有萬能的解決方案。這些命令非常靈活。這意味著您可以以最適合您和您需求的方式來使用它們。
祝您使用愉快!

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