介绍
Iptables 是 Linux 发行版的软件防火墙. 这个 cheat sheet 风格的指南提供了快速引用 iptables 命令,这些命令将创建在常见的日常场景中有用的防火墙规则。
如何使用此指南
- 在这里描述的大多数规则假设您的 iptables 通过默认输入策略设置为 DROP的输入流量,并且您希望选择性地允许输入流量
- 使用随后的部分适用于您试图实现的内容。 大多数部分没有预先设置到任何其他内容,因此您可以独立使用下面的示例
- 使用本页右侧的内容菜单(在宽页)或浏览器的查找功能来查找您需要的部分
- 复制和粘贴给出的命令行示例,以自己的 代替突出值。
请记住,你的规则的顺序很重要。所有这些iptables
命令都使用-A
选项将新规则附加到链的尽头. 如果你想把它放在链中的其他地方,你可以使用-I
选项,允许你指定新规则的位置(或者把它放在链的开头,而不指定规则号)。
<$>[注] **注:**在使用防火墙时,要小心不要通过阻止 SSH 流量(默认端口 22)锁定自己的服务器。如果您由于防火墙设置而失去访问,您可能需要通过基于 Web 的控制台连接到它来修复您的访问。如果您正在使用 DigitalOcean,您可以阅读 我们的恢复控制台产品文档以获取更多信息。一旦您通过控制台连接,您可以更改防火墙规则以允许 SSH 访问(或允许所有流量)。
请记住,您可以检查当前的 iptables 规则,使用sudo iptables -S
和sudo 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 localhost
或ping 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是一个非常灵活的工具,所以请自由混合和匹配命令与不同的选项,以匹配您的特定需求,如果它们不被涵盖在这里。
如果您正在寻找帮助确定如何设置防火墙,请参阅本教程: 如何选择有效的防火墙策略来保护您的服务器。