1

1. 概述

在现代世界中,机器之间交换大量数据。在大多数情况下,交换发生在两个不受信任的机器之间。例如,任何通过HTTP传输的数据都与运行应用程序的计算机无关。

在特别关注隐私和数据保护的情况下,计算机必须将其网络限制为受信任的客户端列表。因此,考虑到这一点,我们通常在防火墙后面保护网络。

在本教程中,我们将讨论iptables,它是Linux计算机的用户空间防火墙。它根据用户定义的规则过滤连接。在以下各节中,我们将详细了解这些规则及其行为。

2. 安装Iptables

通常,iptables预装在Linux发行版中。

但是,它也可以通过apt和yum等各种软件包安装程序进行安装。这样做将在Linux中将iptables作为服务安装并启动。

现在,我们可以验证安装:

iptables -L -v

请注意,非root用户必须在上述命令中使用sudo。它将执行的操作是输出其默认规则:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

现在,我们已经安装了iptables,在实现用于数据包过滤的自定义规则之前,我们将讨论一些基本概念。

3. Tables简介

顾名思义,iptables维护一个表,其中每一行都指定一个过滤输入数据包的规则。表主要有三种类型:

  • filter - Linux内核将在此表中为每个输入数据包搜索规则。根据规则,数据包被接受或丢弃
  • nat - 内核将此表用于NAT规则。网络地址转换(NAT)允许我们更改数据包中的源IP地址或目标IP地址。 iptables可以对传入和传出数据包执行此操作
  • mangle - 该表允许我们更改IP标头。例如,我们可以更改输入数据包中的TTL值

一般来说,filter表是使用最广泛的表,因此它也是默认表。例如,如果要选择其他表来更改或添加NAT规则,则可以在iptables命令中使用-t选项:

iptables -t nat -L -v

此命令将显示nat表的默认规则:

Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

我们将仅在本文其余部分中引用filter表。

4. Chains简介

如上一节所述,表中的每一行都是内核必须在输入数据包上应用的一组规则。所有这些规则都链接在一起,称为链。

filter表中有三种类型的链:

  • INPUT - 该链包含适用于入站连接的规则
  • FORWARD - 这包含仅可转发且不能在本地使用的数据包规则。例如,仅将数据转发到其他计算机的路由器
  • OUTPUT - 此链包含出站连接的规则

在上述每个链中,我们可以创建许多规则。每个规则包括:

  • Matching Expression - 内核应用于过滤数据包的标准
  • Target - 内核对数据包执行的操作

对于每个连接,内核都会遍历整个链,并将匹配的表达式应用于数据包。如果找到匹配项,则将给定目标应用于数据包。

尽管目标类型多种多样,但我们仅讨论最常见的目标:

  • ACCEPT - 允许数据包到达目标套接字
  • DROP - 丢弃数据包,但不将任何错误发送回客户端
  • REJECT - 丢弃数据包并将错误发送回客户端
  1. iptables 命令

iptables公开了一个同名的用户空间命令– iptables。我们可以使用此命令在链中添加或删除规则。我们可以为影响所有连接的默认链添加规则,并根据匹配的表达式创建新规则。 iptables命令为我们提供了广泛的数据包或连接特征列表,以应用过滤器。

5.1. 更改默认链

iptables中有一些默认链没有声明任何匹配的表达式。因此,如果数据包与任何自定义规则都不匹配,内核将使用这些链:

$ iptables -L -v

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

因此,默认情况下,iptables允许所有输入和输出数据包通过。但是,我们可以更改此行为并为以下任何链添加新策略:

iptables --policy FORWARD DROP

结果,iptables将丢弃内核本地未使用的所有数据包:

$ iptables -L -v

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

5.2.通过表达式匹配过滤数据包

一般来说,机器不会平等对待所有来源的连接或数据包。因此,适用于所有连接且没有任何区别的默认链有时是不够的。

iptables允许我们根据许多特性(例如源IP地址,源端口和协议)来过滤连接:

  • 要丢弃来自特定IP的所有数据包:
iptables -A INPUT -s 10.1.2.3 -j DROP

这将丢弃来自IP 10.1.2.3的计算机的所有数据包

  • 要将所有数据包丢弃到特定端口:
iptables -A INPUT -p tcp --dport 8080 -s 10.1.2.3 -j DROP

此命令将阻止从IP 10.1.2.3的计算机到端口8080的任何数据包:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP tcp -- any any 10.1.2.3 anywhere tcp dpt:8080

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

  • 要丢弃特定协议上的所有数据包:
iptables -A INPUT -p tcp --dport 22 -j DROP

此命令将通过TCP阻止来自端口22上任何计算机的所有数据包。因此,不允许SSH连接。

5.3. iptables追加和删除规则

如前所述,规则在iptables中链接在一起。当数据包到达时,内核会识别链并进行导航,直到找到匹配的表达式。然后它将在数据包上应用已定义的目标,从而决定对该数据包进行DROP,ACCEPT或REJECT。

iptables命令允许我们从这些链中添加或删除规则。例如,我们在上一节中讨论的命令在INPUT链中添加了一条规则:

iptables -A INPUT -p tcp --dport 22 -j DROP

因此,通过提供-A作为参数,我们将新规则附加到了链中。当数据包到达时,内核将在接受所有连接的默认规则之前查找此规则。

同样,我们可以从链中删除规则:

iptables -D INPUT -p tcp --dport 22 -j DROP

我们可以随时在任何链条中列出规则:

iptables -L -v

这将按照在链中添加规则的顺序输出规则列表。

6. 保存 IPTables 规则

到目前为止,我们添加的规则只是临时的,如果重新启动iptables或计算机,则内核会将其删除。

为了避免这种情况,我们必须在重新启动之前保存以下规则:

/sbin/iptables-save

该命令通常在基于Ubuntu或Debian的发行版上有效。

对于Red Hat或Centos,我们将执行以下操作:

/sbin/service iptables save

这将把规则永久保存在存储器中,并且内核将在启动时将规则重新加载到iptables中。

7. 结论

在本文中,我们讨论了如何将iptables用作Linux计算机中的防火墙。我们首先在Linux机器上安装了iptables,并解释了它如何充当内核决定是否接受或丢弃数据包的查找表。

随后我们使用iptables命令在防火墙中添加了规则,以基于IP,端口和协议阻止或允许连接。

PS: 本文属于翻译,原文


iyacontrol
1.4k 声望2.7k 粉丝

专注kubernetes,devops,aiops,service mesh。