Iptables基本知識: 常見防火牆規則和命令

介紹

Iptables是Linux發行版的軟件防火牆。這份速查表式指南提供了一個快速參考,介紹了iptables命令,這些命令將創建常見日常情境中有用的防火牆規則。這包括通過端口、網絡接口和來源IP地址允許和阻止各種服務的iptables示例。

如何使用本指南

  • 這裡描述的大多數規則假設您的iptables設置為通過默認輸入策略拒絕入站流量,並且您希望有選擇性地允許入站流量
  • 使用適用於您想要實現的目標的後續部分。大多數部分不依賴於其他任何部分,因此您可以獨立使用以下示例
  • 使用本頁右側的內容菜單(在寬頁面寬度時)或您瀏覽器的查找功能來查找所需的部分
  • 複製並粘貼所提供的命令行示例,將突出顯示的值替換為您自己的值

請注意,您的規則的順序很重要。所有這些iptables命令都使用-A選項將新規則附加到鏈的末尾。如果您想將其放在鏈的其他位置,可以使用-I選項,該選項允許您指定新規則的位置(或通過不指定規則號將其放在鏈的開頭)。

注意:在使用防火墙时,请注意不要通过阻止SSH流量(默认情况下为端口22)将自己锁在自己的服务器外面。如果由于防火墙设置而失去了访问权限,则可能需要通过基于Web的控制台连接到服务器以修复您的访问权限。如果您使用的是DigitalOcean,您可以阅读我们的恢复控制台产品文档以获取更多信息。一旦通过控制台连接,您可以更改防火墙规则以允许SSH访问(或允许所有流量)。如果您的保存的防火墙规则允许SSH访问,则另一种方法是重新启动服务器。

请记住,您可以使用sudo iptables -Ssudo iptables -L检查当前的iptables规则集。

让我们来看一下iptables命令!

保存规则

Iptables规则是短暂的,这意味着它们需要手动保存才能在重新启动后持续存在。

在Ubuntu上,保存iptables规则的一种方法是使用iptables-persistent包。像这样使用apt进行安装:

  1. sudo apt install iptables-persistent

在安装过程中,您将被询问是否要保存当前的防火墙规则。

如果您更新了防火墙规则并希望保存更改,请运行此命令:

  1. sudo netfilter-persistent save

其他Linux发行版可能有其他方法使您的iptables更改永久生效。请参阅相关文档以获取更多信息。

列出和删除规则

如果您想学习如何列出和删除iptables规则,请参阅本教程:如何列出和删除Iptables防火墙规则

通常有用的规则

本节包括各种iptables命令,将创建通常在大多数服务器上有用的规则。

允许回环连接

迴路介面,也被稱為lo,是電腦用來轉發網路連接到自己的地方。例如,如果您執行ping localhostping 127.0.0.1,您的伺服器將使用迴路對自己進行 ping 測試。如果您配置應用伺服器以localhost地址連接到資料庫伺服器,迴路介面也會被使用。因此,您需要確保您的防火牆允許這些連接。

為了接受迴路介面上的所有流量,運行以下命令:

  1. sudo iptables -A INPUT -i lo -j ACCEPT
  2. 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 地址的網絡連接,例如 203.0.113.51,運行此命令:

  1. sudo iptables -A INPUT -s 203.0.113.51 -j DROP

在這個例子中,-s 203.0.113.51 指定了源 IP 地址為 “203.0.113.51”。源 IP 地址可以在任何防火牆規則中指定,包括允許規則。

如果你想拒絕連接,而不是直接丟棄,這將會回應連接請求並顯示“連接被拒絕”錯誤,請將 “DROP” 替換為 “REJECT”,像這樣:

  1. sudo iptables -A INPUT -s 203.0.113.51 -j REJECT

阻止對網絡接口的連接

要阻止從特定 IP 地址(例如 203.0.113.51)到特定網絡接口(例如 eth0)的連接,請使用以下命令:

  1. iptables -A INPUT -i eth0 -s 203.0.113.51 -j DROP

這與前一個例子相同,只是增加了 -i eth0。網絡接口可以在任何防火牆規則中指定,這是限制規則到特定網絡的好方法。

服務:SSH

如果你使用的是沒有本地控制台的服務器,你可能會想要允許傳入的 SSH 連接(端口 22),這樣你就可以連接並管理你的服務器。本部分涵蓋了如何使用各種與 SSH 相關的規則來配置你的防火牆。

允許所有SSH連入

要允許所有SSH連入,執行以下命令:

  1. sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二個命令允許已建立的SSH連接的傳出流量,只有在OUTPUT策略未設置為ACCEPT時才需要。

允許從特定IP地址或子網絡連入SSH

要允許從特定IP地址或子網絡連入SSH,請指定來源。例如,如果要允許整個203.0.113.0/24子網絡,執行以下命令:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二個命令允許已建立的SSH連接的傳出流量,只有在OUTPUT策略未設置為ACCEPT時才需要。

允許SSH連出

如果您的防火牆OUTPUT策略未設置為ACCEPT,且您希望允許外發的SSH連接 – 您的伺服器啟動對另一個伺服器的SSH連接 – 您可以運行以下命令:

  1. sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允許從特定IP地址或子網絡接收Rsync請求

Rsync在端口873上運行,可用於將文件從一台計算機傳輸到另一台計算機。

要允許從特定IP地址或子網絡接收rsync請求,請指定來源IP地址和目標端口。例如,如果您希望允許整個203.0.113.0/24子網絡能夠對您的伺服器進行rsync,請運行以下命令:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二條命令允許已建立的rsync連接的外發流量,僅在OUTPUT策略未設置為ACCEPT時才需要。

服務:Web 伺服器

Web伺服器,例如Apache和Nginx,通常在端口80和443上監聽HTTP和HTTPS連接的請求。如果您的默認入站流量策略設置為拒絕或拒絕,則需要創建規則來允許您的伺服器對這些請求做出響應。

允許所有傳入的HTTP

允許所有傳入的HTTP(端口80)連接運行以下命令:

  1. sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二條命令允許OUTPUT策略未設置為ACCEPT時,已建立的HTTP連接的傳出流量。

允許所有傳入的HTTPS

允許所有傳入的HTTPS(端口443)連接運行以下命令:

  1. sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二條命令允許OUTPUT策略未設置為ACCEPT時,已建立的HTTP連接的傳出流量。

允許所有傳入的HTTP和HTTPS

如果您想允許HTTP和HTTPS流量,您可以使用multiport模塊創建一個允許這兩個端口的規則。要允許所有傳入的HTTP和HTTPS(端口443)連接,請運行以下命令:

  1. sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二個命令允許建立HTTP和HTTPS連接的出站流量,只有當OUTPUT策略未設置為ACCEPT時才是必要的。

服務:MySQL

MySQL監聽端口3306上的客戶端連接。如果您的MySQL數據庫服務器正在被遠程服務器上的客戶端使用,您需要確保允許該流量。

允許特定IP地址或子網的MySQL

要允許從特定IP地址或子網的MySQL連接,請指定來源。例如,如果您想允許整個203.0.113.0/24子網,執行以下命令:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二個命令,允許建立MySQL連接的出站流量,只有當OUTPUT策略未設置為ACCEPT時才是必要的。

允許MySQL連接到特定的網路接口

允許MySQL連接到特定的網絡接口——比如說你有一個私有網絡接口eth1,請使用以下命令:

  1. sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二個命令允許已建立的MySQL連接的外部流量,只有在OUTPUT策略未設置為ACCEPT時才需要使用。

服務:PostgreSQL

PostgreSQL在端口5432上聆聽客戶端連接。如果您的PostgreSQL數據庫服務器被遠程服務器上的客戶端使用,請確保允許該流量。

從特定IP地址或子網絡許可PostgreSQL

為了允許從特定IP地址或子網絡接受到來的PostgreSQL連接,請指定來源。例如,如果您想允許整個203.0.113.0/24子網絡,請運行以下命令:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二個命令允許已建立的PostgreSQL連接的外部流量,只有在OUTPUT策略未設置為ACCEPT時才需要使用。

允許 PostgreSQL 連接到特定的網絡接口

要允許 PostgreSQL 連接到特定的網絡接口——比如說你有一個私有網絡接口 eth1——請使用以下命令:

  1. sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二個命令允許 已建立 的 PostgreSQL 連接的傳出流量,僅在 OUTPUT 策略未設置為 ACCEPT 時才需要。

服務:郵件

郵件服務器,如 Sendmail 和 Postfix,根據用於郵件傳遞的協議監聽各種端口。如果您運行郵件服務器,請確定您正在使用哪些協議,並允許相應類型的流量。我們還將向您展示如何創建一個規則來阻止傳出的 SMTP 郵件。

阻止傳出的 SMTP 郵件

如果您的服務器不應該發送傳出郵件,您可能希望阻止該類流量。要阻止傳出的 SMTP 郵件,使用端口 25 的命令運行此命令:

  1. sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT

這將配置 iptables 拒絕所有輸出端口 25 的流量。如果您需要拒絕不同端口號的其他服務,請將該端口號替換為上述的 25

允許所有輸入的 SMTP

要允許您的伺服器在端口 25 上回應 SMTP 連接,請運行以下命令:

  1. sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二個命令允許已建立的 SMTP 連接的輸出流量,僅在 OUTPUT 策略未設置為 ACCEPT 時才需要。

允許所有輸入的 IMAP

要允許您的伺服器回應 IMAP 連接,端口 143,請運行以下命令:

  1. sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二個命令允許已建立的 IMAP 連接的輸出流量,僅在 OUTPUT 策略未設置為 ACCEPT 時才需要。

允許所有輸入的 IMAPS

允許您的服務器回應 IMAPS 連接,端口 993,運行以下命令:

  1. sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二個命令允許 建立的 IMAPS 連接的傳出流量,只有在 OUTPUT 策略未設置為 ACCEPT 時才需要。

允許所有傳入的 POP3

要允許您的服務器回應 POP3 連接,端口 110,運行以下命令:

  1. sudo iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二個命令允許 建立的 POP3 連接的傳出流量,只有在 OUTPUT 策略未設置為 ACCEPT 時才需要。

允許所有傳入的 POP3S

要允許您的服務器回應 POP3S 連接,端口 995,運行以下命令:

  1. sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二個命令允許 建立的 POP3S 連接的傳出流量,只有在 OUTPUT 策略未設置為 ACCEPT 時才需要。

結論

那應該包含了許多在配置iptables防火牆時常用的命令。當然,iptables是一個非常靈活的工具,所以如果這裡沒有涵蓋到您的特定需求,請隨意混合和匹配命令以及不同的選項。

如果您正在尋找幫助來確定您的防火牆應該如何設置,請查看這篇教程:如何選擇有效的防火牆策略來保護您的伺服器

Source:
https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands