介绍
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 localhost
或ping 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 是一个非常灵活的工具,因此如果此处未涵盖这些命令,请随意混合和匹配具有不同选项的命令以满足您的特定需求。
如果您正在寻求帮助确定应如何设置防火墙,请查看本教程:如何选择有效的防火墙策略来保护您的服务器。