iptables-extensions命令详细介绍-续

tos
该模块匹配IPv4头中的8位服务类型字段(即包括“优先级”位)或IPv6头中的(同样是8位的)优先级字段。

[!] --tos value[/mask]
匹配具有给定 TOS 标记值的数据包。如果指定了掩码,则在比较之前将其逻辑与 TOS 标记进行。

[!] --tos symbol
在使用 IPv4 的 tos 匹配时,可以指定符号名称。可以通过调用带有 -m tos -h 的 iptables 获取已识别的 TOS 名称列表。请注意,这意味着掩码为 0x3F,即除了 ECN 位之外的所有位。

ttl(IPv4特定)
该模块匹配IP头中的生存时间字段。

[!] --ttl-eq ttl
匹配给定的 TTL 值。

--ttl-gt ttl
如果 TTL 大于给定的 TTL 值,则匹配。

--ttl-lt ttl
如果 TTL 小于给定的 TTL 值,则匹配。

u32
U32 测试从数据包中提取的最多4字节的数量是否具有指定的值。要提取的内容的规范足够通用,以找到从 tcp 标头或有效负载的给定偏移量处的数据。

[!] --u32 tests
参数等同于下面描述的一种小语言的程序。

tests := location "=" value | tests "&&" location "=" value

value := range | value "," range

range := number | number ":" number

单个数字 n 被解释为 n:n。n:m 被解释为范围 >=n 且 <=m。

location := number | location operator number

operator := "&" | "<<" | ">>" | "@"

运算符 &、<<、>> 和 && 在C语言中的含义相同。= 实际上是一个设置成员运算符,值语法描述了一个集合。@ 运算符允许移动到下一个标头,后面会进一步描述。

目前对于 u32 参数的大小有一些人为的实现限制:

* u32 参数中不超过 10 个 "="(和 9 个 "&&")
* 每个值中不超过 10 个范围(和 9 个逗号)
* 每个 location 中不超过 10 个数字(和 9 个运算符)

为了描述 location 的含义,想象一下解释它的以下机器。有三个寄存器:

A 是 char * 类型,最初是 IP 头的地址

B 和 C 是无符号32位整数,最初为零

指令为:

number B = number;

C = (*(A+B)<<24) + (*(A+B+1)<<16) + (*(A+B+2)<<8) + *(A+B+3)

&number C = C & number

<< number C = C << number

>> number C = C >> number

@number A = A + C; 然后执行指令 number

任何对 [skb->data,skb->end] 之外的内存的访问都会导致匹配失败。否则,计算的结果是 C 的最终值。

测试中允许有空格,但在测试中出现的字符可能需要 shell 引用,因此最好将参数括在引号中。

示例:

匹配总长度 >= 256 的 IP 数据包

IP 头中包含字节 2-3 的总长度字段。

--u32 "0 & 0xFFFF = 0x100:0xFFFF"

读取字节 0-3

与 0xFFFF 进行 AND 运算(得到字节 2-3),并测试是否在范围 [0x100:0xFFFF] 内

示例:(更实际,因此更复杂)

匹配 ICMP 类型为 0 的数据包

首先测试它是否是 ICMP 数据包,当且仅当字节 9(协议)= 1 时为真

--u32 "6 & 0xFF = 1 && ...

读取字节 6-9,使用 & 丢弃字节 6-8 并将结果与 1 进行比较。接下来测试它是否不是片段。 (如果是这样,它可能是这样一个数据包的一部分,但我们不能总是知道。)注意:如果您想匹配 IP 头之外的任何内容,则通常需要此测试。字节 6 的最后 6 位和字节 7 的所有位都为 0,当且仅当这是一个完整的数据包(而不是一个片段)时。或者,您可以通过仅测试字节 6 的最后 5 位来允许第一个片段。

... 4 & 0x3FFF = 0 && ...

最后一个测试:IP 头之后的第一个字节(类型)为 0。这就是我们必须使用 @ 语法的地方。 IP 头(IHL)的长度以32位字为单位存储在 IP 头本身的字节 0 的右半部分中。

... 0 >> 22 & 0x3C @ 0 >> 24 = 0"

第一个 0 表示读取字节 0-3,>>22 表示将其向右移 22 位。向右移 24 位将给出第一个字节,因此只有 22 位是四次这个值加上一些其他位。&3C 然后消除右侧的两个额外位和第一个字节的前四个位。例如,如果 IHL=5,则 IP 头为 20(4 x 5)字节长。在这种情况下,字节 0-1 是(二进制中)xxxx0101 yyzzzzzz,>>22 给出 10 位值 xxxx0101yy,&3C 给出 010100。@ 表示将此数字用作数据包中的新偏移量,并从那里开始读取四个字节。这是 ICMP 负载的前4个字节,其中字节 0 是 ICMP 类型。因此,我们只需将值向右移 24 位,以除去除第一个字节之外的所有字节,并将结果与 0 进行比较。

示例:

TCP 负载字节 8-12 是 1、2、5 或 8 中的任意一个

首先我们测试数据包是否是 TCP 数据包(类似于 ICMP)。

--u32 "6 & 0xFF = 6 && ...

接下来,测试它是否不是片段(与上述相同)。

... 0 >> 22 & 0x3C @ 12 >> 26 & 0x3C @ 8 = 1,2,5,8"
0 >> 22 & 3C 如上所述,计算IP头中的字节数。@ 使其成为数据包的新偏移量,即TCP头的开始。TCP头的长度(同样以32位字为单位)是TCP头的字节12的左半部分。12 >> 26 & 3C 计算此长度(以字节为单位,类似于之前的IP头)。@ 使其成为新的偏移量,即TCP负载的开始。最后,8读取负载的字节8-12,并使用=检查结果是否为1、2、5或8。

udp
如果指定了 `--protocol udp',则可以使用这些扩展。它提供以下选项:

[!] --source-port,--sport port[:port]
源端口或端口范围规范。有关详细信息,请参阅TCP扩展的--source-port选项的描述。

[!] --destination-port,--dport port[:port]
目标端口或端口范围规范。有关详细信息,请参阅TCP扩展的--destination-port选项的描述。

unclean(仅限IPv4)
此模块不带任何选项,但尝试匹配似乎格式错误或不寻常的数据包。这被视为实验性。

目标扩展
iptables可以使用扩展的目标模块,以下模块包含在标准分发中。

AUDIT
此目标允许为击中目标的数据包创建审计记录。它可用于记录已接受、已丢弃和已拒绝的数据包。有关详细信息,请参阅auditd(8)。

--type {accept|drop|reject}
设置审计记录的类型。

示例:

iptables -N AUDIT_DROP

iptables -A AUDIT_DROP -j AUDIT --type drop

iptables -A AUDIT_DROP -j DROP

CHECKSUM
此目标允许有选择地解决破损/旧应用程序的问题。它仅可用于mangle表。

--checksum-fill
计算并填充数据包中缺少校验和的校验和。如果需要解决与校验和卸载不兼容的旧应用程序(例如不与校验和卸载配合使用的dhcp客户端),则这尤其有用,但不希望在设备中禁用校验和卸载。

CLASSIFY
此模块允许您设置skb->priority值(从而对数据包进行特定的CBQ类别)。 

--set-class major:minor
设置主要和次要类值。这些值始终被解释为十六进制,即使没有给出0x前缀。

CLUSTERIP(仅限IPv4)
此模块允许您配置共享特定IP和MAC地址的节点的简单集群,而无需明确的负载均衡器位于它们之前。连接在此集群中的节点之间静态分布。

--new
创建一个新的ClusterIP。对于给定的ClusterIP的第一条规则,您总是必须设置此选项。

--hashmode mode
指定散列模式。必须是sourceip、sourceip-sourceport或sourceip-sourceport-destport之一。

--clustermac mac
指定ClusterIP的MAC地址。必须是链路层多播地址

--total-nodes num
此集群中的节点总数。

--local-node num
此集群中的本地节点编号。

--hash-init rnd
指定用于散列初始化的随机种子。

CONNMARK
此模块设置与连接关联的netfilter标记值。该标记为32位。

--set-xmark value[/mask]
将掩码给定的位清零并将值异或到ctmark中。

--save-mark [--nfmask nfmask] [--ctmask ctmask]
使用给定的掩码将数据包标记(nfmark)复制到连接标记(ctmark)。新的nfmark值确定如下:

ctmark = (ctmark & ~ctmask) ^ (nfmark & nfmask)

即ctmask定义要清除的位,nfmask定义要异或到ctmark中的nfmark的位。ctmask和nfmask默认为0xFFFFFFFF。

--restore-mark [--nfmask nfmask] [--ctmask ctmask]
使用给定的掩码将连接标记(ctmark)复制到数据包标记(nfmark)。新的ctmark值确定如下:

nfmark = (nfmark & ~nfmask) ^ (ctmark & ctmask);

即nfmask定义要清除的位,ctmask定义要异或到nfmark中的ctmark的位。ctmask和nfmask默认为0xFFFFFFFF。

--restore-mark仅在mangle表中有效。

对于--set-xmark,以下助记符可用:

--and-mark bits
二进制与ctmark与位。 (--set-xmark 0/invbits的助记符,其中invbits是位的二进制否定。)

--or-mark bits
二进制或ctmark与位。 (--set-xmark bits/bits的助记符。)

--xor-mark bits
二进制异或ctmark与位。 (--set-xmark bits/0的助记符。)

--set-mark value[/mask]
设置连接标记。如果指定了掩码,则只修改掩码中设置的位。

--save-mark [--mask mask]
将nfmark复制到ctmark。如果指定了掩码,则只复制那些位。

--restore-mark [--mask mask]
将ctmark复制到nfmark。如果指定了掩码,则只复制那些位。这仅在mangle表中有效。

CONNSECMARK
此模块将安全标记从数据包复制到连接(如果未标记),并从连接复制到数据包(同样仅当未标记时)。通常与SECMARK一起使用,它在安全表中有效(出于向后兼容性,它还在mangle表中有效)。

--save 如果数据包具有安全标记,请将其复制到连接(如果连接未标记)。

--restore 如果数据包没有安全标记,并且连接有,请将连接的安全标记从连接复制到数据包。

CT
CT目标允许为数据包或其关联的连接设置参数。该目标将“模板”连接跟踪条目附加到数据包,然后在初始化新的ct条目时,conntrack核心将使用该模板。因此,此目标仅在“raw”表中有效。

--notrack
禁用此数据包的连接跟踪。

--helper name
对于连接使用名称标识的辅助程序。这比使用预设端口加载conntrack辅助程序模块更灵活。

--ctevents event[,...]
仅为此连接生成指定的连接跟踪事件。可能的事件类型有:new,related,destroy,reply,assured,protoinfo,helper,mark(这是ctmark,而不是nfmark),natseqinfo,secmark(ctsecmark)。

--expevents event[,...]
仅为此连接生成指定的期望事件。可能的事件类型有:new。

--zone id
将此数据包分配给区域id,并仅在该区域中进行查找。默认情况下,数据包的区域为0。

--timeout name
使用由名称标识的连接的超时策略。这提供了比/proc/sys/net/netfilter/nf_conntrack_*_timeout_*中可用的全局超时值更灵活的超时策略定义。
你还必须使用NOTRACK目标来禁用翻译流的连接跟踪。

DSCP
此目标允许更改IPv4数据包的TOS头中的DSCP位的值。由于这会操纵数据包,因此只能在mangle表中使用。

--set-dscp value
将DSCP字段设置为数字值(可以是十进制或十六进制)。

--set-dscp-class class
将DSCP字段设置为DiffServ类。

ECN(仅限IPv4)
此目标允许有选择地解决已知的ECN黑洞问题。它只能在mangle表中使用。

--ecn-tcp-remove
从TCP头中删除所有ECN位。当然,它只能与-p tcp一起使用。

HL(仅限IPv6)
用于修改IPv6头中的Hop Limit字段。 Hop Limit字段类似于IPv4中的TTL值。设置或递增Hop Limit字段可能非常危险,因此应该尽量避免。此目标仅在mangle表中有效。

永远不要在离开本地网络的数据包上设置或递增该值!

--hl-set value
将Hop Limit设置为“value”。

--hl-dec value
将Hop Limit“value”次递减。

--hl-inc value
将Hop Limit“value”次递增。

HMARK
类似于MARK,即设置fwmark,但该标记是根据选择的散列分组的哈希计算的。您还必须指定标记范围,以及可选的从哪里开始的偏移量。 ICMP错误消息将被检查并用于计算哈希。

现有的选项有:

--hmark-tuple tuple
可能的元组成员包括:src(表示源地址(IPv4、IPv6地址)),dst(表示目标地址(IPv4、IPv6地址)),sport(表示源端口(TCP、UDP、UDPlite、SCTP、DCCP)),dport(表示目标端口(TCP、UDP、UDPlite、SCTP、DCCP)),spi(表示安全参数索引(AH、ESP)),ct(表示使用连接跟踪元组而不是数据包选择器)。

--hmark-mod value(必须大于0)
用于哈希计算的模数(以限制可能标记的范围)

--hmark-offset value
从哪里开始标记的偏移量。

对于高级用法,您可以指定自定义前缀和掩码,而不是使用--hmark-tuple:

--hmark-src-prefix cidr
CIDR表示法中的源地址掩码。

--hmark-dst-prefix cidr
CIDR表示法中的目标地址掩码。

--hmark-sport-mask value
十六进制中的16位源端口掩码。

--hmark-dport-mask value
十六进制中的16位目标端口掩码。

--hmark-spi-mask value
具有spi掩码的32位字段。

--hmark-proto-mask value
具有第4层协议号的8位字段。

--hmark-rnd value
用于馈送哈希计算的32位随机自定义值。

示例:

iptables -t mangle -A PREROUTING -m conntrack --ctstate NEW -j HMARK --hmark-tuple ct,src,dst,proto --hmark-offset 10000 --hmark-mod 10 --hmark-rnd 0xfeedcafe

iptables -t mangle -A PREROUTING -j HMARK --hmark-offset 10000 --hmark-tuple src,dst,proto --hmark-mod 10 --hmark-rnd 0xdeafbeef

IDLETIMER
此目标可用于标识接口已处于空闲状态的一段时间。计时器由标签标识,并在使用新标签设置规则时创建。规则还以超时值(以秒为单位)作为选项。如果多个规则使用相同的计时器标签,则每当任何规则中的任何规则被命中时,计时器都将重新启动。在sysfs中为每个计时器创建一个条目。此属性包含计时器到期前的计时器。属性位于xt_idletimer类下:

/sys/class/xt_idletimer/timers/<label>

计时器到期时,目标模块会向用户空间发送sysfs通知,用户空间可以随后决定要执行的操作(例如,为了节省电力而断开连接)。

--timeout amount
这是以秒为单位的触发通知的时间。

--label string
这是计时器的唯一标识符。标签字符串的最大长度为27个字符。

LED
这将创建一个LED触发器,然后可以将其附加到系统指示灯,以在通过系统的某些数据包时闪烁或点亮它们。一个示例可能是每次通过SSH连接到本地机器时都点亮LED几分钟。以下选项控制触发器行为:

--led-trigger-id name
这是给LED触发器的名称。触发器的实际名称将以“netfilter-”为前缀。

--led-delay ms
这指示在数据包到达后LED应该保持点亮多长时间(以毫秒为单位)然后再次关闭。默认值为0(尽快闪烁)。可以提供特殊值inf以在激活后永久保持LED点亮。在这种情况下,触发器将需要手动分离并重新附加到LED设备以关闭它。

--led-always-blink
始终使LED在数据包到达时闪烁,即使LED已经点亮。这允许在长时间延迟值下通知新数据包(否则将导致延迟时间的静默延长)。

示例:

为传入的SSH流量创建LED触发器:
iptables -A INPUT -p tcp --dport 22 -j LED --led-trigger-id ssh

然后将新触发器附加到LED:
echo netfilter-ssh >/sys/class/leds/ledname/trigger

LOG
打开匹配数据包的内核日志记录。设置此规则的选项时,Linux内核将通过内核日志打印有关所有匹配数据包的一些信息(例如大多数IP/IPv6头字段)(可以使用dmesg(1)或在sys中读取)。

这是一个“非终止目标”,即规则遍历会在下一条规则继续。因此,如果要记录您拒绝的数据包,可以使用两个具有相同匹配标准的单独规则,首先使用目标LOG然后是DROP(或REJECT)。

--log-level level
日志级别,可以是(特定于系统的)数字或助记符。可能的值是(按优先级降低的顺序):emerg,alert,crit,error,warning,notice,info或debug。

--log-prefix prefix
在指定的前缀下标记日志消息;最多29个字母,并且对于在日志中区分消息非常有用。

--log-tcp-sequence
记录TCP序列号。如果日志可读取,则这是一种安全风险。

--log-tcp-options
记录TCP数据包头中的选项。

--log-ip-options
记录IP/IPv6数据包头中的选项。

--log-uid
记录生成数据包的进程的用户ID。

MARK
此目标用于设置与数据包关联的Netfilter标记值。例如,它可以与基于fwmark的路由一起使用(需要iproute2)。如果计划这样做,请注意必须在mangle表的PREROUTING链中设置标记以影响路由。标记字段宽32位。

--set-xmark value[/mask]
将由掩码给定的位清零,并将值异或到数据包标记(“nfmark”)中。如果省略掩码,则假定为0xFFFFFFFF。

--set-mark value[/mask]
将由掩码给定的位清零,并将值或到数据包标记中。如果省略掩码,则假定为0xFFFFFFFF。

以下助记符可用:

--and-mark bits
将nfmark与bits进行二进制AND运算。(用于--set-xmark 0/invbits的助记符,其中invbits是bits的二进制否定。)

--or-mark bits
将nfmark与bits进行二进制OR运算。(用于--set-xmark bits/bits的助记符。)

--xor-mark bits
将nfmark与bits进行二进制XOR运算。(用于--set-xmark bits/0的助记符。)

MASQUERADE
此目标仅在nat表中的POSTROUTING链中有效。仅应与动态分配的IP(拨号)连接一起使用:如果您具有静态IP地址,则应使用SNAT目标。伪装相当于指定数据包要传出的接口的IP地址的映射,但还具有在接口关闭时忘记连接的效果。当下一次拨号不太可能具有相同的接口地址时(因此任何已建立的连接无论如何都会丢失),这是正确的行为。

--to-ports port[-port]
指定要使用的源端口范围,覆盖默认的SNAT源端口选择启发式方法(见上文)。仅在规则还指定以下协议之一时才有效:tcp、udp、dccp或sctp。

--random
随机化源端口映射如果使用--random选项,则将随机化端口映射(内核>=2.6.21)。

IPv6支持可用于Linux内核版本>=3.7。

MIRROR(仅限IPv4)
这是一个实验性的演示目标,它颠倒IP头中的源和目标字段并重新传输数据包。仅在INPUT、FORWARD和PREROUTING链以及仅从这些链调用的用户定义链中有效。请注意,传出的数据包不会被任何数据包过滤链、连接跟踪或NAT看到,以避免循环和其他问题。

NETMAP
此目标允许您将一个整个地址网络静态映射到另一个地址网络。只能从nat表中的规则中使用。
 --to address[/mask]
              映射到的网络地址。生成的地址将按以下方式构造:将掩码中的所有'一'位从新的`地址'中填充。掩码中为零的所有位将从原始地址中填充。

       IPv6支持可用于Linux内核版本>=3.7。

   NFLOG
       此目标提供匹配数据包的记录。当为规则设置了此目标时,Linux内核将通过内核日志传递数据包以记录数据包。通常与nfnetlink_log一起使用作为日志后端,后者将通过netlink套接字向指定的多播组广播数据包。一个或多个用户空间进程可以订阅该组以接收数据包。与LOG一样,这是一个非终止目标,即规则遍历会在下一条规则继续。

       --nflog-group nlgroup
              数据包传递到的netlink组(0 - 2^16-1)(仅适用于nfnetlink_log)。默认值为0。

       --nflog-prefix prefix
              要包含在日志消息中的前缀字符串,最长为64个字符,用于在日志中区分消息。

       --nflog-range size
              要复制到用户空间的字节数(仅适用于nfnetlink_log)。nfnetlink_log实例可以指定其自己的范围,此选项会覆盖它。

       --nflog-threshold size
              在将数据包发送到用户空间之前在内核内排队的数据包数(仅适用于nfnetlink_log)。较高的值导致每个数据包的开销减少,但增加了数据包到达用户空间的延迟。默认值为1。

   NFQUEUE
       此目标使用nfnetlink_queue处理程序将数据包传递到用户空间。数据包被放入由其16位队列号标识的队列中。用户空间可以检查和修改数据包(如果需要)。然后,用户空间必须将数据包丢弃或重新注入到内核中。有关详细信息,请参见libnetfilter_queue。nfnetlink_queue添加在Linux 2.6.14中。队列平衡选项在Linux 2.6.31中添加,队列绕过在2.6.39中添加。

       --queue-num value
              指定要使用的QUEUE编号。有效的队列编号为0到65535。默认值为0。

       --queue-balance value:value
              指定要使用的一系列队列。然后,数据包将在给定的队列之间平衡。这对于多核系统很有用:在队列x、x+1、.. x+n上启动用户空间程序的多个实例,并使用“--queue-balance x:x+n”。属于同一连接的数据包将放入相同的nfqueue中。

       --queue-bypass
              默认情况下,如果没有用户空间程序侦听NFQUEUE上的数据包,则将要排队的所有数据包都将被丢弃。使用此选项时,NFQUEUE规则的行为类似于ACCEPT,数据包将移动到下一个表。

       --queue-cpu-fanout
              从Linux内核3.10开始提供。与--queue-balance一起使用时,将使用CPU ID作为将数据包映射到队列的索引。这个想法是如果每个CPU都有一个队列,你可以提高性能。这需要指定--queue-balance。

   NOTRACK
       此扩展禁用所有匹配该规则的数据包的连接跟踪。它等效于-j CT --notrack。与CT一样,NOTRACK只能在原始表中使用。

   RATEEST
       RATEEST目标收集统计信息,执行速率估算计算,并保存结果以供稍后使用rateest匹配进行评估。

       --rateest-name name
              将匹配的数据包计数到由名称引用的池中,该名称是可自由选择的。

       --rateest-interval amount{s|ms|us}
              速率测量间隔,以秒、毫秒或微秒为单位。

       --rateest-ewmalog value
              速率测量平均时间常数。

   REDIRECT
       此目标仅在nat表中的PREROUTING和OUTPUT链以及仅从这些链调用的用户定义链中有效。它通过将目的IP更改为传入接口的主要地址(本地生成的数据包被映射到本地主机地址,IPv4为127.0.0.1,IPv6为::1)来将数据包重定向到本机。

       --to-ports port[-port]
              指定要使用的目标端口范围:如果没有指定此选项,目标端口将永远不会更改。仅当规则还指定以下协议之一时才有效:tcp、udp、dccp或sctp。

       --random
              如果使用了--random选项,则端口映射将被随机化(内核>=2.6.22)。

       IPv6支持可用于Linux内核版本>=3.7。

   REJECT(仅限IPv6)
       用于在响应匹配的数据包时发送错误数据包:否则等效于DROP,因此它是一个终止的TARGET,结束规则遍历。此目标仅在INPUT、FORWARD和OUTPUT链以及仅从这些链调用的用户定义链中有效。以下选项控制返回的错误数据包的性质:

       --reject-with type
              给定的类型可以是icmp6-no-route、no-route、icmp6-adm-prohibited、adm-prohibited、icmp6-addr-unreachable、addr-unreach或icmp6-port-unreachable,它们返回相应的ICMPv6错误消息(icmp6-port-unreachable是默认值)。最后,选项tcp-reset可以用于仅匹配TCP协议的规则:这导致发送一个TCP RST数据包。这主要用于阻止ident(113/tcp)探测,这在发送邮件到损坏的邮件主机时经常发生(否则这些主机将不接受您的邮件)。仅当内核版本为2.6.14或更高时,才能使用tcp-reset。

   REJECT(仅限IPv4)
       用于在响应匹配的数据包时发送错误数据包:否则等效于DROP,因此它是一个终止的TARGET,结束规则遍历。此目标仅在INPUT、FORWARD和OUTPUT链以及仅从这些链调用的用户定义链中有效。以下选项控制返回的错误数据包的性质:

       --reject-with type
              给定的类型可以是icmp-net-unreachable、icmp-host-unreachable、icmp-port-unreachable、icmp-proto-unreachable、icmp-net-prohibited、icmp-host-prohibited或icmp-admin-prohibited (*),它们返回相应的ICMP错误消息(icmp-port-unreachable是默认值)。选项tcp-reset可以用于仅匹配TCP协议的规则:这导致发送一个TCP RST数据包。这主要用于阻止ident(113/tcp)探测,这在发送邮件到损坏的邮件主机时经常发生(否则这些主机将不接受您的邮件)。

       (*)在不支持的内核上使用icmp-admin-prohibited将导致纯粹的DROP而不是REJECT。

   SAME(仅限IPv4)
       与SNAT/DNAT类似,具体取决于链:它获取一系列地址(`--to 1.2.3.4-1.2.3.7')并为每个连接给客户端相同的源/目标地址。

       注意:DNAT目标的--persistent选项替代了SAME目标。

       --to ipaddr[-ipaddr]
              要映射源到的地址。可以多次指定,以获得多个范围。

       --nodst
              在选择新的源IP时,不要使用目标IP进行计算

       --random
              为了避免基于端口预测的攻击,将强制随机化端口映射(内核>=2.6.21)。

   SECMARK
       用于为与数据包关联的安全子系统(例如SELinux)设置安全标记值。在安全表中有效(为了向后兼容较旧的内核,它也在mangle表中有效)。标记宽32位。

       --selctx security_context

   SET
       此模块向可以由ipset(8)定义的IP集添加和/或删除条目。

       --add-set setname flag[,flag...]
              将数据包的地址/端口添加到集合

       --del-set setname flag[,flag...]
              从集合中删除数据包的地址/端口

              其中flag(s)是src和/或dst规范,最多不能超过六个。

       --timeout value
              当添加条目时,使用的超时值,而不是集合定义中的默认超时值

       --exist
              添加条目时,如果已经存在,则将超时值重置为指定的值或集合定义中的默认值

       使用-j SET需要提供ipset内核支持,对于标准内核而言,自Linux 2.6.39以来已经具备。

   SNAT
       仅在nat表中的POSTROUTING和INPUT链以及仅从这些链调用的用户定义链中有效。它指定数据包的源地址应该被修改(并且此后在该连接中的所有未来数据包也将被篡改),并且规则应该停止被检查。它采用以下选项:

       --to-source [ipaddr[-ipaddr]][:port[-port]]
              可以指定单个新的源IP地址,一个包含的IP地址范围。如果规则还指定以下协议之一:tcp、udp、dccp或sctp,还可以选择端口范围。如果未指定端口范围,则将源端口下的端口映射到下一个端口下:512之间的端口包括映射到1024以下的端口,其他端口将映射到1024或更高的端口。在可能的情况下,将不进行端口更改。在内核2.6.10之前的版本中,可以添加多个--to-source选项。对于这些内核,如果通过地址范围或多个--to-source选项指定了多个源地址,将在这些地址之间进行简单的轮询(依次循环)。后来的内核(>= 2.6.11-rc1)不再具有NAT到多个范围的能力。

       --random
              如果使用了--random选项,则端口映射将被随机化(内核>=2.6.21)。

       --persistent
              为每个连接为客户端提供相同的源/目标地址。这替代了SAME目标。从2.6.29-rc2开始,支持持久映射。

       内核在2.6.36-rc1之前不具有在INPUT链中进行SNAT的能力。

       IPv6支持可用于Linux内核版本>=3.7。

   SNPT(仅限IPv6)
       提供无状态源IPv6到IPv6网络前缀转换(如RFC 6296所述)。

       您必须在mangle表中使用此目标,而不是在nat表中。它接受以下选项:

       --src-pfx [prefix/length]
              设置要转换的源前缀及其长度

       --dst-pfx [prefix/length]
              设置要在转换中使用的目标前缀及其长度
       此目标用于撤销翻译。例如:

              ip6tables -t mangle -I POSTROUTING -s fd00::/64  -o vboxnet0 -j SNPT --src-pfx fd00::/64 --dst-pfx 2001:e20:2000:40f::/64

              ip6tables -t mangle -I PREROUTING -i wlan0 -d 2001:e20:2000:40f::/64  -j  DNPT  --src-pfx  2001:e20:2000:40f::/64  --dst-pfx
              fd00::/64

       可能需要启用IPv6邻居代理:

              sysctl -w net.ipv6.conf.all.proxy_ndp=1

       还必须使用NOTRACK目标禁用对已翻译流的连接跟踪。

   TCPMSS
       此目标允许更改TCP SYN数据包的MSS值,以控制该连接的最大大小(通常将其限制为IPv4的出站接口MTU减去40,或IPv6的减去60)。当然,它只能与-p tcp一起使用。
   TCPMSS
       此目标用于克服一些阻止“ICMP分片需要”或“ICMPv6数据包过大”报文的不当屏蔽的互联网服务提供商或服务器。这个问题的症状是,从您的Linux防火墙/路由器一切正常,但它后面的设备无法交换大数据包:

       1. Web浏览器连接后无法接收数据。

       2. 小邮件正常工作,但大邮件卡住。

       3. ssh正常工作,但在初始握手之后scp卡住。

       解决方法:启用此选项,并向防火墙配置添加规则,例如:

               iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN
                           -j TCPMSS --clamp-mss-to-pmtu

       --set-mss value
              显式设置MSS选项的值。如果数据包的MSS已经低于指定值,则不会增加(从Linux 2.6.25版本开始),以避免与依赖正确MSS的主机发生更多问题。

       --clamp-mss-to-pmtu
              自动将MSS值固定为(IPv4的path_MTU - 40;IPv6的 -60)。在存在不对称路由的情况下,这可能无法按预期运行——内核使用发送数据包的源和目标IP地址之间的路径MTU。在Linux 2.6.25之前,此选项仅考虑到目标IP地址的路径MTU;随后的内核还考虑到源IP地址的路径MTU。

       这两个选项是互斥的。

   TCPOPTSTRIP
       此目标将TCP数据包上的TCP选项删除。实际上,它将它们替换为NO-OPs。因此,您需要添加 -p tcp 参数。

       --strip-options option[,option...]
              删除给定的选项。可以通过调用带有 -j TCPOPTSTRIP -h 选项的iptables来获取已识别选项的列表。

   TEE
       TEE目标将克隆一个数据包并将此克隆数据包重定向到本地网络段上的另一台机器。换句话说,下一跳必须是目标,否则您必须配置下一跳以进一步转发它,如果有需要的话。

       --gateway ipaddr
              将克隆的数据包发送到具有给定IP地址的主机。使用 0.0.0.0(对于IPv4数据包)或::(IPv6)是无效的。

       要将eth0上的所有传入流量转发到一个网络层记录框:

       -t mangle -A PREROUTING -i eth0 -j TEE --gateway 2001:db8::1

   TOS
       此模块设置IPv4头中的服务类型字段(包括“优先级”位)或IPv6头中的优先级字段。请注意,TOS和DSCP以及ECN共享相同的位。TOS目标仅在mangle表中有效。

       --set-tos value[/mask]
              将掩码(请参阅下面的注意)给定的位清零,并将值异或到TOS/优先级字段中。如果省略掩码,则假定为0xFF。

       --set-tos symbol
              在IPv4的TOS目标中使用时,可以指定符号名称。它暗示掩码为0xFF(请参阅下面的注意)。可以通过调用带有 -j TOS -h 选项的iptables获取已识别的TOS名称列表。

       下列助记符可用:

       --and-tos bits
              将TOS值与位进行二进制AND运算。 (--set-tos 0/invbits的助记符,其中invbits是位的二进制取反。请参阅下面的注意。)

       --or-tos bits
              将TOS值与位进行二进制OR运算。 (--set-tos bits/bits的助记符。请参阅下面的注意。)

       --xor-tos bits
              将TOS值与位进行二进制XOR运算。 (--set-tos bits/0的助记符。请参阅下面的注意。)

       注意:在Linux内核版本2.6.38及以下,除了长期支持的版本2.6.32(>=.42)、2.6.33(>=.15)和2.6.35(>=.14)之外,存在一个错误,其中IPv6 TOS操作未按照文档说明的那样工作,并且与IPv4版本不同。TOS掩码指示要清零的位,因此在应用到原始TOS字段之前,需要对其进行反转。然而,上述内核放弃了反转,这破坏了 --set-tos 及其助记符。

   TPROXY
       此目标仅在mangle表中的PREROUTING链中有效,以及仅从该链中调用的用户定义链。它将数据包重定向到本地套接字,而不以任何方式更改数据包头。它还可以更改可以在高级路由规则中使用的标记值。它有三个选项:

       --on-port port
              指定要使用的目标端口。这是一个必需的选项,0表示新的目标端口与原始端口相同。仅在规则还指定了 -p tcp 或 -p udp 时才有效。

       --on-ip address
              指定要使用的目标地址。默认情况下,地址是传入接口的IP地址。仅在规则还指定了 -p tcp 或 -p udp 时才有效。

       --tproxy-mark value[/mask]
              使用给定值/掩码标记数据包。这里设置的fwmark值可以被高级路由使用。(透明代理工作所需的:否则这些数据包将被转发,这可能不是您想要的。)

   TRACE
       此目标标记数据包,以便内核在数据包穿过表、链、规则时记录匹配的每个规则。

       必须加载记录后端,例如nf_log_ipv4(6)或nfnetlink_log,才能看到此记录。数据包以字符串前缀:“TRACE: tablename:chainname:type:rulenum”进行记录,其中type可以是“rule”表示普通规则,“return”表示用户定义链末尾的隐式规则,“policy”表示内置链的策略。
       只能在raw表中使用。

   TTL(仅适用于IPv4)
       用于修改IPv4 TTL头字段。TTL字段确定数据包在超过其生存时间之前可以经过多少跃点(路由器)。

       设置或增加TTL字段的值可能非常危险,因此应尽量避免使用。此目标仅在mangle表中有效。

       绝不要在离开本地网络的数据包上设置或增加该值!

       --ttl-set value
              将TTL值设置为“value”。

       --ttl-dec value
              将TTL值减少“value”次。

       --ttl-inc value
              将TTL值增加“value”次。

   ULOG(仅适用于IPv4)
       这是NFLOG目标的已弃用的仅适用于ipv4的前身。它提供匹配数据包的用户空间记录。当为规则设置了此目标时,Linux内核将通过netlink套接字向多播组发送此数据包。然后,一个或多个用户空间进程可以订阅各种多播组并接收数据包。与LOG一样,这是一个“非终结目标”,即规则遍历会在下一个规则上继续。

       --ulog-nlgroup nlgroup
              指定要将数据包发送到的netlink组(1-32)。默认值为1。

       --ulog-prefix prefix
              使用指定的前缀为日志消息添加前缀;最长32个字符,并有助于在日志中区分消息。

       --ulog-cprange size
              要复制到用户空间的字节数。值为0始终复制整个数据包,而不考虑其大小。默认值为0。

       --ulog-qthreshold size
              内核内部排队的数据包数量。将此值设置为,例如10,会在内核内部累积10个数据包,然后将它们作为一个netlink多部分消息传输到用户空间。默认值为1(出于向后兼容性考虑)。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值