NAME
iptables-extensions — standard iptables 发行版中的扩展列表
SYNOPSIS
ip6tables [-m name [module-options...]] [-j target-name [target-options...
iptables [-m name [module-options...]] [-j target-name [target-options...
MATCH EXTENSIONS
iptables 可以使用 -m 或 --match 选项与扩展数据包匹配模块配合使用,后面跟着匹配模块名称;在此之后,会根据特定模块提供各种额外的命令行选项。您可以在一行中指定多个扩展匹配模块,并且在指定模块后,可以使用 -h 或 --help 选项以接收特定于该模块的帮助。扩展匹配模块按照规则中指定的顺序进行评估。
如果指定了 -p 或 --protocol,并且仅当遇到未知选项时,iptables 将尝试加载与协议同名的匹配模块,以尝试使该选项可用。
addrtype
此模块基于地址类型匹配数据包。地址类型在内核网络堆栈中使用,并将地址分类为各种组。该组的确切定义取决于特定的第三层协议。
可能的地址类型有:
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
地址类型检查可以限制到数据包传出的接口。此选项仅在POSTROUTING、OUTPUT和FORWARD链中有效。它不能与 --limit-iface-in 选项一起指定。
ah(IPv6 特有)
此模块匹配 IPsec 数据包的身份验证标头中的参数。
[!] --ahspi spi[:spi]
匹配 SPI。
[!] --ahlen length
此标头的总长度(以八位字节为单位)。
--ahres
如果保留字段填充为零,则匹配。
ah(IPv4 特有)
此模块匹配 IPsec 数据包的身份验证标头中的 SPI。
[!] --ahspi spi[:spi]
bpf
使用 Linux Socket Filter 进行匹配。期望使用十进制格式的 BPF 程序。这是由 nfbpf_compile 实用程序生成的格式。
--bytecode code
传递 BPF 字节码格式(在下面的示例中描述)。
代码格式类似于 tcpdump -ddd 命令的输出:存储指令数的一行,然后是每条指令的一行。指令行遵循十进制表示法中的 'u16 u8 u8 u32' 模式。字段编码操作、如果为真则跳转偏移、如果为假则跳转偏移和通用多用途字段 'K'。不支持注释。
例如,要仅读取与 'ip proto 6' 匹配的数据包,请插入以下内容,不包括注释或尾随空格:
4 # 指令数
48 0 0 9 # 载入字节 ip->proto
21 0 1 6 # 跳转等于 IPPROTO_TCP
6 0 0 1 # 返回 通过 (非零)
6 0 0 0 # 返回 失败 (零)
您可以使用以下命令将此过滤器传递给 bpf 匹配:
iptables -A OUTPUT -m bpf --bytecode '4,48 0 0 9,21 0 1 6,6 0 0 1,6 0 0 0' -j ACCEPT
或者,您可以调用 nfbpf_compile 实用程序。
iptables -A OUTPUT -m bpf --bytecode "`nfbpf_compile RAW 'ip proto 6'`" -j ACCEPT
您可能希望从 FreeBSD 的 bpf(4) 手册中了解有关 BPF 的更多信息。
cgroup
[!] --cgroup fwid
匹配此数据包的相应 cgroup。
可以用于为系统上的聚合任务/作业分配特定的防火墙策略。这允许更细粒度的防火墙策略,仅
匹配系统进程的子集。fwid 是通过 net_cls cgroup 的 id 设置的。
示例:
iptables -A OUTPUT -p tcp --sport 80 -m cgroup ! --cgroup 1 -j DROP
自 Linux 3.14 起提供。
cluster
允许您部署网关和后端负载均衡集群,而无需负载均衡器。
此匹配要求所有节点看到相同的数据包。因此,集群匹配决定是否让此节点处理数据包,给定以下选项:
--cluster-total-nodes num
设置集群中的总节点数。
[!] --cluster-local-node num
设置本地节点编号 ID。
[!] --cluster-local-nodemask mask
设置本地节点编号 ID 掩码。您可以使用此选项代替 --cluster-local-node。
--cluster-hash-seed value
设置 Jenkins 散列的种子值。
示例:
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
注意:上述 arptables 命令使用主流语法。如果您使用的是包含在某些 RedHat、CentOS 和 Fedora 版本中的 arptables-jf,您可能会遇到语法错误。因此,您需要调整这些命令以适应 arptables-jf 语法以使其正常工作。
在 TCP 连接的情况下,必须禁用 pickup facility 以避免将 TCP ACK 包标记为有效的回复方向上的数据包。
echo 0 > /proc/sys/net/netfilter/nf_conntrack_tcp_loose
comment
允许您向任何规则添加注释(最多 256 个字符)。
--comment comment
示例:
iptables -A INPUT -i eth1 -m comment --comment "my local LAN"
connbytes
通过连接(或构成连接的两个流之一)到目前为止传输了多少字节或数据包,或者通过每个数据包的平均字节数进行匹配。
计数器为 64 位,因此不预期溢出 ;)
主要用途是检测长时间下载并标记它们以使用流量控制中的较低优先级带进行调度。
```plaintext
[!] --physdev-out name
包要通过的桥接端口的名称(用于进入 FORWARD、OUTPUT 和 POSTROUTING 链)。如果接口名称以 "+" 结尾,那么任何以该名称开头的接口都将匹配。请注意,在 nat 和 mangle OUTPUT 链中,无法匹配桥接输出端口,但在 filter OUTPUT 链中可以。如果数据包不会通过桥接设备离开,或者尚不知道输出设备是什么,那么除非使用 '!',否则数据包不会匹配此选项。
[!] --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 和 FORWARD 链中有效。
--pol {none|ipsec}
如果数据包受到 IPsec 处理,则匹配。--pol none 不能与 --strict 结合使用。
--strict
选择是否匹配精确策略,或者如果策略的任何规则与给定策略匹配,则匹配。
对于要描述的每个策略元素,可以使用以下一个或多个选项。当 --strict 生效时,每个元素至少必须使用一个。
[!] --reqid id
匹配策略规则的 reqid。可以使用 setkey(8) 使用 unique:id 作为级别指定 reqid。
[!] --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 运算符 rateest-bps
· rateest 运算符 rateest-pps
· (rateest 减 rateest-bps1) 运算符 rateest-bps2
· (rateest 减 rateest-pps1) 运算符 rateest-pps2
· rateest1 运算符 rateest2 rateest-bps(不带速率!)
· rateest1 运算符 rateest2 rateest-pps(不带速率!)
· (rateest1 减 rateest-bps1) 运算符 (rateest2 减 rateest-bps2)
· (rateest1 减 rateest-pps1) 运算符 (rateest2 减 rateest-pps2)
--rateest-delta
对于每个估算器(绝对模式或相对模式),计算估算器确定的流速与使用 BPS/PPS 选项选择的静态值之间的差异。如果流速高于指定的 BPS/PPS,则使用 0 代替负值。换句话说,使用 "max(0, rateest#_rate - rateest#_bps)"。
[!] --rateest-lt
如果速率小于给定的速率/估算器,则匹配。
[!] --rateest-gt
如果速率大于给定的速率/估算器,则匹配。
[!] --rateest-eq
如果速率等于给定的速率/估算器,则匹配。
在所谓的 "绝对模式" 中,只使用一个速率估算器并与静态值进行比较,而在 "相对模式" 中,两个速率估算器与另一个进行比较。
--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、[km
gt]bit、[KMGT]ibit、Bps、[KMGT]Bps、[KMGT]iBps。
示例:这是用于基于启动数据连接时的可用带宽来路由 FTP 服务器的出站数据连接的方法:
# 估算出站速率
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
# 基于可用带宽进行标记
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特定)
该模块匹配路由域。在涉及动态路由协议(如BGP)的复杂路由设置中使用路由域。
[!] --realm value[/mask]
匹配给定的域号(以及可选的掩码)。如果不是数字,则值可以是 /etc/iproute2/rt_realms 中的命名域(在这种情况下不能使用掩码)。
recent
允许您动态创建IP地址列表,然后以不同方式与该列表匹配。
例如,您可以创建一个“badguy”列表,其中包含尝试连接到防火墙上的端口139的人,并且以后的所有数据包都会被丢弃,而无需考虑它们。
--set、--rcheck、--update 和 --remove 是互斥的。
--name name
指定用于命令的列表。如果没有给出名称,则将使用DEFAULT。
[!] --set
这将向列表中添加数据包的源地址。如果源地址已在列表中,则会更新现有条目。这将始终返回成功(如果传递了 '!' 则返回失败)。
--rsource
在最近的列表表中匹配/保存每个数据包的源地址。这是默认设置。
--rdest
在最近的列表表中匹配/保存每个数据包的目标地址。
--mask netmask
将应用于此最近列表的网络掩码。
[!] --rcheck
检查数据包的源地址是否当前在列表中。
[!] --update
类似于 --rcheck,但如果匹配,则会更新“最后见到”的时间戳。
[!] --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 匹配时才会发生。如果您遇到其他人通过伪造源地址向您发送虚假数据包以通过此模块拒绝其他人访问您的站点的问题,这可能会很有用。
示例:
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 添加到 DEFAULT 列表
echo -addr >/proc/net/xt_recent/DEFAULT
从 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
反转匹配的含义。不是匹配通过反向路径过滤测试的数据包,而是匹配未通过测试的数据包。
记录并丢弃未通过反向路径过滤测试的数据包的示例:
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
不记录的情况下丢弃未通过的数据包示例:
iptables -t raw -A RPFILTER -m rpfilter --invert -j DROP
rt(IPv6 特定)
匹配 IPv6 路由标头
[!] --rt-type type
匹配类型(数字)。
[!] --rt-segsleft num[:num]
匹配“剩余段”字段(范围)。
[!] --rt-len length
匹配此标头的长度。
--rt-0-res
匹配保留字段,也是(type=0)
--rt-0-addrs addr[,addr...]
匹配 type=0 地址(列表)。
--rt-0-not-strict
type=0 地址列表不是严格列表。
sctp
[!] --source-port,--sport port[:port]
[!] --destination-port,--dport port[:port]
[!] --chunk-types {all|any|only} chunktype[:flags] [...]
大写字母表示如果设置则匹配标志,小写字母表示如果未设置则匹配标志。
块类型:DATA INIT INIT_ACK SACK HEARTBEAT HEARTBEAT_ACK ABORT SHUTDOWN SHUTDOWN_ACK ERROR COOKIE_ECHO COOKIE_ACK ECN_ECNE ECN_CWR SHUTDOWN_COMPLETE ASCONF ASCONF_ACK FORWARD_TSN
块类型 可用标志
DATA I U B E i u b e
ABORT T t
SHUTDOWN_COMPLETE T t
(小写表示标志应为“关闭”,大写表示“打开”)
示例:
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]...
其中 flags 是逗号分隔的 src 和/或 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 内核支持,对于标准内核来说,自 Linux 2.6.39 以来就已经支持。
socket
如果通过对数据包进行套接字查找可以找到打开的 TCP/UDP 套接字,则匹配此条件。如果存在已建立或非零绑定的监听套接字(可能带有非本地地址),则匹配条件成立。查找是使用 TCP/UDP 数据包的元组,或嵌入在 ICMP/ICPMv6 错误数据包中的原始 TCP/UDP 标头进行的。
--transparent
忽略非透明套接字。
--nowildcard
不要忽略绑定到“任何”地址的套接字。默认情况下,套接字匹配不接受零绑定的监听器,因为这样本地服务可能会拦截本应转发的流量。因此,当使用套接字匹配将流量转发到本地机器并进行策略路由时,此选项具有安全性影响。如果要使用套接字匹配实现绑定到非本地地址的完全透明代理,建议使用 --transparent 选项。
示例(假设传递到本地的标记为 1 的数据包):
-t mangle -A PREROUTING -m socket --transparent -j MARK --set-mark 1
state
“state” 扩展是“conntrack” 模块的子集。 “state” 允许访问此数据包的连接跟踪状态。
state
--state state
其中 state 是要匹配的连接状态的逗号分隔列表。仅识别 "conntrack" 理解的状态的子集:INVALID、ESTABLISHED、NEW、RELATED 或 UNTRACKED。有关其描述,请参见本手册中的 "conntrack" 部分。
statistic
此模块根据某些统计条件匹配数据包。它支持两种不同的模式,可使用 --mode 选项进行设置。
支持的选项:
--mode mode
设置匹配规则的匹配模式,支持的模式为 random 和 nth。
[!] --probability p
设置数据包被随机匹配的概率。仅适用于 random 模式。p 必须在 0.0 到 1.0 之间。支持的粒度以 1/2147483648 递增。
[!] --every n
每隔 n 个数据包匹配一个数据包。仅适用于 nth 模式(也请参见 --packet 选项)。
--packet p
设置 nth 模式的初始计数器值(0 <= p <= n-1,默认值为 0)。
string
此模块通过使用某种模式匹配策略匹配给定的字符串。它需要一个 Linux 内核 >= 2.6.14。
--algo {bm|kmp}
选择模式匹配策略(bm = Boyer-Moore,kmp = Knuth-Pratt-Morris)。
--from offset
设置开始查找匹配项的偏移量。如果未传递,默认为 0。
--to offset
设置应扫描的偏移量。也就是说,偏移量-1(从 0 开始计数)是最后一个扫描的偏移量。如果未传递,默认为数据包大小。
[!] --string pattern
匹配给定的模式。
[!] --hex-string pattern
以十六进制表示匹配给定的模式。
示例:
# 字符串模式可用于简单的文本字符。
iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'GET /index.html' -j LOG
# 十六进制字符串模式可用于非可打印字符,如 |0D 0A| 或 |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 标志。第一个参数 mask 是我们应该检查的标志,写成逗号分隔的列表,第二个参数 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,R
ST,ACK,FIN SYN。如果 "!" 标志在 "--syn" 之前,选项的含义将被反转。
[!] --tcp-option number
如果设置了 TCP 选项,则匹配。
tcpmss
此模块匹配 TCP 标头的 TCP MSS(最大段大小)字段。只能在 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-19T04: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 天的月份;对于 28 或 29 天的 2 月也是一样的。
[!] --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 字符串可能会在不同日期解析时解析为不同的偏移量,这就是在用户空间进行自动时间跳跃的原因。当 DST 更改时,内核的时区偏移变量用于在非 UTC 源之间进行转换,例如 FAT 文件系统到 UTC(因为后者是系统的其余部分使用的)。
内核时区的注意事项是,Linux 发行版可能会忽略设置内核时区,并且只设置系统时间。即使特定的发行版在引导时设置了时区,通常也不会保持内核时区偏移量(即在 DST 更改时会发生变化)。ntpd 不会触及内核时区,因此运行它将不会解决此问题。因此,可能会遇到时区始终为 +0000 的时区,或者一年中有一半时间错误的时区。因此,强烈不建议使用 --kerneltz。
示例。要在周末匹配,请使用:
-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 开始再次匹配。如果这是不想要的,例如如果您想“从星期一 23:00 开始连续两个小时匹配”,则需要在上面的示例中还指定 --contiguous 选项。
1365 未完待续------