3、匹配扩展 iptable可以使用扩展的数据包匹配模块。它们以两种方式加载:隐式地,当指定“-p”或“—protocol”时,或者使用“-m”或“—match”选项,后面跟着匹配的模块名称;之后,根据特定模块的不同,可以使用各种额外的命令行选项。可以在一行中指定多个扩展匹配模块,并且可以在指定模块后使用“-h“或“--help“选项来接收特定于该模块的帮助。 1)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“选项指定。 2)ah 此模块与IPSec数据包的身份验证头中的Spis匹配。 [!] --ahspi spi[:spi] 3)cluster 允许您部署网关和后端负载共享集群,而不需要负载平衡器。此匹配要求所有节点都看到相同的数据包。因此,集群匹配决定该节点是否必须处理给定以下选项的数据包。 --cluster-total-nodesnum,设置集群中的总节点数。 [!] --cluster-local-nodenum,设置本地节点编号ID。 [!] --cluster-local-nodemaskmask,设置本地节点编号ID掩码。您可以使用此选项而不是”--cluster-local-node“。 --cluster-hash-seedvalue,设置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 |
4)comment 允许向任何规则添加注释(最多256个字符)。 --commentcomment iptables -A INPUT -s 192.168.0.0/16 -m comment --comment "A privatized IP block" |
5)connbytes 主要用途是检测长时间下载,并在流量控制中使用较低优先级的频带来标记它们。每个连接传输的字节也可以通过“conntrack -L”查看,并通过ctnetlink访问。 [!] --connbytesfrom[:to],将大于FROM,小于TO的连接中的数据包匹配,“!”用于匹配不在此范围内的数据包。 --connbytes-dir {original|reply|both},要考虑哪些数据包 --connbytes-mode {packets|bytes|avgpkt},是否检查数据包的数量、传输的字节数或到目前为止收到的所有数据包的平均大小(以字节为单位)。请注意,当“both”与“avgpkt”一起使用时,而且数据(主要是)只朝一个方向(例如HTTP)进行,平均数据包大小将约为实际数据包的一半。 iptables .. -m connbytes --connbytes 10000:100000 --connbytes-dir both --connbytes-mode bytes |
6)connlimit 允许您限制每个客户端IP地址(或客户地址块)到服务器的并行连接数。 [!] --connlimit-aboven,如果现有连接的数目大于n,则匹配 --connlimit-maskprefix_length,使用前缀长度对主机进行分组。对于IPv 4,这必须是介于(包括)0和32之间的数字。对于IPv 6,在0到128之间。 #每个客户端主机允许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-above 2 -j ACCEPT #将并行HTTP请求的数量限制在每C类网络16次(24位网络掩码) 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 |
7)connmark 此模块匹配与连接关联的netfilter标记字段(可以使用下面的CONNMARK目标进行设置)。 [!] --markvalue[/mask],将连接中的数据包与给定的标记值相匹配(如果指定了掩码,则在比较之前用标记进行逻辑分析) 8)conntrack 此模块与连接跟踪结合时,允许访问此数据包/连接的连接跟踪状态。 [!] --ctstatestatelist,Statelist是要匹配的连接状态的逗号分隔列表。下面列出了可能的状态。 [!] --ctprotol4proto,第4层协议匹配(按号码或名称) [!] --ctorigsrcaddress[/mask] [!] --ctorigdstaddress[/mask] [!] --ctreplsrcaddress[/mask] [!] --ctrepldstaddress[/mask],与original/reply、source/destination地址匹配。 [!] --ctorigsrcportport [!] --ctorigdstportport [!] --ctreplsrcportport [!] --ctrepldstportport,匹配original/reply、source/destination端口(TCP/UDP/等)或GRE键 [!] --ctstatusstatelis,Statuslist是要匹配的连接状态的逗号分隔列表。下面列出了可能的状态 [!] --ctexpiretime[:time],将剩余生存期(以秒为单位)与给定值或范围(包括)进行匹配。 --ctdir {ORIGINAL|REPLY},匹配按指定方向流动的数据包。如果根本没有指定此标志,则匹配两个方向的数据包。 ctstate的有效值 INVALID,意味着数据包与已知的连接没有关联。 NEW,意味着该数据包已启动一个新连接,或与未在两个方向上看到数据包的连接相关联。 ESTABLISHED,意味着该数据包与看到两个方向的数据包的连接相关联。 RELATED,意味着数据包正在启动新连接,但与现有连接相关联,例如FTP数据传输或ICMP错误。 SNAT,虚拟状态,如果原始源地址与回复目的地不同,则进行匹配。 DNAT,虚拟状态,如果原始目的地与应答源不同,则进行匹配。 ctstatus的有效值 NONE,不是下列任何一项。 EXPECTED,这是一个预期的连接。 SEEN_REPLY,ConnTrack在两个方向都看到了数据包。 ASSURED,连接项不应提前过期。 CONFIRMED,确认连接:原始数据包已离开框。 9)dccp [!] --source-port,--sportport[ ort] [!] --destination-port,--dportport[ ort] [!] --dccp-typesmask,当DCCP数据包类型为“掩码”之一时匹配。“掩码”是以逗号分隔的数据包类型列表。类型可以是:REQUEST、RESPONSE、DATA、ACK、DATAACK、CLOSEREQ、CLOSE、RESET、SYNC、SYNCACK、INVALID。 [!] --dccp-optionnumber,匹配如果设置DCP选项 10)dscp 此模块与IP报头中TOS字段中的6位DSCP字段匹配。Dscp已经取代了IETF中的TOS。 [!] --dscpvalue,匹配数值(十进制或十六进制)值[0-63] [!] --dscp-classclass,匹配DiffServ类。此值可能是BE、EF、AFxx或CSX类中的任何一个。然后,它将被转换为其相应的数值。 11)ecn 这允许您匹配IPv 4和TCP报头的ECN位。ECN是RFC3168中指定的显式拥塞通知机制。 [!] --ecn-tcp-cwr,如果设置了TCP ECN CWR(拥塞窗口接收)位,则匹配。 [!] --ecn-tcp-ece,如果设置了TCP ECN ECE(ECN Echo)位,则匹配。 [!] --ecn-ip-ect num,这与特定的IPv 4 ECT(ECN能力传输)相匹配。你必须在‘0’和‘3’之间指定一个数字。 12)esp 此模块与ipsec数据包的esp报头中的spis匹配。 [!] --espspispi[:spi] 13)hashlimit 哈希限制使用散列桶来表示一组连接的速率限制匹配(如极限匹配),使用单个iptables规则。分组可以完成perhostgroup(源和/或目标地址)和/或每个端口。它使您能够表达“每组每个时间量子N个数据包”: 源主机上的匹配:192.168.0.0/16期间每台主机每秒1000个数据包。 源Prot匹配:每项服务每秒100包(192.168.1.1)。 子网的匹配:10.0.0.0/8中每个/28子网每分钟10000包。 --hashlimit-uptoamount[/second|/minute|/hour|/day],如果速率低于或等于amount/quantum,则匹配。它被指定为一个数字,带有可选的时间量子后缀;默认值是3/小时。 --hashlimit-aboveamount[/second|/minute|/hour|/day],如果速率大于amount/quantum,则匹配 --hashlimit-burstamount,要匹配的数据包的最大初始数量:当未达到上述指定的限制时,该数目将被重新充电一次,最多可达到此数目;默认值为5。 --hashlimit-mode {srcip|srcport|dstip|dstport},...,要考虑的以逗号分隔的对象列表。如果给出了“--hash-limit-mode“选项,hashlimit就像limit一样,但是在进行哈希内务管理时会花费很大的代价。 --hashlimit-srcmaskprefix,当使用“--hashlimit-mode“时,所遇到的所有源地址都将根据给定的前缀长度进行分组,因此创建的子网将受到哈希限制。前缀必须介于(包括)0和32之间。 --hashlimit-dstmaskprefix,类似“--hashlimit-srcmask“,但是对于目标地址。 --hashlimit-namefoo,“/proc/net/ipt_hashlimit/foo“条目的名称。 --hashlimit-htable-sizebuckets,哈希表的桶数。 --hashlimit-htable-maxentries,散列中的最大项。 --hashlimit-htable-expiremsec,在散列条目过期多少毫秒之后。 --hashlimit-htable-gcintervalmsec,垃圾收集间隔之间有多少毫秒。 14)helper 此模块匹配与特定连接辅助程序相关的数据包。 [!] --helperstring,匹配与指定的连接辅助程序相关的数据包。对于默认端口上与ftp会话相关的数据包,字符串可以是“ftp”。对于其他端口,将-portnr附加到值,即。“ftp-2121” 15)icmp 如果指定了“--protocol icmp”,则可以使用此扩展。它提供了以下选项 [!] --icmp-type{type[/code]|typename},这允许指定icmp类型,它可以是数值icmp类型、类型/代码对,也可以是命令显示的icmp类型名称之一。 16)iprange 这与给定的任意范围的ip地址匹配。 [!] --src-rangefrom[-to],匹配指定范围内的源IP。 [!] --dst-rangefrom[-to],匹配指定范围内的目标IP。 17)length 此模块将数据包的第3层有效载荷(例如第4层包)的长度与特定值或范围相匹配。 [!] --lengthlength[:length] 18)limit 此模块使用令牌桶过滤器以有限的速度匹配。使用此扩展的规则将匹配,直到达到此限制(除非“!”使用标志)。它可以与日志目标结合使用,提供有限的日志记录。 --limitrate[/second|/minute|/hour|/day],最大平均匹配率:指定为数字,带有可选的‘/秒’、‘/分钟’、‘/小时’或‘/日’后缀;默认值为3/小时 --limit-burstnumber,要匹配的数据包的最大初始数量:当未达到上述指定的限制时,此数字将被重新充电一次,最多可达到此数目;默认值为5。 19)mac [!] --mac-sourceaddress,匹配源MAC地址。它必须是XX:XX:XX:XX:XX:XX格式。请注意,这只对来自以太网设备并进入PREROUTING、FORWARD或INPUT链的数据包有意义。 20)mark 此模块匹配与数据包关联的netfilter标记字段(可以使用下面的标记目标设置该标记)。 [!] --markvalue[/mask],将数据包与给定的无符号标记值匹配(如果指定了掩码,则在进行比较之前,该掩码将与掩码进行逻辑连接) 21)multiport 此模块匹配一组源端口或目标端口。最多可指定15个端口。端口范围(端口:端口)算作两个端口。它只能与“-p tcp“或”-p udp“一起使用。 [!] --source-ports,--sportsport[,port|,port ort]...,如果源端口是给定端口之一,则匹配。旗杆运动是这个选项的方便别名。多个端口或端口范围使用逗号分隔,端口范围使用冒号指定。因此,53,1024:65535将匹配端口53,所有端口都是从1024到65535。 [!] --destination-ports,--dportsport[,port|,port ort]..,如果目标端口是给定端口之一,则匹配。标志--dports是此选项的方便别名。 [!] --portsport[,port|,port ort]...,如果源端口或目标端口等于给定端口之一,则匹配。 22)owner 对于本地生成的数据包,此模块试图匹配数据包创建者的各种特征。此匹配仅在OUTPUT链和POSTROUTING链中有效。转发的数据包没有任何与其相关联的套接字。来自内核线程的数据包确实有一个套接字,但通常没有所有者。 [!] --uid-ownerusername [!] --uid-owneruserid[-userid],如果数据包套接字的文件结构(如果有)是给定用户拥有的,则匹配。您还可以指定数字UID或UID范围。 [!] --gid-ownergroupname [!] --gid-ownergroupid[-groupid],如果数据包套接字的文件结构属于给定组,则匹配。您还可以指定数字GID或GID范围。 [!] --socket-exists,如果数据包与套接字相关联,则匹配。 23)physdev 该模块在桥端口输入和输出设备上匹配,这些输入和输出设备被奴役到桥接设备上。此模块是支持透明桥接IP防火墙的基础结构的一部分,仅适用于2.5.44版本以上的内核版本。 [!] --physdev-inname,接收数据包的桥端口的名称(仅用于INPUT、FORWARD和PREROUTING链的数据包)。如果接口名以“+“结尾,则以此名称开头的任何接口都将匹配。如果数据包没有通过桥接设备到达,则此数据包将与此选项不匹配,除非“!”被利用了。 [!] --physdev-outname,要发送数据包的桥接端口的名称(用于FORWARD、OUTPUT和POSTROUTING链的数据包)。如果接口名以“+“结尾,则以此名称开头的任何接口都将匹配。注意,在NAT和Magle输出链中,不能在桥输出端口上匹配,但是在过滤器输出链中可以匹配。如果数据包不会由网桥设备离开,或者如果它还不知道输出设备将是什么,那么该数据包将与此选项不匹配,除非‘!’使用。 [!] --physdev-is-in,如果数据包已通过网桥接口输入,则匹配。 [!] --physdev-is-out,如果数据包将通过网桥接口离开,则匹配。。 [!] --physdev-is-bridged,如果数据包正在桥接,因此不被路由,则匹配。这仅在FORWARD链和POSTROUTING链中有用。 24)pkttype 此模块与链路层数据包类型匹配。 [!] --pkt-type {unicast|broadcast|multicast} 25)policy 此模块与IPsec用于处理数据包的策略相匹配。 --dir{in|out},用于选择是否匹配用于解除封装的策略或将用于封装的策略。in在PREROUTING、INPUT、FORWARD链中有效,out在POSTROUTING、OUTPUT、FORWARD链中有效。 --pol {none|ipsec},如果数据包要接受ipsec处理,则匹配。 --strict,选择是否匹配确切的策略,或者如果策略的任何规则与给定的策略匹配,则选择匹配。 [!] --reqidid,匹配策略规则的reqid。可以使用setkey(8)指定REQID,使用unique:id作为级别。 [!] --spi spi,匹配SA的SPI。 [!] --proto {ah|esp|ipcomp},匹配封装协议。 [!] --mode {tunnel|transport},匹配封装模式。 [!] --tunnel-srcaddr[/mask],匹配隧道模式sa的源端点地址。只有和“--mode tunnel“一起使用有效。 [!] --tunnel-dstaddr[/mask],匹配隧道模式sa的目标端点地址。只有和“--mode tunnel“一起使用有效。 --next,启动策略规范中的下一个元素,只有和“--strict.“一起使用有效。 26)quota 通过减少每个数据包的字节计数器来实现网络配额。 --quotabytes,配额(以字节为单位)。 27)rateest 该速率估计器可以与RATEEST目标收集的估计费率相匹配。它支持绝对bps/pps值匹配,比较两种速率估计量,并匹配两种速率估计量之间的差异。 --rateest1name,第一比率估计器的名称。 --rateest2name,第二比率估计器的名称。 --rateest-delta,将差异与给定的比率进行比较 --rateest1-bpsvalue, --rateest2-bpsvalue,每秒比较字节 --rateest1-ppsvalue, --rateest2-ppsvalue,每秒比较包 [!] --rateest-lt,如果速率小于给定的速率/估计量,则匹配 [!] --rateest-gt,如果速率大于给定的速率/估计量,则匹配 [!] --rateest-eq,如果速率等于给定的速率/估计量,则匹配 #示例:在启动数据连接时,可以根据可用带宽从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 |
28)realm 这与路由领域匹配。路由域用于复杂的路由设置,涉及到诸如BGP这样的动态路由协议。 [!] --realmvalue[/mask],匹配给定的领域号(可选掩码)。如果不是一个数字,则值可以是“/etc/iproute2/rt_realms”中的命名域(在这种情况下不能使用掩码)。 29)recent 允许您动态创建IP地址列表,然后以几种不同的方式与该列表进行匹配。例如,您可以创建一个“坏蛋”列表,列出试图连接到防火墙上的端口139的人,然后在不考虑这些包的情况下丢弃它们的所有未来数据包。--set、--rcheck、--update、--remove是相互排斥的。 --namename,指定要用于命令的列表。如果没有指定名称,则将使用默认名称。 [!] --set,他将把数据包的源地址添加到列表中。如果源地址已经在列表中,这将更新现有条目。这将永远返回成功(或失败,如果传入!)。 --rsource,匹配/保存最近列表中每个数据包的源地址。这是默认的 --rdest,匹配/保存最近列表中每个数据包的目标地址 [!] --rcheck,检查数据包的源地址是否当前在列表中。 [!] --update,类似“--rcheck”,但如果匹配,它将更新“最后一次看到”时间戳。 [!] --remove,检查数据包的源地址是否当前在列表中,如果是,该地址将从列表中删除,规则将返回true。如果找不到地址,则返回false。 --secondsseconds,此选项必须与“--rcheck”或“--update”之一结合使用.使用时,这将缩小匹配范围,仅当地址在列表中并在最后给定的秒内被看到时才发生。 --hitcounthits,此选项必须与“--rcheck”或“--update”之一结合使用。使用时,这将缩小匹配范围,仅当地址在列表中且数据包已接收到大于或等于给定值时才发生。此选项可与“--seconds”一起使用,以创建一个更窄的匹配,需要在特定的时间范围内执行一定数量的命中。HitCount参数的最大值由xt_recent内核模块的“ip_pkt_list_tot”参数给出。在命令行中超过此值将导致拒绝该规则。 --rttl,此选项只能与“--rcheck”或“--update”中的一个一起使用。当使用时,这将缩小匹配范围,只有当地址在列表中,并且当前数据包的ttl与符合“--set”规则的数据包匹配时才会发生匹配。这可能是有用的,如果你有问题的人伪造他们的源地址,以便通过这个模块拒绝其他人访问你的网站通过发送虚假的数据包给你。 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_new/*”是关于每个列表中每个条目的地址和信息的当前列表。可以读取“/proc/net/xt_new/”中的每个文件来查看当前列表,或者使用以下命令编写两个文件来修改列表: echo +addr >/proc/net/xt_recent/DEFAULT 增加addr到默认的列表 echo -addr >/proc/net/xt_recent/DEFAULT 将addr从默认列表删除 echo / >/proc/net/xt_recent/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/*”的拥有者ID。 ip_list_gid=0,“/proc/net/xt_recent/*”的拥有者组ID。 30)sctp [!] --source-port,--sportport[ ort] [!] --destination-port,--dport port[ ort] [!] --chunk-types {all|any|only} chunktype[:flags] [...], 大写中的标志字母表示如果设置将匹配标志,小写表示匹配(如果未设置)。 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 ASCONF ASCONF_ACK chunk type:available flags DATA:U B E 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
|
|