「iptables(8)」-

  LINUX MANUAL PAGES

用于IPv4/IPv6数据包过滤和NAT的管理工具

命令语法格式

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

ip6tables [-t table] {-A|-C|-D} 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 target

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中,有以下几个术语:

  • Table,表,目前有5个独立的”表“:filter、nat、mangle、raw、security。参见后面的介绍。
  • Chain,链,“链”属于“表”,不同的“表”包含不同的“链”,但通常都包含了INPUT、OUTPUT,或者FORWARD等等。也可以包含“用户自定义的链”。
  • Rule,规则,”规则“用于判断一个数据包是否匹配。
  • Target,目标,如果数据包匹配了”规则“,则跳转到”目标“进行处理,这一步决定了如何处理这个数据包。

可以定义几个不同的表。 每个表包含许多内置的链(Chain),也可能包含用户定义的链。

每个链都是一组可以匹配一组数据包的规则。 每个规则都指定如何处理匹配的数据包。 这称为“目标”,可以跳转到同一个表中的用户定义链。

命令行参数

TABLE

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

-t, –table 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(用于更改通过设备路由的数据包)。

如果未指定-t选项,则默认为filter表。

TARGET

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

ACCEPT意味着让数据包通过。 DROP意味着将数据包丢弃。 RETURN意味着停止遍历此链并继续前一个(调用)链中的下一个规则。 如果达到内置链的末尾,或者匹配目标为RETURN的内置链中的规则,则链策略指定的目标将确定数据包的命运。

命令行选项

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

命令行选项:命令(COMMANDS)

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

链(Chain)管理

-N, –new-chain chain
按给定名称chain创建新的用户定义链。该名称必须还没有目标。

-X, –delete-chain [chain]
删除指定的可选用户定义链。 必须没有对链的引用。 如果有,则必须删除或替换引用规则,才能删除链。 链必须是空的,即不包含任何规则。 如果没有给出参数,它将尝试删除表中的每个非内置链。

-E, –rename-chain old-chain new-chain
将用户指定的链重命名为用户提供的名称。 这是为了好看,对表的结构没有影响。

-P, –policy chain target
将内置(非用户定义)链的策略设置为给定目标。 策略目标必须是ACCEPT或DROP。

规则(Rule)管理

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

-A, –append chain rule-specification
将一个或多个规则附加到所选链的末尾。 当源或目标名称解析为多个地址时,将为每个可能的地址组合添加规则。

-I, –insert chain [rulenum] rule-specification
根据给定的rulenum,在所选链中插入一个或多个规则。 因此,如果rulenum为“1”,则将规则或规则插入链的头部。如果未指定rulenum,“1”也是默认值。

-D, –delete chain rule-specification
-D, –delete chain rulenum
从所选链中删除一个或多个规则。 此命令有两个版本:规则可以指定为链中的数字(从第一个规则的1开始);或匹配的规则。

-F, –flush [chain]
刷新选定的链(如果没有给出,则表中的所有链)。 这相当于逐个删除所有规则。

-R, –replace chain rulenum rule-specification
替换所选链中的规则。 如果源或目标名称解析为多个地址,则命令将失败。 规则从1开始编号。

-S, –list-rules [chain]
打印所选链中的所有规则。 如果没有选择链,则所有链都像iptables-save一样打印。 与所有其他iptables命令一样,它适用于指定的表(filter是默认值)。

-L, –list [chain]
列出所选链中的所有规则。 如果未选择链,则列出所有链。 与所有其他iptables命令一样,它适用于指定的表(过滤器是默认值),因此NAT规则列出iptables -t nat -n -L。请注意,它通常与-n选项一起使用,以避免长时间的反向DNS查找。指定-Z(零)选项也是合法的,在这种情况下,链将被原子地列出,并归零。 确切的输出受到给定的其他参数的影响。 在您使用iptables -L -v或iptables-save(8)之前,确切的规则被禁止。

-Z, –zero [chain [rulenum]]
将所有链中的数据包和字节计数器归零,或仅归零给定链,或仅链中的给定规则。 同样指定-L,–list(list)选项是合法的,可以在清除之前立即查看计数器。

其他选项

-h
显示帮助。 给出(当前非常简短的)命令语法描述。

命令行选项:参数(PARAMETERS)

以下参数构成规则规范(在add,delete,insert,replace,append命令中使用)。

[!] -i, –in-interface name
接收数据包的接口名称(仅适用于进入INPUT,FORWARD,PREROUTING链的数据包)。 当使用”!”前缀在接口名称之前时,意义是反转的。如果接口名称以“+”结尾,则以此名称开头的任何接口都将匹配。 如果省略此选项,则任何接口名称都将匹配。

[!] -o, –out-interface name
将通过其发送数据包的接口的名称(对于进入FORWARD,OUTPUT,POSTROUTING链的数据包)。当使用”!”前缀在接口名称之前时,意义是反转的。 如果接口名称以“+”结尾,则以此名称开头的任何接口都将匹配。 如果省略此选项,则任何接口名称都将匹配。

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

[!] -d, –destination address[/mask][,…]
目的地址说明。 有关语法的详细说明,请参阅-s(source)标志的说明。 标志–dst是此选项的别名。

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

-6, –ipv6
如果将使用-6选项的规则与(并且只有)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的协议名称。 在前面追加一个 ”!” 则反转测试。数字“0”等于“all”。 “all”将与所有协议匹配,并在省略此选项时作为默认值。 请注意,在ip6tables中,不允许使用除esp之外的IPv6扩展头。esp和ipv6-nonext可以与内核版本2.6.11或更高版本一起使用。 数字“0”等于“all”,这意味着您无法直接测试值为“0”的协议字段。要匹配HBH标头,即使它是最后一个,也不能使用-p 0,但总是需要-m hbh

-m, –match match
指定要使用的匹配项,即测试特定属性的扩展模块。匹配集构成了调用Target的条件。 首先按照命令行中的指定来评估match,并以短路方式工作,即如果一个扩展产生错误,则评估将停止。

手册iptables-extensions(8)中提供了这些列表。

-j, –jump target
这指定了规则的目标;即如果数据包匹配,它该怎么办。target可以是用户定义的链(不是此规则所在的链),一个特殊的内置目标,它可以立即决定数据包的命运,也可以是扩展(请参阅下面的EXTENSIONS部分)。 如果规则中省略了此选项(并且未使用-g),则匹配规则将不会影响数据包的命运,但该规则上的计数器将递增。

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

[!] -f, –fragment
这意味着该规则仅引用分段数据包的第二个和更多IPv4分段。 由于无法告知源端口或目标端口这样的数据包(或ICMP类型),因此这种数据包不会与指定它们的任何规则匹配。当使用”!”前缀在“-f”标志之前,规则将仅匹配头部片段或未分段的数据包。 此选项是特定于IPv4的,在ip6tables中不可用。

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

命令行选项:其他(OTHER OPTIONS)

可以指定以下附加选项:

-v, –verbose
详细输出。 此选项使list命令显示接口名称,规则选项(如果有),TOS掩码。 还列出了数据包和字节计数器,后缀分别为“K”,“M”或“G”,分别为1000,1,000,000和1,000,000,000个乘数(但请参阅-x标志以更改此值)。 对于附加,插入,删除和替换,这会导致有关要打印的规则或规则的详细信息。 -v可以多次指定,以便可能发出更详细的调试语句。

-x, –exact
扩展数字。 显示数据包和字节计数器的确切值,而不是仅显示K的舍入数(1000的倍数)M(1000K的倍数)G(1000M的倍数)。 此选项仅与-L命令相关。

-w, –wait [seconds]
等待xtables锁定。 为了防止程序的多个实例同时运行,将尝试在启动时获得独占锁。 默认情况下,如果无法获取锁定,程序将退出。 此选项将使程序等待(无限期或可选seconds秒),直到可以获得独占锁定。

-W, –wait-interval microseconds
每次迭代等待的间隔。 在运行对延迟敏感的应用程序时,等待xtables锁定延长的持续时间可能是不可接受的。 此选项将使每次迭代花费指定的时间量。 默认间隔为1秒。 此选项仅适用于-w。

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

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

–modprobe=command
在链中添加或插入规则时,使用命令加载任何必要的模块(目标,匹配扩展等)。

注意事项

MATCH AND TARGET EXTENSIONS

命令iptables可以使用扩展数据包匹配和目标模块。手册iptables-extensions(8)中提供了这些列表。

COMPATIBILITY WITH IPCHAINS

这个iptables与Rusty Russell的ipchains非常相似。 主要区别在于链INPUT和OUTPUT仅针对进入本地主机及来自本地主机的数据包进行遍历。 因此,每个数据包只通过三个链中的一个(环回流量除外,它涉及INPUT和OUTPUT链);以前转发的数据包将通过这三个。

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

各种形式的NAT已被分离出来;当使用默认的“filter”表和可选的扩展模块时,iptables是一个纯数据包过滤器。 这应该简化之前看到的“IP伪装”和“数据包过滤”组合的大部分混淆。 因此,以下选项的处理方式不同:

-j MASQ

-M -S

-M -L

在iptables还有一些其他的变化。

退出状态

各种错误消息将打印到标准错误。

0 表示正常运行。

2 看似由无效或滥用的命令行参数引起的错误导致退出代码为2

1 其他错误导致退出代码为1。

相关手册

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

The packet-filtering-HOWTO details iptables usage for packet filtering

the NAT-HOWTO details NAT

the netfilter-extensions-HOWTO details the extensions that are not in the standard distribution

the netfilter-hacking-HOWTO details the netfilter internals.

See http://www.netfilter.org

参考文献

  • man 8 iptables, Version 1.6.2-1.1

更新日志

  • 10/30/2018 创建文章