iptables-extensions(8) iptables 1.8.9 iptables-extensions(8)
NAME
iptables-extensions — list of extensions in the standard iptables distribution
总览
iptables [-m name [module-options…]] [-j target-name [target-options…]
ip6tables [-m name [module-options…]] [-j target-name [target-options…]
MATCH EXTENSIONS
iptables可以使用带有-m或–match选项的扩展数据包匹配模块,后面跟着匹配的模块名称;之后,根据特定模块的不同,各种额外的命令行选项变得可用。您可以在一行中指定多个扩展匹配模块,并且可以在指定模块后使用-h或–help选项来接收特定于该模块的帮助。扩展的匹配模块按照规则中指定的顺序进行评估。
如果指定了-p或–protocol,并且仅当遇到未知选项时,iptables将尝试加载与协议同名的匹配模块,以尝试使该选项可用。
addrtype
此模块根据数据包的地址类型(address type)进行匹配。地址类型在内核网络堆栈中使用,并将地址分为不同的组。该组的确切定义取决于特定的第三层协议。
可以匹配的地址类型:
UNSPEC 未指定的地址(即0.0.0.0)
UNICAST 单播地址
LOCAL 本地地址
BROADCAST 广播地址
ANYCAST 任意播
MULTICAST 多播地址
BLACKHOLE 黑洞地址
UNREACHABLE 无法访问的地址
PROHIBIT 被禁止的地址
THROW FIXME
NAT FIXME
XRESOLVE
[!] –src-type type 匹配源地址类型
[!] –dst-type type 匹配目标地址类型
–limit-iface-in 只匹配进入接口的报文,选项只能应用在PREROUTING, INPUT 和 FORWARD 链,不能和–limit-iface-out 同时使用
–limit-iface-out 只匹配离开接口的报文,选项只能应用在OUTPUT, FORWARD 和 POSTROUTING 链,不能和–limit-iface-in 同时使用
ah (IPv6-specific)
此模块匹配IPsec数据包的身份验证报文头中的参数
[!] –ahspi spi[:spi] Matches SPI.
[!] –ahlen length Total length of this header in octets.
–ahres Matches if the reserved field is filled with zero.
ah (IPv4-specific)
此模块匹配IPsec数据包的身份验证报文头中的参数
[!] –ahspi spi[:spi]
cgroup
[!] –path path
匹配cgroup2成员资格。
每个套接字都与创建进程的v2 cgroup相关联。这将匹配来自或去往指定路径子层次中所有套接字的数据包。路径应相对于cgroup2层次结构的根。
[!] –cgroup classid
匹配cgroup net_cls的classid。
classid标记是通过cgroup net_cls控制器设置的。此选项和–path不能一起使用。
Example:
iptables -A OUTPUT -p tcp –sport 80 -m cgroup ! –path service/http-server -j DROP
iptables -A OUTPUT -p tcp –sport 80 -m cgroup ! –cgroup 1 -j DROP
cluster
允许您部署网关和后端负载共享集群,而不需要负载平衡器。
此匹配要求所有节点看到相同的数据包。因此,在给定以下选项的情况下,集群匹配决定了该节点是否必须处理数据包:
–cluster-total-nodes num
设置群集中的总节点数。
[!] –cluster-local-node num
设置本地节点号ID。
[!] –cluster-local-nodemask mask
设置本地节点号ID掩码。您可以使用此选项代替–cluster-local-node。
–cluster-hash-seed value
设置Jenkins哈希的种子值。
Example:
iptables -A PREROUTING -t mangle -i eth1 -m cluster –cluster-total-nodes 2 –cluster-local-node 1 –cluster-hash-seed 0xdeadbeef -j MARK –set-mark 0xffff
iptables -A PREROUTING -t mangle -i eth2 -m cluster –cluster-total-nodes 2 –cluster-local-node 1 –cluster-hash-seed 0xdeadbeef -j MARK –set-mark 0xffff
iptables -A PREROUTING -t mangle -i eth1 -m mark ! –mark 0xffff -j DROP
iptables -A PREROUTING -t mangle -i eth2 -m mark ! –mark 0xffff -j DROP
以及以下命令,使所有节点看到相同的数据包:
ip maddr add 01:00:5e:00:01:01 dev eth1
ip maddr add 01:00:5e:00:01:02 dev eth2
arptables -A OUTPUT -o eth1 –h-length 6 -j mangle –mangle-mac-s 01:00:5e:00:01:01
arptables -A INPUT -i eth1 –h-length 6 –destination-mac 01:00:5e:00:01:01 -j mangle –mangle-mac-d 00:zz:yy:xx:5a:27
arptables -A OUTPUT -o eth2 –h-length 6 -j mangle –mangle-mac-s 01:00:5e:00:01:02
arptables -A INPUT -i eth2 –h-length 6 –destination-mac 01:00:5e:00:01:02 -j mangle –mangle-mac-d 00:zz:yy:xx:5a:27
comment
允许您向任何规则添加注释(最多256个字符)。
–comment comment
Example:
iptables -A INPUT -i eth1 -m comment –comment “my local LAN”
connbytes
模块用于流量控制,匹配连接中已经传输的数据流量。
计数器是64位的,因此预计不会溢出;)
主要用途是检测长期下载,并在流量控制中将其标记为使用较低优先级的频带进行调度。
每个连接传输的字节数也可以通过“conntrack -L”查看,并通过ctnetlink访问。
[!] –connbytes from[:to]
匹配大于from且小于to的数据包。如果省略了to,则只进行from检查。“!”用于匹配不在该范围内的数据包。
–connbytes-dir {
original|reply|both}
要匹配哪些数据包
–connbytes-mode {
packets|bytes|avgpkt}
是否检查数据packets(包的总量)、bytes(传输的字节数)或avgpkt(迄今为止接收到的所有数据包的平均大小)(以字节为单位)。请注意,当“both”与“avgpkt”一起使用时,且数据(主要)仅在一个方向上传输(例如HTTP),平均数据包大小将约为实际数据包的一半。
Example:
iptables .. -m connbytes –connbytes 10000:100000 –connbytes-dir both –connbytes-mode bytes …
connlabel
模块用于匹配或向连接添加连接标签。connlabels与connmarks相似,只是标签是基于位的;即,所有标签可以同时附着到流上。目前最多支持128个唯一标签。
[!] –label name
如果已在连接上设置标签名称,则匹配。可以使用数字代替名称(名称将被翻译成数字,见下面的示例)。使用数字总是会覆盖connlabel.conf。
–set
如果连接上尚未设置标签,请进行设置。请注意,设置标签可能会失败。这是因为内核在创建连接时分配conntrack标签存储区域,并且只保留创建连接时存在的规则集所需的内存量。在这种情况下,匹配将失败(或成功,以防–label选项被否定)。
此匹配取决于libnetfilter_conntrack 1.0.4或更高版本。标签转换是通过/etc/xtables/connlabel.conf配置文件完成的。
Example:
0 eth0-in
1 eth0-out
2 ppp-in
3 ppp-out
4 bulk-traffic
5 interactive
connlimit
模块允许您限制每个客户端IP地址(或客户端地址块)到服务器的并行连接数量。
–connlimit-upto n
如果现有连接数小于或等于n,则匹配。
–connlimit-above n
如果现有连接数大于n,则匹配。
–connlimit-mask prefix_length
使用前缀长度对主机进行分组。对于IPv4,这必须是介于(包括)0和32之间的数字。对于IPv6,介于0和128之间。如果未指定,则使用适用协议的最大前缀长度。
–connlimit-saddr
将限制应用于源组。如果未指定–connlimit-daddr,则这是默认值。
–connlimit-daddr
将限制应用于目标组。
Examples:
# 每个客户端主机允许2个telnet连接
iptables -A INPUT -p tcp –syn –dport 23 -m connlimit –connlimit-above 2 -j REJECT
# 你也可以反过来匹配:
iptables -A INPUT -p tcp –syn –dport 23 -m connlimit –connlimit-upto 2 -j ACCEPT
# 将并行HTTP请求的数量限制为每个C类大小的源网络(24位网络掩码)16个
iptables -p tcp –syn –dport 80 -m connlimit –connlimit-above 16 –connlimit-mask 24 -j REJECT
# 将链接本地网络的并行HTTP请求数限制为16
(ipv6) ip6tables -p tcp –syn –dport 80 -s fe80::/64 -m connlimit –connlimit-above 16 –connlimit-mask 64 -j REJECT
# 限制特定主机的连接数:
ip6tables -p tcp –syn –dport 49152:65535 -d 2001:db8::1 -m connlimit –connlimit-above 100 -j REJECT
connmark
此模块匹配与连接关联的网络过滤器标记字段(可以使用下面的CONNMARK目标设置)。
[!] –mark value[/mask]
将连接中的数据包与给定的标记值进行匹配(如果指定了掩码,则在比较之前,该掩码将与标记进行逻辑AND运算)。
conntrack
当与连接跟踪结合使用时,此模块允许访问此数据包/连接的连接跟踪状态。
[!] –ctstate statelist
statelist是以逗号分隔的要匹配的连接状态列表。下面列出了可能的状态。
[!] –ctproto l4proto
要匹配的4层协议(编号或名称)
[!] –ctorigsrc address[/mask] 匹配原始来源地址
[!] –ctorigdst address[/mask] 匹配原始目标地址
[!] –ctreplsrc address[/mask] 匹配应答来源地址
[!] –ctrepldst address[/mask] 匹配应答目标地址
[!] –ctorigsrcport port[:port] 匹配原始来源端口
[!] –ctorigdstport port[:port] 匹配原始来源端口
[!] –ctreplsrcport port[:port] 匹配原始来源端口
[!] –ctrepldstport port[:port] 匹配原始来源端口
[!] –ctstatus statelist
statuslist是一个以逗号分隔的要匹配的连接状态列表。下面列出了可能的状态。
[!] –ctexpire time[:time]
将剩余寿命(秒)与给定值或值范围(包括)进行匹配
–ctdir {
ORIGINAL|REPLY}
匹配沿指定方向流动的数据包。如果根本没有指定此标志,则在两个方向上匹配数据包。
States for –ctstate:
INVALID 非法连接
NEW 新连接请求
ESTABLISHED 已建立连接,成功地发送了SYN和ACK数据包
RELATED 一个已经建立的连接相关的连接
UNTRACKED 未追踪链接
SNAT 源地址转换
DNAT 目标地址转换
Statuses for –ctstatus:
NONE 以下都不是
EXPECTED 一个预期的连接(即conntrack助手设置了它)
SEEN_REPLY Conntrack在两个方向上都看到了数据包
ASSURED Conntrack条目不应提前过期
CONFIRMED 连接已确认:原始数据包已离开盒子
cpu
[!] –cpu number
匹配处理此数据包的cpu。cpu的编号从0到NR_CPUS-1。可以与RPS(远程数据包引导)或多队列NICs结合使用,以在不同队列上传播网络流量。
Example:
iptables -t nat -A PREROUTING -p tcp –dport 80 -m cpu –cpu 0 -j REDIRECT –to-port 8080
iptables -t nat -A PREROUTING -p tcp –dport 80 -m cpu –cpu 1 -j REDIRECT –to-port 8081
dccp
[!] –source-port,–sport port[:port]
[!] –destination-port,–dport port[:port]
[!] –dccp-types mask
当DCCP数据包类型为“mask”匹配时。“mask”是一个逗号分隔的数据包类型列表。数据包类型包括:REQUEST RESPONSE DATA ACK DATAACK CLOSEREQ CLOSE RESET SYNC SYNCACK INVALID。
[!] –dccp-option number
如果设置了DCCP选项,则匹配。
devgroup
匹配数据包传入/传出接口的设备组。
[!] –src-group name
匹配传入设备的设备组
[!] –dst-group name
匹配输出设备的设备组
dscp
此模块与IP报文头中TOS字段内的6位DSCP字段匹配。DSCP已经取代了IETF中的TOS。
[!] –dscp value
匹配数字(十进制或十六进制)值[0-63]。
[!] –dscp-class class
匹配DiffServ类。该值可以是be、EF、AFxx或CSx类中的任何一个。然后,它将被转换为相应的数值。
dst (IPv6-specific)
此模块与Destination Options报文头中的参数匹配
[!] –dst-len length
此报文头的总长度(八位字节)。
–dst-opts type[:length][,type[:length]…]
选项的数字类型和选项数据的长度(以八位字节为单位)。
ecn
允许您匹配IPv4/IPv6和TCP报头的ECN位。ECN是RFC3168中规定的显式拥塞通知机制
[!] –ecn-tcp-cwr
如果设置了TCP ECN CWR(Congestion Window Received)位,则此项匹配。
[!] –ecn-tcp-ece
如果设置了TCP ECN ECE(ECN Echo)位,则此匹配。
[!] –ecn-ip-ect num
这与特定的IPv4/IPv6 ECT(ECN-Capable Transport)相匹配。您必须指定一个介于“0”和“3”之间的数字。
esp
此模块与IPsec数据包的ESP报文头中的SPI匹配。
[!] –espspi spi[:spi]
eui64 (IPv6-specific)
此模块匹配无状态自动配置IPv6地址的EUI-64部分。它将从以太网帧中的源MAC地址导出的EUI-64与IPv6源地址的较低64位进行比较。但“Universal/Local”位没有进行比较。此模块与其他链路层帧不匹配,仅在PREROUTING、INPUT和FORWARD链中有效。
frag (IPv6-specific)
此模块与Fragment报文头中的参数匹配
[!] –fragid id[:id]
匹配给定的标识或范围
[!] –fraglen length
此选项不能用于内核2.6.10或更高版本。Fragment报文头的长度是静态的,此选项没有意义。
–fragres
如果保留字段填充为零,则匹配
–fragfirst
匹配第一个分片
–fragmore
匹配更多的分片
–fraglast
匹配最后一个分片
hbh (IPv6-specific)
此模块与“Hop-by-Hop”报文头中的参数匹配。
[!] –hbh-len length
此报文头的总长度(八位字节)。
–hbh-opts type[:length][,type[:length]…]
选项的数字类型和选项数据的长度(以八位字节为单位)。
helper
此模块匹配与特定conntrack帮助程序相关的数据包。
[!] –helper string
匹配与指定conntrack帮助程序相关的数据包。
对于与默认端口上的ftp会话相关的数据包,字符串可以是“ftp”。对于其他端口,在值后附加-portnr,即“ftp-2121”。
同样的规则也适用于其他conntrack助手。
hl (IPv6-specific)
此模块与IPv6报文头中的Hop Limit字段匹配。
[!] –hl-eq value
如果跳跃限制等于值,则匹配。
–hl-lt value
如果跳跃限制小于值,则匹配。
–hl-gt value
如果跳跃限制大于值,则匹配。
icmp (IPv4-specific)
如果指定了“–protocol icmp”,则可以使用此扩展。它提供以下选项:
[!] –icmp-type {type[/code]|typename}
这允许指定ICMP类型,它可以是数字ICMP类型、类型/代码对或命令显示的ICMP类型名称之一
iptables -p icmp -h
icmp6 (IPv6-specific)
如果指定了“–protocol ipv6-icmp”或“–protocol icmpv6”,则可以使用此扩展。它提供以下选项:
[!] –icmpv6-type type[/code]|typename
这允许指定ICMPv6类型,可以是数字ICMPv6的类型、类型和代码,也可以是命令显示的ICMPv6名称之一
ip6tables -p ipv6-icmp -h
iprange
匹配任意IP地址范围。
[!] –src-range from[-to]
匹配指定范围内的源IP
[!] –dst-range from[-to]
匹配指定范围内的目标IP
ipv6header (IPv6-specific)
此模块匹配IPv6扩展报文头和/或上层报文头。
–soft
如果数据报包含用–header指定的任何标头,则匹配。
[!] –header header[,header…]
匹配完全包含所有指定报文头的数据包。用ESP报文头封装的报文头超出范围。可能的报文头类型包括:
hop|hop-by-hop Hop-by-Hop报文头
dst 目标选项报文头
route 路由报文头
frag 分片报头
auth 身份验证报文头
esp 封装安全有效负载(Encapsulating Security Payload)报文头
none 没有与IPv6标头或任何IPv6扩展标头的“Next header字段”中的59匹配的Next标头
prot 其匹配任何上层协议报头。还允许使用/etc/protocols中的协议名称和数值。数字255相当于proto。
ipvs
匹配IPVS连接属性。
[!] –vproto protocol
VIP协议匹配;按编号或名称,例如“tcp”
[!] –vaddr address[/mask]
要匹配的VIP地址
[!] –vport port
VIP端口匹配;按编号或名称,例如“http”。
–vdir {
ORIGINAL|REPLY}
数据包流向。
[!] –vmethod {
GATE|IPIP|MASQ}
使用的IPVS转发方法。
[!] –vportctl port
要匹配的控制连接的VIP端口,例如21用于FTP。
length
该模块将数据包的第三层有效载荷(例如第四层数据包)的长度与特定值或值范围进行匹配。
[!] –length length[:length]
limit
此模块使用令牌桶过滤器以有限的速率进行匹配。使用此扩展名的规则将匹配,直到达到此限制。例如,它可以与LOG目标结合使用,以提供有限的日志记录。
xt_limit不支持否定,您必须使用-m hashlimit。在这种情况下,hashlimit速率,而忽略–hash-limit-mode。
—limit rate[/second|/minute|/hour|/day]
最大平均匹配率:指定为数字,带有可选的“/sec”、“/minute”、“/hhour”或“/day”后缀;默认值为3/小时。
–limit-burst number
要匹配的最大初始数据包数量:每当未达到上述限制时,此数量将被重新充电一次,直至达到此数量;默认值为5。
mac
[!] –mac-source address
匹配源MAC地址。格式必须为XX:XX:XX:MX:XX:XX。注意,这只对来自以太网设备并进入PREROUTING、FORWARD或INPUT链的数据包有意义。
mark
此模块匹配与数据包关联的网络过滤器标记字段(可以使用下面的标记目标进行设置)。
[!] –mark value[/mask]
将数据包与给定的无符号标记值进行匹配(如果指定了掩码,则在比较之前会与掩码进行逻辑与运算)。
mh (IPv6-specific)
如果指定了“–protocol ipv6-mh”或“–protocol mh”,则加载此扩展。它提供以下选项:
[!] –mh-type type[:type]
这允许指定移动性标头(MH)类型,该类型可以是数字MH类型、类型或命令显示的MH类型名称之一
ip6tables -p mh -h
multiport
此模块匹配一组源端口或目标端口。最多可以指定15个端口。一个端口范围(port:port)计为两个端口。它只能与以下协议之一结合使用:tcp、udp、udplite、dccp和sctp。
[!] –source-ports,–sports port[,port|,port:port]…
如果源端口是给定端口之一,则进行匹配。–sports是此选项的方便别名。多个端口或端口范围用逗号分隔,端口范围用冒号指定。因此,53,1024:65535将匹配端口53,并且所有端口从1024到65535。
[!] –destination-ports,–dports port[,port|,port:port]…
如果目标端口是给定端口之一,则匹配。–dports是此选项的方便别名。
[!] –ports port[,port|,port:port]…
如果源端口或目标端口等于给定端口之一,则匹配。
nfacct
nfacct匹配为iptables提供了扩展的计费基础架构。您必须将此匹配与独立用户空间实用程序nfacct(8)一起使用。
此匹配唯一可用的选项如下:
–nfacct-name name
这允许您指定将用于核算此规则集匹配的流量的现有对象名称。
要使用此扩展,必须创建一个计费对象:
nfacct add http-traffic
然后,您必须通过iptables将其附加到计费对象:
iptables -I INPUT -p tcp –sport 80 -m nfacct –nfacct-name http-traffic
iptables -I OUTPUT -p tcp –dport 80 -m nfacct –nfacct-name http-traffic
然后,您可以检查规则匹配的流量:
nfacct get http-traffic
{ pkts = 00000000000000000156, bytes = 00000000000000151786 } = http-traffic;
physdev
该模块在网桥端口上匹配从属于网桥设备的输入和输出设备。此模块是实现透明桥接IP防火墙的基础设施的一部分,仅适用于2.5.44以上的内核版本。
[!] –physdev-in name
用于接收数据包的网桥端口的名称(仅适用于进入INPUT、FORWARD和PREROUTING链的数据包)。如果接口名称以“+”结尾,则以该名称开头的任何接口都将匹配。如果数据包没有通过网桥设备到达,则此数据包将不匹配此选项,除非'!“使用。
[!] –physdev-out name
将通过其发送数据包的网桥端口的名称(用于进入FORWARD和POSTROUTING链的桥接数据包)。如果接口名称以“+”结尾,则以该名称开头的任何接口都将匹配。
[!] –physdev-is-in
如果数据包是通过网桥接口进入的,则匹配。
[!] –physdev-is-out
如果数据包将通过网桥接口离开,则匹配。
[!] –physdev-is-bridged
如果数据包正在桥接,因此未被路由,则进行匹配。这仅在FORWARD和POSTROUTING链中有用。
pkttype
此模块与链路层数据包类型匹配。
[!] –pkt-type {
unicast|broadcast|multicast}
policy
此模块与IPsec用于处理数据包的策略相匹配。
–dir {
in|out}
用于匹配解封策略或封装策略。in在PREROUTING、INPUT和FORWARD链中有效,out在POSTROUTING、OUTPUT和FORWAR链中有效。
–pol {
none|ipsec}
如果数据包经过IPsec处理,则匹配。–pol none不能与–strict结合使用。
–strict
选择是匹配精确的策略,还是在策略的任何规则与给定策略匹配时进行匹配。
对于要描述的每个策略元素,可以使用以下一个或多个选项。当–strict生效时,每个元素必须至少使用一个。
[!] –reqid id
匹配策略规则的reqid。reqid可以使用setkey(8)指定,使用unique:id作为级别。
[!] –spi spi
匹配SA的SPI。
[!] –proto {
ah|esp|ipcomp}
匹配封装协议。
[!] –mode {
tunnel|transport}
匹配封装模式。
[!] –tunnel-src addr[/mask]
匹配隧道模式SA的源端点地址。仅对–mode tunnel有效。
[!] –tunnel-dst addr[/mask]
匹配隧道模式SA的目标端点地址。仅对–mode tunnel有效。
–next
启动策略规范中的下一个元素。只能与–strict一起使用。
quota
通过减少每个数据包的字节计数器来实现网络配额。条件匹配,直到字节计数器达到零。行为与否定相反(即,在字节计数器达到零之前,条件不匹配)。
[!] –quota bytes
配额(以字节为单位)。
rateest
速率估计器可以与RATEEST目标收集的估计速率相匹配。它支持对绝对bps/pps值进行匹配,比较两个速率估计器,并对两个速率估计值之间的差异进行匹配。
为了更好地了解可用的选项,这些都是可能的组合:
• rateest operator rateest-bps
• rateest operator rateest-pps
• (rateest minus rateest-bps1) operator rateest-bps2
• (rateest minus rateest-pps1) operator rateest-pps2
• rateest1 operator rateest2 rateest-bps(without rate!)
• rateest1 operator rateest2 rateest-pps(without rate!)
• (rateest1 minus rateest-bps1) operator (rateest2 minus rateest-bps2)
• (rateest1 minus rateest-pps1) operator (rateest2 minus rateest-pps2)
–rateest-delta
对于每个估计器(绝对或相对模式),计算估计器确定的流量与使用BPS/PPS选项选择的静态值之间的差值。如果流速高于指定的BPS/PPS,将使用0而不是负值。换句话说,使用了“max(0, rateest#_rate – rateest#_bps)”。
[!] –rateest-lt
如果速率小于给定的速率/估计值,则进行匹配。
[!] –rateest-gt
如果速率大于给定的速率/估计器,则进行匹配。
[!] –rateest-et
如果速率等于给定的速率/估计器,则匹配。
在所谓的“绝对模式”中,只使用一个速率估计器并与静态值进行比较,而在“相对模式”中则将两个速率估器与另一个速率估计器进行比较。
–rateest name
绝对模式的一个速率估计器的名称。
–rateest1 name
–rateest2 name
相对模式的两个速率估计器的名称。
–rateest-bps [value]
–rateest-pps [value]
–rateest-bps1 [value]
–rateest-bps2 [value]
–rateest-pps1 [value]
–rateest-pps2 [value]
按每秒字节或数据包比较估计器,并与所选值进行比较。请参阅上面的项目符号列表,了解在哪种情况下使用哪个选项。可以使用单位后缀-可用的后缀有:bit, [kmgt]bit, [KMGT]ibit, Bps, [KMGT]Bps, [KMGT]iBps。
Example: 这可用于根据数据连接启动时的可用带宽,通过两条线路路由FTP服务器的传出数据连接:
# Estimate outgoing rates
iptables -t mangle -A POSTROUTING -o eth0 -j RATEEST –rateest-name eth0 –rateest-interval 250ms –rateest-ewma 0.5s
iptables -t mangle -A POSTROUTING -o ppp0 -j RATEEST –rateest-name ppp0 –rateest-interval 250ms –rateest-ewma 0.5s
# Mark based on available bandwidth
iptables -t mangle -A balance -m conntrack –ctstate NEW -m helper –helper ftp -m rateest –rateest-delta –rateest1 eth0 –rateest-bps1 2.5mbit –rateest-gt –rateest2 ppp0 –rateest-bps2 2mbit -j CONNMARK –set-mark 1
iptables -t mangle -A balance -m conntrack –ctstate NEW -m helper –helper ftp -m rateest –rateest-delta –rateest1 ppp0 –rateest-bps1 2mbit –rateest-gt –rateest2 eth0 –rateest-bps2 2.5mbit -j CONNMARK –set-mark 2
iptables -t mangle -A balance -j CONNMARK –restore-mark
realm (IPv4-specific)
这与路由领域相匹配。路由领域用于涉及BGP等动态路由协议的复杂路由设置。
[!] –realm value[/mask]
匹配给定的领域编号(以及可选的掩码)。如果不是数字,则值可以是/etc/iproute2/rt_reposses中的命名域(在这种情况下不能使用掩码)。value和mask都是四字节无符号整数,可以用十进制、十六进制(通过前缀“0x”)或八进制(如果给出前导零)指定。
recent
允许您动态创建IP地址列表,然后以几种不同的方式与该列表进行匹配。
例如,你可以从试图连接到防火墙139端口的人中创建一个“badguy”列表,然后在不考虑他们的情况下从他们那里删除所有未来的数据包。
–set, –rcheck, –update 和 –remove 相互排斥
–name name
指定用于命令的列表。如果未指定名称,则将使用DEFAULT。
[!] –set
这将把数据包的源地址添加到列表中。如果源地址已经在列表中,这将更新现有条目。这将始终返回成功(如果传入!,则返回失败)。
–rsource
匹配/保存最近列表表中每个数据包的源地址。这是默认设置。
–rdest
匹配/保存最近列表表中每个数据包的目的地址。
–mask netmask
将应用于此最近列表的网络掩码。
[!] –rcheck
检查数据包的源地址当前是否在列表中。
[!] –update
类似于–rcheck,但如果匹配,它将更新“last seen”的时间戳。
[!] –remove
检查数据包的源地址当前是否在列表中,如果是,则该地址将从列表中删除,规则将返回true。如果找不到地址,则返回false。
–seconds seconds
此选项必须与–rcheck或–update之一一起使用。使用时,这将缩小匹配范围,使其仅在地址在列表中且在最后给定的秒数内看到时发生。
–reap
此选项只能与–seconds一起使用。使用时,这将导致清除早于最后给定秒数的条目。
–hitcount hits
此选项必须与–rcheck或–update之一一起使用。使用时,这将缩小匹配范围,使其仅在地址在列表中且接收到的数据包大于或等于给定值时发生。此选项可以与–seconds一起使用,以创建一个更窄的匹配,该匹配需要在特定时间范围内进行一定数量的命中。hitcount参数的最大值由xt_recent内核模块的“ip_pkt_list_tot”参数给出。在命令行上超过此值将导致规则被拒绝。
–rttl
此选项只能与–rcheck或–update之一一起使用。使用时,这将缩小匹配范围,使其仅在地址在列表中且当前数据包的TTL与符合–set规则的数据包的TTL匹配时发生。如果有人通过向您发送虚假数据包来禁止他人访问您的网站,从而通过此模块拒绝您,从而伪造其源地址,这可能很有用。
Examples:
iptables -A FORWARD -m recent –name badguy –rcheck –seconds 60 -j DROP
iptables -A FORWARD -p tcp -i eth0 –dport 139 -m recent –name badguy –set -j DROP
/proc/net/xt_recent/* 是地址的当前列表,以及每个列表中每个条目的信息。
可以读取/proc/net/xt_recent/中的每个文件以查看当前列表,也可以使用以下命令编写两个文件以修改列表:
echo +addr >/proc/net/xt_recent/DEFAULT
将addr添加到默认列表。
echo –addr >/proc/net/xt_recent/DEFAULT
从默认列表中删除addr。
echo / >/proc/net/xt_recent/DEFAULT
刷新DEFAULT列表(删除所有条目)。
模块本身接受参数,默认值如下:
ip_list_tot=100
每个表记住的地址数。
ip_pkt_list_tot=20
记住的每个地址的数据包数。
ip_list_hash_size=0
哈希表大小。0表示根据ip_list_tot计算,默认值为512。
ip_list_perms=0644
/proc/net/xt_recent/*文件的权限。
ip_list_uid=0
/proc/net/xt_recent/*文件所有权的数字UID。
ip_list_gid=0
/proc/net/xt_recent/*文件所有权的数字GID。
rpfilter
对数据包执行反向路径筛选器测试。如果对数据包的回复将通过数据包到达的同一接口发送,则数据包将匹配。请注意,与内核中的rp_filter不同,受IPSec保护的数据包没有得到特殊处理。如果需要,请将此匹配与策略匹配相结合。此外,始终允许通过环回接口到达的数据包。此匹配只能在raw或mangle的PREROUTING链中使用。
–loose
用于指定即使所选输出设备不是预期的输出设备,反向路径过滤器测试也应匹配。
–validmark
在执行反向路径路由查找时,还要使用数据包的nfmark值。
–accept-local
这将允许数据包从网络到达,其源地址也分配给本地机器。
–invert
这将颠倒比赛的感觉。与其匹配通过反向路径过滤器测试的数据包,不如匹配那些失败的数据包。
Example 记录并丢弃未通过反向路径过滤器测试的数据包:
iptables -t raw -N RPFILTER
iptables -t raw -A RPFILTER -m rpfilter -j RETURN
iptables -t raw -A RPFILTER -m limit –limit 10/minute -j NFLOG –nflog-prefix “rpfilter drop”
iptables -t raw -A RPFILTER -j DROP
iptables -t raw -A PREROUTING -j RPFILTER
Example 在不记录的情况下丢弃失败的数据包:
iptables -t raw -A RPFILTER -m rpfilter –invert -j DROP
rt (IPv6-specific)
IPv6路由报文头匹配
[!] –rt-type type
匹配类型(数字)。
[!] –rt-segsleft num[:num]
匹配“左侧分段”字段(范围)。
[!] –rt-len length
匹配此报文头的长度。
–rt-0-res
也匹配保留字段(类型=0)
–rt-0-addrs addr[,addr…]
匹配类型=0地址(列表)。
–rt-0-not-strict
类型=0的地址列表不是严格列表。
sctp
此模块匹配流控制传输协议报文头。
[!] –source-port,–sport port[:port]
[!] –destination-port,–dport port[:port]
[!] –chunk-types {
all|any|only} chunktype[:flags] […]
大写的标志字母表示如果设置,标志将匹配,小写的标志字母则表示如果未设置,标志匹配。
Match types:
all 如果所有给定的块类型都存在并且标志匹配,则匹配。
any 如果任何给定的块类型存在给定的标志,则进行匹配。
only 如果只有给定的块类型存在给定的标志并且没有丢失,则进行匹配。
Chunk types: DATA INIT INIT_ACK SACK HEARTBEAT HEARTBEAT_ACK ABORT SHUTDOWN SHUTDOWN_ACK ERROR COOKIE_ECHO COOKIE_ACK ECN_ECNE ECN_CWR SHUTDOWN_COMPLETE I_DATA RE_CONFIG PAD ASCONF ASCONF_ACK FORWARD_TSN I_FORWARD_TSN
chunk type available flags
DATA I U B E i u b e
I_DATA I U B E i u b e
ABORT T t
SHUTDOWN_COMPLETE T t
(小写表示标志应为“关闭”,大写表示“打开”)
Examples:
iptables -A INPUT -p sctp –dport 80 -j DROP
iptables -A INPUT -p sctp –chunk-types any DATA,INIT -j DROP
iptables -A INPUT -p sctp –chunk-types any DATA:Be -j ACCEPT
set
此模块匹配可以由ipset(8)定义的IP集。
[!] –match-set setname flag[,flag]…
其中标志是src and/or dst规范的逗号分隔列表,最多只能有六个。因此,命令
iptables -A FORWARD -m set –match-set test src,dst
将匹配数据包,对于这些数据包(如果集合类型为ipportmap),可以在指定的集合中找到源地址和目标端口对。如果指定集合的集合类型为一维(例如ipmap),则该命令将匹配在指定集合中可以找到源地址的数据包。
–return-nomatch
如果指定了–return-nomatch选项,并且集合类型支持nomatch标志,则匹配过程相反:与标记为nomatch的元素的匹配返回true,而与普通元素的匹配则返回false
! –update-counters
如果–update-counters标志被否定,则集合中匹配元素的数据包和字节计数器将不会被更新。默认情况下,数据包和字节计数器会更新。
! –update-subcounters
如果–update-subcounters标志被否定,则列表类型集合的成员集中匹配元素的数据包和字节计数器将不会被更新。默认情况下,数据包和字节计数器会更新。
[!] –packets-eq value
如果数据包与集合中的一个元素匹配,则仅当元素的数据包计数器也与给定值匹配时才匹配。
–packets-lt value
如果数据包与集合中的一个元素匹配,则仅当元素的数据包计数器也小于给定值时才匹配。
–packets-gt value
如果数据包与集合中的一个元素匹配,则仅当元素的数据包计数器也大于给定值时才匹配。
[!] –bytes-eq value
如果数据包与集合中的一个元素匹配,则仅当元素的字节计数器也与给定值匹配时才进行匹配。
–bytes-lt value
如果数据包与集合中的一个元素匹配,则仅当元素的字节计数器也小于给定值时才匹配。
–bytes-gt value
如果数据包与集合中的一个元素匹配,则仅当元素的字节计数器也大于给定值时才匹配。
当在没有计数器支持的情况下定义集合时,将忽略与数据包和字节计数器相关的选项和标志。
如果选项–match-set与其他扩展的选项不冲突,则可以用–set替换。
使用-m set需要提供ipset内核支持,对于标准内核,这是自Linux2.6.39以来的情况。
socket
如果通过在数据包上进行套接字查找可以找到打开的TCP/UDP套接字,则此项匹配。如果存在已建立或非零绑定的侦听套接字(可能具有非本地地址),则它匹配。使用TCP/UDP数据包的数据包元组或嵌入在ICMP/ICPMv6错误数据包中的原始TCP/UDP报头进行查找。
–transparent
忽略不透明套接字。
–nowildcard
不要忽略绑定到“any”地址的套接字。默认情况下,套接字匹配不会接受零绑定侦听器,因为这样本地服务就可以拦截原本会转发的流量。因此,当用于匹配转发的流量以将此类数据包重定向到具有策略路由的本地计算机时,此选项具有安全隐患。当使用套接字匹配来实现绑定到非本地地址的完全透明代理时,建议使用–transparent选项。
Example (assuming packets with mark 1 are delivered locally):
-t mangle -A PREROUTING -m socket –transparent -j MARK –set-mark 1
–restore-skmark
将数据包标记设置为匹配的套接字标记。可以与–transparent和–nowildcard选项组合使用,以在恢复数据包标记时限制要匹配的套接字。
Example:应用程序打开2个透明(IP_TRANSPARENT)套接字,并在其上设置一个带有SO_MARK套接字选项的标记。我们可以过滤匹配的数据包:
-t mangle -I PREROUTING -m socket –transparent –restore-skmark -j action
-t mangle -A action -m mark –mark 10 -j action2
-t mangle -A action -m mark –mark 11 -j action3
state
“state”扩展是“conntrack”模块的一个子集。“state”允许访问此数据包的连接跟踪状态。
[!] –state state
其中state是要匹配的连接状态的逗号分隔列表。只有一部分未被“conntrack”识别的状态被识别:INVALID, ESTABLISHED, NEW, RELATED 或 UNTRACKED。有关它们的描述,请参阅本手册页中的“conntrack”标题。
statistic
此模块根据某些统计条件匹配数据包。它支持通过–mode选项设置的两种不同模式。
Supported options:
–mode mode
设置匹配规则的匹配模式,支持的模式有随机和第n种。
[!] –probability p
设置数据包随机匹配的概率。它只适用于随机模式。p必须在0.0和1.0之间。支持的粒度以1/2147483648为增量。
[!] –every n
每n个包匹配一个包。它仅适用于第n种模式(另请参见–packet选项)。
–packet p
为第n个模式设置初始计数器值(0<=p<=n-1,默认值0)。
string
此模块通过使用某种模式匹配策略来匹配给定的字符串。它需要一个>=2.6.14的linux内核。
–algo {
bm|kmp}
选择模式匹配策略。(bm=Boyer Moore,kmp=Knuth Pratt Morris)
–from offset
设置开始查找任何匹配项的偏移量。如果未通过,默认值为0。
–to offset
设置应扫描的偏移量。也就是说,字节 offset-1(从0开始计数)是最后一个被扫描的字节。如果未通过,则默认为数据包大小。
[!] –string pattern
匹配给定的模式。
[!] –hex-string pattern
匹配十六进制表示法中的给定模式。
–icase
搜索时忽略大小写。
Examples:
# 字符串模式可用于简单的文本字符。
iptables -A INPUT -p tcp –dport 80 -m string –algo bm –string 'GET /index.html' -j LOG
# 十六进制字符串模式可用于不可打印的字符,如|0D 0A| or |0D0A|。
iptables -p udp –dport 53 -m string –algo bm –from 40 –to 57 –hex-string '|03|www|09|netfilter|03|org|00|'
tcp
如果指定了“–protocol tcp”,则可以使用这些扩展。它提供以下选项:
[!] –source-port,–sport port[:port]
源端口或端口范围规范。这可以是服务名称或端口号。也可以使用first:last格式指定包含范围。如果省略第一个端口,则假定为“0”;如果省略最后一个,则假定为“65535”。–sport是这个选项的一个方便的别名。
[!] –destination-port,–dport port[:port]
目标端口或端口范围规范。–dport是此选项的方便别名。
[!] –tcp-flags mask comp
当TCP标志符合指定时进行匹配。第一个参数掩码是我们应该检查的标志,以逗号分隔的列表形式编写,第二个参数comp是必须设置的逗号分隔的标志列表。标志是:SYN ACK FIN RST URG PSH ALL NONE。因此,命令
iptables -A FORWARD -p tcp –tcp-flags SYN,ACK,FIN,RST SYN
将仅匹配设置了SYN标志且未设置ACK、FIN和RST标志的数据包。
[!] –syn
仅匹配设置了SYN位且清除了ACK、RST和FIN位的TCP数据包。此类数据包用于请求TCP连接启动;例如,阻止此类数据包进入接口将阻止传入的TCP连接,但传出的TCP连接将不受影响。它相当于–tcp-flags SYN,RST,ACK,FIN SYN。如果“!”标志位于“–syn”之前,则选项的含义将颠倒。
[!] –tcp-option number
如果设置了TCP选项,则匹配。
tcpmss
这与TCP标头的TCP MSS (maximum segment size)字段相匹配。您只能在TCP SYN或SYN/ACK数据包上使用此功能,因为MSS仅在连接启动时的TCP握手期间进行协商。
[!] –mss value[:value]
匹配给定的TCP MSS值或范围。如果给定了一个范围,则第二个值必须大于或等于第一个值。
time
如果数据包到达时间/日期在给定范围内,则匹配。所有选项都是可选的,但在指定时都是AND。默认情况下,所有时间都解释为UTC。
–datestart YYYY[–MM[–DD[Thh[:mm[:ss]]]]]
–datestop YYYY[–MM[–DD[Thh[:mm[:ss]]]]]
仅在给定时间内匹配,该时间必须采用ISO 8601“T”表示法。可能的时间范围为1970-01-01T00:00:00至2038-01-1T04:17:07。
如果未指定–datestart或–datestop,则分别默认为1970-01-01和2038-01-19。
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
只匹配白天的时间。可能的时间范围是00:00:00到23:59:59。允许使用前导零(例如“06:03”)并正确解释为以10为基数。
[!] –monthdays day[,day…]
仅在当月给定的日期匹配。可能的值是1到31。请注意,指定31在没有第31天的月份当然不匹配;2月28日或29日也是如此。
[!] –weekdays day[,day…]
仅在指定的工作日匹配。可能的值分别为Mon, Tue, Wed, Thu, Fri, Sat, Sun,或1到7的值。您也可以使用两个字符变体(Mo、Tu等)。
–contiguous
当–timestop小于–timestart值时,将其匹配为单个时间段,而不是不同的时间间隔。请参见示例。
–kerneltz
使用内核时区而不是UTC来确定数据包是否符合时间规定。
关于内核时区:Linux将系统时间保持在UTC,并且始终如此。在启动时,系统时间从引用时间源初始化。如果此时间源没有时区信息,例如x86 CMOS RTC,则将采用UTC。然而,如果时间源不是UTC,用户空间应该在获得信息后向内核提供正确的系统时间和时区。
本地时间是(与时区无关的)系统时间之上的一个功能。每个进程都有自己的本地时间概念,通过TZ环境变量指定。内核也有自己的时区偏移变量。TZ用户空间环境变量指定如何显示基于UTC的系统时间,例如何时运行date(1),或者在桌面时钟上看到什么。TZ字符串可能在不同日期解析为不同的偏移量,这就是用户空间中自动跳时的原因。当夏令时改变时。当内核的时区偏移变量必须在非UTC源(如FAT文件系统)之间转换为UTC时(因为后者是系统其余部分使用的),就会使用它。
内核时区的警告是,Linux发行版可能会忽略设置内核时区,而只设置系统时间。即使某个特定的发行版确实在启动时设置了时区,它通常也不会保持内核时区偏移(即夏令时发生的变化)最新。ntpd不会触及内核时区,因此运行它不会解决问题。因此,人们可能会遇到一个总是+0000的时区,或者一年中有一半的时间是错误的。As such, using –kerneltz is highly discouraged.
EXAMPLES. 要匹配周末时间,请使用:
-m time –weekdays Sa,Su
或者,在国家假日街区匹配(一次):
-m time –datestart 2007-12-24 –datestop 2007-12-27
由于停止时间实际上是包含在内的,因此您需要以下停止时间与新一天的第一秒不匹配:
-m time –datestart 2007-01-01T17:00 –datestop 2007-01-01T23:59:59
午餐时间:
-m time –timestart 12:30 –timestop 13:30
本月的第四个星期五:
-m time –weekdays Fr –monthdays 22,23,24,25,26,27,28
(请注意,这利用了某种数学性质。不可能在一条规则中说“第四个星期四或第四个周五”。但也可能有多条规则。)
跨天匹配可能不会达到预期效果。例如,
-m time --weekdays Mo --timestart 23:00 --timestop 01:00
将于周一进行匹配,从午夜到凌晨1点进行一个小时,然后从23:00开始进行另一个小时。如果这是不需要的,例如,如果您希望“从Montay 23:00开始匹配两个小时”,则还需要在上面的示例中指定–contiguous选项。
tos
此模块匹配IPv4报头中的8位服务类型字段(即包括“优先级”位)或IPv6报头中的(也是8位)优先级字段。
[!] –tos value[/mask]
将数据包与给定的TOS标记值进行匹配。如果指定了掩码,则在比较之前,它将与TOS标记进行逻辑AND运算。
[!] –tos symbol
使用IPv4的tos匹配时,可以指定符号名称。通过使用-m tos -h调用iptables,可以获得已识别的TOS名称列表。请注意,这意味着掩码为0x3F,即除了ECN位之外的所有位。
ttl (IPv4-specific)
此模块与IP标头中的生存时间字段匹配。
[!] –ttl-eq ttl
匹配给定的TTL值。
–ttl-gt ttl
如果TTL大于给定的TTL值,则匹配。
–ttl-lt ttl
如果TTL小于给定的TTL值,则匹配。
udp
如果指定了“–protocol udp”,则可以使用这些扩展。它提供以下选项:
[!] –source-port,–sport port[:port]
源端口或端口范围规范。有关详细信息,请参阅TCP扩展的–source-port选项的描述。
[!] –destination-port,–dport port[:port]
目标端口或端口范围规范。有关详细信息,请参阅TCP扩展的–destination-port选项的描述。
TARGET EXTENSIONS
iptables可以使用扩展的目标模块:标准发行版中包含以下模块。
AUDIT
为到达目标的数据包创建审计记录。它可用于记录接受、丢弃和拒绝的数据包。更多详细信息请参见auditd(8)
–type {
accept|drop|reject}
设置审核记录的类型。从linux-4.12开始,此选项对生成的审核消息不再有影响。出于兼容性原因,它仍然被iptables接受,但被忽略了。
Example:
iptables -N AUDIT_DROP
iptables -A AUDIT_DROP -j AUDIT
iptables -A AUDIT_DROP -j DROP
CHECKSUM
选择性地解决损坏/旧版应用程序的问题。它只能在mangle表中使用。
–checksum-fill
在缺少校验和数据包中计算并填写校验和。如果您需要处理如DHCP客户端等旧版应用程序,这些应用程序在关闭校验和卸载功能时无法正常工作,但又不想在设备中禁用校验和卸载功能,那么此操作将特别有用。
CLASSIFY
允许您设置skb->priority值(从而将数据包分类到特定的CBQ类别中)。
–set-class major:minor
设置主要和次要类值。即使没有给出0x前缀,这些值也始终被解释为十六进制。
CONNSECMARK
将安全标记从数据包复制到连接(如果未标记),并从连接复制回数据包(也只有在未标记的情况下)。通常与SECMARK结合使用,它在安全表中有效(为了与旧内核向后兼容,它在mangle表中也有效)。
–save
如果数据包有安全标记但是链接没有,将安全标记复制到链接
–restore
如果链接有安全标记但是数据包没有,将安全标记复制到数据包
CT
为数据包或其相关连接设置参数。目标将一个“template”连接跟踪条目附加到数据包上,然后在初始化新的ct条目时由conntrack核心使用。因此,此目标仅在“raw”表中有效。
–notrack
禁用此数据包的连接跟踪。
–helper name
使用按名称标识的连接帮助程序。这比用预设端口加载conntrack辅助模块更灵活。
–ctevents event[,…]
为此连接生成指定的conntrack事件。可能的事件类型有:new, related, destroy, reply, assured, protoinfo, helper, mark(指ctmark,而不是nfmark), natseqinfo, secmark(ctsecmark)。
–expevents event[,…]
为此连接生成指定的预期事件。可能的事件类型有:new。
–zone-orig {id|mark}
对于来自原始方向的流量,将此数据包分配给区域id,并仅在该区域进行查找。如果使用mark而不是id,则区域从数据包nfmark中导出。
–zone-reply {id|mark}
对于来自REPLY方向的流量,将此数据包分配给区域id,并仅在该区域进行查找。如果使用mark而不是id,则区域从数据包nfmark中导出。
–zone {id|mark}
将此数据包分配给区域id,并仅在该区域中进行查找。如果使用mark而不是id,则区域从数据包nfmark派生。默认情况下,数据包具有区域0。此选项适用于两个方向。
–timeout name
使用连接名称标识的超时策略。这提供了比/proc/sys/net/netfilter/nf_conntrack_*_timeout_*上可用的全局超时值更灵活的超时策略定义。
DNAT
在nat表,PREROUTING和OUTPUT链以及仅从这些链调用的用户定义链中有效。它指定应修改数据包的目标地址(此连接中的所有未来数据包也将被损坏),并且应停止检查规则。它有以下选项:
–to-destination [ipaddr[–ipaddr]][:port[–port[/baseport]]]
可以指定单个新的目的地IP地址、包括IP地址的范围。如果规则还指定了以下协议之一,则可以选择端口范围:tcp、udp、dccp或sctp。如果没有指定端口范围,则目标端口将永远不会被修改。如果没有指定IP地址,则只会修改目标端口。如果给定了基端口,则原始目标端口与其值的差值将用作映射端口范围的偏移。这允许创建移位的端口映射范围,从内核版本4.18开始可用。对于单个端口或基端口,可以使用/etc/services中列出的服务名称。
–random
随机源端口映射(内核>=2.6.22)。
–persistent
为每个连接向客户端提供相同的源/目标地址。这取代了相同的目标。2.6.29-rc2提供了对持久映射的支持。
Linux kernels>=3.7后提供IPv6支持。
DNPT (IPv6-specific)
提供无状态目标IPv6到IPv6网络前缀转换(如RFC 6296所述)。
您必须在mangle表中使用此目标,而不是在nat表中。它有以下选项:
–src-pfx [prefix/length]
设置要转换的源前缀和长度
–dst-pfx [prefix/length]
设置要转换的目标前缀和长度
Example:
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目标来禁用转换流的连接跟踪。
DSCP
更改IPv4数据包的TOS报头内的DSCP位的值。当这操作一个数据包时,它只能在mangle表中使用。
–set-dscp value
将DSCP字段设置为数值(可以是十进制或十六进制)
–set-dscp-class class
将DSCP字段设置为DiffServ类。
ECN (IPv4-specific)
选择性地围绕已知的ECN黑洞工作。它只能在mangle上使用。
–ecn-tcp-remove
从TCP报头中删除所有ECN位。当然,只能与-p tcp结合使用。
HL (IPv6-specific)
这用于修改IPv6标头中的Hop Limit字段。Hop Limit字段类似于IPv4中的TTL值。设置或递增跳跃限制字段可能非常危险,因此应不惜一切代价避免。此目标仅在mangle表中有效。
永远不要设置或增加离开本地网络的数据包的值!
–hl-set value
设置Hop Limit值
–hl-dec value
Hop Limit 自减
–hl-inc value
Hop Limit 自增
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使用conntrack元组而不是数据包选择器。
–hmark-mod value (must be > 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位随机自定义值,用于提供哈希计算。
Examples:
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个字符。
LOG
打开匹配数据包的内核日志记录。当为规则设置此选项时,Linux内核将通过内核日志(可以使用dmesg(1)读取或在syslog中读取)打印所有匹配数据包的一些信息(如大多数IP/IPv6标头字段)。
这是一个“非终止目标”,即规则遍历在下一个规则处继续。因此,如果你想记录你拒绝的数据包,请使用两个具有相同匹配条件的单独规则,首先使用目标日志,然后使用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。
–log-macdecode
记录MAC地址和协议。
MARK
用于设置与数据包关联的Netfilter标记值。例如,它可以与基于fwmark的路由结合使用(需要iproute2)。如果您打算这样做,请注意,需要在mangle表的PREROUTING或OUTPUT链中设置标记才能影响路由。标记字段的宽度为32位。
–set-xmark value[/mask]
将掩码和XOR值给出的位归零到数据包标记(“nfmark”)中。如果省略掩码,则假定为0xFFFFFFFF。
–set-mark value[/mask]
将掩码和OR值给出的位归零到数据包标记中。如果省略掩码,则假定为0xFFFFFFFF。
The following mnemonics are available:
–and-mark bits
Binary AND the nfmark with bits. (Mnemonic for –set-xmark 0/invbits, where invbits is the binary negation of bits.)
–or-mark bits
Binary OR the nfmark with bits. (Mnemonic for –set-xmark bits/bits.)
–xor-mark bits
Binary XOR the nfmark with bits. (Mnemonic for –set-xmark bits/0.)
MASQUERADE
在nat表和POSTROUTING链中有效。它只应与动态分配的IP(拨号)连接一起使用:如果您有静态IP地址,则应使用SNAT目标。伪装相当于指定一个映射到数据包发出的接口的IP地址,但也有在接口关闭时忘记连接的效果。当下一次拨号不太可能具有相同的接口地址时(因此无论如何都会丢失任何已建立的连接),这是正确的行为。
–to-ports port[–port]
这指定了要使用的源端口范围,覆盖了默认的SNAT源端口选择启发式方法(见上文)。这仅在规则还指定以下协议之一时有效:tcp、udp、dccp或sctp。
–random
随机化源端口映射(kernel>=2.6.21)。从内核5.0开始,–random与–random-fully完全相同。
–random-fully
完全随机化源端口映射(kernel>=3.13)。
Linux kernels>=3.7后提供IPv6支持。
NETMAP
将整个地址网络静态映射到另一个地址网络。它只能从nat表中的规则中使用。
–to address[/mask]
要映射到的网络地址。生成的地址将按以下方式构造:掩码中的所有“1”位都由新的“地址”填充。掩码中所有为零的位都从原始地址填充。
NFLOG
target提供匹配数据包的日志记录。当为规则设置此target时,Linux内核会将数据包传递给加载的nfnetlink_log以记录数据包。它将通过netlink套接字将数据包组播到指定的组播组。一个或多个用户空间进程可以订阅该组以接收数据包。与LOG一样,这是一个非终止目标,即规则遍历在下一个规则处继续。
–nflog-group nlgroup
数据包所在的netlink组(0-2^16-1)(仅适用于nfnetlink_log)。默认值为0。
–nflog-prefix prefix
日志消息中包含的前缀字符串,最长64个字符,可用于区分日志中的消息。
–nflog-range size
This option has never worked, use –nflog-size instead
–nflog-size size
要复制到用户空间的字节数(仅适用于nfnetlink_log)。nfnetlink_log实例可以指定自己的范围,此选项会覆盖它。
–nflog-threshold size
在将数据包发送到用户空间之前,在内核内排队的数据包数量(仅适用于nfnetlink_log)。更高的值会减少每个数据包的开销,但会增加延迟,直到数据包到达用户空间。默认值为1。
NFQUEUE
使用nfnetlink_queue处理程序将数据包传递给用户空间。数据包被放入由其16位队列号标识的队列中。如果需要,Userspace可以检查和修改数据包。然后,Userspace必须将数据包丢弃或重新注入内核。有关详细信息,请参阅libnetfilter_queue。nfnetlink_queue是在Linux 2.6.14中添加的。queue-balance选项是在Linux 2.6.31中添加的,queue-bypass是在2.6.39中添加的。
–queue-num value
指定要使用的QUEUE编号。有效的队列号为0到65535。默认值为0。
–queue-balance value:value
指定要使用的队列范围。然后,在给定的队列中平衡数据包。这对于多核系统很有用:在队列x, x+1, .. x+n 上启动用户空间程序的多个实例。并使用“–queue-balancex:x+n”。属于同一连接的数据包被放入同一nfqueue中。由于实现细节,较低的范围值0将较高的范围值限制为65534,即最多只能在65535个队列之间进行平衡。
–queue-bypass
默认情况下,如果没有用户空间程序在NFQUEUE上侦听,则所有要排队的数据包都会被丢弃。使用此选项时,NFQUEUE规则的行为类似于ACCEPT,数据包将继续移动到下一个表。
–queue-cpu-fanout
从Linux内核3.10开始可用。当与–queue-balance一起使用时,它将使用CPU ID作为索引,将数据包映射到队列。这个想法是,如果每个CPU都有一个队列,就可以提高性能。这需要指定–queue-balance。
NOTRACK
此扩展禁用了与该规则匹配的所有数据包的连接跟踪。它相当于-j CT –notrack。与CT一样,NOTRACK只能在raw中使用。
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,到达没有配置IP地址的接口的数据包将被丢弃)。
–to-ports port[–port]
这指定了要使用的目标端口或端口范围:没有这个,目标端口永远不会改变。这仅在规则还指定以下协议之一时有效:tcp、udp、dccp或sctp。对于单个端口,可以使用/etc/services中列出的服务名称。
–random
随机化源端口映射 (kernel >= 2.6.22).
REJECT (IPv6-specific)
返回一个错误数据包以响应匹配的数据包:否则它相当于DROP,因此它是一个终止TARGET,结束规则遍历。此目标仅在INPUT、FORWARD和OUTPUT链以及仅从这些链调用的用户定义链中有效。以下选项控制返回的错误数据包的性质:
–reject-with type
给定的类型可以是icmp6-no-route, no-route, icmp6-adm-prohibited, adm-prohibited, icmp6-addr-unreachable, addr-unreach, or icmp6-port-unreachable,这些类型会返回相应的ICMPv6错误消息(默认值:icmp6-port-unreachable)。最后,选项tcp-reset可用于仅与tcp协议匹配的规则:这会导致tcp RST数据包被发回。这主要用于阻止向损坏的邮件主机(否则将不接受您的邮件)发送邮件时经常发生的ident(113/tcp)探测。tcp重置只能用于内核版本2.6.14或更高版本。
警告:您不应该不加选择地将REJECT应用于连接状态被分类为INVALID的数据包;相反,你应该DROP这些。
考虑一个源主机传输数据包P,其中P在其路径上经历了延迟,以至于源主机发出重传P_2,其中P_2成功到达目的地并正常推进连接状态。可以想象,迟到的P可能被认为与任何连接跟踪条目都没有关联。为如此分类的数据包生成拒绝响应将终止健康连接。
So, instead of:
-A INPUT … -j REJECT
do consider using:
-A INPUT … -m conntrack –ctstate INVALID -j DROP -A INPUT … -j REJECT
REJECT (IPv4-specific)
返回一个错误数据包以响应匹配的数据包:否则它相当于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, or icmp-admin-prohibited (*),返回相应的ICMP错误消息(默认值:icmp-port-unreachable)。tcp-reset选项可用于仅与tcp协议匹配的规则:这会导致tcp RST数据包被发回。这主要用于阻止向损坏的邮件主机(否则将不接受您的邮件)发送邮件时经常发生的ident(113/tcp)探测。
(*)在不支持icmp-admin的内核中禁止使用它,这将导致纯DROP而不是REJECT
警告:您不应该不加选择地将REJECT目标应用于连接状态被分类为INVALID的数据包;相反,你应该DROP这些。
考虑一个源主机传输数据包P,其中P在其路径上经历了如此多的延迟,以至于源主机发出重传P_2,其中P_2成功到达目的地并正常推进连接状态。可以想象,迟到的P可能被认为与任何连接跟踪条目都没有关联。为如此分类的数据包生成拒绝响应将终止健康连接。
So, instead of:
-A INPUT … -j REJECT
do consider using:
-A INPUT … -m conntrack –ctstate INVALID -j DROP -A INPUT … -j REJECT
SECMARK
这用于设置与数据包关联的安全标记值,以供SELinux等安全子系统使用。它在安全表中有效(为了与旧内核向后兼容,它在mangle表中也有效)。该标记的宽度为32位。
–selctx security_context
SET
此模块adds and/or deletes 可由ipset(8)定义的IP集中的条目。
–add-set setname flag[,flag…]
将数据包的address(es)/port(s)添加到集合中
–del-set setname flag[,flag…]
从集合中删除数据包的address(es)/port(s)
–map-set setname flag[,flag…]
[–map-mark] [–map-prio] [–map-queue] 映射数据包属性(防火墙标记、tc优先级、硬件队列)
其中标志是src and/or dst规范,并且不能超过六个。
–timeout value
添加条目时,使用超时值,而不是集合定义中的默认值
–exist
添加条目(如果已存在)时,将超时值重置为指定值或设置定义中的默认值
–map-set set-name
应使用–skbinfo选项创建集合名称–map-mark通过查找集合中的值将防火墙标记映射到数据包–map-prio通过查找集合中值将流量控制优先级映射到数据包包括起来–map-queue通过查询集合中值,将硬件NIC队列映射到数据包里
–map-set选项只能在mangle表中使用。–map prio和–map-queue标志可用于OUTPUT、FORWARD和POSTROUTING链。
使用-j SET需要提供ipset内核支持,对于标准内核来说,从Linux 2.6.39开始就是这种情况。
SNAT
在nat表POSTROUTING和INPUT链以及仅从这些链调用的用户定义链中有效。它指定应修改数据包的源地址(此连接中的所有未来数据包也将被损坏),并且应停止检查规则。它有以下选项:
–to-source [ipaddr[–ipaddr]][:port[–port]]
其可以指定单个新的源IP地址、IP地址的范围。如果规则还指定了以下协议之一,则可以选择端口范围:tcp、udp、dccp或sctp。如果没有指定端口范围,则512以下的源端口将映射到512以下的其他端口:512到1023之间的端口将映射为1024以下的端口,其他端口将映射至1024或以上。在可能的情况下,不会进行端口更改。
–random
通过基于哈希的算法(kernel >= 2.6.21)随机化源端口映射。
–random-fully
通过PRNG (kernel >= 3.14)完全随机化源端口映射。
–persistent
为每个连接向客户端提供相同的源/目标地址。这取代了相同的目标。2.6.29-rc2提供了对持久映射的支持。
SNPT (IPv6-specific)
提供无状态源IPv6到IPv6网络前缀转换(参考RFC 6296)。
您必须在mangle表中使用此目标,而不是在nat表中。它有以下选项:
–src-pfx [prefix/length]
设置要转换的源前缀和长度
–dst-pfx [prefix/length]
设置要转换的目标前缀和长度
您必须使用DNPT目标来撤消转换。例子:
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的输出接口的MTU减去60)。当然,它只能与-p tcp结合使用。
该target用于克服那些阻止“ICMP Fragmentation Needed”或“ICMPv6 Packet Too Big”数据包的犯罪性愚蠢的ISP或服务器。这个问题的症状是,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值箝位为(path_MTU – 40 for IPv4; -60 for IPv6)。在存在具有不同路径MTU的非对称路由的情况下,这可能无法按预期运行——内核使用路径MTU将数据包从其自身发送到源和目标IP地址。在Linux 2.6.25之前,此选项只考虑到目标IP地址的路径MTU;后续内核还考虑到到源IP地址的路径MTU。
TCPOPTSTRIP
此目标将从TCP数据包中删除TCP选项。(它实际上会用NO OP替换它们。)因此,您需要添加-p tcp参数。
–strip-options option[,option…]
删除给定的选项。选项可以通过TCP选项号或符号名称指定。通过使用-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]
将掩码(见下文注释)和XOR值给出的位归零到TOS/优先级字段中。如果省略掩码,则假定为0xFF。
–set-tos symbol
使用IPv4的TOS目标时,可以指定符号名称。这意味着掩码为0xFF(见下面的注释)。通过使用-j TOS -h调用iptables,可以获得已识别的TOS名称列表。
he following mnemonics are available:
–and-tos bits
Binary AND the TOS value with bits. –set-tos 0/invbits
–or-tos bits
Binary OR the TOS value with bits. –set-tos bits/bits
–xor-tos bits
Binary XOR the TOS value with bits. –set-tos bits/0
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
标记数据包,以便内核在数据包遍历表、链和规则时记录与数据包匹配的每个规则。它只能在原始表格中使用。
使用iptables-nft,目标被转换为nftables的meta nftrace表达式。因此,内核通过netlink将跟踪事件发送到用户空间,在那里可以使用xtables-monitor –trace命令显示这些事件。有关详细信息,请参阅xtables-monitor(8)
TTL (IPv4-specific)
用于修改IPv4 TTL标头字段。TTL字段决定了数据包在超过生存时间之前可以经过多少跳(路由器)。
设置或递增TTL字段可能非常危险,因此应不惜一切代价避免。此目标仅在mangle表中有效。
永远不要设置或增加离开本地网络的数据包的值!
–ttl-set value
Set the TTL value to `value'.
–ttl-dec value
Decrement the TTL value `value' times.
–ttl-inc value
Increment the TTL value `value' times.
暂无评论内容