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 destinationChain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destinationChain 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 destinationChain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destinationChain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destinationChain 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
- 丢弃数据包并将错误发送回客户端
- iptables 命令
iptables公开了一个同名的用户空间命令– iptables。我们可以使用此命令在链中添加或删除规则。我们可以为影响所有连接的默认链添加规则,并根据匹配的表达式创建新规则。 iptables命令为我们提供了广泛的数据包或连接特征列表,以应用过滤器。
5.1. 更改默认链
iptables中有一些默认链没有声明任何匹配的表达式。因此,如果数据包与任何自定义规则都不匹配,内核将使用这些链:
$ iptables -L -vChain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destinationChain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destinationChain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
因此,默认情况下,iptables允许所有输入和输出数据包通过。但是,我们可以更改此行为并为以下任何链添加新策略:
iptables --policy FORWARD DROP
结果,iptables将丢弃内核本地未使用的所有数据包:
$ iptables -L -vChain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destinationChain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destinationChain 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:8080Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destinationChain 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: 本文属于翻译,原文
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。