Contents

Linux中Iptables简介

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. 表格介绍

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

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

一般来说,过滤表是使用最广泛的,因此它也是默认表。如果我们想选择其他表,例如,更改或添加 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

我们将仅在本文的其余部分中参考 过滤器表

4. 链简介

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

过滤表中有三种类型的链 :

  • INPUT – 此链包含应用于传入连接的规则
  • FORWARD – 这包含数据包的规则,这些数据包只能在本地转发而不是在本地使用。例如,仅将数据转发给其他机器的路由器
  • OUTPUT - 此链包含传出连接的规则

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

  • 匹配表达式——内核用于过滤数据包的标准
  • 目标——内核对数据包执行的动作

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

尽管有各种类型的目标,但我们只讨论最常见的目标:

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

5. 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 中链接在一起。当数据包到达时,内核识别链并对其进行导航,直到找到匹配的表达式。然后它将在数据包上应用定义的目标,从而决定丢弃、接受或拒绝该数据包。

** 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. 保存 IP 表规则

到目前为止,我们添加的规则只是临时的,如果 iptables 或机器重新启动,内核将删除这些规则

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

/sbin/iptables-save

此命令通常适用于基于 Ubuntu 或 Debian 的发行版。

对于 Red Hat 或 Centos,我们会这样做:

/sbin/service iptables save

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