iptables Essentials:常用防火墙规则和命令

介绍

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

如何使用本指南

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

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

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

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

我们来看看iptables命令吧!

保存规则

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

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

  • sudo apt install iptables-persistent

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

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

  • sudo netfilter-persistent save

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

上市和删除规则

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

一般有用的规则

本节包括各种 iptables 命令,它们将创建通常在大多数服务器上有用的规则。

允许环回连接

环回接口,也被称为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

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

  • 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 地址可以在任何防火墙规则中指定,包括允许规则。

如果你想拒绝连接,它会以“连接被拒绝”错误响应连接请求,将“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

第二个命令允许已建立的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

如果您的防火墙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

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

服务:网络服务器

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

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

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

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

允许所有传入的 HTTP 和 HTTPS

如果您想同时允许 HTTP 和 HTTPS 流量,您可以使用多端口模块创建一个允许两个端口的规则。要允许所有传入的 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

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

服务: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

第二个命令允许已建立的MySQL 连接的传出流量,仅当OUTPUT策略未设置为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

第二个命令允许已建立的MySQL 连接的传出流量,仅当OUTPUT策略未设置为ACCEPT.

服务: 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

第二个命令允许已建立的PostgreSQL 连接的传出流量,仅当OUTPUT策略未设置为时才需要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

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

服务:邮寄

邮件服务器(例如 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

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

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

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

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

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

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

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

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

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

结论

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

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

觉得文章有用?

点个广告表达一下你的爱意吧 !😁