iptables
iptables指令用来设置Linux内核的ip过滤规则以及管理nat功能。iptables用于在Linux内核中设置、维护和检查IPv4数据包过滤规则表。可以定义几个不同的表。每个表包含许多内置链,也可能包含用户定义的链。每个链都是一个规则列表,可以匹配一组数据包。每条规则都指定如何处理匹配的数据包。这被称为“目标”,它可能是跳转到同一表中的用户定义链。
此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。
1、语法
iptables [-t table] {-A|-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]
目前Linux内核支持3个相互独立的表:filter,过滤ip数据包;nat,配置nat功能;mangle,修改ip数据包。
filter是默认表,包含INPUT(发送给本机) 、OUTPUT(本机向外发送)、FORWARD(被路由出去)三个链。
nat表包含PREROUTING(修改刚收到的数据包) 、OUTPUT(在路由之前处理本机产生的数据包) 、POSTROUTING(修改将要发送的数据包)三个链
mangle表包含PREROUTING(路由之前,修改收到的包) 、OUTPUT(路由之前,修改本机产生的包) 、INPUT(修改发送到本机的包) 、FORWARD (修改路由之后的包) 、POSTROUTING(修改将被本机发送的包)五个链。
Linux系统中的内置目标包括:ACCEPT(允许数据包通过)DROP(丢弃数据包) QUEUE(传递包到用户空间)RETURN(停止向后检测其他的规则,返回之前的条用规则处)
2、选项列表
选项可以按组来区分
-t table
指定要管理的表
-A | --append chain rule-specification
追加记录
-D | --delete chain rule-specification
删除记录
-I | --insert chain [rulenum] rule-specification
插入记录
-R | --replace chain [rulenum] rule-specification
替换记录
-L | --list [chain]
列出记录
-S | --list-rules [chain]
列出已选择链的所有规则。如果没有选择任何链,则所有链都打印
-F | --flush [chain]
删除指定的记录
-Z | --zero [chain [rulenum]]
将数据计数和字节计数清零
-N | --new-chain chain
用户自定义新链
-X | --delete-chain [chain]
删除用户自定义链
-P | --policy chaintarget
为指定的链设置策略
-E | --rename-chain old new
重命名链
-h
显示帮助信息
参数
[!] –p | --protocol protocol
指定协议类型tcp、udp、icmp、all,协议前加!标识否定
[!] –s | --sourceaddress[/mask][,…
源地址
[!] –d
--destinationaddress[/mask][,…
目标
-j | --jump
指定跳转的目标
-g | --goto chain
这指定应在用户指定的链中继续处理。与“--jump”选项不同,返回将不再在此链中继续处理,而是在通过“--jump”调用我们的链中继续处理。
[!] –i | --in-interface name
接收数据包的接口名称(仅用于输入、转发和PREROUTING链的数据包)。当“!”参数在接口名称之前使用,意义被倒置。如果接口名以“+”结尾,则以此名称开头的任何接口都将匹配。如果省略此选项,则任何接口名称都将匹配。
-o | --out-interfacename
指定数据包离开的网络接口
[!] –f | --fragment
这意味着该规则仅指分段数据包的第二段和更多的片段。
-c | --set-counters packets bytes
这使管理员能够初始化规则的数据包和字节计数器(在插入、追加、替换操作期间)。
其他选项
-v | --verbose
冗长的输出,该选项使List命令显示接口名称、规则选项(如果有的话)和TOS掩码。还列出了数据包计数器和字节计数器
-n | --numeric
数字输出IP地址和端口号将以数字格式打印。默认情况下,程序将尝试将它们显示为主机名、网络名称或服务(只要适用)。
-x | --exact
扩大数字。显示数据包和字节计数器的确切值,而不是只显示K‘s(1000倍)M’s(1000 K倍数)或G‘s(1000 m倍数)中的四舍五入数。此选项仅与-L命令相关。
--line-numbers
当列出规则时,将行号添加到每条规则的开头,对应于该规则在链中的位置。
--modprobe=command
在向链中添加或插入规则时,使用命令加载任何必要的模块(目标、匹配扩展等)
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[:port]
[!] --destination-port,--dportport[:port]
[!] --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-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:port]...,如果源端口是给定端口之一,则匹配。旗杆运动是这个选项的方便别名。多个端口或端口范围使用逗号分隔,端口范围使用冒号指定。因此,53,1024:65535将匹配端口53,所有端口都是从1024到65535。
[!] --destination-ports,--dportsport[,port|,port:port]..,如果目标端口是给定端口之一,则匹配。标志--dports是此选项的方便别名。
[!] --portsport[,port|,port:port]...,如果源端口或目标端口等于给定端口之一,则匹配。
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[:port]
[!] --destination-port,--dport port[:port]
[!] --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
31)set
该模块匹配可由ipset(8)定义的IP集。
[!] --match-setsetnameflag[,flag]..,其中flag是用逗号分隔的src或dst规范的列表,其中最多只能有6个。
iptables -A FORWARD -m set --match-set test src,dst
将匹配数据包,对于这些数据包(如果SET类型为ipportmap),源地址和目标端口对可以在指定的集合中找到。如果指定集的集合类型为单维(例如ipmap),则该命令将匹配在指定集中可以找到源地址的数据包。
如果选项与其他扩展的选项不冲突,则可以将选项“--match-set”替换为“--set”。
32)socket
如果可以通过在数据包上执行套接字查找找到打开的套接字,则他的匹配项。
--transparent,忽略非transparent的包。
33)state
当与连接跟踪相结合时,此模块允许访问此数据包的连接跟踪状态。
[!] --statestate,其中状态是要匹配的连接状态的逗号分隔列表。可能的状态是无效的,这意味着由于某些原因无法识别数据包,其中包括内存不足和ICMP错误,这些错误与任何已知的连接不相对应,这意味着该数据包与一个已经在两个方向上看到数据包的连接相关联,新的意思是该数据包已经启动了一个新连接,或以其他方式与没有在两个方向上看到数据包的连接相关联,以及相关的意思是,该数据包正在启动一个新连接,但与现有连接相关联,例如FTP数据传输或ICMP错误。
34)statistic
该模块基于一定的统计条件对数据包进行匹配。它支持使用“--mode”选项设置的两种不同的模式。
--modemode,设置匹配规则的匹配模式,所支持的模式为随机模式和nth模式。
--probabilityp,将随机匹配数据包的概率从0设置为1。它只适用于随机模式。
--everyn,每第n包匹配一包。它只适用于nth模式。
--packetp,为nth模式设置初始计数器值(0<=p<=n-1,默认值0)
35)string
该模块通过使用某种模式匹配策略来匹配给定的字符串。它需要一个Linux内核>=2.6.14。
--algo {bm|kmp},选择模式匹配策略(bm=Boyer-Moore, kmp=Knuth-Pratt- Morris)
--fromoffset,设置它开始寻找匹配的偏移量。如果未通过,默认为0。
--tooffset,设置它开始寻找匹配的偏移量。如果未通过,则默认为数据包大小。
[!] --stringpattern,匹配给定的模式。
[!] --hex-string pattern,匹配以十六进制表示的给定模式。
36)tcp
如果指定了“--protocol TCP”,则可以使用这些扩展。它提供了以下选项:
[!] --source-port,--sportport[:port],源端口或端口范围规范。这可以是服务名称,也可以是端口号。如果省略第一个端口,则假定为“0”;如果省略最后一个端口,则假定为“65535”。如果第一个端口大于第二个端口,它们将被交换
[!] --destination-port,--dportport[:port],目的端口或端口范围规范。“--dport”的方便别名。
[!] --tcp-flagsmaskcomp,匹配指定的TCP标志。第一个参数掩码是我们应该检查的标志,写成逗号分隔列表,第二个参数comp是必须设置的以逗号分隔的标志列表。flag可以是SYN ACK FIN RST URG PSH ALL NONE
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
这个命令只匹配了SYN标志
[!] --syn,只匹配设置了SYN位,并且清除了ACK,RST,FIN为的包。等价于“--tcp-flags SYN,RST,ACK,FIN SYN”
这与TCP标头的TCPMSS(最大段大小)字段匹配。您只能在TCP SYN或SYN/ACK数据包上使用这一点,因为MSS只在连接启动时的TCP握手期间协商。
[!] --mssvalue[:value],匹配给定的tcp mss值或范围。
38)time
如果数据包到达时间/日期在给定范围内,则匹配。所有选项都是可选的,但在指定的时候都是可选的。
--datestartYYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestopYYYY[-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。
--timestarthh:mm[:ss]
--timestophh:mm[:ss],只有在指定的白天匹配。可能的时间范围是00:00到23:59:59。允许前导零(例如“06:03”),并正确解释为基数-10。
[!] --monthdaysday[,day...],只在一个月的指定日期匹配。可能值为1到31。请注意,在没有第31天的月份中,指定31当然不匹配;28天或29天的2月也是如此。
[!] --weekdaysday[,day...],只有在给定的工作日匹配。可能的值分别是Mon、Tue、Wed、Thu、Fri、sat、Sun或1到7之间的值。您也可以使用两个字符的变体(Mo,Tu等)。
--utc,把给--datestart、--datestop、--timestart、--timestop的时间解释为UTC。
--localtz,把给--datestart、--datestop、--timestart、--timestop的时间解释为本地时间(默认)。
匹配星期天
-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
39)tos
此模块匹配IPv 4报头中的8位服务类型字段(即包括IPv 6报头中的“优先级”比特)或(也包括8位)优先级字段。
[!] --tos value[/mask],匹配具有给定TOS标记值的数据包。如果指定了mask,则在比较之前使用TOS标记进行逻辑分析。
[!] --tos symbol,在为IPv4使用tos匹配时,您可以指定一个符号名。可以通过使用“-m tos-h”调用iptables来获得已识别的TOS名称的列表。请注意,这意味着掩码为0x3F,即除ECN位外的所有掩码。
40)ttl
此模块匹配ip报头中活动字段的时间。
--ttl-eqttl,如果和给定的ttl值相等,那么就匹配。
--ttl-gtttl,如果大于给定的ttl值,那么就匹配。
--ttl-ltttl,如果小于给定的ttl值,那么就匹配。
41)u32
U32测试从数据包中提取的多达4个字节的数量是否具有指定的值。要提取哪些内容的规范足够通用,可以在给定的偏移量下从tcp报头或有效负载中找到数据。
[!] --u32tests,该参数相当于下面描述的一种小型语言中的程序。
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参数中“=”不超过10个,“&&”不超过9个;
*每个值不超过10个范围(和9个逗号);
*每个地点不超过10个number(和9个操作符);
要描述位置的含义,请想象下面解释它的机器。有三个寄存器: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;
任何对[SKB->Data,SKB->End]外部内存的访问都会导致匹配失败。否则,计算结果是C的最终值。允许使用空白,但在测试中不需要。但是,出现在其中的字符可能需要shell引用,因此将参数括在引号中是个好主意。
例子代码
匹配总长度>=256的IP数据包。IP报头包含一个以字节2-3为单位的总长度字段。以及使用0xFFFF(给定字节2-3),并测试它是否在[0x100:0xFFF]范围内。
--u32 "0 & 0xFFFF = 0x100:0xFFFF"
匹配ICMP数据包与ICMP类型0。首先测试它是否是ICMP数据包,真IP字节9(协议)=1
--u32 "6 & 0xFF = 1 && ...
读取字节6-9,使用&丢弃字节6-8,并将结果与1进行比较。下一次测试它不是片段。(如果是这样的话,它可能是这样的包的一部分,但我们不能总是说出来。)注:如果您想要匹配IP报头之外的任何内容,则通常需要进行此测试。最后6位字节6和所有字节7都是0当且仅当这是一个完整的数据包(不是片段)。或者,您可以只测试字节6的最后5位,从而允许第一个片段。
... 4 & 0x3FFF = 0 && ...
最后一次测试:通过IP报头的第一个字节(类型)是0。这就是我们必须使用@语法的地方。以32位字表示的ip报头(Ihl)的长度存储在ip报头本身的字节0的右侧。
... 0 >> 22 & 0x3C @ 0 >> 24 = 0"
前0表示读取字节0-3,>22表示向右移动22位。移动24位将给出第一个字节,所以只有22位是4倍,再加上几个比特。&3C然后删除右边的两个额外位和第一个字节的前四位。例如,如果IHL=5,则IP报头长20(4x5)字节。在本例中,字节0-1为(二进制)xxx0101 yzzzz,>22为10位值xxx0101yy,&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中的任何一个。
42)udp
如果指定了“--protocol udp”,则可以使用这些扩展。它提供了以下选项:
[!] --source-port,--sport port[:port],源端口或端口范围规范。
[!] --destination-port,--dportport[:port],目的端口或端口范围规范。
43)unclean
此模块不需要任何选项,而是尝试匹配看起来格式错误或不寻常的数据包。
4、目标扩展
1)AUDIT
此目标允许为到达目标的数据包创建审核记录。它可以用来记录接受、丢弃和拒绝的数据包。
--type {accept|drop|reject},设置审计记录类型。
iptables -N AUDIT_DROP
iptables -A AUDIT_DROP -j AUDIT --type drop
iptables -A AUDIT_DROP -j DROP
2)CHECKSUM
这个目标允许有选择地处理损坏的/旧的应用程序。它只能在mangle表上使用。
--checksum-fill,计算并填写缺少校验和的数据包中的校验和。如果您需要处理诸如dhcp客户端之类的旧应用程序,这些应用程序不能很好地处理校验和卸载,但不希望在设备中禁用校验和卸载,这一点尤其有用。
3)CLASSIFY
该模块允许您设置skb->priority(从而将数据包分类为特定的CBQ类)。
--set-classmajor:minor,设置主类和次要类值。即使没有提供0x前缀,这些值也总是被解释为十六进制。
4)CLUSTERIP
此模块允许您配置一个简单的节点集群,这些节点共享特定的IP和MAC地址,而无需在其前面显式负载均衡器。连接是静态地分布在此集群中的节点之间的。
--new,创建一个新的集群IP。对于给定的集群IP,始终必须在第一条规则上设置这一项。
--hashmodemode,指定hash模式,可以是:sourceip,sourceip-sourceport,sourceip-sourceport-destport。
--clustermacmac,指定集群IP MAC地址。必须是链路层多播地址。
--total-nodesnum,该集群中节点总数的数目。
--local-nodenum,此集群中的本地节点号。
--hash-initrnd,指定用于哈希初始化的随机种子。
5)CONNMARK
此模块设置与连接关联的netfilter标记值。标记宽32位。
--set-xmarkvalue[/mask],将mask定义的为归零,value定义的位和ctmark异或。
--save-mark[--nfmasknfmask] [--ctmask ctmask],使用给定的掩码将数据包标记(Nfmark)复制到连接标记(Ctmark)。新的nfmark值确定如下:
ctmark = (ctmark & ~ctmask) ^ (nfmark & nfmask)
例如,ctmask定义要清除哪些位,nfmask中要将哪些nfmark为和ctmark进行异或。默认为0xFFFFFFFF。
--restore-mark[--nfmasknfmask] [--ctmask ctmask],只有在mangle表中使用。
--and-markbits,ctmark和bits进行与操作,助记符:--set-xmark 0/invbits。
--or-markbits,ctmark和bits进行或操作,助记符:--set-xmark bits/bits。
--xor-markbits,ctmark和bits进行异或操作,助记符:--set-xmark bits/0。
--set-markvalue[/mask],置位连接标记。如果指定了掩码,则只修改掩码中设置的位。
--save-mark[--maskmask],将nfmark复制到ctmark。如果指定了掩码,则只复制这些位。
--restore-mark[--maskmask],将cctmark复制到nfmark。如果指定了掩码,则仅复制这些位。这在mangle表中是有效的
6)CONNSECMARK
此模块将安全标记从数据包复制到连接(如果没有标记),从连接复制回数据包(也只有在未标记的情况下)。通常与SECMARK一起使用,它仅在mangle表中有效。
--save,如果数据包有安全标记,如果未标记连接,请将其复制到连接中。
--restore,如果数据包没有安全标记,而连接有安全标记,则将安全标记从连接复制到数据包。
7)DNAT
此目标仅在nat表、PREROUTING和OUTPUT链以及仅从这些链调用的用户定义链中有效。它指定应修改数据包的目标地址(并且此连接中的所有未来数据包也将被破坏),并且应该停止检查规则。它需要以下一种选择:
--to-destination[ipaddr][-ipaddr][:port[-port]],它可以指定单个新的目标IP地址、包含的IP地址范围以及可选的端口范围(只有在规则还指定“-p tcp”或“-p udp”时才有效)。如果未指定端口范围,则永远不会修改目标端口。如果未指定IP地址,则只修改目标端口。
--random,如果使用选项“--random”,则端口映射将是随机的(内核>=2.6.22)。
--persistent,为每个连接提供相同的源/目标地址。这取代了同一个目标。对持久映射的支持可从2.6.29-Rc2中获得。
8)DSCP
此目标允许在IPv 4数据包的TOS报头中更改DSCP位的值。由于这操作一个数据包,它只能在mangle表中使用。
--set-dscpvalue,将DSCP字段设置为数字值(可以是十进制或十六进制)。
--set-dscp-classclass,将DSCP字段设置为DiffServ类。
9)ECN
这个目标允许有选择地围绕已知的ECN黑洞工作。它只能在mangle表中使用。
--ecn-tcp-remove,从TCP报头中删除所有ECN位。当然,它只能与“-p tcp”一起使用。
10)LOG
打开匹配数据包的内核日志记录。当将此选项设置为规则时,Linux内核将通过内核日志(在其中可以使用dmesg或sy d(8)读取)打印所有匹配数据包(如大多数IP报头字段)上的一些信息。这是一个“非终止目标”,即在下一个规则中继续进行规则遍历。因此,如果要记录拒绝的数据包,请使用两个具有相同匹配条件的单独规则,首先使用目标日志,然后删除(或拒绝)。
--log-levellevel,日志记录级别。
--log-prefixprefix,前缀为指定prefix的日志消息;长度可达29个字母,用于区分日志中的消息。
--log-tcp-sequence,记录TCP序列号。如果用户可以读取日志,则这是一种安全风险。
--log-tcp-options,从TCP数据包报头log选项
--log-ip-options,从IP数据包报头log选项
--log-uid,记录生成数据包的进程的userid
11)MARK
此目标用于设置与数据包关联的Netfilter标记值。目标只能在mangle表中使用。例如,它可以与基于fwmark的路由一起使用(需要iucte 2)。标记字段宽32位。
--set-xmarkvalue[/mask],将掩码和XOR值给出的位归零到数据包标记(“nfmark”)中。如果省略掩码,则假定为0xFFFFFFFF。
--set-markvalue[/mask],将掩码和OR值给出的位归零到数据包标记(“nfmark”)中。如果省略掩码,则假定为0xFFFFFFFF。
--and-markbits,将nfmark和bits进行与操作,助记符:--set-xmark 0/invbits。
--or-markbits,将nfmark和bits进行或操作,助记符:--set-xmark bits/bits。
--xor-markbits,将nfmark和bits进行异或操作,助记符:--set-xmark bits/0。
12)MASQUERADE
此目标仅在NAT表中的POSTROUTING链中有效。它应该只用于动态分配的IP(拨号)连接:如果您有一个静态IP地址,则应该使用SNAT目标。伪装相当于指定一个映射到数据包将要输出的接口的IP地址,但也会导致连接在接口下降时被遗忘。当下一个拨号不太可能具有相同的接口地址时,这是正确的行为(因此,任何已建立的连接无论如何都会丢失)。只有一个选择:
--to-portsport[-port],这指定了要使用的一系列源端口,覆盖默认的SNAT源端口-选择启发式(见上文)。
--random,随机化源端口映射,如果使用选项-随机,则端口映射将是随机的(内核>=2.6.21)。
13)MIRROR
这是一个实验演示目标,它反转IP报头中的源字段和目标字段,并重新传输数据包。它仅在输入链、前向链和PREROUTING链以及仅从这些链调用的用户定义链中有效。请注意,任何数据包过滤链、连接跟踪或NAT都看不到传出数据包,以避免循环和其他问题。
14)NETMAP
此目标允许您静态地将整个地址网络映射到另一个地址网络。它只能从NAT表中的规则中使用。
--toaddress[/mask],要映射到的网络地址。生成的地址将以下方式构造:掩码中的所有位都是从新的“地址”中填充的。掩码中的所有零位都是从原始地址填充的。
15)NFLOG
此目标提供匹配数据包的日志记录。当为规则设置此目标时,Linux内核将数据包传递给加载的日志后端以记录数据包。这通常与nfnetlink_log作为日志后端结合使用,后者将通过NetLink套接字将数据包多播到指定的多播组。一个或多个用户空间进程可以订阅组以接收分组。与日志一样,这是一个不终止的目标,即在下一个规则中继续进行规则遍历。
--nflog-groupnlgroup,数据包所在的NetLink组(1~2^32-1)(仅适用于nfnetlink_log)。默认值为0。
--nflog-prefixprefix,一个前缀字符串,包含在日志消息中,长度可达64个字符,用于区分日志中的消息。
--nflog-rangesize,要复制到用户空间的字节数(仅适用于nfnetlink_log)。nfnetlink_log实例可以指定它们自己的范围,此选项将重写它。
此目标是QUEUE目标的扩展。与QUEUE相反,它允许您将数据包放入任何特定队列中,该队列由其16位队列号标识。它只能与内核版本2.6.14或更高版本一起使用,因为它需要nfnetlink_Queue内核支持。队列平衡选项在Linux2.6.31中添加,队列旁路在2.6.39中添加。
--queue-numvalue,这指定要使用的队列号。有效队列号为0至65535。默认值为0。
--queue-balancevalue:value,这指定要使用的队列范围。然后在给定的队列中平衡数据包。
--queue-bypass,默认情况下,如果在NFQUEUE上没有用户空间程序侦听,那么所有要排队的数据包都会被丢弃。当使用此选项时,将悄悄绕过NFQUEUE规则。包将转到下一个规则。
17)NOTRACK
此目标禁用与该规则匹配的所有数据包的连接跟踪,只能在raw表中使用。
18)RATEEST
RATEEST目标收集统计数据,执行速率估计计算,并将结果保存起来,以便使用最优匹配进行以后的评估。
--rateest-namename,将匹配的数据包计数到按名称引用的池中,这是可以自由选择的。
--rateest-intervalamount{s|ms|us},速率测量间隔,以秒、毫秒或微秒为单位。
--rateest-ewmalogvalue,速率测量平均时间常数。
19)REDIRECT
此目标仅在NAT表、PREROUTING和输出链以及仅从这些链调用的用户定义链中有效。它将数据包重定向到机器本身,方法是将目标IP更改为传入接口的主地址(本地生成的数据包映射到127.0.0.1地址)。
--to-ports port[-port],这将指定要使用的目的端口或端口范围:否则,目标端口将永远不会更改。只有配合选项“-p tcp”和“-p udp”才有用。
--random,如果使用选项“--random”,则端口映射将是随机的(内核>=2.6.22)
20)REJECT
这用于响应匹配的数据包发送错误数据包:否则,它等同于丢弃,因此它是一个终止目标,结束规则遍历。此目标仅在输入、前向和输出链以及用户定义的仅从这些链调用的链中有效。以下选项控制返回的错误数据包的性质:
--reject-withtype,type可以是icmp-net-unreachable, icmp-host-unreachabl,icmp-port-unreachable,icmp-proto-unreachable,icmp-net-prohibited,icmp-host-prohibited,icmp-admin-prohibited
21)SAME
类似于SNAT/DNAT,取决于链:它接受一系列地址“--to 1.2.3.4-1.2.3.7”。为每个连接提供相同的源/目标地址。
--toipaddr[-ipaddr],要将源映射到的地址。可以为多个范围指定不止一次。
--nodst,在选择新的源-ip时,不要在计算中使用目标-ip。
--random,端口映射将强制随机化,以避免基于端口预测的攻击(内核>=2.6.21)。
22)SECMARK
这用于设置与数据包关联的安全标记值,以供安全子系统(如SELinux)使用。它只在残缺表中有效。标记宽32位。
--selctxsecurity_context
23)SET
此模块从ip集中添加和/或删除可由ipset(8)定义的项。
--add-setsetnameflag[,flag...],将数据包的地址/端口添加到集合中
--del-setsetnameflag[,flag...],从集合中删除数据包的地址/端口
24)SNAT
此目标仅在NAT表中的POSTROUTING链中有效。它指定应该修改数据包的源地址(并且这个连接中的所有未来数据包也将被破坏),并且应该停止检查规则。它需要一种选择
--to-sourceipaddr[-ipaddr][:port[-port]],它可以指定单个新的源IP地址、包含的IP地址范围以及可选的端口范围(只有在规则还指定-p TCP或-p UDP时才有效)。 如果未指定端口范围,则512以下的源端口将映射到512以下的其他端口:512和1023之间的端口将映射到1024以下的端口,而其他端口将映射到1024或以上端口。如有可能,不会更改端口。
--random,如果使用了选项“--random”,则端口映射将被随机化(内核>=2.6.21)。
--persistent,为每个连接提供相同的源/目标地址。这取代了同一个目标。对持久映射的支持可从2.6.29-Rc2中获得
25)TCPMMS
此目标允许更改TCP SYN数据包的MSS值,以控制该连接的最大大小(通常将其限制为输出接口的MTU减去40(ipv4)或者减去60(ipv6)。当然,它只能与-p TCP一起使用。它仅在mangle表中有效。
该目标用于克服阻碍“ICMP碎片需要”或“ICMPv 6数据包太大”数据包的犯罪行为。这个问题的症状是,Linux防火墙/路由器的所有功能都很好,但是它背后的机器永远不能交换大数据包:Web浏览器连接,然后挂起没有收到的数据;小邮件工作正常,但大型电子邮件挂着;SSH工作正常,但scp在初次握手后挂起。
解决办法:激活此选项并将规则添加到防火墙配置中,如
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
--set-mssvalue,显式地将MSS选项设置为指定的值。如果数据包的MSS已经低于值,则不会增加(从Linux2.6.25开始),以避免主机依赖适当的MSS出现更多问题
--clamp-mss-to-pmtu,自动将MSS值夹到(IPv4的PATH_MTU-40;IPv 6的PATH_MTU-60)。
26)TCPOPTSTRIP
此目标将从TCP数据包中删除TCP选项。(它实际上将以无操作代替。)因此,您需要添加“-p tcp”参数。
--strip-optionsoption[,option...],去掉给定的选项。这些选项可以由TCP选项号或符号名称指定。可以通过使用“-j TCPOPTSTRIP -h”调用iptable来获得可识别选项的列表。
27)TOS
此模块在IPv 4报头中设置服务类型字段(包括“优先级”位)或在IPv 6报头中设置优先级字段。注意,TOS与DSCP和ECN共享相同的位。tos目标仅在mangle表中有效。
--set-tosvalue[/mask],将掩码和XOR值给出的位归零到TOS/Priority字段中。如果省略掩码,则假定为0 xff。
--set-tossymbol,在为IPv4使用TOS目标时,可以指定一个符号名。它暗示了0xFF的掩码。可以通过使用“-j TOS -h”调用iptables来获得已识别的TOS名称的列表。
--and-tosbits,bits和TOS执行与操作。(助记符用于“--set-tos 0/invbits”,其中inbit是位的二进制否定。)
--or-tosbits,bits和TOS执行或操作。
--xor-tosbits,bits和TOS执行异或操作。
28)TPROXY
此目标仅在mangle表、PREROUTING链和用户定义链中有效,这些链仅从该链调用。它将数据包重定向到本地套接字,而不以任何方式更改数据包报头。它还可以更改标记值,然后在高级路由规则中使用。它有三个选项:
--on-portport,这指定要使用的目标端口。这是必需的选项,0表示新的目标端口与原始端口相同。这只有在规则还指定“-p tcp“或”-p udp“时才有效。
--on-ipaddress,这指定要使用的目标地址。默认情况下,该地址是传入接口的ip地址。这只有在规则还指定“-p tcp“或”-p udp“时才有效。
--tproxy-markvalue[/mask],用给定的值/掩码标记数据包。这里的fwmark值集可以被高级路由使用。(透明代理工作所必需的:否则这些数据包将被转发,这可能不是您想要的。)
29)TRACE
此目标标记Packes,以便内核在遍历表、链、规则时记录与数据包匹配的每条规则。(日志记录需要ipt_log或ip6t_log模块)。数据包以字符串前缀记录:“TRACE:tablename:chainname:type:ruenum”,其中type可以是普通规则的“rule”,用户定义的链末尾的隐式规则可以是“return”,内置链的策略可以是“policy”。
只能在raw表中使用。
30)TTL
这用于修改IPv 4 TTL头字段。TTL字段确定数据包可以遍历多少跳(路由器),直到超过生存时间。设置或递增ttl字段可能非常危险,因此应不惜任何代价加以避免。不要在离开本地网络的数据包上设置或增加值!
--ttl-setvalue,设置TTL值为value。
--ttl-decvalue,减少TTL的值value次。
--ttl-incvalue,增加TTL的值value次。
31)ULOG
此目标提供匹配数据包的用户空间日志记录。当为规则设置此目标时,Linux内核将通过NetLink套接字对此数据包进行多播。然后,一个或多个用户空间进程可以订阅各种多播组并接收分组。与日志一样,这是一个“不终止的目标”,即在下一个规则中继续进行规则遍历。
--ulog-nlgroupnlgroup,这指定了将数据包发送到的netlink组(1-32)。默认值为1
--ulog-prefixprefix,前缀为指定前缀的日志消息;长度可达32个字符,用于区分日志中的消息。
--ulog-cprangesize,要复制到用户空间的字节数。值为0总是复制整个数据包,而不考虑其大小。默认值为0
--ulog-qthresholdsize,内核中要排队的数据包数。例如,将此值设置为10,在内核内累加10个数据包,并将它们作为一个NetLink多部分消息传输到用户空间。默认值为1(用于向后兼容性)
5、实例
1)显示filter表的记录
[root@localhost ~]# iptables -t filter –L //显示指定表的记录
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
…
Chain FORWARD (policy ACCEPT
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
…
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
2)禁止端口135的tcp数据包
[root@localhost ~]# iptables -t filter -A INPUT -p tcp --dport 135 -j DROP //添加记录,忽略135端口的tcp数据包
[root@localhost ~]# iptables –L //查看表,已经加入规则
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
DROP tcp -- anywhere anywhere tcp dpt:epmap
3)禁止目标地址访问本机
[root@localhost ~]# iptables -A INPUT -s 192.168.1.110 -j DROP //禁止110地址访问本机
[root@localhost ~]# iptables -L |grep DROP //查看filter表,已经添加记录
DROP tcp -- anywhere anywhere tcp dpt:epmap
iptables指令用来设置Linux内核的ip过滤规则以及管理nat功能。iptables用于在Linux内核中设置、维护和检查IPv4数据包过滤规则表。可以定义几个不同的表。每个表包含许多内置链,也可能包含用户定义的链。每个链都是一个规则列表,可以匹配一组数据包。每条规则都指定如何处理匹配的数据包。这被称为“目标”,它可能是跳转到同一表中的用户定义链。
此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。
1、语法
iptables [-t table] {-A|-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]
目前Linux内核支持3个相互独立的表:filter,过滤ip数据包;nat,配置nat功能;mangle,修改ip数据包。
filter是默认表,包含INPUT(发送给本机) 、OUTPUT(本机向外发送)、FORWARD(被路由出去)三个链。
nat表包含PREROUTING(修改刚收到的数据包) 、OUTPUT(在路由之前处理本机产生的数据包) 、POSTROUTING(修改将要发送的数据包)三个链
mangle表包含PREROUTING(路由之前,修改收到的包) 、OUTPUT(路由之前,修改本机产生的包) 、INPUT(修改发送到本机的包) 、FORWARD (修改路由之后的包) 、POSTROUTING(修改将被本机发送的包)五个链。
Linux系统中的内置目标包括:ACCEPT(允许数据包通过)DROP(丢弃数据包) QUEUE(传递包到用户空间)RETURN(停止向后检测其他的规则,返回之前的条用规则处)
2、选项列表
选项可以按组来区分
-t table
指定要管理的表
-A | --append chain rule-specification
追加记录
-D | --delete chain rule-specification
删除记录
-I | --insert chain [rulenum] rule-specification
插入记录
-R | --replace chain [rulenum] rule-specification
替换记录
-L | --list [chain]
列出记录
-S | --list-rules [chain]
列出已选择链的所有规则。如果没有选择任何链,则所有链都打印
-F | --flush [chain]
删除指定的记录
-Z | --zero [chain [rulenum]]
将数据计数和字节计数清零
-N | --new-chain chain
用户自定义新链
-X | --delete-chain [chain]
删除用户自定义链
-P | --policy chaintarget
为指定的链设置策略
-E | --rename-chain old new
重命名链
-h
显示帮助信息
参数
[!] –p | --protocol protocol
指定协议类型tcp、udp、icmp、all,协议前加!标识否定
[!] –s | --sourceaddress[/mask][,…
源地址
[!] –d
--destinationaddress[/mask][,…
目标
-j | --jump
指定跳转的目标
-g | --goto chain
这指定应在用户指定的链中继续处理。与“--jump”选项不同,返回将不再在此链中继续处理,而是在通过“--jump”调用我们的链中继续处理。
[!] –i | --in-interface name
接收数据包的接口名称(仅用于输入、转发和PREROUTING链的数据包)。当“!”参数在接口名称之前使用,意义被倒置。如果接口名以“+”结尾,则以此名称开头的任何接口都将匹配。如果省略此选项,则任何接口名称都将匹配。
-o | --out-interfacename
指定数据包离开的网络接口
[!] –f | --fragment
这意味着该规则仅指分段数据包的第二段和更多的片段。
-c | --set-counters packets bytes
这使管理员能够初始化规则的数据包和字节计数器(在插入、追加、替换操作期间)。
其他选项
-v | --verbose
冗长的输出,该选项使List命令显示接口名称、规则选项(如果有的话)和TOS掩码。还列出了数据包计数器和字节计数器
-n | --numeric
数字输出IP地址和端口号将以数字格式打印。默认情况下,程序将尝试将它们显示为主机名、网络名称或服务(只要适用)。
-x | --exact
扩大数字。显示数据包和字节计数器的确切值,而不是只显示K‘s(1000倍)M’s(1000 K倍数)或G‘s(1000 m倍数)中的四舍五入数。此选项仅与-L命令相关。
--line-numbers
当列出规则时,将行号添加到每条规则的开头,对应于该规则在链中的位置。
--modprobe=command
在向链中添加或插入规则时,使用命令加载任何必要的模块(目标、匹配扩展等)
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[:port]
[!] --destination-port,--dportport[:port]
[!] --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:port]...,如果源端口是给定端口之一,则匹配。旗杆运动是这个选项的方便别名。多个端口或端口范围使用逗号分隔,端口范围使用冒号指定。因此,53,1024:65535将匹配端口53,所有端口都是从1024到65535。
[!] --destination-ports,--dportsport[,port|,port:port]..,如果目标端口是给定端口之一,则匹配。标志--dports是此选项的方便别名。
[!] --portsport[,port|,port:port]...,如果源端口或目标端口等于给定端口之一,则匹配。
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[:port]
[!] --destination-port,--dport port[:port]
[!] --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
31)set
该模块匹配可由ipset(8)定义的IP集。
[!] --match-setsetnameflag[,flag]..,其中flag是用逗号分隔的src或dst规范的列表,其中最多只能有6个。
iptables -A FORWARD -m set --match-set test src,dst
将匹配数据包,对于这些数据包(如果SET类型为ipportmap),源地址和目标端口对可以在指定的集合中找到。如果指定集的集合类型为单维(例如ipmap),则该命令将匹配在指定集中可以找到源地址的数据包。
如果选项与其他扩展的选项不冲突,则可以将选项“--match-set”替换为“--set”。
32)socket
如果可以通过在数据包上执行套接字查找找到打开的套接字,则他的匹配项。
--transparent,忽略非transparent的包。
33)state
当与连接跟踪相结合时,此模块允许访问此数据包的连接跟踪状态。
[!] --statestate,其中状态是要匹配的连接状态的逗号分隔列表。可能的状态是无效的,这意味着由于某些原因无法识别数据包,其中包括内存不足和ICMP错误,这些错误与任何已知的连接不相对应,这意味着该数据包与一个已经在两个方向上看到数据包的连接相关联,新的意思是该数据包已经启动了一个新连接,或以其他方式与没有在两个方向上看到数据包的连接相关联,以及相关的意思是,该数据包正在启动一个新连接,但与现有连接相关联,例如FTP数据传输或ICMP错误。
34)statistic
该模块基于一定的统计条件对数据包进行匹配。它支持使用“--mode”选项设置的两种不同的模式。
--modemode,设置匹配规则的匹配模式,所支持的模式为随机模式和nth模式。
--probabilityp,将随机匹配数据包的概率从0设置为1。它只适用于随机模式。
--everyn,每第n包匹配一包。它只适用于nth模式。
--packetp,为nth模式设置初始计数器值(0<=p<=n-1,默认值0)
35)string
该模块通过使用某种模式匹配策略来匹配给定的字符串。它需要一个Linux内核>=2.6.14。
--algo {bm|kmp},选择模式匹配策略(bm=Boyer-Moore, kmp=Knuth-Pratt- Morris)
--fromoffset,设置它开始寻找匹配的偏移量。如果未通过,默认为0。
--tooffset,设置它开始寻找匹配的偏移量。如果未通过,则默认为数据包大小。
[!] --stringpattern,匹配给定的模式。
[!] --hex-string pattern,匹配以十六进制表示的给定模式。
36)tcp
如果指定了“--protocol TCP”,则可以使用这些扩展。它提供了以下选项:
[!] --source-port,--sportport[:port],源端口或端口范围规范。这可以是服务名称,也可以是端口号。如果省略第一个端口,则假定为“0”;如果省略最后一个端口,则假定为“65535”。如果第一个端口大于第二个端口,它们将被交换
[!] --destination-port,--dportport[:port],目的端口或端口范围规范。“--dport”的方便别名。
[!] --tcp-flagsmaskcomp,匹配指定的TCP标志。第一个参数掩码是我们应该检查的标志,写成逗号分隔列表,第二个参数comp是必须设置的以逗号分隔的标志列表。flag可以是SYN ACK FIN RST URG PSH ALL NONE
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
这个命令只匹配了SYN标志
[!] --syn,只匹配设置了SYN位,并且清除了ACK,RST,FIN为的包。等价于“--tcp-flags SYN,RST,ACK,FIN SYN”
[!] --tcp-optionnumber,如果设置了tcp选项就匹配。
37)tcpmss这与TCP标头的TCPMSS(最大段大小)字段匹配。您只能在TCP SYN或SYN/ACK数据包上使用这一点,因为MSS只在连接启动时的TCP握手期间协商。
[!] --mssvalue[:value],匹配给定的tcp mss值或范围。
38)time
如果数据包到达时间/日期在给定范围内,则匹配。所有选项都是可选的,但在指定的时候都是可选的。
--datestartYYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestopYYYY[-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。
--timestarthh:mm[:ss]
--timestophh:mm[:ss],只有在指定的白天匹配。可能的时间范围是00:00到23:59:59。允许前导零(例如“06:03”),并正确解释为基数-10。
[!] --monthdaysday[,day...],只在一个月的指定日期匹配。可能值为1到31。请注意,在没有第31天的月份中,指定31当然不匹配;28天或29天的2月也是如此。
[!] --weekdaysday[,day...],只有在给定的工作日匹配。可能的值分别是Mon、Tue、Wed、Thu、Fri、sat、Sun或1到7之间的值。您也可以使用两个字符的变体(Mo,Tu等)。
--utc,把给--datestart、--datestop、--timestart、--timestop的时间解释为UTC。
--localtz,把给--datestart、--datestop、--timestart、--timestop的时间解释为本地时间(默认)。
匹配星期天
-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
39)tos
此模块匹配IPv 4报头中的8位服务类型字段(即包括IPv 6报头中的“优先级”比特)或(也包括8位)优先级字段。
[!] --tos value[/mask],匹配具有给定TOS标记值的数据包。如果指定了mask,则在比较之前使用TOS标记进行逻辑分析。
[!] --tos symbol,在为IPv4使用tos匹配时,您可以指定一个符号名。可以通过使用“-m tos-h”调用iptables来获得已识别的TOS名称的列表。请注意,这意味着掩码为0x3F,即除ECN位外的所有掩码。
40)ttl
此模块匹配ip报头中活动字段的时间。
--ttl-eqttl,如果和给定的ttl值相等,那么就匹配。
--ttl-gtttl,如果大于给定的ttl值,那么就匹配。
--ttl-ltttl,如果小于给定的ttl值,那么就匹配。
41)u32
U32测试从数据包中提取的多达4个字节的数量是否具有指定的值。要提取哪些内容的规范足够通用,可以在给定的偏移量下从tcp报头或有效负载中找到数据。
[!] --u32tests,该参数相当于下面描述的一种小型语言中的程序。
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参数中“=”不超过10个,“&&”不超过9个;
*每个值不超过10个范围(和9个逗号);
*每个地点不超过10个number(和9个操作符);
要描述位置的含义,请想象下面解释它的机器。有三个寄存器: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;
任何对[SKB->Data,SKB->End]外部内存的访问都会导致匹配失败。否则,计算结果是C的最终值。允许使用空白,但在测试中不需要。但是,出现在其中的字符可能需要shell引用,因此将参数括在引号中是个好主意。
例子代码
匹配总长度>=256的IP数据包。IP报头包含一个以字节2-3为单位的总长度字段。以及使用0xFFFF(给定字节2-3),并测试它是否在[0x100:0xFFF]范围内。
--u32 "0 & 0xFFFF = 0x100:0xFFFF"
匹配ICMP数据包与ICMP类型0。首先测试它是否是ICMP数据包,真IP字节9(协议)=1
--u32 "6 & 0xFF = 1 && ...
读取字节6-9,使用&丢弃字节6-8,并将结果与1进行比较。下一次测试它不是片段。(如果是这样的话,它可能是这样的包的一部分,但我们不能总是说出来。)注:如果您想要匹配IP报头之外的任何内容,则通常需要进行此测试。最后6位字节6和所有字节7都是0当且仅当这是一个完整的数据包(不是片段)。或者,您可以只测试字节6的最后5位,从而允许第一个片段。
... 4 & 0x3FFF = 0 && ...
最后一次测试:通过IP报头的第一个字节(类型)是0。这就是我们必须使用@语法的地方。以32位字表示的ip报头(Ihl)的长度存储在ip报头本身的字节0的右侧。
... 0 >> 22 & 0x3C @ 0 >> 24 = 0"
前0表示读取字节0-3,>22表示向右移动22位。移动24位将给出第一个字节,所以只有22位是4倍,再加上几个比特。&3C然后删除右边的两个额外位和第一个字节的前四位。例如,如果IHL=5,则IP报头长20(4x5)字节。在本例中,字节0-1为(二进制)xxx0101 yzzzz,>22为10位值xxx0101yy,&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中的任何一个。
42)udp
如果指定了“--protocol udp”,则可以使用这些扩展。它提供了以下选项:
[!] --source-port,--sport port[:port],源端口或端口范围规范。
[!] --destination-port,--dportport[:port],目的端口或端口范围规范。
43)unclean
此模块不需要任何选项,而是尝试匹配看起来格式错误或不寻常的数据包。
4、目标扩展
1)AUDIT
此目标允许为到达目标的数据包创建审核记录。它可以用来记录接受、丢弃和拒绝的数据包。
--type {accept|drop|reject},设置审计记录类型。
iptables -N AUDIT_DROP
iptables -A AUDIT_DROP -j AUDIT --type drop
iptables -A AUDIT_DROP -j DROP
2)CHECKSUM
这个目标允许有选择地处理损坏的/旧的应用程序。它只能在mangle表上使用。
--checksum-fill,计算并填写缺少校验和的数据包中的校验和。如果您需要处理诸如dhcp客户端之类的旧应用程序,这些应用程序不能很好地处理校验和卸载,但不希望在设备中禁用校验和卸载,这一点尤其有用。
3)CLASSIFY
该模块允许您设置skb->priority(从而将数据包分类为特定的CBQ类)。
--set-classmajor:minor,设置主类和次要类值。即使没有提供0x前缀,这些值也总是被解释为十六进制。
4)CLUSTERIP
此模块允许您配置一个简单的节点集群,这些节点共享特定的IP和MAC地址,而无需在其前面显式负载均衡器。连接是静态地分布在此集群中的节点之间的。
--new,创建一个新的集群IP。对于给定的集群IP,始终必须在第一条规则上设置这一项。
--hashmodemode,指定hash模式,可以是:sourceip,sourceip-sourceport,sourceip-sourceport-destport。
--clustermacmac,指定集群IP MAC地址。必须是链路层多播地址。
--total-nodesnum,该集群中节点总数的数目。
--local-nodenum,此集群中的本地节点号。
--hash-initrnd,指定用于哈希初始化的随机种子。
5)CONNMARK
此模块设置与连接关联的netfilter标记值。标记宽32位。
--set-xmarkvalue[/mask],将mask定义的为归零,value定义的位和ctmark异或。
--save-mark[--nfmasknfmask] [--ctmask ctmask],使用给定的掩码将数据包标记(Nfmark)复制到连接标记(Ctmark)。新的nfmark值确定如下:
ctmark = (ctmark & ~ctmask) ^ (nfmark & nfmask)
例如,ctmask定义要清除哪些位,nfmask中要将哪些nfmark为和ctmark进行异或。默认为0xFFFFFFFF。
--restore-mark[--nfmasknfmask] [--ctmask ctmask],只有在mangle表中使用。
--and-markbits,ctmark和bits进行与操作,助记符:--set-xmark 0/invbits。
--or-markbits,ctmark和bits进行或操作,助记符:--set-xmark bits/bits。
--xor-markbits,ctmark和bits进行异或操作,助记符:--set-xmark bits/0。
--set-markvalue[/mask],置位连接标记。如果指定了掩码,则只修改掩码中设置的位。
--save-mark[--maskmask],将nfmark复制到ctmark。如果指定了掩码,则只复制这些位。
--restore-mark[--maskmask],将cctmark复制到nfmark。如果指定了掩码,则仅复制这些位。这在mangle表中是有效的
6)CONNSECMARK
此模块将安全标记从数据包复制到连接(如果没有标记),从连接复制回数据包(也只有在未标记的情况下)。通常与SECMARK一起使用,它仅在mangle表中有效。
--save,如果数据包有安全标记,如果未标记连接,请将其复制到连接中。
--restore,如果数据包没有安全标记,而连接有安全标记,则将安全标记从连接复制到数据包。
7)DNAT
此目标仅在nat表、PREROUTING和OUTPUT链以及仅从这些链调用的用户定义链中有效。它指定应修改数据包的目标地址(并且此连接中的所有未来数据包也将被破坏),并且应该停止检查规则。它需要以下一种选择:
--to-destination[ipaddr][-ipaddr][:port[-port]],它可以指定单个新的目标IP地址、包含的IP地址范围以及可选的端口范围(只有在规则还指定“-p tcp”或“-p udp”时才有效)。如果未指定端口范围,则永远不会修改目标端口。如果未指定IP地址,则只修改目标端口。
--random,如果使用选项“--random”,则端口映射将是随机的(内核>=2.6.22)。
--persistent,为每个连接提供相同的源/目标地址。这取代了同一个目标。对持久映射的支持可从2.6.29-Rc2中获得。
8)DSCP
此目标允许在IPv 4数据包的TOS报头中更改DSCP位的值。由于这操作一个数据包,它只能在mangle表中使用。
--set-dscpvalue,将DSCP字段设置为数字值(可以是十进制或十六进制)。
--set-dscp-classclass,将DSCP字段设置为DiffServ类。
9)ECN
这个目标允许有选择地围绕已知的ECN黑洞工作。它只能在mangle表中使用。
--ecn-tcp-remove,从TCP报头中删除所有ECN位。当然,它只能与“-p tcp”一起使用。
10)LOG
打开匹配数据包的内核日志记录。当将此选项设置为规则时,Linux内核将通过内核日志(在其中可以使用dmesg或sy d(8)读取)打印所有匹配数据包(如大多数IP报头字段)上的一些信息。这是一个“非终止目标”,即在下一个规则中继续进行规则遍历。因此,如果要记录拒绝的数据包,请使用两个具有相同匹配条件的单独规则,首先使用目标日志,然后删除(或拒绝)。
--log-levellevel,日志记录级别。
--log-prefixprefix,前缀为指定prefix的日志消息;长度可达29个字母,用于区分日志中的消息。
--log-tcp-sequence,记录TCP序列号。如果用户可以读取日志,则这是一种安全风险。
--log-tcp-options,从TCP数据包报头log选项
--log-ip-options,从IP数据包报头log选项
--log-uid,记录生成数据包的进程的userid
11)MARK
此目标用于设置与数据包关联的Netfilter标记值。目标只能在mangle表中使用。例如,它可以与基于fwmark的路由一起使用(需要iucte 2)。标记字段宽32位。
--set-xmarkvalue[/mask],将掩码和XOR值给出的位归零到数据包标记(“nfmark”)中。如果省略掩码,则假定为0xFFFFFFFF。
--set-markvalue[/mask],将掩码和OR值给出的位归零到数据包标记(“nfmark”)中。如果省略掩码,则假定为0xFFFFFFFF。
--and-markbits,将nfmark和bits进行与操作,助记符:--set-xmark 0/invbits。
--or-markbits,将nfmark和bits进行或操作,助记符:--set-xmark bits/bits。
--xor-markbits,将nfmark和bits进行异或操作,助记符:--set-xmark bits/0。
12)MASQUERADE
此目标仅在NAT表中的POSTROUTING链中有效。它应该只用于动态分配的IP(拨号)连接:如果您有一个静态IP地址,则应该使用SNAT目标。伪装相当于指定一个映射到数据包将要输出的接口的IP地址,但也会导致连接在接口下降时被遗忘。当下一个拨号不太可能具有相同的接口地址时,这是正确的行为(因此,任何已建立的连接无论如何都会丢失)。只有一个选择:
--to-portsport[-port],这指定了要使用的一系列源端口,覆盖默认的SNAT源端口-选择启发式(见上文)。
--random,随机化源端口映射,如果使用选项-随机,则端口映射将是随机的(内核>=2.6.21)。
13)MIRROR
这是一个实验演示目标,它反转IP报头中的源字段和目标字段,并重新传输数据包。它仅在输入链、前向链和PREROUTING链以及仅从这些链调用的用户定义链中有效。请注意,任何数据包过滤链、连接跟踪或NAT都看不到传出数据包,以避免循环和其他问题。
14)NETMAP
此目标允许您静态地将整个地址网络映射到另一个地址网络。它只能从NAT表中的规则中使用。
--toaddress[/mask],要映射到的网络地址。生成的地址将以下方式构造:掩码中的所有位都是从新的“地址”中填充的。掩码中的所有零位都是从原始地址填充的。
15)NFLOG
此目标提供匹配数据包的日志记录。当为规则设置此目标时,Linux内核将数据包传递给加载的日志后端以记录数据包。这通常与nfnetlink_log作为日志后端结合使用,后者将通过NetLink套接字将数据包多播到指定的多播组。一个或多个用户空间进程可以订阅组以接收分组。与日志一样,这是一个不终止的目标,即在下一个规则中继续进行规则遍历。
--nflog-groupnlgroup,数据包所在的NetLink组(1~2^32-1)(仅适用于nfnetlink_log)。默认值为0。
--nflog-prefixprefix,一个前缀字符串,包含在日志消息中,长度可达64个字符,用于区分日志中的消息。
--nflog-rangesize,要复制到用户空间的字节数(仅适用于nfnetlink_log)。nfnetlink_log实例可以指定它们自己的范围,此选项将重写它。
--nflog-thresholdsize,在将数据包发送到用户空间(仅适用于nfnetlink_log)之前,要在内核中排队的数据包数。较高的值会减少每个数据包的开销,但会增加延迟,直到数据包到达用户空间为止。默认值为1。
16)NFQUEUE此目标是QUEUE目标的扩展。与QUEUE相反,它允许您将数据包放入任何特定队列中,该队列由其16位队列号标识。它只能与内核版本2.6.14或更高版本一起使用,因为它需要nfnetlink_Queue内核支持。队列平衡选项在Linux2.6.31中添加,队列旁路在2.6.39中添加。
--queue-numvalue,这指定要使用的队列号。有效队列号为0至65535。默认值为0。
--queue-balancevalue:value,这指定要使用的队列范围。然后在给定的队列中平衡数据包。
--queue-bypass,默认情况下,如果在NFQUEUE上没有用户空间程序侦听,那么所有要排队的数据包都会被丢弃。当使用此选项时,将悄悄绕过NFQUEUE规则。包将转到下一个规则。
17)NOTRACK
此目标禁用与该规则匹配的所有数据包的连接跟踪,只能在raw表中使用。
18)RATEEST
RATEEST目标收集统计数据,执行速率估计计算,并将结果保存起来,以便使用最优匹配进行以后的评估。
--rateest-namename,将匹配的数据包计数到按名称引用的池中,这是可以自由选择的。
--rateest-intervalamount{s|ms|us},速率测量间隔,以秒、毫秒或微秒为单位。
--rateest-ewmalogvalue,速率测量平均时间常数。
19)REDIRECT
此目标仅在NAT表、PREROUTING和输出链以及仅从这些链调用的用户定义链中有效。它将数据包重定向到机器本身,方法是将目标IP更改为传入接口的主地址(本地生成的数据包映射到127.0.0.1地址)。
--to-ports port[-port],这将指定要使用的目的端口或端口范围:否则,目标端口将永远不会更改。只有配合选项“-p tcp”和“-p udp”才有用。
--random,如果使用选项“--random”,则端口映射将是随机的(内核>=2.6.22)
20)REJECT
这用于响应匹配的数据包发送错误数据包:否则,它等同于丢弃,因此它是一个终止目标,结束规则遍历。此目标仅在输入、前向和输出链以及用户定义的仅从这些链调用的链中有效。以下选项控制返回的错误数据包的性质:
--reject-withtype,type可以是icmp-net-unreachable, icmp-host-unreachabl,icmp-port-unreachable,icmp-proto-unreachable,icmp-net-prohibited,icmp-host-prohibited,icmp-admin-prohibited
21)SAME
类似于SNAT/DNAT,取决于链:它接受一系列地址“--to 1.2.3.4-1.2.3.7”。为每个连接提供相同的源/目标地址。
--toipaddr[-ipaddr],要将源映射到的地址。可以为多个范围指定不止一次。
--nodst,在选择新的源-ip时,不要在计算中使用目标-ip。
--random,端口映射将强制随机化,以避免基于端口预测的攻击(内核>=2.6.21)。
22)SECMARK
这用于设置与数据包关联的安全标记值,以供安全子系统(如SELinux)使用。它只在残缺表中有效。标记宽32位。
--selctxsecurity_context
23)SET
此模块从ip集中添加和/或删除可由ipset(8)定义的项。
--add-setsetnameflag[,flag...],将数据包的地址/端口添加到集合中
--del-setsetnameflag[,flag...],从集合中删除数据包的地址/端口
24)SNAT
此目标仅在NAT表中的POSTROUTING链中有效。它指定应该修改数据包的源地址(并且这个连接中的所有未来数据包也将被破坏),并且应该停止检查规则。它需要一种选择
--to-sourceipaddr[-ipaddr][:port[-port]],它可以指定单个新的源IP地址、包含的IP地址范围以及可选的端口范围(只有在规则还指定-p TCP或-p UDP时才有效)。 如果未指定端口范围,则512以下的源端口将映射到512以下的其他端口:512和1023之间的端口将映射到1024以下的端口,而其他端口将映射到1024或以上端口。如有可能,不会更改端口。
--random,如果使用了选项“--random”,则端口映射将被随机化(内核>=2.6.21)。
--persistent,为每个连接提供相同的源/目标地址。这取代了同一个目标。对持久映射的支持可从2.6.29-Rc2中获得
25)TCPMMS
此目标允许更改TCP SYN数据包的MSS值,以控制该连接的最大大小(通常将其限制为输出接口的MTU减去40(ipv4)或者减去60(ipv6)。当然,它只能与-p TCP一起使用。它仅在mangle表中有效。
该目标用于克服阻碍“ICMP碎片需要”或“ICMPv 6数据包太大”数据包的犯罪行为。这个问题的症状是,Linux防火墙/路由器的所有功能都很好,但是它背后的机器永远不能交换大数据包:Web浏览器连接,然后挂起没有收到的数据;小邮件工作正常,但大型电子邮件挂着;SSH工作正常,但scp在初次握手后挂起。
解决办法:激活此选项并将规则添加到防火墙配置中,如
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
--set-mssvalue,显式地将MSS选项设置为指定的值。如果数据包的MSS已经低于值,则不会增加(从Linux2.6.25开始),以避免主机依赖适当的MSS出现更多问题
--clamp-mss-to-pmtu,自动将MSS值夹到(IPv4的PATH_MTU-40;IPv 6的PATH_MTU-60)。
26)TCPOPTSTRIP
此目标将从TCP数据包中删除TCP选项。(它实际上将以无操作代替。)因此,您需要添加“-p tcp”参数。
--strip-optionsoption[,option...],去掉给定的选项。这些选项可以由TCP选项号或符号名称指定。可以通过使用“-j TCPOPTSTRIP -h”调用iptable来获得可识别选项的列表。
27)TOS
此模块在IPv 4报头中设置服务类型字段(包括“优先级”位)或在IPv 6报头中设置优先级字段。注意,TOS与DSCP和ECN共享相同的位。tos目标仅在mangle表中有效。
--set-tosvalue[/mask],将掩码和XOR值给出的位归零到TOS/Priority字段中。如果省略掩码,则假定为0 xff。
--set-tossymbol,在为IPv4使用TOS目标时,可以指定一个符号名。它暗示了0xFF的掩码。可以通过使用“-j TOS -h”调用iptables来获得已识别的TOS名称的列表。
--and-tosbits,bits和TOS执行与操作。(助记符用于“--set-tos 0/invbits”,其中inbit是位的二进制否定。)
--or-tosbits,bits和TOS执行或操作。
--xor-tosbits,bits和TOS执行异或操作。
28)TPROXY
此目标仅在mangle表、PREROUTING链和用户定义链中有效,这些链仅从该链调用。它将数据包重定向到本地套接字,而不以任何方式更改数据包报头。它还可以更改标记值,然后在高级路由规则中使用。它有三个选项:
--on-portport,这指定要使用的目标端口。这是必需的选项,0表示新的目标端口与原始端口相同。这只有在规则还指定“-p tcp“或”-p udp“时才有效。
--on-ipaddress,这指定要使用的目标地址。默认情况下,该地址是传入接口的ip地址。这只有在规则还指定“-p tcp“或”-p udp“时才有效。
--tproxy-markvalue[/mask],用给定的值/掩码标记数据包。这里的fwmark值集可以被高级路由使用。(透明代理工作所必需的:否则这些数据包将被转发,这可能不是您想要的。)
29)TRACE
此目标标记Packes,以便内核在遍历表、链、规则时记录与数据包匹配的每条规则。(日志记录需要ipt_log或ip6t_log模块)。数据包以字符串前缀记录:“TRACE:tablename:chainname:type:ruenum”,其中type可以是普通规则的“rule”,用户定义的链末尾的隐式规则可以是“return”,内置链的策略可以是“policy”。
只能在raw表中使用。
30)TTL
这用于修改IPv 4 TTL头字段。TTL字段确定数据包可以遍历多少跳(路由器),直到超过生存时间。设置或递增ttl字段可能非常危险,因此应不惜任何代价加以避免。不要在离开本地网络的数据包上设置或增加值!
--ttl-setvalue,设置TTL值为value。
--ttl-decvalue,减少TTL的值value次。
--ttl-incvalue,增加TTL的值value次。
31)ULOG
此目标提供匹配数据包的用户空间日志记录。当为规则设置此目标时,Linux内核将通过NetLink套接字对此数据包进行多播。然后,一个或多个用户空间进程可以订阅各种多播组并接收分组。与日志一样,这是一个“不终止的目标”,即在下一个规则中继续进行规则遍历。
--ulog-nlgroupnlgroup,这指定了将数据包发送到的netlink组(1-32)。默认值为1
--ulog-prefixprefix,前缀为指定前缀的日志消息;长度可达32个字符,用于区分日志中的消息。
--ulog-cprangesize,要复制到用户空间的字节数。值为0总是复制整个数据包,而不考虑其大小。默认值为0
--ulog-qthresholdsize,内核中要排队的数据包数。例如,将此值设置为10,在内核内累加10个数据包,并将它们作为一个NetLink多部分消息传输到用户空间。默认值为1(用于向后兼容性)
5、实例
1)显示filter表的记录
[root@localhost ~]# iptables -t filter –L //显示指定表的记录
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
…
Chain FORWARD (policy ACCEPT
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
…
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
2)禁止端口135的tcp数据包
[root@localhost ~]# iptables -t filter -A INPUT -p tcp --dport 135 -j DROP //添加记录,忽略135端口的tcp数据包
[root@localhost ~]# iptables –L //查看表,已经加入规则
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
DROP tcp -- anywhere anywhere tcp dpt:epmap
3)禁止目标地址访问本机
[root@localhost ~]# iptables -A INPUT -s 192.168.1.110 -j DROP //禁止110地址访问本机
[root@localhost ~]# iptables -L |grep DROP //查看filter表,已经添加记录
DROP tcp -- anywhere anywhere tcp dpt:epmap
DROP all -- 192.168.1.110 anywhere