命令行手册

Man » iptables 在线手册 - iptables 手册页的详细在线文档

🌍
iptables/ip6tables — IPv4/IPv6 数据包过滤和 NAT 的管理工具

概要

iptables [-t table] {-A|-C|-D|-V} chain rule-specification

ip6tables [-t table] {-A|-C|-D|-V} chain rule-specification

iptables [-t table] -I chain [rulenum] rule-specification

iptables [-t table] -R chain rulenum rule-specification

iptables [-t table] -D chain rulenum

iptables [-t table] -S [chain [rulenum]]

iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

iptables [-t table] -N chain

iptables [-t table] -X [chain]

iptables [-t table] -P chain policy

iptables [-t table] -E old-chain-name new-chain-name

rule-specification := [matches...] [target]

match := -m matchname [per-match-options]

target := -j targetname [per-target-options]

描述

Iptables 和 ip6tables 用于设置、维护和检查 Linux 内核中的 IPv4 和 IPv6 数据包过滤规则表。可以定义多个不同的表。每个表包含一些内置链,并且也可以包含用户定义的链。

每个链都是一系列规则的列表,这些规则可以匹配一组数据包。每个规则指定对匹配的数据包执行什么操作。这称为“目标”,可以是跳转到同一表中的用户定义的链。

目标

防火墙规则指定数据包的标准和一个目标。如果数据包不匹配,则检查链中的下一个规则;如果匹配,则下一个规则由目标的值指定,该目标可以是用户定义链的名称、iptables-extensions(8) 中描述的目标之一,或者 ACCEPT、DROP 或 RETURN 这些特殊值之一。

ACCEPT 表示允许数据包通过。DROP 表示将数据包丢弃。RETURN 表示停止遍历此链,并从先前的(调用)链中的下一个规则开始。如果到达内置链的末尾,或者在内置链中匹配了具有 RETURN 目标的规则,则链策略中指定的目标决定了数据包的命运。

当前有五个独立的表(任何时候存在的表取决于内核配置选项以及存在的模块)。

-t, --table table

此选项指定命令应操作的包匹配表。如果内核配置为自动加载模块,则如果尚未加载,将尝试加载该表的相应模块。


以下是各个表:

filter:

这是默认表(如果未传递 -t 选项)。它包含内置链:INPUT(用于发送到本地套接字的包)、FORWARD(用于路由通过该机器的包)和 OUTPUT(用于本地生成的包)。

nat:

当遇到创建一个新连接的包时,会查阅此表。它由四个内置链组成:PREROUTING(用于在包进入时对其进行更改)、INPUT(用于更改发送到本地套接字的包)、OUTPUT(用于在路由之前更改本地生成的包)和 POSTROUTING(用于在包即将发送出去时对其进行更改)。自内核 3.7 起,支持 IPv6 NAT。

mangle:

此表用于专门的包更改。在内核 2.4.17 之前,它有两个内置链:PREROUTING(用于在路由之前更改传入的包)和 OUTPUT(用于在路由之前更改本地生成的包)。从内核 2.4.18 开始,还支持另外三个内置链:INPUT(用于进入该机器的包)、FORWARD(用于更改路由通过该机器的包)和 POSTROUTING(用于在包即将发送出去时对其进行更改)。

raw:

此表主要用于配置与 NOTRACK 目标结合的连接跟踪豁免。它以更高的优先级注册到 netfilter 钩点,因此在 ip_conntrack 或任何其他 IP 表之前调用。它提供以下内置链:PREROUTING(用于通过任何网络接口到达的包)和 OUTPUT(用于本地进程生成的包)。

security:

此表用于强制访问控制 (MAC) 网络规则,例如由 SECMARK 和 CONNSECMARK 目标启用的规则。强制访问控制由 Linux 安全模块(如 SELinux)实现。在 filter 表之后调用 security 表,允许 filter 表中的任何自主访问控制 (DAC) 规则在 MAC 规则生效之前生效。此表提供以下内置链:INPUT(用于进入该机器的包)、OUTPUT(用于在路由之前更改本地生成的包)和 FORWARD(用于更改路由通过该机器的包)。

选项

iptables 和 ip6tables 识别的选项可以分为几个不同的组。

命令

这些选项指定要执行的所需操作。除非另有说明,否则只能在命令行中指定其中一个。对于命令和选项名称的长版本,您只需要使用足够多的字母,以便 iptables 可以将其与其他选项区分开。

-A, --append chain rule-specification

将一个或多个规则附加到所选链的末尾。当源和/或目标名称解析为多个地址时,将为每种可能的地址组合添加一个规则。

-C, --check chain rule-specification

检查是否在所选链中存在与规范匹配的规则。此命令使用与 -D 相同的逻辑来查找匹配的条目,但不更改现有的 iptables 配置,并使用其退出代码来指示成功或失败。


-D, --delete chain rule-specification
-D, --delete chain rulenum

从选定的链中删除一个或多个规则。 此命令有两种形式: 规则可以指定为链中的编号(从链中的第一个规则开始编号为 1),也可以指定为匹配的规则。

-I, --insert chain [rulenum] rule-specification

将一个或多个规则插入到选定的链中,作为给定的规则编号。 因此,如果规则编号为 1,则规则或规则将被插入到链的头部。 如果未指定规则编号,则默认为此行为。

-R, --replace chain rulenum rule-specification

替换选定链中的一个规则。 如果源和/或目标名称解析为多个地址,则该命令将失败。 规则的编号从 1 开始。

-L, --list [chain]

列出选定链中的所有规则。 如果未选择链,则列出所有链。 与其他 iptables 命令一样,它适用于指定的表(默认表为 filter),因此 NAT 规则通过 iptables -t nat -n -L 列出。 请注意,它通常与 -n 选项一起使用,以避免进行长时间的反向 DNS 查找。 也可以指定 -Z(零)选项,在这种情况下,链(们)将原子地列出并清零。 确切的输出受其他给定的参数影响。 确切的规则将被抑制,直到您使用 iptables -L -v 或 iptables-save(8)。

-S, --list-rules [chain]

打印选定链中的所有规则。 如果未选择链,则像 iptables-save 一样打印所有链。 与其他 iptables 命令一样,它适用于指定的表(默认表为 filter)。

-F, --flush [chain]

清除选定的链(如果未指定,则清除表中的所有链)。 这等效于逐个删除所有规则。

-Z, --zero [chain [rulenum]]

将所有链中、给定链中或链中给定规则中的数据包计数器和字节计数器清零。 也可以指定 -L,--list(列表)选项,以在清除计数器之前立即查看计数器。 (参见上文。)

-N, --new-chain chain

通过给定的名称创建一个新的用户定义的链。 不能存在具有相同名称的已存在的目标。

-X, --delete-chain [chain]

删除指定的链。 不能有对该链的引用。 如果存在引用,则必须先删除或替换引用规则,然后才能删除该链。 该链必须为空,即不包含任何规则。 如果没有给出参数,它将删除表中所有空链。 只能使用 iptables-nft 删除空的内置链。

-P, --policy chain target

将内置(非用户定义的)链的策略设置为给定的目标。 策略目标必须是 ACCEPT 或 DROP。


-E, --rename-chain old-chain new-chain
重命名用户指定的链到用户提供的名称。这只是外观上的更改,不会影响表的结构。

-h     帮助。提供(目前非常简短的)命令语法的描述。

参数

以下参数构成规则规范(如用于添加、删除、插入、替换和追加命令)。

-4, --ipv4
此选项在 iptables 和 iptables-restore 中没有效果。如果使用带有 -4 选项的规则插入到 ip6tables-restore 中(并且仅插入到 ip6tables-restore 中),则会被静默忽略。任何其他使用方式都会引发错误。此选项允许在单个规则文件中使用 IPv4 和 IPv6 规则,以便与 iptables-restore 和 ip6tables-restore 一起使用。

-6, --ipv6
如果使用带有 -6 选项的规则插入到 iptables-restore 中(并且仅插入到 iptables-restore 中),则会被静默忽略。任何其他使用方式都会引发错误。此选项允许在单个规则文件中使用 IPv4 和 IPv6 规则,以便与 iptables-restore 和 ip6tables-restore 一起使用。此选项在 ip6tables 和 ip6tables-restore 中没有效果。

[!] -p, --protocol protocol
规则或要检查的数据包的协议。指定的协议可以是 tcp、udp、udplite、icmp、icmpv6、esp、ah、sctp、mh 或特殊关键字“all”,也可以是数字值,代表这些协议中的一个或另一个协议。/etc/protocols 中的协议名称也是允许的。在协议之前使用“!”会反转测试。数字零等效于 all。“all”将匹配所有协议,并且在省略此选项时,它将被视为默认值。请注意,在 ip6tables 中,除 esp 之外的 IPv6 扩展头是不允许的。可以使用 Kernel 6.11 或更高版本的 esp 和 ipv6-nonext。数字零等效于 all,这意味着您不能直接测试协议字段的值是否为 0。要匹配 HBH 标头,即使它是最后一个,也不能使用 -p 0,而应始终使用 -m hbh。

[!] -s, --source address[/mask][,...]
源规范。地址可以是网络名称、主机名、网络 IP 地址(带有 /mask)或纯 IP 地址。主机名将仅解析一次,然后在将规则提交到内核之前。请注意,指定任何需要通过远程查询(如 DNS)解析的名称是一个非常糟糕的主意。掩码可以是 IPv4 网络掩码(用于 iptables)或纯数字,指定网络掩码左侧的 1 的数量。因此,iptables 掩码 24 等效于 255.255.255.0。“!”符号后的地址规范会反转地址的含义。标志 --src 是此选项的别名。可以指定多个地址,但这会扩展到多个规则(在使用 -A 添加时),或者会导致删除多个规则(在使用 -D 删除时)。

[!] -d, --destination address[/mask][,...]
目标规范。请参阅 -s(源)标志的描述,以获取对语法的详细描述。标志 --dst 是此选项的别名。

-m, --match match
指定要使用的匹配项,即用于测试特定属性的扩展模块。
匹配项的集合构成目标被调用的条件。匹配项按命令行中指定的顺序从第一个开始进行评估,并且以短路方式工作,即如果一个扩展返回 false,则评估将停止。

-j, --jump target
这指定了规则的目标;即,如果数据包匹配规则,应该执行什么操作。
目标可以是用户定义的链(不包括规则所在的链),也可以是内置的特殊目标,这些目标会立即决定数据包的命运,或者是一个扩展(请参见“匹配和目标扩展”部分)。如果规则中省略了此选项(并且未使用 -g),那么匹配该规则不会对数据包的命运产生任何影响,但规则上的计数器会递增。

-g, --goto chain
这指定处理应该继续在用户指定的链中进行。与 --jump 选项不同,RETURN 不会继续在此链中处理,而是继续在通过 --jump 调用我们的链中处理。

[!] -i, --in-interface name
数据包通过哪个接口接收(仅适用于进入 INPUT、FORWARD 和 PREROUTING 链的数据包)。如果使用“!”符号在接口名称之前,则含义反转。如果接口名称以“+”结尾,则任何以该名称开头的接口都将匹配。如果省略此选项,则任何接口名称都将匹配。

[!] -o, --out-interface name
数据包将通过哪个接口发送(适用于进入 FORWARD、OUTPUT 和 POSTROUTING 链的数据包)。如果使用“!”符号在接口名称之前,则含义反转。如果接口名称以“+”结尾,则任何以该名称开头的接口都将匹配。如果省略此选项,则任何接口名称都将匹配。

[!] -f, --fragment
这意味着规则仅引用 IPv4 数据包的第二个或后续片段。由于无法确定这些数据包的源端口或目标端口(或 ICMP 类型),因此这些数据包将不会匹配任何指定这些端口的规则。如果“!”符号位于“-f”标志之前,则该规则仅匹配头部片段或未分片的数据包。此选项是 IPv4 特定的,在 ip6tables 中不可用。

-c, --set-counters packets bytes
这使管理员能够在 INSERT、APPEND、REPLACE 操作期间初始化规则的包和字节计数器。

其他选项

可以指定以下其他选项:

-v, --verbose
详细输出。此选项使 list 命令显示接口名称、规则选项(如果有)和 TOS 掩码。还会列出数据包和字节计数器,并带有“K”、“M”或“G”后缀,分别表示 1000、1,000,000 和 1,000,000,000 倍。请参阅 -x 标志以更改此设置。对于附加、插入、删除和替换,这将导致打印有关规则或规则的详细信息。-v 可以多次指定,以可能发出更多详细的调试语句:指定两次,iptableslegacy 将转储表信息和 libiptc 中的条目,iptables-nft 将以 netlink(VM 代码)表示形式转储规则。指定三次,iptables-nft 还会转储发送到内核的任何 netlink 消息。

-V, --version

显示程序版本和使用的内核 API。

-w, --wait [秒]

等待 xtables 锁。为了防止程序的多个实例并发运行,程序启动时会尝试获取一个独占锁。默认情况下,如果无法获取该锁,程序将退出。此选项将使程序等待(无限期或指定的秒数),直到可以获取独占锁。

-n, --numeric

数字输出。IP 地址和端口号将以数字格式打印。默认情况下,程序会尝试将它们显示为主机名、网络名或服务名称(在适用时)。

-x, --exact

扩展数字。显示数据包和字节计数器的确切值,而不是仅显示四舍五入后的数字,以 K(1000 的倍数)、M(1000K 的倍数)或 G(1000M 的倍数)为单位。此选项仅与 -L 命令相关。

--line-numbers

列出规则时,在每个规则的开头添加行号,对应于该规则在链中的位置。

--modprobe=命令

在将规则添加到或插入链中时,使用该命令加载任何必需的模块(目标、匹配扩展等)。

锁文件

iptables 使用 /run/xtables.lock 文件在启动时获取独占锁。

可以使用 XTABLES_LOCKFILE 环境变量来覆盖默认设置。

匹配和目标扩展

iptables 可以使用扩展的包匹配和目标模块。可以在 iptables-extensions(8) 手册页中找到这些模块的列表。

诊断

各种错误消息会打印到标准错误输出。如果一切正常,则退出代码为 0。如果由于无效或滥用的命令行参数而导致错误,则退出代码为 2。如果指示内核空间和用户空间之间存在不兼容性,则退出代码为 3。如果指示存在资源问题,例如繁忙的锁、内存分配失败或来自内核的错误消息,则退出代码为 4。最后,其他错误将导致退出代码为 1。

错误

有错误吗?这算什么?;-) 你可能想看看 https://bugzilla.netfilter.org/ 如果 iptables 发现它被作为以 root 用户身份运行的程序调用,它将立即以错误代码 111 退出。由于 iptables 信任在运行时加载的共享库(匹配项、目标),因此无法安全地以这种方式使用 iptables,并且可以使用环境变量设置搜索路径。


与 IPCHAINS 的兼容性

这个 iptables 与 Rusty Russell 的 ipchains 非常相似。 主要区别在于,INPUT 和 OUTPUT 链仅用于处理进入本地主机的包和从本地主机发出的包。 因此,每个包仅通过其中三个链之一(除了环回流量,环回流量涉及 INPUT 和 OUTPUT 链); 之前,转发的包会通过所有三个链。

另一个主要区别是,-i 指的是输入接口;-o 指的是输出接口,并且两者都可用于进入 FORWARD 链的包。

各种形式的 NAT 已被分离;在使用默认的 filter 表时,iptables 是一个纯粹的包过滤器,并带有可选的扩展模块。 这应该可以避免之前看到的 IP 伪装和包过滤器的组合所引起的大量混淆。 因此,以下选项的处理方式不同: -j MASQ -M -S -M -L iptables 中还有一些其他的更改。

参见

iptables-apply(8)、iptables-save(8)、iptables-restore(8)、iptables-extensions(8)

packet-filtering-HOWTO 详细介绍了 iptables 在包过滤方面的用法,NAT-HOWTO 详细介绍了 NAT,netfilter-extensions-HOWTO 详细介绍了未包含在标准发行版中的扩展,netfilter-hacking-HOWTO 详细介绍了 netfilter 内部结构。 请访问 https://www.netfilter.org/。

作者

Rusty Russell 最初编写了 iptables,并在早期与 Michael Neuling 进行了咨询。

Marc Boucher 通过提倡在 iptables 中使用通用的包选择框架,从而使 Rusty 放弃了 ipnatctl,然后编写了 mangle 表、owner 匹配、mark 相关内容,并四处进行各种酷炫的工作。

James Morris 编写了 TOS 目标和 tos 匹配。

Jozsef Kadlecsik 编写了 REJECT 目标。

Harald Welte 编写了 ULOG 和 NFQUEUE 目标、新的 libiptc,以及 TTL、DSCP、ECN 匹配和目标。

Netfilter 核心团队成员:Jozsef Kadlecsik、Pablo Neira Ayuso、Eric Leblond、Florian Westphal 和 Arturo Borrero Gonzalez。 荣誉核心团队成员:Marc Boucher、Martin Josefsson、Yasuyuki Kozakai、James Morris、Harald Welte 和 Rusty Russell。

Herver Eychenne 最初编写了本手册页。

版本

本手册页适用于 iptables/ip6tables 1.8.11。