介绍
Iptables是Linux发行版的软件防火墙。这份速查表风格的指南提供了iptables命令的快速参考,这些命令将创建在常见的日常场景中有用的防火墙规则。这包括允许和阻止各种服务的iptables示例,按端口、网络接口和源IP地址进行分类。
如何使用本指南
- 这里描述的大多数规则假定您的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进行安装:
在安装过程中,您将被询问是否要保存当前的防火墙规则。
如果您更新了防火墙规则并希望保存更改,请运行此命令:
其他Linux发行版可能有其他方法来使您的iptables更改永久生效。有关更多信息,请参阅相关文档。
列出和删除规则
如果您想学习如何列出和删除iptables规则,请查看这个教程:如何列出和删除Iptables防火墙规则。
通常有用的规则
此部分包括各种iptables命令,将创建通常适用于大多数服务器的规则。
允许环回连接
回环接口,也称为lo
,是计算机用于将网络连接转发到自身的接口。例如,如果您运行ping localhost
或ping 127.0.0.1
,您的服务器将使用回环来对自身进行ping测试。如果您将应用服务器配置为使用localhost
地址连接到数据库服务器,也会使用回环接口。因此,您需要确保防火墙允许这些连接。
要接受回环接口上的所有流量,请运行以下命令:
允许已建立和相关的传入连接
由于网络流量通常需要双向传输 – 传入和传出 – 为了正常工作,通常会创建一个防火墙规则,允许已建立的和相关的传入流量,以便服务器允许由服务器本身发起的传出连接的返回流量。此命令将允许此操作:
允许已建立的传出连接
您可能希望允许所有已建立连接的流量出站,这通常是对合法入站连接的响应。此命令将允许这样做:
允许内部网络访问外部网络
假设eth0
是您的外部网络,而eth1
是您的内部网络,则此命令将允许您的内部网络访问外部网络:
丢弃无效数据包
一些网络流量数据包会被标记为无效。有时记录此类数据包可能会有用,但通常最好将它们丢弃。使用此命令执行此操作:
阻止IP地址
要阻止源自特定IP地址(例如203.0.113.51
)的网络连接,请运行此命令:
在这个例子中,-s 203.0.113.51
指定了“203.0.113.51”作为源 IP 地址。源 IP 地址可以在任何防火墙规则中指定,包括允许规则。
如果你想要拒绝连接,而不是丢弃它,这将用“连接被拒绝”错误响应连接请求,请将“DROP”替换为“REJECT”,像这样:
阻止连接到网络接口
要阻止从特定 IP 地址,例如203.0.113.51
,到特定网络接口,例如eth0
的连接,使用此命令:
这与前面的例子相同,只是添加了-i eth0
。网络接口可以在任何防火墙规则中指定,并且是限制规则适用于特定网络的绝佳方法。
服务:SSH
如果您使用的服务器没有本地控制台,您可能希望允许传入的 SSH 连接(端口22),以便您可以连接到和管理您的服务器。本节介绍了如何使用各种与 SSH 相关的规则配置您的防火墙。
允许所有传入SSH连接
要允许所有传入的SSH连接,请运行以下命令:
第二个命令允许已建立的SSH连接的传出流量,仅在OUTPUT
策略未设置为ACCEPT
时才需要执行。
允许特定IP地址或子网的传入SSH
要允许特定IP地址或子网的传入SSH连接,请指定来源。例如,如果您想允许整个203.0.113.0/24
子网,请运行以下命令:
第二个命令允许已建立的SSH连接的传出流量,仅在OUTPUT
策略未设置为ACCEPT
时才需要执行。
允许传出SSH连接
如果您的防火墙 OUTPUT
策略未设置为 ACCEPT
,而您想允许出站 SSH 连接——您的服务器发起到另一个服务器的 SSH 连接——您可以运行以下命令:
允许特定 IP 地址或子网的传入 Rsync
Rsync 运行在端口 873 上,可用于在计算机之间传输文件。
要允许特定 IP 地址或子网的传入 rsync 连接,请指定源 IP 地址和目标端口。例如,如果您想允许整个 203.0.113.0/24
子网能够 rsync 到您的服务器,请运行以下命令:
第二个命令,允许已建立的 rsync 连接的出站流量,仅在 OUTPUT
策略未设置为 ACCEPT
时才需要。
服务:Web 服务器
Web 服务器,如 Apache 和 Nginx,通常会在端口 80 和 443 上监听 HTTP 和 HTTPS 连接的请求。如果您的默认入站流量策略设置为拒绝或禁止,则需要创建规则以允许您的服务器响应这些请求。
允许所有传入的HTTP连接
要允许所有传入的HTTP(端口80)连接,请运行以下命令:
第二个命令允许OUTPUT
策略未设置为ACCEPT
时建立的HTTP连接的出站流量。
允许所有传入的HTTPS连接
要允许所有传入的HTTPS(端口443)连接,请运行以下命令:
第二个命令允许OUTPUT
策略未设置为ACCEPT
时建立的HTTPS连接的出站流量。
允许所有传入的HTTP和HTTPS连接
如果您想要允许HTTP和HTTPS流量,请使用multiport模块创建一个允许两个端口的规则。要允许所有传入的HTTP和HTTPS(端口443)连接,请运行以下命令:
第二个命令允许已建立的HTTP和HTTPS连接的出站流量,只有在OUTPUT
策略未设置为ACCEPT
时才是必要的。
服务:MySQL
MySQL在端口3306上监听客户端连接。如果您的MySQL数据库服务器被远程服务器上的客户端使用,您需要确保允许该流量。
允许特定IP地址或子网的MySQL
为了允许来自特定IP地址或子网的MySQL连接,请指定源。例如,如果您想允许整个203.0.113.0/24
子网,请运行以下命令:
第二个命令,允许已建立的MySQL连接的出站流量,只有在OUTPUT
策略未设置为ACCEPT
时才是必要的。
允许MySQL到特定网络接口
允许MySQL连接到特定的网络接口——比如说你有一个私有网络接口eth1
,例如——使用以下命令:
第二个命令用于允许已建立的MySQL连接的出站流量,只有当OUTPUT
策略未设置为ACCEPT
时才需要执行。
服务:PostgreSQL
PostgreSQL监听客户端连接的端口为5432。如果您的PostgreSQL数据库服务器被远程服务器上的客户端使用,您需要确保允许该流量。
来自特定IP地址或子网的PostgreSQL
为了允许来自特定IP地址或子网的入站PostgreSQL连接,请指定源。例如,如果您想允许整个203.0.113.0/24
子网,请运行以下命令:
第二个命令用于允许已建立的PostgreSQL连接的出站流量,只有当OUTPUT
策略未设置为ACCEPT
时才需要执行。
允许 PostgreSQL 连接到特定网络接口
要允许 PostgreSQL 连接到特定的网络接口——比如说你有一个名为eth1
的私有网络接口——请使用以下命令:
第二个命令用于允许已建立的 PostgreSQL 连接的传出流量,只有在OUTPUT
策略未设置为ACCEPT
时才是必要的。
服务:邮件
邮件服务器,如 Sendmail 和 Postfix,根据用于邮件投递的协议监听各种端口。如果您运行邮件服务器,请确定您正在使用哪些协议,并允许适当类型的流量。我们还将向您展示如何创建一个规则来阻止传出的 SMTP 邮件。
阻止传出的 SMTP 邮件
如果您的服务器不应该发送传出邮件,您可能希望阻止这种类型的流量。要阻止传出的 SMTP 邮件,使用端口 25 的,请运行以下命令:
这会配置iptables来拒绝所有出站流量的25端口。如果您需要拒绝其他服务的端口号,请将该端口号替换上述的25
。
允许所有传入SMTP
为了允许您的服务器在25端口上响应SMTP连接,请运行以下命令:
第二个命令允许已建立的SMTP连接的出站流量,只有当OUTPUT
策略未设置为ACCEPT
时才需要。
允许所有传入IMAP
为了允许您的服务器在端口143上响应IMAP连接,请运行以下命令:
第二个命令允许已建立的IMAP连接的出站流量,只有当OUTPUT
策略未设置为ACCEPT
时才需要。
允许所有传入IMAPS
要允许服务器响应IMAPS连接(端口993),请运行以下命令:
第二个命令用于允许已建立的IMAPS连接的出站流量,仅在OUTPUT
策略未设置为ACCEPT
时才需要。
允许所有传入的POP3
要允许服务器响应POP3连接(端口110),请运行以下命令:
第二个命令用于允许已建立的POP3连接的出站流量,仅在OUTPUT
策略未设置为ACCEPT
时才需要。
允许所有传入的POP3S
要允许服务器响应POP3S连接(端口995),请运行以下命令:
第二个命令用于允许已建立的POP3S连接的出站流量,仅在OUTPUT
策略未设置为ACCEPT
时才需要。
结论
这应该涵盖了配置iptables防火墙时常用的许多命令。当然,iptables是一个非常灵活的工具,所以如果这里没有涵盖到你的特定需求,可以随意混合和匹配命令及不同选项。
如果你正在寻求帮助确定如何设置防火墙,请查看这个教程:如何选择有效的防火墙策略以保护你的服务器。