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

介绍

Iptables 是 Linux 发行版的软件防火墙. 这个 cheat sheet 风格的指南提供了快速引用 iptables 命令,这些命令将创建在常见的日常场景中有用的防火墙规则。

如何使用此指南

  • 在这里描述的大多数规则假设您的 iptables 通过默认输入策略设置为 DROP的输入流量,并且您希望选择性地允许输入流量
  • 使用随后的部分适用于您试图实现的内容。 大多数部分没有预先设置到任何其他内容,因此您可以独立使用下面的示例
  • 使用本页右侧的内容菜单(在宽页)或浏览器的查找功能来查找您需要的部分
  • 复制和粘贴给出的命令行示例,以自己的 代替突出值。

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

<$>[注] **注:**在使用防火墙时,要小心不要通过阻止 SSH 流量(默认端口 22)锁定自己的服务器。如果您由于防火墙设置而失去访问,您可能需要通过基于 Web 的控制台连接到它来修复您的访问。如果您正在使用 DigitalOcean,您可以阅读 我们的恢复控制台产品文档以获取更多信息。一旦您通过控制台连接,您可以更改防火墙规则以允许 SSH 访问(或允许所有流量)。

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

让我们来看看iptables的命令!

节约规则

Iptables 规则是短暂的,这意味着它们需要手动保存,以便在重新启动后继续使用。

在Ubuntu上,保存iptables规则的一种方法是使用iptables-persistent包。

1sudo apt install iptables-persistent

在安装过程中,您将被问到是否想要保存当前的防火墙规则。

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

1sudo netfilter-persistent save

其他 Linux 发行版可能有其他方法来使您的 iptables 变更永久。

列出和删除规则

如果您想了解如何列出和删除iptables规则,请参阅本教程: 如何列出和删除iptables防火墙规则

一般有用的规则

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

允许Loopback连接

loopback接口,也被称为lo,是计算机用来将网络连接转发给自己的方式。例如,如果您运行ping localhostping 127.0.0.1,您的服务器会使用 loopback 来 ping 自己。

要接受您的 loopback 接口上的所有流量,请运行以下命令:

1sudo iptables -A INPUT -i lo -j ACCEPT
2sudo iptables -A OUTPUT -o lo -j ACCEPT

允许建立和相关的接入连接

由于网络流量通常需要双向 - 输入和输出 - 才能正常工作,因此通常会创建一个防火墙规则,允许 建立相关的输入流量,以便服务器允许由服务器本身启动的输出连接的返回流量。

1sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

允许建立的外出连接

您可能希望允许所有已建立的连接的输出流量,这些连接通常是对合法的输入连接的响应。

1sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许内部网络访问外部

假设「eth0」是您的外部网络,而「eth1」是您的内部网络,这将允许您的内部访问外部网络:

1sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

丢失无效包裹

某些网络流量包被标记为 不有效. 有时登录此类型的包可能有用,但通常可以放下它们。

1sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

阻止一个IP地址

例如,要阻止来自特定 IP 地址的网络连接,例如,‘203.0.113.51’,请执行以下命令:

1sudo iptables -A INPUT -s 203.0.113.51 -j DROP

在本示例中, -s 203.0.113.51 指定一个 IP 地址为 "203.0.113.51". 源 IP 地址可以在任何防火墙规则中指定,包括一个 允许 规则。

如果您希望以拒绝连接错误来响应连接请求,则用拒绝连接代替拒绝如下:

1sudo iptables -A INPUT -s 203.0.113.51 -j REJECT

阻止连接到网络接口

若要阻止从特定的 IP 地址(例如「203.0.113.51」)到特定的网络接口(例如「eth0」)的连接,请使用以下命令:

1iptables -A INPUT -i eth0 -s 203.0.113.51 -j DROP

这是与上一个例子相同的,添加了i eth0。网络接口可以在任何防火墙规则中指定,这是限制规则到特定网络的好方法。

服务: SSH

如果您正在使用没有本地控制台的服务器,您可能希望允许接入的 SSH 连接(端口 22),以便您可以连接和管理您的服务器。

允许所有接入的 SSH

要允许所有接入的 SSH 连接运行这些命令:

1sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo 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 子网,请运行以下命令:

1sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二个命令,允许建立的**SSH连接的输出流量,只有在OUTPUT策略未设置为ACCEPT时才有必要。

允许输出 SSH

如果您的防火墙OUTPUT策略未设置为ACCEPT,并且您想要允许输出 SSH 连接 - 您的服务器启动到另一个服务器的 SSH 连接 - 您可以执行以下命令:

1sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo 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,请执行以下命令:

1sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二个命令,允许建立的**rsync连接的输出流量,只有在OUTPUT策略未设置为ACCEPT时才有必要。

服务:Web服务器

Apache 和 Nginx 等 Web 服务器通常在端口 80 和端口 443 上收听 HTTP 和 HTTPS 连接的请求,如果您的入口流量默认策略设置为下降拒绝,则需要创建允许服务器响应这些请求的规则。

允许所有接入的 HTTP

要允许所有接入的 HTTP (端口 80) 连接运行以下命令:

1sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二个命令,允许已建立的**HTTP连接的输出流量,只有在OUTPUT策略未设置为ACCEPT时才有必要。

允许所有接入的 HTTPS

要允许所有接入的 HTTPS (端口 443) 连接运行以下命令:

1sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二个命令,允许已建立的**HTTP连接的输出流量,只有在OUTPUT策略未设置为ACCEPT时才有必要。

允许所有接入的 HTTP 和 HTTPS

如果您要允许 HTTP 和 HTTPS 流量,您可以使用 multiport 模块创建允许两个端口的规则。

1sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二个命令,允许已建立的**HTTP和HTTPS连接的输出流量,只有在OUTPUT策略未设置为ACCEPT时才有必要。

服务:思维

如果您的 MySQL 数据库服务器正在远程服务器上的客户端使用,您需要确保允许此类流量。

允许从特定 IP 地址或子网的 MySQL

要允许从特定 IP 地址或子网接入的 MySQL 连接,请指定来源,例如,如果要允许整个 203.0.113.0/24 子网,请运行以下命令:

1sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二个命令,允许已建立的**MySQL连接的输出流量,只有在OUTPUT策略未设置为ACCEPT时才有必要。

允许MySQL到特定的网络接口

若要允许 MySQL 连接到特定网络接口(例如,您有一个私有网络接口eth1),请使用以下命令:

1sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二个命令,允许已建立的**MySQL连接的输出流量,只有在OUTPUT策略未设置为ACCEPT时才有必要。

服务:PostgreSQL

如果您的 PostgreSQL 数据库服务器正在被远程服务器上的客户端使用,您需要确保允许此类流量。

PostgreSQL 来自特定 IP 地址或子网

若要允许从特定 IP 地址或子网接入 PostgreSQL 连接,请指定来源,例如,如果要允许整个 203.0.113.0/24 子网,请运行以下命令:

1sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二个命令,允许建立的 ** PostgreSQL 连接的输出流量,只有在OUTPUT策略未设置为ACCEPT时才有必要。

允许 PostgreSQL 到特定网络接口

若要允许 PostgreSQL 连接到特定网络接口(例如,您有一个私有网络接口eth1),请使用以下命令:

1sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二个命令,允许建立的 ** PostgreSQL 连接的输出流量,只有在OUTPUT策略未设置为ACCEPT时才有必要。

服务:邮件

邮件服务器,如Sendmail和Postfix,听取各种端口,取决于用于邮件交付的协议. 如果您正在运行邮件服务器,确定您正在使用的协议,并允许相应的流量类型. 我们还将向您展示如何创建一个规则来阻止发出的SMTP邮件。

阻止 SMTP 邮件

如果您的服务器不应该发送输出邮件,您可能想要阻止此类流量。

1sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT

这将 iptables 配置为 ** reject** 在端口上的所有输出流量 25. 如果您需要通过其端口号拒绝不同的服务,而不是端口 25,则更换该端口号为上面的 25

允许所有传入的 SMTP

要允许服务器在端口 25 上响应 SMTP 连接,请执行以下命令:

1sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二个命令,允许建立的**SMTP连接的输出流量,只有在OUTPUT策略未设置为ACCEPT时才有必要。

允许所有 IMAP 接收

要允许您的服务器响应 IMAP 连接,端口 143 运行以下命令:

1sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二个命令,允许已建立的**IMAP连接的输出流量,只有在OUTPUT策略未设置为ACCEPT时才有必要。

允许所有传入的 IMAP

要允许您的服务器响应 IMAPS 连接,端口 993,运行以下命令:

1sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二个命令,允许已建立的**IMAPS连接的输出流量,只有在OUTPUT策略未设置为ACCEPT时才有必要。

允许所有 POP3 接收

要允许您的服务器响应 POP3 连接,端口 110,运行以下命令:

1sudo iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二个命令,允许已建立的** POP3连接的输出流量,只有在OUTPUT策略未设置为ACCEPT时才有必要。

允许所有 POP3 接收

若要允许您的服务器响应 POP3S 连接,请使用端口 995 执行以下命令:

1sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第二个命令,允许已建立的** POP3S连接的输出流量,只有在OUTPUT策略未设置为ACCEPT时才有必要。

结论

当然,iptables是一个非常灵活的工具,所以请自由混合和匹配命令与不同的选项,以匹配您的特定需求,如果它们不被涵盖在这里。

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

Published At
Categories with 技术
Tagged with
comments powered by Disqus