iptables深度指南


前言

Linux 内核带有一个名为 netfilter 的数据包过滤框架。 它允许您allow、drop和modify进出系统的流量。 iptables是建立在此功能之上的一个工具,以提供强大的防火墙功能,可以通过添加规则对其进行配置。 此外,fail2ban 等其他程序也使用 iptables 来阻止攻击者。
在本文中,我们将了解 iptables 的工作原理。 还将看到一些示例,这将帮助编写自己的规则。


提示:以下是本篇文章正文内容,下面案例可供参考

一、iptables 是如何工作的?

iptables 只是 netfilter 中包过滤功能的命令行界面。 但是,为了保持本文的简单,我们不会在本文中区分 iptables 和 netfilter,而将整个东西简单地称为“iptables”。
iptables 提供的包过滤机制被组织成三种不同的结构:表(table)、链(chain)和目标(target)。 简单地说,表是一种允许以特定方式处理数据包的东西。 默认表是filter表,但也有其他表。
同样,这些表都有连接到它们的链。 这些链允许在各个点检查流量,例如当它们刚刚到达网络接口时或就在它们被移交给进程之前。 您可以向它们添加规则以匹配特定数据包(例如前往端口 80 的 TCP 数据包)并将其与目标相关联。 目标决定数据包的命运,例如允许或拒绝它。
当一个数据包到达(或离开,取决于链)时,iptables 将它与这些链中的规则一一匹配。 当它找到匹配项时,它会跳到目标上并执行与其相关的操作。 如果它没有找到与任何规则匹配的内容,它只会按照链的默认策略告诉它去做。 默认策略也是一个目标。 默认情况下,所有链都有一个允许数据包的默认策略。
现在,我们将更深入地研究这些结构中的每一个。

1.1 Tables

正如之前提到,表允许对数据包执行具体的操作。在现代 Linux 发行版上,有四个表:
filter表:这是默认的,也许是使用最广泛的表。它用于决定是否应允许数据包到达其目的地。
mangle表:此表允许以各种方式更改数据包标头,例如更改 TTL 值。
nat 表:允许通过更改数据包的源地址和目标地址,将数据包路由到 NAT(网络地址转换)网络上的不同主机。它通常用于允许访问无法直接访问的服务,因为它们位于 NAT 网络上。
raw表:iptables 是一个有记录数据包状态能力的防火墙,意味着能检查数据包的“状态”。 (例如,数据包可能是新连接的一部分,也可能是现有连接的一部分。)raw表允许在内核开始跟踪其状态之前处理数据包。此外,还可以从状态跟踪机制中豁免某些数据包

1.2 Chains

现在,这些表中的每一个都由几个默认链组成。这些链允许在各个点过滤数据包。 iptables 提供的链列表是:
PREROUTING 链:此链中的规则适用于刚到达网络接口的数据包。该链存在于 nat、mangle 和 raw 表中。
INPUT 链:此链中的规则在数据包被提供给本地进程之前适用于数据包。该链存在于 mangle 和 filter 表中。
OUTPUT 链:这里的规则适用于刚刚由进程生成的数据包。该链存在于 raw、mangle、nat 和 filter 表中。
FORWARD 链:这里的规则适用于通过当前主机路由的任何数据包。该链仅存在于 mangle 和 filter 表中。
POSTROUTING 链:此链中的规则适用于刚刚离开网络接口的数据包。该链存在于 nat 和 mangle 表中。
下图显示了通过各个表中的链的数据包流:
在这里插入图片描述

1.3 Targets

正如之前提到的,链允许通过向流量添加规则来过滤流量。 例如,可以在filter表的 INPUT 链上添加一条规则来匹配端口 22 上的流量。但是在匹配它们之后会做什么呢? 这就是目标的用途——它们决定了数据包的命运。
一些目标正在终止,意味着数据包已经匹配规则,必须立即决定它们的去向。 该数据包不会与任何其他规则匹配。 最常用的终止目标是:
ACCEPT:这会导致 iptables 接受数据包。
DROP:iptables 丢弃数据包。 对于任何试图连接到系统的人来说,系统似乎根本不存在。
REJECT:iptables “拒绝”数据包。 如果是 TCP,它会发送一个“connection reset”数据包,或者如果是 UDP 或 ICMP,它会发送一个“destination host unreachable”数据包。
另一方面,有non-terminating(非终止目标),即使找到匹配项,它们也会继续匹配其他规则。 这方面的一个例子是内置的 LOG 目标。 当接收到匹配的数据包时,它会在内核日志中记录它。 但是,iptables 也不断将其与其他规则相匹配。
有时,一旦匹配了数据包,可能需要执行一组复杂的规则。 为了简化事情,可以创建一个自定义链。 然后,可以从自定义链之一跳转到该链。

现在我们了解了 iptables 背后的理论,我们将看一些示例。

二、关于 iptables 命令的说明

Internet 协议有两个版本——IPv4 和 IPv6。 这些协议有一些差异,并且在内核中的处理方式也不同。 因此,iptables 为这些协议提供了不同的命令——用于 IPv4 的 iptables 和用于 IPv6 的 ip6tables。
无论怎样,这些命令接受的选项变化不大。 稍后在本文的相应部分中讨论了这些差异。
此外,还需要以 root 身份执行所有 iptables 命令。 可以通过输入 su -c 然后输入root 密码来启动 root shell,然后运行本文中的命令。 或者,可以在每个 iptables 命令前添加 sudo。

三、Block IPs(封锁ip)

防火墙最常见的用途是阻止IP。 例如,假设 IP 59.45.175.62 不断尝试攻击服务器,如果想阻止它。 我们需要简单地阻止来自该 IP 的所有传入数据包。 因此,需要将此规则添加到filter表的 INPUT 链中。 可以这样做:

iptables -t filter -A INPUT -s 59.45.175.62 -j REJECT

-t 开关指定规则将进入的表——在这个例子中,它是filter表。 -A 开关告诉 iptables 将其“附加”到 INPUT 链中现有规则的列表中。 但是,如果第一次使用 iptables,则不会有任何其他规则,这将是第一个。
-s 开关只是设置应该被阻止的源 IP。 最后,-j 开关告诉 iptables 使用 REJECT 目标“reject”流量。 如果希望 iptables 根本不响应,则可以使用 DROP 目标。

之前,我们已经提到如果iptables没有指定table,默认将使用filter表。 所以你可以省略-t开关,这样可以节省一些输入:

iptables -A INPUT -s 59.45.175.62 -j REJECT

您还可以使用 CIDR 表示法去阻止一个 IP 范围。 如果想阻止从 59.145.175.0 到 59.145.175.255 的所有 IP,你可以这样做:

iptables -A INPUT -s 59.45.175.0/24 -j REJECT

如果要阻止到 某个IP 的输出流量,则应使用 OUTPUT 链和 -d 标志来指定目标 IP:

iptables -A OUTPUT -d 31.13.78.35 -j DROP

四、Listing rules

现在,假设我们通过附加规则阻止了几个 IP。 如果您想稍后查看这些规则,可以使用 -L 开关。 此外,正如我们将在下一节中看到的,查看这些规则的行号非常有帮助,因此我们还将使用 --line-numbers 开关。

iptables -L --line-numbers

运行此命令会为我们提供如下规则列表。 此列表也来自filter表,您也可以使用 -t 开关列出其他表。

Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 59.45.175.0/24 anywhere
2 DROP all -- 221.194.47.0/24 anywhere
3 DROP all -- 91.197.232.104/29 anywhere
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- anywhere 31.13.78.0/24

在我们的示例中,我们在 INPUT 链中阻止了三个 IP 范围,在 OUTPUT 链中阻止了一个。 FORWARD 链中没有规则。
iptables 还尝试通过对 IP 进行反向 DNS 查找来提供帮助。 通常,这是不必要的,并且会减慢list过程。 要禁用此功能,可以使用 -n 开关:

iptables -L -n --line-numbers

五、Delete rules

现在,假设错误地阻止了 IP 范围 221.194.47.0/24。 删除它很容易:只需将 -A 替换为 -D,它会删除一条规则:

iptables -D INPUT -s 221.194.47.0/24 -j REJECT

还可以通过其行号删除规则。 如果要从 INPUT 链中删除第二条规则,则命令为:

iptables -D INPUT 2

当删除不是最后一条规则的规则时,行号会发生变化,因此最终可能会删除错误的规则! 所以,如果要删除一堆规则,应该首先删除行号最高的那些。 如果要从 INPUT 链中删除第 9 条和第 12 条规则,您将运行:

iptables -D INPUT 12
iptables -D INPUT 9

有时,可能需要删除特定链中的所有规则。 一个一个地删除它们是不切实际的,所以有一个 -F 开关可以“刷新”一个链。 例如,如果想刷新filter表的 INPUT 链,你可以运行:

iptables -F INPUT

六、Inserting and replacing rules(插入和替换规则)

到目前为止,我们已经看到了append和删除规则的示例。 事实证明,还可以在给定位置插入规则! 这在许多情况下都很有用。 我们将在list rule部分使用前面的示例。 当看到来自 59.45.175.0/24 的攻击时,假设需要将 59.45.175.10 列入白名单。
由于 iptables 会逐一评估链中的规则,因此只需在阻止 59.45.175.0/24 的规则上方添加一条规则以“接受”来自该 IP 的流量。 因此,可以运行以下命令:

iptables -I INPUT 1 -s 59.45.175.10 -j ACCEPT

这条规则被插入到第一行,它使阻止 59.45.175.0/24 的规则进入第二行。 您可以通过l列出规则来验证这一点:

Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 59.45.175.10 0.0.0.0/0
2 DROP all -- 59.45.175.0/24 0.0.0.0/0
3 DROP all -- 221.192.0.0/20 0.0.0.0/0
4 DROP all -- 91.197.232.104/29 0.0.0.0/0

您还可以使用 -R 开关替换规则。 例如,您可能将错误的 IP 列入白名单,并输入 59.45.175.12 而不是 59.45.175.10。 由于新规则位于第一行,因此您可以将其替换为正确的规则,如下所示:

iptables -R INPUT 1 -s 59.45.175.10 -j ACCEPT

七、Protocols and modules协议和模块

到目前为止,我们已经看到了阻止 IP 的示例。 但是,您可以通过使用基于模块和协议的匹配来做更多事情。
我们将从一个简单的例子开始。 假设您想阻止所有传入的 TCP 流量。 这不是太有用,但它是一个有用的起点。 只需要使用 -p 指定协议,如下所示:

iptables -A INPUT -p tcp -j DROP

您还可以指定其他协议,例如 udp 或 icmp。 要在 ip6tables 上处理 ICMP 流量,您需要使用 ipv6-icmp 作为协议。
我们考虑一个更有用的例子。 假设您需要阻止某个 IP 范围的 SSH 访问。 您必须首先匹配所有 TCP 流量,就像我们在上面的示例中所做的那样。 然后,要检查目标端口,应该首先使用 -m 加载 tcp 模块。 接下来,可以使用 --dport 检查流量是否打算发送到 SSH 目标端口。 因此,整个命令将是:

iptables -A INPUT -p tcp -m tcp --dport 22 -s 59.45.175.0/24 -j DROP

现在,也许您想阻止某个 IP 范围的 SSH 和 VNC 访问。 虽然不能使用 tcp 模块指定多个端口,但可以使用 multiport 模块来指定。 然后,可以使用 --dports 指定端口号。 最后的命令是:

iptables -A INPUT -p tcp -m multiport --dports 22,5901 -s 59.45.175.0/24 -j DROP

让考虑另一个例子。 假设想阻止 ICMP 地址掩码请求(类型 17)。 首先,应该匹配 ICMP 流量,然后使用 icmp 模块中的 icmp-type 匹配流量类型:

iptables -A INPUT -p icmp -m icmp --icmp-type 17 -j DROP

下一节中,将介绍一个非常重要的模块:the connection tracking module(连接跟踪模块)。 此外,还将在本文后面介绍其他模块。

八、The Connection tracking module(连接跟踪模块)

如果您尝试阻止 INPUT 链上的某些 IP,您可能会注意到一个有趣的警告—— “you can’t access the services hosted on those IPs either!”(您也无法访问托管在这些 IP 上的服务!), 您可能认为 INPUT 链中的规则会以某种方式影响 OUTPUT 链上的流量,但事实并非如此。 来自您系统的数据包确实会到达服务器。 但是,服务器发送到您的系统的数据包会被拒绝。 (有关其他示例,请参见下一节。)
我们在这里真正需要的是一种方法来告诉 iptables 不要接触属于现有连接的数据包。 幸运的是,iptables 是一个有状态的防火墙,它为此提供了一个名为“conntrack”的连接跟踪模块。 此模块跟踪的连接将处于以下状态之一:
NEW:此状态表示连接的第一个数据包。
ESTABLISHED:此状态用于作为现有连接一部分的数据包。 对于处于这种状态的连接,它应该已经收到来自其他主机的回复。
RELATED:此状态用于与另一个 ESTABLISHED 连接相关的连接。 这方面的一个例子是 FTP 数据连接——它们与已经“建立”的控制连接“相关”。
无效:此状态意味着数据包没有正确的状态。 这可能是由于多种原因造成的,例如系统内存不足或某些类型的 ICMP 流量。
UNTRACKED:任何在原始表中以 NOTRACK 目标免于连接跟踪的数据包最终都处于此状态。
DNAT:这是一个虚拟状态,用于表示目标地址被 nat 表中的规则更改的数据包。
SNAT:与 DNAT 一样,此状态表示源地址已更改的数据包。
因此,需要放置一条如下所示的规则,通常位于最顶部。 (如果这不是第一条规则,请使用 -I 将其放在顶部。) --ctstate 开关设置状态。 在一些较旧的内核上,这个模块被命名为 state,开关被命名为 --state 而不是 --ctstate。

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

此外,丢弃任何处于无效状态的数据包通常是一个好主意。 您可以将其放置在上述规则的位置的正下方。

iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

九、Changing the default policy(改变默认策略)

之前,我们已经解释了默认策略的概念。 默认情况下,默认链具有接受所有流量的默认策略。 这也是您可以在规则列表中看到的内容:

Chain INPUT (policy ACCEPT)
...
Chain FORWARD (policy ACCEPT)
...
Chain OUTPUT (policy ACCEPT)
..

可以使用 -P 开关更改默认策略。 也许您正在为您的家用计算机配置 iptables,并且您不希望任何本地程序接收入站连接。 将 iptables 设置为接受来自相关和已建立连接的数据包后,您可以将 INPUT 链的策略切换为 DROP:

iptables -P INPUT DROP

请记住,在使用此规则之前,应该首先接受来自established和rerlated状态的数据包! 如果你不这样做,你会发现你不能使用任何基于互联网的应用程序,因为通过 INPUT 链进入的响应将被drop。

十、Selecting interface(选择接口)

由于 iptables 将数据包与链中的每个规则匹配,因此当有很多规则时,事情会变得非常缓慢。 在这种情况下,豁免某些类型的流量很有用。
例如,在典型的 Nginx/PHP-FPM 堆栈上,Nginx 通过使用环回接口的 localhost 与 PHP 通信。 类似地,PHP 可以使用环回接口连接到像 Redis 这样的数据库服务器。 过滤这些流量是没有用的,所以你可以允许它。 环回接口通常命名为 lo,您可以在 INPUT 链的顶部添加这样的规则:

iptables -A INPUT -i lo -j ACCEPT

-i 标志指定输入接口。 在这里,我们假设 INPUT 链是空的,并且您正在添加第一条规则。 如果不是这种情况,您需要使用 -I 开关将其添加到顶部。
对于 OUTPUT 链,您需要使用 -o 标志,它代表“输出接口”。 例如,假设您只想在使用 WiFi 时阻止 IP 范围 121.18.238.0/29。 如果 WiFi 接口命名为 wlan0,您可以添加如下规则:

iptables -A OUTPUT -o wlan0 -d 121.18.238.0/29 -j DROP

十一、The negating conditions(否定条件)

至此,已经看到了很多关于如何根据特定条件匹配数据包的示例。 但是,在某些情况下,可能需要否定这些条件检查。 为此,iptables 提供了否定运算符 (!)。
在服务器上运行 node.js 或 Go Web 应用程序的一种非常常见的方法是在它们前面放置一个服务器,例如 nginx。 配置 nginx 以将流量转发到应用程序后,无需直接访问它。 换句话说,你只需要接受用于 HTTP、HTTPS 和 SSH 的 TCP 流量——你可以放弃其余的:

iptables -A INPUT -p tcp -m multiport ! --dports 22,80,443 -j DROP

但是,在使用此规则之前,应该首先接受来自已estitableshed和related状态连接的数据包! 如果不这样做,会发现不能使用任何基于 TCP 的应用程序。 这是因为合法的 TCP 流量也会被丢弃。

十二、Blocking invalidate packages with tcp module使用 tcp 模块阻止无效的 TCP 数据包

我们对 iptables 有了一定的了解,现在设计一些规则来阻止无效的 TCP 数据包。 tcp 模块有一个 --tcp-flags 开关,可以使用它来检查各个 TCP 标志。 这个开关有两个参数:一个“mask”和一组"compared flag”。 mask选择应该检查的标志,而“compared flag”选择应该在数据包中设置的标志。

现在,例如,您想阻止Christmas tree packets数据包。 因此,需要检查“所有”flag",但只会设置 FIN、PSH 和 URG。 因此,您可以编写如下规则:

iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

此外,也可以拒绝许多其他类型的无效数据包。 例如,设置了 SYN 和 FIN 的数据包是无效的。 在这种情况下,只需检查这些标志并验证它们是否已设置。 所以,规则是:

iptables -A INPUT -p tcp -m tcp --tcp-flags ALL FIN,PSH,URG -j DROP

接下来,我们将考虑另一种无效数据包——不以 SYN 开头的“新”连接。 在这里,只需检查 FIN、RST、ACK 和 SYN 标志; 无论怎样只有 SYN应该被设置。 然后,可以否定此条件。 最后,您可以使用 conntrack 来验证连接是否是新的。 因此,规则是:

iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j DROP

十三、Limiting packages:the limit module(限制数据包:limit 模块)

在本节中,我们将研究另一个模块:limit。该模块的工作是限制通过的数据包数量。

为了理解这个模块是如何工作的,我们将使用一个类比。假设,给你一个包含 5 个令牌的桶。每当一个数据包进来,你应该扔掉一个令牌。此外,如果存储桶为空,则不能允许数据包进来。此外,您可以以每小时 3 个(或 20 分钟 1 个)的速度添加回令牌。从技术上讲,令牌的数量是“limit-burst”值,可以重新填充它的速率是“limit”值。

现在,假设有 10 个数据包到达您的系统。为了接受前五个数据包,您丢弃前五个令牌。因为您的桶现在是空的,所以您必须丢弃其余的。事实上,在接下来的 20 分钟内,您不能再接受任何数据包,因为在此之前您的存储桶将是空的。现在,假设 45 分钟过去了,三个数据包到达。您可以只接受前两个,因为您的存储桶现在只有两个令牌。如果 100 分钟过去了你还没有收到一个数据包,那么这个桶就会被完全重新装满。

作为一个实际示例,假设您想要对 ICMP 数据包进行速率限制。像这样的规则可以完成这项工作:

iptables -A INPUT -p icmp -m limit --limit 1/sec --limit-burst 1 -j ACCEPT

只要流量在给定的限制范围内,数据包就会被接受。 但是,一旦数据包流超过此限制,流量就会通过此规则传递给其他规则。 因此,您应该在 INPUT 链上设置默认的 DROP 策略以使其正常工作。

十四、Per-IP packet limits: the recent module

不幸的是,限制模块无法处理每个 IP 的动态限制。 这是recent module出现的原因。

也许你在 SSH 服务器上遇到过一些蛮力攻击。 通常,攻击者会尝试建立许多连接以加快攻击速度。 因此,可以像这样设置每个 IP 的限制,这将减慢攻击者的速度:

iptables -A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name SSHLIMIT --rsource
iptables -A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name SSHLIMIT --update --seconds 180 --hitcount 5 --name SSH --rsource -j DROP

我们为限制模块设置了一个名称,可以通过它来跟踪事物——在我们的例子中,它是“SSHLIMIT”。 第一行将源 IP 添加到recent module维护的列表中。 如果 IP 已在此列表中,则更新此 IP 的条目。 在下一行中,我们检查计数器是否在 180 秒内达到了 5 。 如果如此,丢弃数据包。 因此,这个允许在 3 分钟内从一个 IP 建立 4 个新的 SSH 连接。

一些最近的内核也有一个 --mask 参数。 这允许对 IP 范围进行限制。 例如,如果你想限制整个 /24,你可以运行:

iptables ... -m recent ... --mask 255.255.255.0

由于recent module基于名称提供,因此可以做很多技巧。 例如,如果从第二行中删除匹配 SSH 的条件,它将丢弃来自攻击者的所有流量。 如果您愿意,可以使用它来完全阻止攻击者进入您的系统。

十五、the owner module

在家用电脑上,阻止每个用户的流量通常很有用。 owner模块可以帮助完成这项工作。
例如,假设您在家中使用共享计算机。 您不想让你的小孩访问一个 IP为31.13.78.35的特定网站, 假设您的孩子使用用户名为 bobby 的帐户。 因此,iptables 规则将是:

iptables -A OUTPUT -d 31.13.78.35 -m owner --uid-owner bobby -j DROP

您还可以使用数字用户 ID 或范围(例如 1000-1006)作为参数。 同样,您可以使用 --gid-owner 数据包匹配组的数据包。
owner模块仅在 OUTPUT 和 POSTROUTING 链中有效。

十六、Custom chains(自定义链)

有时,可能需要一遍又一遍地对同一个数据包进行一些复杂的处理。 例如,假设希望仅允许SSH 访问几个 IP 范围的。 根据我们目前看到的规则类型,必须执行以下操作:

iptables -A INPUT -p tcp -m tcp --dport 22 -s 18.130.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -s 18.11.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j DROP

不幸的是,这有点笨且低效。 组织这些规则的更好方法是使用自定义链。 首先,需要制作一个自定义链。 我们将命名我们的 ssh 规则:

iptables -N ssh-rules

然后,可以为新链中的 IP 添加规则。 当然,我们不限于只匹配 IP — 可以在这里做任何事情。 但是,由于自定义链没有默认策略,因此请确保最终对数据包进行了处理。 在这里,我们在最后一行添加了drop其他所有的packet。 还有 RETURN 目标,它允从自定义的链返回父链并匹配那里的其他规则——类似于non-terminating目标。

iptables -A ssh-rules -s 18.130.0.0/16 -j ACCEPT
iptables -A ssh-rules -s 18.11.0.0/16 -j ACCEPT
iptables -A ssh-rules -j DROP

现在,应该在引用它的 INPUT 链中放置一条规则:

iptables -A INPUT -p tcp -m tcp --dport 22 -j ssh-rules

使用自定义链具有许多优点。 例如,您可以通过脚本完全管理这条链,而不必担心会干扰到链的其余部分。

如果你想删除这个链,应该首先删除所有引用它的规则。 然后,可以使用以下命令删除链:

iptables -X ssh-rules

十七、Logging packets: the LOG target

我们接触了许多terminating target。 现在将注意力转移到一个常用的non-terminating target:LOG。 顾名思义,它记录志中匹配的数据包的特征到log中。 日志的位置取决于版本,但通常在 /var/log/syslog 或 /var/log/messages 中。
这个目标相当容易使用。 例如,假设想在丢弃无效 TCP 数据包之前记录它们。 您应该首先记录数据包,然后将其丢弃:

iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j LOG
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP

LOG 目标也有一个 --log-prefix 选项,可以使用它以便于之后帮助轻松搜索日志:

iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j LOG --log-prefix=iptables:

十八、iptables-save and iptables-restore

iptables/ip6tables 命令提供了一种插入、删除和管理规则的方法。 但是,工作流程并不是特别好。 首先,必须首先列出现有规则。 接下来,需要弄清楚新规则应该放在哪里,然后编写一个插入规则的命令。 幸运的是,iptables 还附带了两个命令,iptables-save 和 iptables-restore(IPv6 等效项是 ip6tables-save 和 ip6tables-restore)。 这些命令将所有链和filter中的规则转储到标准输出中。 可以将其重定向到这样的文件:

iptables-save > iptables.rules

现在,可以使用文本编辑器轻松地编辑此文件。 完成后,再通过以下方式应用这些规则:

iptables-restore < iptables.rules

也可以使用它们来持久化 iptables 规则,将在下一节中看到。
Preserving iptables rules across reboots

十九、在重新启动时保留 iptables 规则

不幸的是,事实证明 iptables 规则不是持久的——当重新启动系统时它们会丢失。 在 RHEL 和 CentOS 等发行版上,有一个名为“iptables-services”的软件包,您可以安装它:

sudo yum install iptables-services

在 Debian 和 Ubuntu 上,可以安装执行相同操作的“iptables-persistent”软件包。

sudo apt install iptables-persistent

在内部,这两个包都运行 iptables-save/restore 命令来将 iptables 配置保存到文件中。
如果您的发行版没有类似的包,可以简单地编写一个服务文件,在启动时从文件加载 iptables 规则,并在停止时保存它。

二十、总结

防火墙是网络管理员的重要安全工具。 正如我们所见,iptables 提供了一个非常强大的防火墙,可以使用它来保护您的系统。 我们在这里介绍了许多示例,这些示例应该有助于为您管理的系统设计 iptables 规则。

此外,如果愿意阅读更多关于 iptables 的信息,这是一个很好的资源(如果有点长)。 iptables-extensions 的man pagenetfilter extension documentation还涵盖了我们未在此处介绍的其他一些模块。

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值