IptablesEssentials:常见的防火墙规则和命令

来自菜鸟教程
跳转至:导航、​搜索

介绍

iptables 是 Linux 发行版的软件防火墙。 这个备忘单风格的指南提供了 iptables 命令的快速参考,这些命令将创建在常见的日常场景中有用的防火墙规则。 这包括通过端口、网络接口和源 IP 地址允许和阻止各种服务的 iptables 示例。

如何使用本指南

  • 此处描述的大多数规则都假定您的 iptables 通过默认输入策略设置为 DROP 传入流量,并且您希望有选择地允许入站流量
  • 使用适用于您要达到的目标的任何后续部分。 大多数部分不以任何其他部分为基础,因此您可以独立使用下面的示例
  • 使用此页面右侧的目录菜单(在宽页面宽度下)或浏览器的查找功能找到您需要的部分
  • 复制并粘贴给出的命令行示例,用您自己的值替换突出显示的值

请记住,规则的顺序很重要。 所有这些 iptables 命令都使用 -A 选项将新规则附加到链的末尾。 如果你想把它放在链中的其他地方,你可以使用 -I 选项,它允许你指定新规则的位置(或者通过不指定规则号将它放在链的开头)。

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


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

让我们看一下iptables命令!

保存规则

iptables 规则是短暂的,这意味着它们需要手动保存,以便在重启后保持不变。

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

sudo apt install iptables-persistent

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

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

sudo netfilter-persistent save

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

上市和删除规则

如果您想了解如何列出和删除 iptables 规则,请查看本教程:如何列出和删除 iptables 防火墙规则

一般有用的规则

本节包括各种 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

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

由于网络流量通常需要双向 - 传入和传出 - 才能正常工作,因此通常会创建一个防火墙规则,允许 已建立相关 传入流量,以便server 将允许由服务器本身发起的传出连接的返回流量。 该命令将允许:

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

丢弃无效数据包

一些网络流量数据包被标记为 无效 。 有时记录这种类型的数据包可能很有用,但通常可以丢弃它们。 使用以下命令执行此操作:

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

阻止 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 地址,包括 allow 规则。

如果您想 拒绝 连接,它将以“连接被拒绝”错误响应连接请求,请将“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。 可以在任何防火墙规则中指定网络接口,这是将规则限制到特定网络的好方法。

服务:SSH

如果您使用没有本地控制台的服务器,您可能希望允许传入的 SSH 连接(端口 22),以便您可以连接和管理您的服务器。 本节介绍如何使用各种 SSH 相关规则配置防火墙。

允许所有传入的 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

仅当 OUTPUT 策略未设置为 ACCEPT 时,才需要第二条命令,该命令允许 已建立 SSH 连接的传出流量。

允许来自特定 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

仅当 OUTPUT 策略未设置为 ACCEPT 时,才需要第二条命令,该命令允许 已建立 SSH 连接的传出流量。

允许传出 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

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

Rsync 在端口 873 上运行,可用于将文件从一台计算机传输到另一台计算机。

要允许来自特定 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

仅当 OUTPUT 策略未设置为 ACCEPT 时,才需要第二条命令,该命令允许 已建立 rsync 连接的传出流量。

服务:网络服务器

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

允许所有传入的 HTTP

要允许所有传入的 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

仅当 OUTPUT 策略未设置为 ACCEPT 时,才需要第二条命令,该命令允许 已建立 HTTP 连接的传出流量。

允许所有传入的 HTTPS

要允许所有传入的 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

仅当 OUTPUT 策略未设置为 ACCEPT 时,才需要第二条命令,该命令允许 已建立 HTTP 连接的传出流量。

允许所有传入的 HTTP 和 HTTPS

如果你想同时允许 HTTP 和 HTTPS 流量,你可以使用 multiport 模块来创建一个允许两个端口的规则。 要允许所有传入的 HTTP 和 HTTPS(端口 443)连接,请运行以下命令:

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 在端口 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

仅当 OUTPUT 策略未设置为 ACCEPT 时,才需要第二条命令,该命令允许 已建立 MySQL 连接的传出流量。

允许 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

仅当 OUTPUT 策略未设置为 ACCEPT 时,才需要第二条命令,该命令允许 已建立 MySQL 连接的传出流量。

服务:PostgreSQL

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

仅当 OUTPUT 策略未设置为 ACCEPT 时,才需要第二条命令,该命令允许 已建立 PostgreSQL 连接的传出流量。

允许 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

仅当 OUTPUT 策略未设置为 ACCEPT 时,才需要第二条命令,该命令允许 已建立 PostgreSQL 连接的传出流量。

服务:邮件

邮件服务器(例如 Sendmail 和 Postfix)根据用于邮件传递的协议侦听各种端口。 如果您正在运行邮件服务器,请确定您使用的协议并允许适当类型的流量。 我们还将向您展示如何创建规则来阻止传出的 SMTP 邮件。

阻止传出的 SMTP 邮件

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

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

这会将 iptables 配置为 拒绝 端口 25 上的所有传出流量。 如果您需要通过端口号而不是端口 25 拒绝不同的服务,请将该端口号替换为上面的 25

允许所有传入的 SMTP

要允许您的服务器响应端口 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

仅当 OUTPUT 策略未设置为 ACCEPT 时,才需要第二条命令,该命令允许 已建立 SMTP 连接的传出流量。

允许所有传入的 IMAP

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

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

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

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

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

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

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

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 连接的传出流量。

结论

这应该涵盖了配置 iptables 防火墙时常用的许多命令。 当然,iptables 是一个非常灵活的工具,因此如果此处未涵盖这些命令,请随意混合和匹配具有不同选项的命令以满足您的特定需求。

如果您正在寻求确定如何设置防火墙的帮助,请查看本教程:如何选择有效的防火墙策略来保护您的服务器