iptables - 用于 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 包过滤规则的表。 可以定义几个不同的表。 每个表包含许多内置链,也可能包含用户定义的链。
每个链都包含了一个规则列表,可以匹配一组数据包。 每个规则都指定如何去处理匹配的数据包,即Target,如下图所示,表中有五个链:PREROUTING,INPUT,POSTROUTING,OUTPUT和DOCKER,其中链POSTROUTING拥有两个匹配规则,他们的Target分别是MASQUERADE和SNAT,即进行网络地址转换,链OUTPUT只有一条规则,其target是DOCKER,即数据包要交给链DOCKER进行进一步匹配处理。
Target
数据包将在链上依次匹配规则,若不匹配,则检查下一条,若匹配,则根据target,执行下一步操作。target的至可能是其他链的名字(如上面的DOCKER),则此时将数据包交给此链进行规则匹配;target还可能是其他特殊值:ACCEPT、DROP或 RETURN 之一。
- ACCEPT 表示让数据包通过。
- DROP 意味着将数据包丢弃
- RETURN 表示停止遍历此链并在上一个链中的下一个规则处恢复。
如果到达内置链的末端或匹配带有目标 RETURN 的内置链中的规则,则链的策略将决定数据包的命运。链的策略在上图中,每个内置链名称后的括号中体现。
Tables
目前有五个独立的表(存在哪些表取决于内核配置选项和存在哪些模块)。
-t, --table table
此选项指定命令应操作那个数据包匹配表。 如果内核配置了自动模块加载,则将尝试加载该表的适当模块(如果该模块尚不存在)。
三个表包括:
- filter:
这是默认表(如果没有传递 -t 选项)。 它包含内置链 INPUT(用于更改发往本地套接字的数据包)、FORWARD(用于更改通过本机的路由转发的数据包)和 OUTPUT(用于在路由之前更改本地生成的数据包)。 - nat:
当遇到创建新连接的数据包时,会查阅此表。 它由四个内置函数组成:PREROUTING(用于在数据包进入时立即更改)、INPUT、OUTPUT 和 POSTROUTING(用于在数据包即将离开时对其进行更改)。IPv6 NAT 支持从内核 3.7 开始可用。 - mangle:
该表用于专门的数据包更改。 在内核 2.4.17 之前,它有两个内置链:PREROUTING 和 OUTPUT。 从内核 2.4.18 开始,还支持其他三个内置链:INPUT、FORWARD 和 POSTROUTING - raw:
此表主要用于配置与 NOTRACK Target 相结合的连接跟踪豁免。 它在具有更高优先级的 netfilter 钩子上注册,因此在 ip_conntrack 或任何其他 IP 表之前调用。 它提供以下内置链: PREROUTING、 OUTPUT - security:
此表用于强制访问控制 (Mandatory Access Control, MAC) 网络规则,例如由 SECMARK 和 CONNSECMARK Target启用的规则。 强制访问控制由 Linux 安全模块(例如 SELinux)实现。 security 在 filter 之后调用,允许filter中的任何自由访问控制 ( Discretionary Access Control, DAC) 规则在 MAC 规则之前生效。 该表提供了以下内置链:INPUT、OUTPUT 和 FORWARD。
Options
iptables 和 ip6tables 识别的Options可以分为几个不同的类别:
COMMANDS
这些选项指定要执行的所需操作。 除非下面另有说明,否则只能在命令行上指定其中之一。 对于长版本的命令和选项名称,您只需要使用足够多的字母以确保 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,则将一条或多条规则插入到链的头部。 如果未指定规则编号,默认使用1。 -
-R, --replace chain rulenum rule-specification
替换所选链中的规则。 如果源和/或目标名称解析为多个地址,该命令将失败。 规则从 1 开始编号。 -
-L, --list [chain]
列出所选链中的所有规则。 如果未选择任何链,则列出所有链。如,可以iptables -t nat -n -L
使用列出nat表的所有链。经常和-n连用,以避免进行长时间的反向DNS查询(由ip获取域名) -
-S, --list-rules [chain]
打印所选链中的所有规则。 如果没有选择链,则所有链都像 iptables-save 一样打印。 可以理解为显示所有规则是怎么生成方式、顺序。
-
-F, --flush [chain]
刷新选定的链(如果没有给出表中的所有链)。 这相当于将所有规则一一删除。 -
--Z, --zero [chain [rulenum]]
将所有链中的数据包和字节计数器清零,或仅清零给定链,或仅清零链中的给定规则。 可以同时指定 -L、--list选项,以便在计数器被清除之前查看计数器。 -
-N, --new-chain chain
通过给定的名称创建一个新的用户定义链。 必须没有该名称的目标。 -
-X, --delete-chain [chain]
删除指定的用户定义链。 必须保证没有链的引用才能删除(所谓引用就是内置链的规则)。 如果有,您必须先删除或替换引用规则,然后才能删除链。 链必须为空,即不包含任何规则。 如果没有给出参数,它将尝试删除表中的每个非内置链。 -
-P, --policy chain target
将内置(非用户定义)链的策略设置为给定的目标。 策略目标必须是 ACCEPT 或 DROP。 -
-E, --rename-chain old-chain new-chain
将用户指定的链重命名为用户提供的名称。 这是装饰性的,对表的结构没有影响。 -
-h
帮助。 给出命令语法的(目前非常简短的)描述。
PARAMETERS
以下参数构成规则规范(rule-specification在添加、删除、插入、替换和追加命令中使用)。
-
-4, --ipv4
此选项在 iptables 和 iptables-restore 中无效。 如果使用 -4 选项的规则与(并且仅与)ip6tables-restore 一起插入,它将被静默忽略。 任何其他用途都会引发错误。 此选项允许在单个规则文件中使用 IPv4 和 IPv6 规则,以便与 iptables-restore 和 ip6tables-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 的协议名称。 数字零等价于ALL。 "ALL" 将匹配所有协议,并在省略此选项时作为默认值。 请注意,在 ip6tables 中,不允许使用除 esp 之外的 IPv6 扩展标头。 esp 和 ipv6-nonext 可用于内核版本 2.6.11 或更高版本。 数字 0 等价于 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
指定要使用的匹配项,即测试特定属性的扩展模块。 这组匹配构成了调用目标的条件。 匹配项按照命令行上的指定从头到尾进行评估,并以短路方式工作,即如果一个扩展产生错误,则评估将停止。 -
-j, --jumpt targe
用于指定规则的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 类型)的源端口或目标端口,因此此类数据包将不匹配任何指定它们的规则。 ”!” 在接口名称之前使用,规则将只匹配头部片段或未分段的数据包。 此选项特定于 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 可以多次指定以可能发出更详细的调试语句。 - **-w, --wait ** [seconds]
等待 xtables 锁定。 为了防止程序的多个实例同时运行,将尝试在启动时获取排他锁。 默认情况下,如果无法获得锁,程序将退出。 此选项将使程序等待(无限期或可选秒),直到获得排他锁。 -
-W, --wait-interval microseconds
每次迭代等待的时间间隔。 在运行延迟敏感的应用程序时,等待 xtables 锁的时间过长可能是不可接受的。 此选项将使每次迭代花费指定的时间量。 默认间隔为 1 秒。 此选项必须和-w一起使用。 -
-n, --numeric
数字输出。 IP 地址和端口号将以数字格式打印。 默认情况下,程序会尝试将它们显示为主机名、网络名或服务(只要适用)。 -
-x, --exact
展开数字。 显示数据包和字节计数器的确切值,而不是仅以 K(1000 的倍数)M(1000K 的倍数)或 G(1000M 的倍数)为单位的舍入数字。 此选项仅与 -L 命令相关。 -
--line-numbers
列出规则时,将行号添加到每个规则的开头,对应于该规则在链中的位置。 -
--modprobe=command
在链中添加或插入规则时,使用命令加载任何必要的模块(目标、匹配扩展等)。
网友评论