Iptables 基础知识:常见防火墙规则和命令

介绍

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

如何使用本指南

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

请注意,您规则的顺序很重要。所有这些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 指定了“203.0.113.51”作为 IP 地址。源 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时建立的HTTPS连接的出站流量。

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

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

  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