IptablesEssentials:常见的防火墙规则和命令
介绍
iptables 是 Linux 发行版的软件防火墙。 这个备忘单风格的指南提供了 iptables 命令的快速参考,这些命令将创建在常见的日常场景中有用的防火墙规则。 这包括通过端口、网络接口和源 IP 地址允许和阻止各种服务的 iptables 示例。
如何使用本指南
- 此处描述的大多数规则都假定您的 iptables 通过默认输入策略设置为 DROP 传入流量,并且您希望有选择地允许入站流量
- 使用适用于您要达到的目标的任何后续部分。 大多数部分不以任何其他部分为基础,因此您可以独立使用下面的示例
- 使用此页面右侧的目录菜单(在宽页面宽度下)或浏览器的查找功能找到您需要的部分
- 复制并粘贴给出的命令行示例,用您自己的值替换突出显示的值
请记住,规则的顺序很重要。 所有这些 iptables
命令都使用 -A
选项将新规则附加到链的末尾。 如果你想把它放在链中的其他地方,你可以使用 -I
选项,它允许你指定新规则的位置(或者通过不指定规则号将它放在链的开头)。
注意: 使用防火墙时,请注意不要通过阻止 SSH 流量(默认为 22 端口)将自己锁定在自己的服务器之外。 如果您因防火墙设置而失去访问权限,您可能需要通过基于 Web 的控制台连接到它以修复您的访问权限。 如果您使用的是 DigitalOcean,您可以阅读 我们的故障恢复控制台产品文档 了解更多信息。 通过控制台连接后,您可以更改防火墙规则以允许 SSH 访问(或允许所有流量)。 如果您保存的防火墙规则允许 SSH 访问,另一种方法是重新启动服务器。
请记住,您可以使用 sudo iptables -S
和 sudo 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 localhost
或 ping 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 是一个非常灵活的工具,因此如果此处未涵盖这些命令,请随意混合和匹配具有不同选项的命令以满足您的特定需求。
如果您正在寻求确定如何设置防火墙的帮助,请查看本教程:如何选择有效的防火墙策略来保护您的服务器。