简介
Iptables 是一个命令行 防火墙 工具。这意味着它是一款允许您在系统上配置防火墙的软件。它通常默认安装在 Linux 系统上。在本指南中,我们将 讨论一些与 iptables 防火墙相关的常用规则和命令。每当有连接尝试与您的系统建立时,防火墙都会参考这些规则来决定下一步应该采取什么操作。
Iptables 命令
本指南将介绍一些最基本的 iptables 命令。要学习本指南,您需要对什么是 iptables 及其工作原理有基本的了解。这将有助于您更好地掌握使用以下命令所实施的规则。请记住,下面给出的任何命令都可以单独使用。另一方面,您也可以根据自己的特定需求对它们进行混搭。
注意事项
在继续阅读之前,请记住以下几点:
- iptables 中规则的顺序非常重要。
- 要在链的末尾追加新规则,您的
iptables命令必须使用-A。 - 如果您想在其他位置追加规则,则必须使用
-I选项。此选项使您能够指定规则的确切位置。如果您想将规则放在链的开头,只需不提供规则编号即可。 - 为了确保您能够持续访问服务器,默认情况下阻止端口 22 上的 SSH 流量。
- 如果您未能这样做并失去了对服务器的访问权限,您可以使用控制台重新连接。允许 SSH 流量以更改防火墙设置。
- 如果您想查看当前生效的规则集,请使用命令
sudo iptables -S 和 sudo iptables -L。
此外,我们还有一篇关于如何列出和删除 iptables 防火墙规则的详细指南, 这将进一步帮助您充分利用 iptables 防火墙。
现在准备工作已经就绪,让我们深入了解一些 常用的 iptables 命令:
如何保存您的规则
我们首先来确定如何保存您的规则。需要注意的是,iptables 规则是临时的。这意味着在您重启系统后它们将会丢失——除非您保存它们。以下是您分别在 Ubuntu 和 CentOS 服务器上手动保存新规则的方法:
-
Ubuntu
在 Ubuntu 服务器上保存新规则最简单的方法是使用 iptables-persistent 软件包。您可以轻松地按照本教程创建 Ubuntu 服务器。
现在,保存新 iptables 规则的第一步是使用 apt-get 安装 iptables-persistent 软件包。以下是获取它的方法:
|
1 |
sudo apt-get install iptables-persistent |

在安装过程中,您需要决定是否保存当前生效的防火墙规则。如果要更新规则并保存更改,请使用以下命令:
|
1 |
sudo netfilter-persistent save |

上述命令通常适用于 16.04 之后的 Ubuntu 版本。如果您使用的是更早的版本,请改用以下命令:
|
1 |
sudo invoke-rc.d iptables-persistent save |
-
CentOS
您可以在 CentOS 6 或更早版本上使用 iptables 配置防火墙。CentOS 7 则使用 FirewallD。请按照本 教程学习如何在 CentOS 7 上设置 FirewallD.
您可以使用 iptables 初始化脚本在 CentOS 上保存新规则。请参阅以下命令:
|
1 |
sudo service iptables save |
此命令将保存您的 iptables 防火墙新规则。当前处于活动状态的 iptables 规则可以在 /etc/sysconfig/iptables 文件中找到。
实用的 Iptables 命令
现在,让我们来看看您可能需要在服务器上使用的一些非常实用的 iptables 防火墙命令。
-
环回连接
首先,我们将探讨如何允许环回连接。您的系统使用环回接口向自身发送连接。例如,假设您运行了以下命令:ping localhost 或 ping 127.0.0.1。您的服务器将使用回环接口(即 lo)来实质上 ping 自身。其他时候,如果您的应用服务器配置为连接到“localhost”地址,服务器也可能会使用它。
无论情况如何,您都需要确保您的 iptables 防火墙不会阻止这些连接。因此,您必须允许回环连接以使这些功能得以运行。
以下是您将运行以允许所有流量进入回环接口的命令:
|
1 2 |
sudo iptables -A INPUT -i lo -j ACCEPT 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 地址的连接的命令。为了简单起见,我们将在命令中使用 15.15.15.51 IP 地址作为示例。您可以用您特定的 IP 地址替换此值。
|
1 |
sudo iptables -A INPUT -s 15.15.15.51 -j DROP |
在 -s 15.15.15.51 中,-s 代表来源(source)。因此,该命令指定了源 IP 地址“15.15.15.51”。同样,您可以在任何防火墙规则中指定源 IP 地址。这包括允许和拒绝规则。
如果您想拒绝连接,您将在命令中使用 REJECT 代替 DROP,如下所示:
|
1 |
sudo iptables -A INPUT -s 15.15.15.51 -j REJECT |
因此,每当该特定 IP 地址发送连接请求时,您的服务器都会给出“连接被拒绝”(connection refused)错误。
-
阻止到特定接口的连接
您可以阻止从特定 IP 地址到特定网络接口的所有连接请求。在我们的示例中,IP 地址是 15.15.15.51,网络接口是 eth0。使用此命令阻止连接:
|
1 |
iptables -A INPUT -i eth0 -s 15.15.15.51 -j DROP |
极好的一点是,您可以在任何规则中指定网络接口。这意味着任何规则都可以应用并仅限制在特定的网络中。
服务规则:SSH
SSH 在您使用云服务器时会变得非常重要。在这种情况下,您需要允许端口 22 上的入站 SSH 连接。启用这些连接允许您连接并管理您的服务器。在这里,我们将讨论一些与 SSH 相关的常见规则。
-
允许所有入站 SSH
以下命令允许所有传入的 SSH 连接:
|
1 2 |
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 连接的传出流量。
-
允许来自特定子网的传入 SSH
前面的命令允许所有传入连接。您可以使用以下命令,仅允许来自特定 IP 地址或子网的传入连接。假设您只想允许来自 15.15.15.0/24 子网的传入连接:
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.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 连接:
|
1 2 |
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 |
要在您的云服务器上进一步利用 SSH,请查看我们关于 如何在 Ubuntu 中使用 SSH 连接到远程服务器 和 如何配置您的 Linux 服务器以使用基于 SSH 密钥的身份验证.
-
允许来自特定子网的传入 Rsync
Rsync 是一种可用于在系统之间传输文件的功能。它运行在端口 873 上。因此,如果您想允许来自特定 IP 地址或子网的端口 873 上的传入 Rsync 连接,请使用以下命令:
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.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 |
如您所见,我们指定了源 IP 地址以及目标端口。只有在防火墙的 OUTPUT 策略未设置为 ACCEPT 时,才需要使用第二条命令。它允许已建立的 Rsync 连接的传出流量。此外,您可以查看我们的 关于如何利用 Rsync 同步 VPS 上的本地和远程目录的教程.
服务规则:Web 服务器
HTTP 连接通常在端口 80 上接收。同样,HTTPS 通常在端口 443 上接收。像 Apache 和 Nginx 监听这些端口以捕获连接请求。有时,默认设置可能会使您的服务器拒绝或丢弃这些传入请求。这就是为什么您需要设置新规则以允许流量通过的原因。
-
允许所有传入的 HTTP 连接
您可以使用以下命令允许端口 80 上的所有传入 HTTP 连接:
|
1 2 |
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 连接
使用以下命令允许端口 443 上的所有传入 HTTPS 连接请求:
|
1 2 |
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 |
仅当 iptables 防火墙的 OUTPUT 策略未设置为 ACCEPT 时,您才需要使用第二条命令。它允许已建立的 HTTP 连接的传出流量。
-
允许来自 HTTP 和 HTTPS 的所有传入连接
如果您想允许来自 HTTP 和 HTTPS 端口的流量,可以使用 multiport 模块。如果是这种情况,请使用以下命令:
|
1 2 |
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 数据库服务器。在这种情况下,您需要手动允许来自相关端口的传入流量。MySQL 监听来自端口 3306 的连接请求。
-
允许来自子网的传入 MySQL 连接
如果您想允许来自特定子网的 MySQL 连接,则必须指定源。在我们的示例中,我们将使用以下命令允许来自 15.15.15.0/24 子网的传入流量:
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.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 连接,可以使用以下命令:
|
1 2 |
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 |
在这种情况下,我们允许连接到名为 eth1.
仅当防火墙的 OUTPUT 策略未设置为 ACCEPT 时,您才需要使用第二条命令。它允许已建立 of MySQL 连接的传出流量。
您可以按照我们的 教程在您的服务器上轻松设置 MySQL.
服务规则:PostgreSQL
您的客户端可能会使用远程服务器来访问您的 PostgreSQL 数据库服务器。在这种情况下,您需要允许这些传入连接。这些连接将通过端口 5432 传入。
-
允许来自子网的传入 PostgreSQL 连接
您可以使用以下命令允许来自特定子网或 IP 地址的传入 PostgreSQL 连接。如您所见,我们指定了源,即 15.15.15.0/24 子网。
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.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 连接,请使用以下命令:
|
1 2 |
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 |
在这种情况下,我们允许连接到名为 eth1 的私有网络接口。只有在防火墙 OUTPUT 策略未设置为 ACCEPT 时,您才需要使用第二条命令。它允许已建立的 PostgreSQL 连接的传出流量。
遵循此 教程在您的 Ubuntu 服务器上安装 PostgreSQL.
服务规则:邮件
您可能还需要根据您使用的任何邮件服务器来配置防火墙。例如,Sendmail 和 Postfix 可以在许多不同的端口上接收连接。这取决于您用于邮件传递的协议。要阻止和允许某些邮件连接,您需要知道您使用的是什么协议。
-
允许传入的 SMTP 连接
SMTP 连接通常通过端口 25 传入。尽管 SMTP 也通常使用端口 587 进行传出邮件。要允许您的服务器响应这些连接,请使用以下命令:
|
1 2 |
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
要允许您的服务器响应端口 143 上的所有传入 IMAP 连接,只需键入并运行以下命令:
|
1 2 |
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
使用以下命令让您的服务器响应端口 993 上的 IMAPS 连接:
|
1 2 |
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
这些连接将通过端口 993 传入。如果您希望您的服务器响应 IMAPS 连接请求,请使用以下命令:
|
1 2 |
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
使用以下命令允许您的服务器与通过端口 995 传入的 POP3S 请求建立连接:
|
1 2 |
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 连接的传出流量。
-
如何阻止传出 SMTP 邮件
除了允许传入连接和启用服务器响应之外,您可能还想完全阻止传出邮件。您可以使用以下命令阻止端口 25 上的所有传出 SMTP 邮件:
|
1 |
sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT |
因此,所有在端口 25 上的传出流量都将被 iptables 防火墙拒绝。如果您想拒绝任何其他服务,可以使用相同的命令结构。您只需将端口 25 替换为相应的端口号即可。
结论
本指南涵盖了基本的 iptables 防火墙命令。它为您提供了有效配置 iptables 防火墙所需的基本工具。请记住,没有一种万能的解决方案。这些命令非常灵活。这意味着您可以以最适合您和您需求的方式来使用它们。
祝您使用愉快!

评论
暂无评论。发表第一条评论吧。