Linux防火墙iptables入门指南

iptables是为Linux操作系统构建的极其灵活的防火墙实用程序。无论您是Linux新手还是系统管理员,iptables都可能在某些方面对您非常有用。请继续阅读,我们将向您展示如何配置功能最强大的Linux防火墙。

照片由ezioman拍摄。

关于iptables

iptables是一个命令行防火墙实用程序,它使用策略链来允许或阻止通信。当连接试图在系统上建立自身时,iptables会在其列表中查找要与其匹配的规则。如果找不到,则求助于默认操作。

iptables几乎总是预装在任何Linux发行版上。要更新/安装它,只需检索iptables软件包:

iptables还有一些GUI替代方案,比如Firestarter,但是一旦您关闭了几个命令,iptables就不会那么难了。在配置iptables规则时要格外小心,特别是当您通过SSH连接到服务器时,因为一个错误的命令可能会永久锁定您,直到在物理机器上手动修复它。

链条的类型

iptables使用三个不同的链:输入、转发和输出。

输入-此链用于控制传入连接的行为。例如,如果用户尝试通过SSH连接到您的PC/服务器,iptables将尝试将IP地址和端口与输入链中的规则相匹配。

转发-此链用于实际上不在本地传递的传入连接。以路由器为例-数据总是被发送到它,但很少真正发往路由器本身;数据只是转发到它的目标。除非您在系统上执行某种路由、NAT或其他需要转发的操作,否则您甚至不会使用这个链。

有一个可靠的方法可以检查您的系统是否使用/需要转发链。

上面的屏幕截图显示的是一台已经运行了几周的服务器,它对传入或传出连接没有任何限制。如您所见,输入链已经处理了11 GB的数据包,而输出链已经处理了17 GB。另一方面,前向链不需要处理单个数据包。这是因为服务器没有执行任何类型的转发或被用作直通设备。

输出-此链用于传出连接。例如,如果您尝试ping howtogek.com,iptables将在决定允许或拒绝连接尝试之前检查其输出链,以查看有关ping和howtogek.com的规则是什么。

告诫:

尽管ping外部主机似乎只需要遍历输出链,但请记住,要返回数据,也将使用输入链。使用iptables锁定系统时,请记住,许多协议都需要双向通信,因此输入链和输出链都需要正确配置。SSH是人们忘记在两条链上都允许的公共协议。

策略链默认行为

在进入并配置特定规则之前,您需要确定您希望这三个链的默认行为是什么。换句话说,如果连接不匹配任何现有规则,您希望iptables做什么?

要查看您的策略链当前配置为如何处理不匹配的流量,请运行iptables-L命令。

如您所见,我们还使用grep命令来提供更干净的输出。在该屏幕截图中,我们的链条目前被设计为接受流量。

很多时候,您会希望您的系统在默认情况下接受连接。除非您以前更改过策略链规则,否则应该已经配置了此设置。无论哪种方式,以下是默认情况下接受连接的命令:

通过默认接受规则,您可以使用iptables拒绝特定的IP地址或端口号,同时继续接受所有其他连接。我们将立即执行这些命令。

如果您宁愿拒绝所有连接并手动指定要允许连接的连接,则应将链的默认策略更改为DROP。这样做可能只对包含敏感信息且只连接相同IP地址的服务器有用。

特定于连接的响应

配置了默认链策略后,您可以开始向iptables添加规则,以便它知道在遇到来自或指向特定IP地址或端口的连接时该如何操作。在本指南中,我们将回顾三个最基本、最常用的“回答”。

接受-允许连接。

丢掉连接,就当什么都没发生过。如果您不希望源代码意识到您的系统存在,这是最好的。

拒绝-不允许连接,但发回错误。如果您不想让某个特定的源连接到您的系统,但又想让他们知道您的防火墙阻止了他们,那么这是最好的。

要显示这三个规则之间的差异,最好的方法是显示当PC尝试ping Linux机器(为每个设置配置了iptables)时是什么样子。

允许连接:

正在断开连接:

拒绝连接:

允许或阻止特定连接

配置策略链后,您现在可以配置iptables以允许或阻止特定地址、地址范围和端口。在这些示例中,我们将连接设置为Drop,但您可以根据您的需要和如何配置策略链,将它们切换为接受或拒绝。

注意:在这些示例中,我们将使用iptables-A将规则附加到现有链中。iptables从其列表的顶部开始,遍历每个规则,直到找到匹配的规则。如果需要将一条规则插入到另一条规则之上,可以使用iptables-i[CHAIN][NUMBER]指定该规则在列表中的编号。

来自单个IP地址的连接

此示例显示如何阻止来自IP地址10.10.10.10的所有连接。

来自一系列IP地址的连接

本例显示如何拦截10.10.10.0/24网络范围内的所有IP地址。您可以使用网络掩码或标准斜杠表示法来指定IP地址范围。

或者 / 还是 / 即 / 否则

连接到特定端口

此示例显示如何阻止来自10.10.10.10的SSH连接。

您可以用任何协议或端口号替换“ssh”。代码的-p tcp部分告诉iptables协议使用哪种连接。如果您阻塞的是使用UDP而不是TCP的协议,则需要使用-p UDP。

此示例说明如何阻止来自任何IP地址的SSH连接。

连接状态

正如我们前面提到的,很多协议将需要双向通信。例如,如果您希望允许SSH连接到您的系统,则输入链和输出链将需要添加一个规则。但是,如果您只希望允许SSH进入您的系统,该怎么办呢?向输出链添加规则不也允许传出SSH尝试吗?

这就是连接状态的用武之地,它为您提供了允许双向通信但只允许建立单向连接所需的功能。看看这个示例,其中允许从10.10.10.10到10.10.10.10的SSH连接,但不允许到10.10.10.10的SSH连接。但是,只要会话已经建立,系统就可以通过SSH发回信息,这使得这两台主机之间可以进行SSH通信。

正在保存更改

除非您执行命令保存更改,否则下次重新启动iptables服务时,您对iptables规则所做的更改将被废弃。注意,此命令可能会因您的版本而异:

Ubuntu:

Red Hat/CentOS:

或者 / 还是 / 即 / 否则

其他命令

列出当前配置的iptables规则:

添加-v选项将给出数据包和字节信息,添加-n将以数字列出所有内容。换句话说,主机名、协议和网络都以数字列出。

要清除当前配置的所有规则,可以发出flush命令。

相关文章