Ubuntu Iptables:如何使用 iptables 控制网络流量?
“……用户空间 Unix 实用程序,使系统管理员能够配置由内核的网络过滤器模块实现的 IP 数据包过滤规则。 ” Iptables 充当防火墙,使用基于 IP 地址、端口和协议等各种标准的数据包过滤规则。
本指南将讨论如何在 Ubuntu 系统上配置和使用 iptables 规则来保护您的网络。无论您是 Linux 新手还是经验丰富的系统管理员,从本指南中,您都会以某种方式学到一些有关 iptables 的有用知识。
Iptables 预装在 Ubuntu 和大多数基于 Debian 的发行版上。 Ubuntu 还打包了 GUFW 防火墙,这是一种可以用来处理 iptables 的图形化替代方案。
注意:要使用和配置 iptables,您需要系统上的 sudo 权限。您可以从以下教程中了解有关 sudo 的更多信息。
现在您已经了解了 Iptables 是什么,让我们开始吧!
如何使用 iptables 管理 IPv4 流量?
要使用 Iptables 进行 IPv4 网络和流量管理,您需要了解以下内容:
iptables命令
Iptables 提供了一系列选项,允许您自定义和调整 iptables 规则。让我们讨论其中一些参数并看看它们的作用。
注意:您可以配置一组规则来管理特定子集(称为 iptables 链)。
iptables参数
在开始创建和配置 iptables 规则之前,让我们首先了解 iptables 的基础知识,例如通用语法和默认参数。
考虑下面的命令:
上面的命令告诉 iptables 在链中创建规则。该规则丢弃来自 IP 地址 192.168.0.24 的所有数据包。
让我们逐行检查该命令,以便更好地理解它。
第一个命令 iptables 调用 iptables 命令行实用程序。
接下来是用于插入的 -I 参数。插入参数在 iptables 链的开头添加一条规则,从而获得更高的优先级。要在链中的特定编号处添加规则,请使用 -I 参数,后跟应分配规则的编号。
-s 参数有助于指定源。因此,我们使用 -s 参数,后跟 IP 地址。
iptables 的 -j 参数指定跳转到特定目标。该选项设置一旦有匹配的数据包,Iptables 应执行的操作。 Iptables 默认提供四个主要目标,包括:ACCEPT、DROP、LOG 和 REJECT。
Iptables 提供了一系列可用于配置各种规则的参数。可用于配置 iptables 规则的各种参数包括:
- -p –protocol
指定连接协议;例如 TCP、UDP 等。
- -d –destination
指定目标,可以是地址、网络名称或主机名。
- -j –jump
设置 iptables 在找到数据包后应执行的操作。
- -o –out-interface
设置 iptable 发送数据包的接口。
- -i –in-interface
设置用于建立网络数据包的接口。
- -c –set-counters
允许管理员设置指定规则的字节和数据包计数器。
- -g –goto chain
该参数指定返回后应在用户设置的链中继续处理。
- -f –fragment
告诉 iptables 仅将规则应用于分段数据包的第二个及后续分段。
iptables 选项
iptables 命令支持多种选项。一些常见的包括:
- -D –delete
从指定链中删除规则
- -F –flush
删除所有规则,一次一项
- -L –list
显示指定链中的所有规则
- -I –insert
将规则插入到指定的链中(如果没有指定数字,则作为数字传递;规则添加到顶部)
- -C –check
查询规则匹配;特定规则中的要求
- -v –verbose
与 -L 参数一起使用时显示更多详细信息
- -N –new-chain <name>
添加新的用户定义链
- -X –delete-chain <name>
删除特定的用户定义链
iptables 表
Linux 内核有包含一组相关规则的默认表。这些默认表有一组默认链,但用户可以通过添加用户定义的规则来自定义规则。
注意:默认表在很大程度上取决于您的内核配置和安装的模块。
以下是默认的 iptables 表:
1:过滤表
过滤表是一个默认表,包含用于网络数据包过滤的链。此表中的一些默认链包括:
Chain | Description |
---|---|
Input | Iptables use this chain for any incoming packets to the system, i.e., packets going to local network sockets. |
Output | Iptables use the output chain for locally generated packets, i.e., packets going out of the system. |
Forward | This chain is what the Iptables use for packets routed or forwarded via the system. |
2:NAT 表
NAT 或网络地址表是一种路由设备,用于修改网络数据包中的源 IP 地址和目标 IP 地址。 NAT 表的主要用途是将私有地址范围内的两个网络与公共网络连接起来。
NAT 的开发是为了支持屏蔽真实 IP 地址,从而允许私有 IP 地址范围到达外部网络。这有助于防止有关内部网络的详细信息在公共网络中泄露。
当数据包发起新连接时,将使用 NAT 表。
Iptables 有一个用于 NAT 寻址的默认表。该表有3条主链:
Chain | Description |
---|---|
PREROUTING | Allows the modification of packet information before arriving in the INPUT chain—used for incoming packets |
OUTPUT | Reserved for packets created locally, i.e., before network routing occurs |
POSTROUTING | Allows the modification of outgoing packets— Packets leaving the OUTPUT chain |
下图显示了此过程的高级概述。
使用以下命令查看您的 NAT 路由表。
3:Mangle 桌子
mangle表主要用于对数据包进行特殊修改。简单来说,它用于修改网络数据包的IP头。数据包的修改可以包括更改数据包的 TTL 值、更改数据包的有效网络跃点等。
该表包含以下默认链:
- POSTROUTING
用于出站数据包
- INPUT
用于直接进入服务器的数据包
- OUTPUT
用于本地数据包
- Forward
为通过系统路由的数据包保留
4:原始表格
原始表的主要目的是为不打算由跟踪系统处理的数据包配置例外。 raw表在数据包上设置NOTRACK标记,提示conntrack功能忽略该数据包。
Conntrack 是一项 Linux 内核网络功能,允许 Linux 内核跟踪所有网络连接,从而使内核能够识别构成网络流的数据包。
raw表有两条主链:
Chain | Description |
---|---|
PREROUTING | Reserved for packets received by network interfaces |
OUTPUT | Reserved for packets initiated by local processes |
5:安全表
该表的主要用途是设置在数据包上标记的内部 Linux 安全增强 (SELinux) 安全机制。安全标记可以应用于每个连接或数据包。
它用于强制访问控制规则,是过滤表之后访问的第二个表。它提供以下默认链:
Chain | Description |
---|---|
INPUT | Reserved for incoming packets to the system |
OUTPUT | Used for locally created packets |
FORWARD | Used for packets routed through the system |
了解了默认的 Iptables 后,让我们更进一步讨论如何使用 iptables 规则。
如何使用 iptables 规则?
Iptables 规则按升序应用。这意味着首先应用特定集合中的第一条规则,然后是第二条、第三条,依此类推,直到最后一条。
由于此功能,iptables 会阻止您使用 -A 参数在集合中添加规则;您必须使用 -I,后跟数字或将其清空以添加到列表顶部。
显示 iptables
要查看 iptables,请使用命令 iptables -L -v(对于 IPv4)和 ip6tables -L -v(对于 IPv6)。
插入规则
要在集合中插入规则,您必须按照确切的顺序放置它们,并尊重同一链使用的规则。您可以使用上面讨论的命令查看 iptables 规则列表:
例如,要插入一条允许通过 TCP 传入连接到端口 9001 的规则,我们需要为符合 Web 流量规则的 INPUT 链指定规则编号。
查看当前 iptables 后,您应该会在集中看到新规则。
替换规则
替换功能的工作方式与插入类似,但它使用 iptables -R 命令。例如,要修改上面的规则并将端口 9001 设置为拒绝,我们:
删除规则
要删除规则,我们传递规则编号。例如,要删除上面的规则,我们可以指定为:
在大多数 Linux 发行版中,IPv4 和 IPv6 的 iptables 都是空的。因此,如果您没有添加任何新规则,您将获得类似于下图所示的输出。这是有风险的,因为这意味着系统允许所有传入、传出和路由的流量。
让我们深入了解如何配置 iptables:
如何配置iptables?
配置 iptables 规则的方法有很多种。本节通过示例介绍如何使用IP地址和端口设置规则。
通过端口阻止和允许流量
您可以使用特定端口来阻止或允许网络接口上的所有流量。考虑以下示例:
上述命令允许 wlan0 接口上端口 1001 TCP 上的流量。
此命令与上述命令执行相反的操作,因为它会阻止 wlan0 上端口 1001 上的所有流量。
下面是对该命令的仔细检查:
第一个参数 (-A) 在表链的末尾添加一条新规则。
INPUT 参数将指定的规则添加到表中。
DROP 参数将要执行的操作分别设置为 ACCEPT 和 DROP。这意味着一旦数据包匹配,它就会被丢弃。
-p 指定 TCP 等协议,并允许其他协议上的流量通过。
–destination-port 设置接受或丢弃发往端口 1001 的所有流量的规则。
-i <接口名称> 告诉 iptables 将规则应用于来自 wlan0 接口的流量。
注意: Iptables 不理解网络接口别名。因此,在具有多个虚拟接口的系统中,您需要手动且显式地定义目标地址。
例如:
IP 地址白名单和黑名单
您可以使用 iptables 创建防火墙规则。一个示例是停止所有流量并仅允许来自显式 IP 地址的网络流量。
例子 :
iptables -A INPUT -i lo -m comment --comment "Allow loopback connections" -j ACCEPT
iptables -A INPUT -p icmp -m comment --comment “Allow Ping to work as expected” -j
接受
iptables -A INPUT -s 192.168.0.0 -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
第一行设置一条规则,允许 192.168.0.1/24 子网中的所有源 IP 地址。您还可以使用 CIDR 或单独的 IP 地址。在以下命令中,我们设置规则以允许连接到现有连接的所有流量。在最后的命令中,我们为 INPUT 和 FORWARD 设置了删除所有命令的策略。
在 IPv6 上使用 iptables
iptables 命令仅适用于 IPv4。要在 IPv6 上使用 iptables,必须使用 ip6tables 命令。 Ip6tables 使用 raw、filter、security 和 mangle 表。 ip6tables 的一般语法与 iptables 类似,也支持匹配 iptables 选项,如追加、删除等。
考虑使用 ip6tables 手册页来获取更多信息。
网络安全 iptables 规则集示例
创建合适的防火墙规则主要取决于系统上运行的服务和使用的端口。但是,您可以使用以下一些基本网络配置规则来保护系统:
1:允许环回接口流量并拒绝来自其他接口的所有环回
iptables -A INPUT ! -i lo -s 127.0.0.0 -j REJECT (ip6tables also applicable)
2:拒绝所有 ping 请求
3:允许SSH连接
这些是可用于保护系统安全的示例命令。但是,配置在很大程度上取决于您想要访问哪些服务或谁想要访问各种服务。
注意:如果您希望完全禁用 IPv6,请确保取消注释该行,因为这会减慢更新过程:
这是因为 APT 包管理器由于 apt-get update 解析了 IPv6 中的镜像域。
如何部署iptables规则?
要在 Ubuntu 或其他基于 Debian 的系统上部署 iptables,首先为各自的 IP 地址创建两个文件 ip4 和 ip6。
在任一文件中,将您希望在其相应文件中强制执行的规则添加到 ip4 文件中的 IPv4 规则和到 ip6 文件中的 IPv6 规则。
接下来,我们需要使用以下命令导入规则:
然后,您可以使用以下命令验证规则是否已应用:
iptables 持久快速指南
Ubuntu 和常见的基于 Debian 的发行版附带了 iptables-persistent 软件包,允许您在重新启动时轻松应用防火墙规则。该软件包提供了可用于设置 IPv4 或 IPv6 规则的文件,并且可以在启动时自动应用。
您还可以使用 UFW 或 GUFW 来使用防火墙规则。请考虑以下教程来学习如何使用 UFW。
如何安装 iptables 持久化?
确保您的系统上安装了 iptables-persistent。使用 dpkg 检查是否安装了该软件包。
如果没有,请使用以下命令:
系统将提示您两次保存当前的 IPv4 和 IPv6 规则。单击“是”保存这两个规则。
单击“是”保存 IPv6。
安装完成后,验证您是否拥有 iptables 子目录,如下图所示。
结论
在本教程中,我们介绍了 iptables 的基础知识。从使用 iptables、基本命令、默认 iptables 表和参数开始。
根据您所学到的知识,您应该能够使用 iptables 创建防火墙规则来帮助保护您的系统。