Iptables 核心指南:常用防火墙规则与命令详解

本文详细介绍了 Linux 系统中 `iptables` 防火墙的常用配置,包括规则的保存、列出与删除,以及如何根据端口、IP地址、网络接口为SSH、Web服务、数据库和邮件服务等配置放行或阻止策略。旨在帮助中文开发者高效管理服务器网络安全。

阅读时长: 8 分钟
共 3582字
作者: eimoon.com

iptables 是 Linux 发行版中广泛使用的软件防火墙,它允许系统管理员配置内核 IPv4 数据包过滤规则集。本指南旨在为中文开发者提供一份快速参考,详细介绍如何在常见场景下使用 iptables 命令创建防火墙规则,包括按端口、网络接口和源 IP 地址允许或阻止各种服务。

使用本指南须知

  • 本文中的大多数规则都假设您的 iptables 默认 INPUT 策略已设置为 DROP(丢弃)传入流量,并且您希望选择性地允许入站流量。
  • 各个部分之间通常是独立的,您可以根据需要独立使用其中的示例。
  • 请注意,iptables 规则的顺序非常重要。文中的所有 iptables 命令都使用 -A 选项将新规则追加到链的末尾。如果您想将其放置在链中的其他位置,可以使用 -I 选项指定新规则的位置(或不指定规则编号则放置在链的开头)。

重要提示:在配置防火墙时,请务必小心,不要阻止 SSH 流量(默认为端口 22),以免将自己锁定在服务器之外。如果您因防火墙设置而失去访问权限,可能需要通过基于 Web 的控制台连接到服务器以修复问题。一旦通过控制台连接,您可以更改防火墙规则以允许 SSH 访问(或允许所有流量)。如果您的已保存防火墙规则允许 SSH 访问,另一种方法是重启服务器。

您可以使用 sudo iptables -Ssudo iptables -L 命令来检查当前的 iptables 规则集。

现在,让我们深入了解 iptables 命令!

规则的持久化与管理

iptables 规则在默认情况下是临时性的,这意味着它们需要在系统重启后手动保存才能持久生效。

保存 iptables 规则

在 Ubuntu 系统上,保存 iptables 规则的一种推荐方法是使用 iptables-persistent 软件包。通过 apt 进行安装:

sudo apt install iptables-persistent

安装过程中,系统会询问您是否要保存当前的防火墙规则。

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

sudo netfilter-persistent save

其他 Linux 发行版可能有不同的方法使 iptables 更改永久生效,例如使用 iptables-saveiptables-restore 命令配合系统服务。请参阅相关文档以获取更多信息。

列出和删除 iptables 规则

关于如何列出和删除 iptables 规则的详细信息,您可以参考更深入的 iptables 教程。常用的命令包括:

  • sudo iptables -Lsudo iptables -L -n -v:列出所有规则。
  • sudo iptables -D INPUT <规则编号>:按编号删除 INPUT 链中的规则。

核心防火墙规则

本节包含各种 iptables 命令,它们将创建在大多数服务器上普遍有用的核心防火墙规则。

允许回环(Loopback)连接

回环接口(也称为 lo)是计算机用于将网络连接转发给自身的接口。例如,如果您运行 ping localhostping 127.0.0.1,您的服务器将使用回环接口进行 ping 操作。如果您的应用程序服务器配置为使用 localhost 地址连接到数据库服务器,也会使用回环接口。因此,您需要确保防火墙允许这些连接。

要接受回环接口上的所有流量,请运行以下命令:

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

允许已建立和相关传入连接

由于网络流量通常需要双向(入站和出站)才能正常工作,因此通常会创建一条防火墙规则,允许已建立(ESTABLISHED)和相关(RELATED)的传入流量。这允许服务器能够接收由服务器自身发起的出站连接的返回流量。此命令将允许此操作:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

允许已建立的出站连接

您可能希望允许所有已建立连接的出站流量,这些流量通常是对合法传入连接的响应。此命令将允许此操作:

sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许内部网络访问外部网络

假设 eth0 是您的外部网络接口,eth1 是您的内部网络接口,此命令将允许您的内部网络访问外部网络:

sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

丢弃无效数据包

某些网络流量数据包会被标记为无效(INVALID)。有时记录这类数据包可能很有用,但通常丢弃它们也没有问题。使用此命令执行此操作:

sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

IP 地址与网络接口控制

iptables 允许您基于源 IP 地址或网络接口来精确控制流量。

阻止特定 IP 地址

要阻止源自特定 IP 地址(例如 203.0.113.51)的网络连接,请运行以下命令:

sudo iptables -A INPUT -s 203.0.113.51 -j DROP

在此示例中,-s 203.0.113.51 指定了源 IP 地址 “203.0.113.51”。源 IP 地址可以在任何防火墙规则中指定,包括允许规则。

如果您想拒绝连接(这将以“连接被拒绝”错误响应连接请求),请将 “DROP” 替换为 “REJECT”:

sudo iptables -A INPUT -s 203.0.113.51 -j REJECT

阻止到特定网络接口的连接

要阻止来自特定 IP 地址(例如 203.0.113.51)到特定网络接口(例如 eth0)的连接,请使用此命令:

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

这与上一个示例相同,只是增加了 -i eth0。网络接口可以在任何防火墙规则中指定,是限制规则到特定网络的好方法。

常见服务端口配置

本节将介绍如何为一些常见的网络服务配置 iptables 规则。

SSH 服务(端口 22)

如果您使用的服务器没有本地控制台,您可能需要允许传入的 SSH 连接(默认为端口 22),以便连接和管理服务器。

允许所有传入 SSH

要允许所有传入的 SSH 连接,请运行以下命令:

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

第二个命令(允许已建立 SSH 连接的出站流量)仅在 OUTPUT 策略未设置为 ACCEPT 时才需要。

允许来自特定 IP 地址或子网的传入 SSH

要允许来自特定 IP 地址或子网的传入 SSH 连接,请指定源。例如,如果您想允许整个 203.0.113.0/24 子网:

sudo iptables -A INPUT -p tcp -s 203.0.113.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

允许出站 SSH

如果您的防火墙 OUTPUT 策略未设置为 ACCEPT,并且您想允许出站 SSH 连接(您的服务器发起 SSH 连接到另一个服务器),您可以运行以下命令:

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

Rsync 服务(端口 873)

Rsync 运行在端口 873 上,可用于在计算机之间传输文件。

允许来自特定 IP 地址或子网的传入 Rsync

要允许来自特定 IP 地址或子网的传入 Rsync 连接,请指定源 IP 地址和目标端口。例如,如果您想允许整个 203.0.113.0/24 子网能够 Rsync 到您的服务器,请运行以下命令:

sudo iptables -A INPUT -p tcp -s 203.0.113.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

Web 服务器(HTTP/HTTPS)

Web 服务器(如 Apache 和 Nginx)通常分别监听端口 80 和 443 用于 HTTP 和 HTTPS 连接。如果您的传入流量默认策略设置为丢弃或拒绝,您将需要创建规则来允许您的服务器响应这些请求。

允许所有传入 HTTP(端口 80)

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

允许所有传入 HTTPS(端口 443)

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

同时允许所有传入 HTTP 和 HTTPS

如果您想同时允许 HTTP 和 HTTPS 流量,可以使用 multiport 模块创建一个同时允许这两个端口的规则。

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

MySQL 数据库服务(端口 3306)

MySQL 监听端口 3306 上的客户端连接。如果您的 MySQL 数据库服务器被远程服务器上的客户端使用,您需要确保允许该流量。

允许来自特定 IP 地址或子网的 MySQL 连接

要允许来自特定 IP 地址或子网的传入 MySQL 连接,请指定源。例如,如果您想允许整个 203.0.113.0/24 子网:

sudo iptables -A INPUT -p tcp -s 203.0.113.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

允许 MySQL 连接到特定网络接口

要允许 MySQL 连接到特定网络接口(例如,如果您有一个私有网络接口 eth1),请使用以下命令:

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

PostgreSQL 数据库服务(端口 5432)

PostgreSQL 监听端口 5432 上的客户端连接。如果您的 PostgreSQL 数据库服务器被远程服务器上的客户端使用,您需要确保允许该流量。

允许来自特定 IP 地址或子网的 PostgreSQL 连接

要允许来自特定 IP 地址或子网的传入 PostgreSQL 连接,请指定源。例如,如果您想允许整个 203.0.113.0/24 子网:

sudo iptables -A INPUT -p tcp -s 203.0.113.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

允许 PostgreSQL 连接到特定网络接口

要允许 PostgreSQL 连接到特定网络接口(例如,如果您有一个私有网络接口 eth1),请使用以下命令:

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

邮件服务

邮件服务器(如 Sendmail 和 Postfix)根据所使用的邮件传输协议监听各种端口。如果您正在运行邮件服务器,请确定您正在使用的协议并允许相应的流量类型。

阻止出站 SMTP 邮件(端口 25)

如果您的服务器不应该发送出站邮件,您可能希望阻止此类流量。要阻止使用端口 25 的出站 SMTP 邮件,请运行以下命令:

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

允许所有传入 SMTP(端口 25)

要允许您的服务器响应端口 25 上的 SMTP 连接,请运行以下命令:

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

允许所有传入 IMAP(端口 143)

要允许您的服务器响应端口 143 上的 IMAP 连接,请运行以下命令:

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

允许所有传入 IMAPS(端口 993)

要允许您的服务器响应端口 993 上的 IMAPS 连接,请运行以下命令:

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

允许所有传入 POP3(端口 110)

要允许您的服务器响应端口 110 上的 POP3 连接,请运行以下命令:

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

允许所有传入 POP3S(端口 995)

要允许您的服务器响应端口 995 上的 POP3S 连接,请运行以下命令:

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

总结

本文涵盖了配置 iptables 防火墙时常用的许多命令和规则。iptables 是一个功能强大且灵活的工具,您可以根据自己的特定需求混合和匹配命令和不同的选项来构建复杂的防火墙策略。掌握这些基本规则将帮助您有效地保护您的 Linux 服务器。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计