正文共:3456 字 22 图,预估阅读时间:3 分钟
iptables/ip6tables命令,用于在Linux内核中设置、维护和检查IPv4和IPv6数据包过滤规则的表,从而实现IPv4/IPv6数据包过滤和NAT的管理工具。它可以定义多个不同的表,每个表中包含多个预定义的链,也可能包含用户自定义的链。每个链都是一个规则列表,用来匹配一组数据包,每个规则都指定如何处理匹配到的数据包,也被称为“目标”,它可能是跳转到同一个表中用户自定义的链。
本文基于iptables 1.4.21进行介绍。
匹配规则
防火墙规则指定数据包和目标的标准。如果数据包不匹配,则检查链中的下一条规则;如果匹配,则下一个规则由目标的值指定,该值可以是用户自定义的链的名称、iptables扩展中描述的目标之一,或者特殊值ACCEPT、DROP或RETURN之一。
ACCEPT(接受)意味着让数据包通过,DROP(丢弃)的意思是把数据包丢弃,RETURN(返回)表示停止遍历此链,并在上一个(调用)链中的下一个规则处继续。如果到达了预定义链的末端,或者与目标为RETURN的预定义链中的规则匹配,则链策略指定的目标将决定数据包的命运。
命令简介
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]
表
目前有五个独立的表(哪些表随时存在,取决于内核配置选项和存在哪些模块)。
-t, --table table
此选项指定命令应操作的数据包匹配表。如果内核配置了自动模块加载,则会尝试为该表加载适当的模块(如果该表尚未存在)。
各表如下:
filter
filter是默认表(如果未传递-t选项)。它包含预定义链INPUT(用于发往本地套接字的数据包)、FORWARD(用于通过设备路由的数据包)以及OUTPUT(用于本地生成的数据包)。
nat
当遇到创建新连接的数据包时,将查阅此表。它由三个内置组件组成:PREROUTING(用于在数据包进入时立即更改数据包)、OUTPUT(用于在路由之前更改本地生成的数据包)和POSTROUTING(用于在即将离开时更改数据包)。IPv6 NAT支持从内核3.7开始提供。
mangle
此表用于专用数据包更改。在内核2.4.17之前,它有两个预定义链:PREROUTING(用于在路由之前更改传入数据包)和OUTPUT(用于在路由之前更改本地生成的数据包)。自内核2.4.18以来,还支持其他三个预定义链:INPUT(用于进入设备本身的数据包)、FORWARD(用于更改通过设备路由的数据包)和POSTROUTING(用于在数据包即将出去时更改数据包)。
raw
此表主要用于结合NOTRACK目标配置连接跟踪豁免。它以较高的优先级在netfilter挂钩处注册,因此在ip_contrack或任何其他ip表之前调用。它提供以下预定义链:PREROUTING(用于通过任何网络接口到达的数据包)、OUTPUT(用于本地进程生成的数据包。
security
此表用于强制访问控制(Mandatory Access Control,MAC)网络规则,如SECMARK和CONNSECMARK目标启用的规则。强制访问控制由Linux安全模块(如SELinux)实现。security表在filter表之后调用,允许filter表中的所有任意访问控制(Discretionary Access Control,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命令。
-S, --list-rules [chain]
打印选定链中的所有规则。如果没有选择链,则所有链都会像iptables-save一样打印。与其他所有iptables命令一样,它适用于指定的表(默认为filter)。
-F, --flush [chain]
刷新选定的链(如果未给出任何链,则表中的所有链)。这相当于逐个删除所有规则。
-Z, --zero [chain [rulenum]]
将所有链中的数据包和字节计数器归零,或者只将给定链归零,或只将给定规则归零。也可以指定-L,--list(list)选项,以便在计数器被清除之前立即查看计数器。
-N, --new-chain chain
按给定名称创建新的用户自定义链。必须没有该名称的目标。
-X, --delete-chain [chain]
删除指定的可选用户自定义链。不能有对链的引用。如果存在,则必须删除或替换引用规则,然后才能删除链。链必须为空,即不包含任何规则。如果没有给出参数,它将尝试删除表中的每个非预定义链。
-P, --policy chain target
将链的策略设置为给定的目标。只有内置(非用户自定义)链才能有策略,预定义链和用户自定义链都不能是策略目标。
-E, --rename-chain old-chain new-chain
将用户指定的链重命名为用户提供的名称。这是装饰性的,对表的结构没有影响。
-h Help
给出命令语法的描述(目前非常简短)。
参数
以下参数构成了规则规范(在add、delete、insert、replace和append命令中使用)。
-4, --ipv4
此选项在iptables和iptables-restore中无效。如果使用-4选项的规则与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中的协议名称。协议前面带“!”参数反转测试。数字0等于所有。
“all”将与所有协议匹配,如果省略此选项,则默认为“all”。请注意,在ip6tables中,不允许使用除esp之外的IPv6扩展头。esp和ipv6-nonext可以与内核2.6.11或更高版本一起使用。数字0等于全部,这意味着您不能直接测试协议字段的值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(source)标志的描述。标志--dst是此选项的别名。
-m, --match match
指定要使用的匹配项,即测试特定属性的扩展模块。匹配集构成了调用目标的条件。匹配将按照命令行上的指定先求值后求值,并以短路方式工作,即如果一个扩展产生错误,求值将停止。
-j, --jump target
这指定了规则的目标;例如,如果数据包与之匹配,该怎么办。目标可以是一个用户自定义的链(除了此规则所在的链)、一个立即决定数据包命运的特殊内置目标或一个扩展(参见下面的扩展)。如果在规则中省略了这个选项(并且没有使用-g),那么匹配规则将不会影响数据包的转发,但是规则上的计数器将增加。
-g, --goto chain
这指定处理应在用户指定的链中继续。与--jump选项不同,返回不会在这个链中继续处理,而是在通过--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、1000000和1000000000乘数(但请参见-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
在链中添加或插入规则时,使用命令加载任何必要的模块(目标、匹配扩展等)。
匹配和目标模块扩展
iptables可以使用扩展包匹配和目标模块,请参考iptables-extensions手册页中提供的列表信息。
诊断信息
将各种错误消息打印为标准错误。退出代码为0,表示正常工作。似乎由无效或滥用的命令行参数引起的错误导致退出代码为2,其他错误导致退出码为1。
与IPCHAINS的兼容性
这个iptables与Rusty Russell的ipchains非常相似。主要的区别是,链INPUT和OUTPUT仅针对分别进入本地主机和来自本地主机的数据包进行遍历。因此,每个数据包只通过三个链中的一个(环回口流量除外,环回流量同时涉及INPUT和OUTPUT链);之前,转发的分组将通过所有三个。
另一个主要区别是-i表示输入接口,-o表示输出接口,两者都可用于进入FORWARD链的数据包。
各种形式的NAT已被分离出来;当使用默认的“filter”表时,iptables是一个纯数据包过滤器,带有可选的扩展模块。这应该可以简化以前对IP伪装和数据包过滤组合的混淆。因此,以下选项的处理方式不同:
-j MASQ
-M -S
-M -L
相关命令
iptables-apply、iptables-save、iptables-restore、iptables-extensions。
packet-filtering-HOWTO详细说明了iptables在数据包过滤中的使用,NAT-HOWTO详细说明了NAT,netfilter-extensions-HOWTO详细介绍了不在标准发行版中的扩展,而netfilter-hacking-HOWTO详细描述了netfilter内部。可以参阅:http://www.netfilter.org/。
长按二维码
关注我们吧
Wireguard配置文件详解
Wireshark如何解密IPSec报文?
听说你想收集HCL的设备版本?好吧,成全你!
Ubuntu 18.04开启远程桌面连接
还在到处找Win11镜像?自己动手,丰衣足食!
某国产化台式机产品介绍及维护(上)
某国产化台式机产品介绍及维护(下)
strongSwan之ipsec.secrets配置手册
基于TCP的DNS传输:实施要求
什么是NaaS?哪里冒出来的网络即服务?
基于TCP的DNS传输:操作要求
互联网密钥交换 (IKEv2) 协议中的多重认证交换
配置Wireguard的几个进阶玩法