柴少的官方网站 技术在学习中进步,水平在分享中升华

iptables详解(一)

      阿里云有安全组策略,不管是华为交换机还是思科交换机都有ACL策略,dns和squid等都有acl策略,就是这个网络安全防护的概念运用到各种各样我们的生产维护中。当然windows系统直接就叫防火墙,linux系统呢在Centos7以前叫做iptables,在Centos7以后叫做了firewalld。


一、iptables介绍

1.1 简介

      iptables的介绍就不做累述了,网上一搜一大把的资料,主要就记住,iptables就是主机防火墙,是一种IP数据包的过滤器。运作在底层TCP/IP协议堆栈上,也就是工作在IOS模型的二层的数据链路层、三层网络层和四层传输层。当然添加了layer7补丁之后,iptables就可以进行7层应用层过滤了。


1.2 网络知识


1.2.1 IP报文首部:


第一层:前四个字节是版本号(IPv4或IPv6),下面后四个字节是包头的首部长度,首部长度(HLEN)这个四位字段定义了数据报首部的总长度,首部长度是可变的(在20-60字节之间)在没有选项时,首部长度是20字节,且这个字段的值是55*4=20)。后面8位是服务类型用来获得更好的服务,在旧标准中叫做服务类型,但实际上一直未被使用过.1998 年这个字段改名为区分服务.只有在使用区分服务(DiffServ)时,这个字段才起作用.一般的情况下都不使用这个字段,后面的16是报文的总长度,总长度-首部长度,就是数据长度

第二层:段标识符(IP报文太长需要分片,就需要段标识来标示),标志占三位占3位,目前只有前两位有意义,中间位是DF标示,不能分片只有当 DF=0 时才允许分片(如果不允许分片发送不出去就返回错误信息了),最后一位是MF标示更多的分片,MF=1 表示后面“还有分片”。MF=0 表示最后一个分片。最后的是用来定义片偏移量,占12位,指较长的分组在分片后某片在原分组中的相对位置.片偏移以 8 个字节为偏移单位,越小越在前面。

第三层:生存时间,每经过一个网关设备TTL就-1,减到0还没有到设备就丢弃,TTL 字段是由发送端初始设置一个8 bit字段.推荐的初始值由分配数字 RFC 指定,当前值为 64.发送 ICMP 回显应答时经常把 TTL 设为最大值 255。后8个字节标示协议类型,指出此数据报携带的数据使用何种协议以便目的主机的IP层将数据部分上交给哪个处理过程, 1表示为 ICMP 协议, 2表示为 IGMP 协议, 6表示为 TCP 协议, 17表示为 UDP 协议。最后是首部校验和,存放首部的校验码。

第四层:源IP

第五层:目标IP

第六层:标记是什么协议什么进程进行的通信,端口号的范围是0-65535,linux主机一般0-1023端口是系统占用的,大于5000的端口才允许客户端随意使用呢,linux没打开一个端口就是打开了一个套接字文件。

第七层:数据。这是在数据报中要传输的数据。它是一个完整的较高层报文或报文的一个分片。


1.2.2 TCP报文首部:

第一层:发送方的端口号,接收方的端口号

第二层:32位序列号:也就是我们tcp三次握手中的seq,表示的是我们tcp数据段发送的第一个字节的序号,范围[0,2^32 - 1]

第三层:32位确认序列号:也就是ack,序列号+1就是确认号。

第四层:首部长度,后面是6个保留位置,URG标示紧急指针(URG为1表示有效,0表示无效)它告诉系统中有紧急数据,应当尽快传送,这时不会按照原来的排队序列来传送.而会将紧急数据插入到本报文段数据的最前面.ACK用于说明确认号是否有效,当ACK=1时,我们的确认序列号ack才有效,当ACK=0时,确认序号ack无效,TCP规定:所有建立连接的ACK必须全部置为1.PSH推送,一旦发生推送报文立即送往内核,RST表示重置,当RST=1时,表明TCP连接出现严重错误,此时必须释放连接,之后重新连接,又叫重置位。SYN发送同步请求。FYN断开连接。最后是窗口大小。

第五层:TCP的校验码,可选长度的可选数据

第六层:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,那么选项部分最长为:(2^4-1)*4-20=40字节。选项部分的应用:MSS最大报文段长度(Maxium Segment Size),窗口扩大选项(Windows Scaling),SACK选择确认项(Selective Acknowledgements),时间戳(Timestamps),NOP(NO-Operation)

第七层:数据。


1.2.3 TCP三次握手:

图片.png

第一次握手:

客户端发送一个TCP的SYN标志位置1的包,ACK=0,TCP规定SYN=1时不能携带数据,当SYN=1而ACK=0时,表明这是一个连接请求报文但要消耗一个序号,因此声明自己的序号是seq=i。Seq:序号,4字节,范围为0^32—1^32,共4284967296,达到时重新开始计算。Clinet进入SYN_SENT状态,等待Server确认。所以最终客户端发送的报文中包含SYN=1,ACK=0,seq=i(i为一个随机数)。

第二次握手:

服务器发回确认包(ACK)应答。即SYN=1 ACK=1,因为建立连接,则应在响应报文中使SYN=1和ACK=1。seq=j(产生的随机包序号),ack=i+1(确认客户端序号有效)。所以发送给客户端的包里面包含:SYN=1,ACK=1,seq=j,ack=i+1,此时服务器进入SYN_RECV状态。

第三次握手:

客户端收到返回的包进行确认,检查ack是否为i+1(也就是是不是自己第一次发起请求时候产生的随机序号+1),ACK是否为1,如果正确则将标志位ACK置为1,并将ack=j+1(即在服务器序号的基础上加1),seq=i+1(也就是最早的seq序号)发送给服务器端,服务器收到后确认seq=i+i,ACK=1,ack=j+1,服务端验证没有问题随建立连接,并开始打开端口为客户端发送数据。客户端服务端进入ESTABLISHED状态,完成三次握手。


1.2.4 TCP四次断开:

图片.png

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

不管是客户端还是服务器端都可以调用close之类的函数主动终止一个连接。这里以客户端主动断开连接举例。

第一次握手

  客户端调用close函数,主动发送一个FIN报文给服务器端,用来关闭客户端到服务器的数据传送,此时客户端进入TIME_WAIT1状态。

  FIN报文也可能附加用户数据。发送了FIN只是表示这端不能继续发送数据(应用层不能再调用send发送)但是还可以接收数据。

  当调用recv时,如果返回0就表示对端关闭。这个时候通常被关闭端也调用close,然后TCP层发送FIN,继续完成四次握手。如果被关闭端不调用close,那么对端就会处于FIN_WAIT_2状态,而本端则会处于CLOSE_WAIT状态。

  FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。

第二次握手:

   服务器收到这个FIN,它发回一个ACK,确认号为收到的序号加1,和SYN一样,一个FIN将占用一个序号,此时服务器进入CLOSE_WAIT状态,客户端进入TIME_WAIT2状态。

第三次握手:

   当服务器端也没有要传送的数据时,服务器关闭与客户端的连接,发送一个FIN给客户端A,服务器进入LAST_ACK状态。

第四次握手:

   客户端发回ACK报文确认,并将确认号设置为收到序号加1,服务器收到报文并确认成功,服务器端进入CLOSED状态,客户端进入TIME_WAIT(表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。),等待2MSL--120s-240s(1、确保连接可靠地关闭; 即防止最后一个ACK丢失。2、避免产生套接字混淆(同一个端口对应多个套接字),没有收到任何回复,则证明server端已正常关闭,客户端也就关闭了。


博文来自:www.51niux.com

1.2.5 TCP的连接状态:

从上面的三次握手和四次断开就能知道TCP有哪些状态。https://blog.51niux.com/?id=103里面也有写。


1.3 iptables的基础知识

1.3.1 iptables规则的三类匹配条件类型

通用匹配:直接使用,不依赖于其他条件或扩展,如网络协议、IP地址、网络接口等条件。

隐含匹配:要求以特定的协议匹配作为前提,如端口、tcp标志位(SYN=1,FIN=0,RST=0,ACK=0这是TCP握手的第一次;SYN=1,ACK=1,FIN=0,RST=0是tcp的第二次握手,ACK=1,SYN=0,RST=0,FIN=0(ESTABLISHED) TCP的第三次握手

)、icmp类型等条件。

显示匹配:要求以“-m扩展模块”的形式明确指出类型,如多端口、MAC地址、IP范围、数据包状态等条件。


1.3.2 iptables对数据包的操作


DROP:委婉的拒绝,简单地丢弃,不做其它任何处理。一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表。
REJECT:明示拒绝,会向发送这个包的源主机发送错误消息。这个错误消息可以指定,也可以自动产生。

ACCEPT:接受让数据报通过。
custom_chain:转向一个自定义的链
DNAT:目标地址转发。
SNAT:源地址转发。
MASQUERADE:源地址伪装
REDIRECT:重定向:主要用于实现端口重定向。
MARK:打防火墙标记的。
RETURN:返回。在自定义链执行完毕后使用返回,来返回原规则链。


1.3.3 iptables和netfilter的关系

       iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。。真正实现防火墙功能的是 netfilter,它是Linux内核中实现包过滤的内部结构。netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。

图片.png



1.3.4 四表五链

四个表:filter、nat、managle、raw,默认是filter表。表的处理优先级:raw>managle>nat>filter。

filter:一般用于过滤。

nat:网络地址转换(端口映射、地址映射等。)

mangle:用于对特定数据报的修改。

raw:优先级最高,设置raw时一般是为了不再让iptables做数据报的链接跟踪处理,提高性能。


五个链:PREROUTING 、INPUT、FORWARD、OUTPUT、POSTROUTING

PREROUTING:数据包进入路由表之前,对数据包做路由选择前应用此链路中的规则,所有的数据包进来的时候都先由这个链处理。

INPUT:通过路由表后目的为本机,进来的数据报应用此规则链上的策略。

FORWARD:通过路由表后,目标地址不为本机,做转发数据报时应用此规则链上的策略。

OUTPUT:由本机产生的外出的数据包向外转发时,应用此规则链中的策略。

POSTROUTING:数据报做路由选择后发送后到网卡接口之前应用此链中的规则,所有的数据包出来的时候都先由这个链处理。


表与链之间的包含关系:

filter表包含:INPUT,OUTPUT,FORWARD

nat表包含:PREROUTING,OUTPUT,POSTROUTING

mangle表包含:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

raw表包含:PREROUTING,OUTPUT

图片.png

1.3.5 iptables的格式


iptables  [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法

-t TABLE: 指定表,默认是filter表,其他表前面已经说过了。


1.3.5.1 COMMANDS:

-A:后面跟链规则规范,将一个或多个规则附加到所选链的末尾。

-C:检查链规则规范,检查所选链中示范存在与规范匹配的规则。此命令使用与-D相同的逻辑来找到匹配的条目,但不会改变现有的iptables匹配,并使用退出代码来指示成功或失败。

-D:删除链规则规范。从所选链中删除一个或多个规则。 这个命令有两个版本:规则可以被指定为链中的数字(从第一个规则的1开始)或匹配的规则。

-I: 后接rulenum,在选定的链中插入一个或多个规则作为给定的规则编号。 因此,如果规则编号为1,则规则或规则将插入到链的头部。 如果没有指定规则号,这也是默认值。

-R:后接relenum,替换所选链中的规则。 如果源和/或目标名称解析为多个地址,命令将失败。 规则从1开始编号。

-L:  列出所选链中的所有规则。 如果没有选择链,则列出所有链。 像其他的一样 iptables命令,它适用于指定的表(过滤器是默认值),因此NAT规则将被列出iptables -t nat -n -L。请注意,它通常与-n选项一起使用,以避免长时间反向DNS查找。 它是合法指定-Z(零)选项,在这种情况下,链将被原子地列出归零 确切的输出受到给出的其他参数的影响。 确切的规则被抑制直到你用 iptables -L -v。

-S:打印选定链中的所有规则。 如果没有选择链条,所有的链条都像iptables-save。像其他iptables命令一样,它适用于指定的表(过滤器是默认值)。

-F: 冲洗选定的链(表中的所有链,如果没有给出)。 这相当于删除所有的规则一个接一个。

-Z: 将所有链中的数据包和字节计数器置零,或仅将给定链路或仅链接到给定的规则。 指定-L,--list(list)选项也是合法的,可以在清除它们之前立即看到计数器。

-N:后接新链名称,按照给定的名称创建一个新的用户定义的链。 必须没有该名称的目标。

-X: 删除指定的可选用户定义的链。 链中不得有任何参考。 如果有的话,您必须删除或替换引用规则才能删除链。 链条必须为空,即不包含任何规则。 如果没有给出参数,它将尝试删除表中的每个非内置链。

-P: 将链的策略设置为给定的目标。只有内置(非用户定义的)链可以具有策略,内置的和用户定义的链都不能是策略目标。

-E: 将用户指定的链重命名为用户提供的名称。

-h : 帮助。


博文来自:www.51niux.com

1.3.5.2 匹配标准:

参数(以下参数组成一个规则规范(在添加,删除,插入,替换和追加命令中使用)):

[!] -p, --protocol protocol: 后面跟协议,指定的协议可以是tcp,udp,udplite,icmp,esp,ah,sctp或all之一,也可以是一个数字值,代表这些协议之一或不同的协议。还允许/etc/protocols中的协议名称。协议之前加!表示此协议除外。 数字零相当于所有。

[!] -s, --source address[/mask][,...]: 源规范。地址可以是网络名称,主机名,网络IP地址(带/掩码)或纯IP地址。在将规则提交给内核之前,主机名将被解析一次。 掩码可以是网络掩码或普通号码,指定网络掩码左侧的1号。 因此,24的掩码相当于255.255.255.0。 一个 ”!” 地址指定之前的参数反转了地址的意义。标志--src是此选项的别名。 可以指定多个地址,但这会扩展到多个规则(使用-A添加时),或者会导致删除多个规则(用-D)。

[!] -d, --destination address[/mask][,...] : 目的地规格。 有关语法的详细描述,请参阅-s(source)标志的说明。 标志--dst是此选项的别名。

-j, --jump target:这规定了规则的目标; 即如果数据包匹配该怎么办。目标可以是用户定义的链(除了该规则所在的链接之外),即立即决定分组命运的特殊内置目标之一或扩展名。 如果规则中省略此选项(而不使用-g),则匹配该规则将对分组的命运没有影响,但规则上的计数器将增加。

-g, --goto chain : 这指定处理应在用户指定的链中继续。 不同于--jump选项返回将不会继续处理这个链,而是在通过--jump调用我们的链。

[!] -i, --in-interface name:后面跟接口名称,  接收到数据包的接口的名称(仅限于进入INPUT,FORWARD和PREROUTING链的数据包)。当接口前面有!表示除次接口外,如果接口名称以“+”结尾,则以该名称开头的任何接口将匹配。 如果省略此选项,任何接口名称都将匹配。

[!] -o, --out-interface name:将要发送数据包的接口的名称(对于进入FORWARD,OUTPUT和POSTROUTING链的数据包)。当接口前面有!表示除次接口外。如果接口名称以“+”结尾,则以该名称开头的任何接口将匹配。 如果省略此选项,任何接口名称都将匹配。

[!] -f, --fragment:后面跟片段,这意味着该规则仅指分段数据包的第二个和其他片段。 由于没有办法告知源或目的端口这样的数据包(或ICMP类型),所以这样的数据包将不匹配任何规定它们的规则。 当 !参数在“-f”标志之前,该规则将仅匹配头部片段或未分片数据包。

-c:后面跟数据报字节,这使得管理员能够初始化规则的数据包和字节计数器(在INSERT,APPEND,REPLACE操作期间)。

-v : 详细输出。对于附加,插入,删除和替换,这将导致要打印的规则或细则的详细信息。

-n:数字输出。 IP地址和端口号将以数字格式打印。 默认情况下,程序将尝试将其显示为主机名称,网络名称或服务(适用时)。

-x: 展开数字 显示分组和字节计数器的确切值,而不是仅K(倍数为1000)M(1000K的倍数)或G(1000M的倍数)中的舍入数。 此选项仅与-L命令相关。

--line-numbers : 当列出规则时,将行号添加到每个规则的开头,对应于该规则在链中的位置。

--modprobe=command : 在链中添加或插入规则时,请使用命令加载任何必要的模块(目标,匹配扩展名等)。

匹配延伸: iptables可以使用扩展的数据包匹配模块。 这些以两种方式加载:默认情况下,指定-p或--pro-tocol时,或使用-m或--match选项,后跟匹配的模块名称; 之后,根据具体的模块,可以使用各种额外的命令行选项。 您可以在一行中指定多个扩展匹配模块,并且可以在模块被指定为接收该模块特定的帮助之后使用-h或--help选项。!是起到取反的效果。


1.3.5.3 基础包中的一些模块的使用(了解内容,可跳过):

addrtype:

该模块根据其地址类型匹配数据包。 地址类型在内核网络堆栈中使用,并将地址分为不同的组。 该组的确切定义取决于具体的三层协议。

以下地址类型是可能的:

 UNSPEC:未指定地址(即0.0.0.0)

 UNICAST: 单播地址。

LOCAL:本地地址。

BROADCAST:广播地址。

ANYCAST:一个任播数据包。

MULTICAST:多播地址。

 BLACKHOLE:一个黑洞地址。

UNREACHABLE:一个无法访问的地址。

 PROHIBIT:禁止地址。

[!] --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:

该模块匹配IPsec数据包的认证头中的SPI。

[!] --ahspi spi[:spi]


cluster:

允许您部署网关和后端负载分担集群,而无需负载平衡器 。此匹配要求所有节点都看到相同的数据包。 因此,集群匹配决定该节点是否具有
处理一个包,给出以下选项:

 --cluster-total-nodes num:设置集群中总结点的数量。

[!] --cluster-local-node num: 设置本地节点号码。

[!] --cluster-local-nodemask mask: 设置本地节点号码掩码。 您可以使用此选项而不是--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

iptables -A OUTPUT -o eth1 --h-length 6 -j mangle --mangle-mac-s 01:00:5e:00:01:01
iptables -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
iptables -A OUTPUT -o eth2 --h-length 6 -j mangle --mangle-mac-s 01:00:5e:00:01:02
iptables  -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

在TCP连接的情况下,必须禁用启动设备以避免标记TCP ACK数据包进入答复方向为有效。echo 0> / proc / sys / net / netfilter / nf_conntrack_tcp_loose


 comment:

允许您添加注释(最多256个字符)到任何规则。

--comment comment:如 iptables -A INPUT -s 192.168.0.0/16 -m comment --comment "A privatized IP block"


connbytes:

匹配连接(或构成连接的两个流中的一个)到目前为止传输了多少字节或数据包,或匹配每个数据包的平均字节数。这些计数器是64位,因此不会溢出;)主要用途是检测长时间的下载,并将其标记为在流量控制中使用较低优先级的频段。每个连接的传输字节也可以通过'conntrack -L'查看,并通过ctnetlink进行访问。 请注意,对于没有会计信息的连接,匹配将始终返回false.“net.netfilter.nf_conntrack_acct”sysctl标志控制是否新的连接将被字节/数据包计数。
当sysctl标志被翻转时,现有的连接流将不会获得/丢失会计结构。

[!] --connbytes from[:to]: 匹配来自其数据包/字节/平均数据包大小大于FROM的连接的数据包,并且小于TO字节/数据包。 如果TO忽略只有FROM检查完成."!"用于匹配不在范围内的数据包。

--connbytes-dir {original|reply|both}:哪些数据包要考虑。

 --connbytes-mode {packets|bytes|avgpkt}:是否检查数据包的数量,传输的字节数或到目前为止接收到的所有数据包的平均大小(以字节为单位)。 请注意,当“both”与“avgpkt”一起使用时,数据(主要)仅在一个方向(例如HTTP)进行,平均数据包大小将是实际数据包的大约一半。


connlimit:

允许您限制每个客户端IP地址(或客户端地址块)到服务器的并行连接数。

[!] --connlimit-above n:如果现有连接的数量(n)以上,则匹配。

 --connlimit-mask prefix_length:使用前缀长度的组主机。 对于IPv4,这必须是(包括)0和32之间的数字。对于IPv6,介于0和128之间。

例子:

iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT #每个客户端主机允许2个telnet连接

iptables -A INPUT -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT#也可以相互匹配

iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT#将每个C类大小的网络(24位网络掩码)将并行HTTP请求数限制为16个

(ipv6) ip6tables -p tcp --syn --dport 80 -s fe80::/64 -m connlimit --connlimit-above 16 --connlimit-mask 64 -j REJECT #将链路本地网络的并行HTTP请求数限制为16个


 connmark:

 该模块匹配与连接相关联的netfilter标记字段(可以使用CONNMARK设置)目标如下)。

[!] --mark value[/mask]: 匹配与给定标记值连接的数据包(如果指定掩码,则在比较之前与标记进行逻辑“与”)。


conntrack:

该模块与连接跟踪组合时,允许访问该数据包/连接的连接跟踪状态。

 [!] --ctstate statelist:statelist是一个逗号分隔的连接状态列表,以匹配。可能的状态如下。

         [!] --ctproto l4proto: 第4层协议匹配(按号码或名称)
         [!] --ctorigsrc address[/mask]

         [!] --ctorigdst address[/mask]

         [!] --ctreplsrc address[/mask]

         [!] --ctrepldst address[/mask]: 匹配原始/回复源/目的地址

         [!] --ctorigsrcport port

         [!] --ctorigdstport port
         [!] --ctreplsrcport port
         [!] --ctrepldstport port: 匹配原始/回复源/目的端口TCP/UDP/etc或GRE密钥。

   [!] --ctstatus statelist:statuslist是一个逗号分隔的连接状态列表,以便匹配。列出可能的状态下面。

         [!] --ctexpire time[:time]: 根据给定值或值范围(包括)匹配剩余寿命(秒)

   --ctdir {ORIGINAL|REPLY}: 匹配在指定方向流动的数据包。如果没有指定此标志,则匹配数据包在两个方向.

State: 状态扩展,结合ip_conntrack追踪会话的状态:

INVALID:非法连接请求 syn=1,fin=1

NEW:新连接请求。这意味着数据包已经开始了新的连接,或以其他方式与在两个方向上看不到数据包的连接相关联

ESTABLISHED:已建立的连接。 意味着分组与已经在两个方向上看到分组的连接相关联,

RELATED:相关联的,这意味着数据包正在开始新的连接,但与现有的连接相关联,例如FTP数据传输或ICMP错误。

SNAT:虚拟状态,如果原始源地址与回复目的地不同,则进行匹配。

DNAT:虚拟状态,如果原始目的地与回复源不同,则进行匹配。

--ctstatus的状态:

        EXPECTED: 这是一个预期的连接(即conntrack帮助器设置)

        SEEN_REPLY: Conntrack已经在两个方向看到数据包。

        ASSURED:Conntrack条目绝对不能提前过期。

        CONFIRMED: 连接确认:始发数据包已保留。


dccp:

      --source-port,--sport port[:port]

      [!] --dccp-types mask:  当DCCP数据包类型为“掩码”之一时匹配。 'mask'是逗号分隔的数据包类型列表。数据包类型为:请求响应数据ACK数据库CLOSEREQ关闭复位SYNC SYNCACK INVALID。

       [!] --dccp-option number:匹配DCP选项设置。


dscp:

该模块匹配IP头中TOS字段内的6位DSCP字段。 DSCP已经取代IETF内的TOS。

[!] --dscp value:匹配数字(十进制或十六进制)值[0-63]。

[!] --dscp-class class:匹配DiffServ类。 该值可以是BE,EF,AFxx或CSx类中的任何一个。 那将是转换成其相应的数值。


ecn:

这允许您匹配IPv4和TCP报头的ECN位。 ECN是RFC3168中规定的显式拥塞通知机制。

[!] --ecn-tcp-cwr:如果设置了TCP ECN CWR(拥塞窗口接收)位,则匹配。

[!] --ecn-tcp-ece: 如果设置了TCP ECN ECE(ECN Echo)位,则匹配。

[!] --ecn-ip-ect num:这符合特定的IPv4 ECT(ECN能力传输)。 您必须在“0”和“3”之间指定一个数字。


esp:

 该模块匹配IPsec数据包的ESP头中的SPI。[!] --espspi spi[:spi]


hashlimit:

  hashlimit使用哈希桶来表示使用单个iptables规则的一组连接的速率限制匹配(如限制匹配)。 可以对每个主机组(源和/或目标地址)和/或每个端口进行分组。 它使您能够表达“每组每个时间量产N个数据包":

--hashlimit-upto amount[/second|/minute|/hour|/day]:  如果速率低于或等于量/量,则匹配。它被指定为一个数字,带有可选项时间量子后缀;默认为3小时。

--hashlimit-above amount[/second|/minute|/hour|/day]:如果速率超过量/量,则匹配。

--hashlimit-burst amount:要匹配的最大数据包数量:每次限制规格时, 以上没有达到,达到这个数字;默认为5。

--hashlimit-mode {srcip|srcport|dstip|dstport},...:要考虑的对象的逗号分隔列表。 如果没有给出--hashlimit-mode选项,则hashlimit的行为就像限制一样,但是在做哈希管理的时候很费事。

--hashlimit-srcmask prefix: 当使用--hashlimit-mode srcip时,遇到的所有源地址都将根据给定的前缀长度和所创建的子网将受到hashlimit的约束。前缀必须在之间(包括)0和32.请注意,--hashlimit-srcmask 0基本上做同样的事情,不指定 - 在srcip为--hashlimit模式,但在技术上更费事。

--hashlimit-dstmask prefix:像--hashlimit-srcmask,但是用于目的地址。

--hashlimit-name foo: /proc/net/ipt_hashlimit/foo条目的名称。

--hashlimit-htable-size buckets: 散列表的数。

--hashlimit-htable-max entries:  散列中的最大条目。

--hashlimit-htable-expire msec: 散列表过期多少毫秒。

--hashlimit-htable-gcinterval msec: 垃圾收集间隔之间有多少毫秒。


helper:

该模块匹配与特定conntrack-helper相关的数据包。

[!] --helper string: 匹配与指定conntrack-helper相关的数据包。对于与默认端口上的ftp会话相关的数据包,字符串可以是“ftp”。 对于其他端口append-portnr的值,即"ftp-2121”。规则适用于其他conntrack-helpers。


icmp:

如果指定了“--protocol icmp”,则可以使用此扩展。 它提供以下选项:
[!] --icmp-type {type[/code]|typename}:这允许指定ICMP类型,其可以是数字ICMP类型,类型/代码对或其中之一该命令显示的ICMP类型名称iptables -p icmp -h


iprange:

这将匹配给定的任意IP地址范围。

[!] --src-range from[-to]:  匹配指定范围内的源IP。

[!] --dst-range from[-to]: 匹配指定范围内的目标IP。


length:

该模块将分组的第3层有效载荷(例如第4层数据包)的长度与特定值或值范围进行匹配。

[!] --length length[:length]


limit:

该模块使用令牌桶过滤器以有限的速率进行匹配。 使用此扩展名的规则将匹配,直到达到此限制(除非使用'!'标志)。 例如,它可以与LOG目标组合使用,以提供有限的日志记录。

--limit rate[/second|/minute|/hour|/day]:最大平均匹配率:指定为数字,可选的“/秒”,“/分钟”,“/小时”或“/天”后缀; 默认为3小时。

--limit-burst number:最大初始数据包数量匹配:每次无法达到上述限制时,该号码将被重新充值一次,直到该号码为止; 默认为5。


mac:

[!] --mac-source address:匹配源MAC地址。 它必须是XX:XX:XX:XX:XX:XX的形式。 请注意,这仅对来自以太网设备的数据包有效,并且进入PREROUTING,FOR-WARD或INPUT链。


mark:

模块匹配与一个数据包相关联的netfilter标记字段(可以使用下面的MARK地址进行设置)。

[!] --mark value[/mask]: 匹配具有给定无符号标记值的数据包(如果指定一个掩码,则在比较之前与掩码进行逻辑“与”)。


multiport:

该模块匹配一组源端口或目标端口。 最多可以指定15个端口。 端口范围(端口:端口)计为两个端口。 它只能与-p tcp或-p udp结合使用。

[!] --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]...:如果源端口或目标端口等于给定端口之一,则匹配。


owner:

该模块尝试匹配数据包创建者的各种特性,用于本地生成的数据包。 此匹配仅在OUTPUT和POSTROUTING链中有效。 转发的包没有与它们相关联的任何套接字。 来自内核线程的数据包确实有一个套接字,但通常没有所有者。

[!] --uid-owner username:

[!] --uid-owner userid[-userid]:匹配数据包套接字的文件结构(如果有的话)是由给定用户拥有的。 您还可以指定一个数字UID或一个UID范围。

[!] --gid-owner groupname
[!] --gid-owner groupid[-groupid]: 匹配数据包套接字的文件结构是否由给定组拥有。 您还可以指定数字GID或GID范围。

[!] --socket-exists:如果数据包与套接字相关联,则匹配。


physdev:

该模块匹配桥接设备承载的桥接端口输入和输出设备。 该模块是支持透明桥接IP防火墙的基础设施的一部分,仅对2.5.44版本以上的内核版本有用。

[!] --physdev-in name:接收到数据包的桥接端口的名称(仅限于进入INPUT,FORWARD和PREROUTING链的数据包)。如果接口名称以“+”结尾,则以该名称开头的任何接口将匹配。如果数据包没有通过网桥设备到达,则此数据包将不匹配此选项,用“!”取反。

[!] --physdev-out name:要发送数据包的桥端口的名称(对于进入FORWARD,OUTPUT和POSTROUTING链的数据包)。如果接口名称以“+”结尾,则以该名称开头的任何接口将匹配。请注意,在nat和mangle OUTPUT链中,桥输出端口不能匹配,但是可以在过滤器OUTPUT链中进行匹配。如果数据包不会离开桥接器件,或者如果尚未知道输出器件将是什么,则数据包将不匹配此选项,用“!”取反。

[!] --physdev-is-in:匹配数据包是否通过桥接口输入。

[!] --physdev-is-out: 匹配数据包是否通过桥接口离开。
[!] --physdev-is-bridged:匹配数据包是否被桥接,因此不被路由。这只适用于FORWARD和POSTROUTING链。


pkttype:
该模块匹配链路层分组类型。

[!] --pkt-type {unicast|broadcast|multicast}

policy:

此模块与IPsec用于处理数据包的策略相匹配。

--dir {in|out}:用于选择是否匹配用于解封装的策略或将用于封装的策略。在PREROUTING,INPUT和FORWARD链中有效,out在POSTROUTING,OUTPUT和FORWARD链中有效。

--pol {none|ipsec}:匹配数据包是否经过IPsec处理。

--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-dst addr[/mask]:匹配隧道模式SA的目标终点地址。仅适用于--mode通道。

--next:启动策略规范中的下一个元素。只能与--strict一起使用。


quota:

通过递减每个数据包的字节计数器来实现网络配额。

--quota bytes:配额以字节为单位。


rateest:

速率估算器可以匹配RATEEST目标收集的估计费率。 它支持匹配绝对bps / pps值,比较两个速率估计器,并对两个速率估计器之间的差异进行匹配。

--rateest1 name:  第一速率估计器的名称。

--rateest2 name: 第二速率估计器的名称(如果计算差额)。

--rateest-delta:  将差异与给定的比率进行比较。

--rateest1-bps value:

--rateest2-bps value:  比较每秒字节数。

--rateest1-pps value:

--rateest2-pps value:每秒比较数据包。

[!] --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


realm:

 这匹配了路由领域。 路由领域用于涉及动态路由协议(如BGP)的复杂路由设置。

[!] --realm value[/mask]:匹配给定的领域号码(并且可选地掩蔽)。 如果不是数字,值可以是来自/etc/iproute2/rt_realms的命名域(在这种情况下不能使用掩码)。


recent:

允许您动态创建IP地址列表,然后以几种不同的方式与该列表进行匹配。

--name name: 指定用于命令的列表。 如果没有给出名称,那么将使用DEFAULT。

[!] --set : 这将将数据包的源地址添加到列表中。 如果源地址已经在列表中,这将更新现有条目。 这将始终返回成功(如果传入,则失败)。

--rsource :  匹配/保存最近列表表中每个数据包的源地址。这是默认值。

--rdest :   匹配/保存最近列表表中每个数据包的目标地址。

[!] --rcheck :  检查数据包的源地址当前是否在列表中。

[!] --update : 像--rcheck,除了它会更新“最后看到”的时间戳,如果它匹配。

[!] --remove:检查数据包的源地址当前是否在列表中,如果是,该地址将从列表中删除,并且规则将返回true。如果找不到地址,返回false。

--seconds seconds:此选项必须与-rcheck或--update之一结合使用。使用时,这将缩小匹配,只有当地址在列表中并被看到时才会发生最后给出的秒数。

--hitcount hits :  此选项必须与-rcheck或--update之一结合使用。当使用时,这将缩小匹配,只有当地址在列表中并且数据包已经被接收到大于或等于给定值时才会发生。该选项可与 - 秒一起使用,以创建更窄的匹配,在特定时间段内需要一定数量的命中。 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。


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
块类型可用标志: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

set:

该模块匹配可由ipset(8)定义的IP集。

[!] --match-set setname flag[,flag]...:其中标志是src和/或dst规范的逗号分隔列表,其中不能超过六个。 因此命令:iptables -A FORWARD -m set --match-set test src,dst

将匹配数据包(如果设置类型为ipportmap),则可以在指定的集合中找到源地址和目标端口对。 如果指定集合的集合类型为单维(例如ipmap),则该命令将匹配在指定集合中可以找到源地址的数据包。如果没有与其他扩展名的选项冲突,则可以使用--set替换--match-set。使用-m set需要提供ipset内核支持。 由于标准内核目前尚未发布,因此需要安装ipset或Xtables-addons软件包。


socket:

如果通过在数据包上进行套接字查找可以找到打开的套接字,则会匹配。

--transparent: 忽略不透明的套接字。


state:

该模块与连接跟踪组合时,允许访问该数据包的连接跟踪状态.

[!] --state state :   其中state是一个逗号分隔的连接状态列表,以便匹配。 可能的状态是INVALID,意味着由于某些原因导致数据包不能被识别,包括内存不足和与任何已知连接不对应的ICMP错误,ESTABLISHED意味着数据包与已经在两者中看到数据包的连接相关联 方向,NEW表示数据包已经开始了新的连接,或以其他方式与两个方向上没有看到数据包的连接相关联,“相关”意味着数据包正在开始一个新的连接,而是与现有的连接相关联,例如 FTP数据传输或ICMP错误。


statistic:

该模块根据某些统计条件匹配数据包。 它支持使用--mode选项设置的两种不同模式。

支持的选项:

--mode mode : 设置匹配规则的匹配模式,支持的模式是随机的,第n个。

--probability p : 将数据包的概率从0设置为1,以便随机匹配。 它只适用于随机模式。

--every n : 每n个数据包匹配一个数据包。 它只适用于第n个模式(另请参阅--packet选项)。
--packet p :  设置第n个模式的初始计数器值(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 : 设置它开始查找任何匹配的偏移量。 如果没有通过,默认是包大小。

[!] --string pattern:匹配给定的模式。

[!] --hex-string pattern:  以十六进制符号匹配给定的模式。


tcp:

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

[!] --source-port,--sport port[:port]:源端口或端口范围规范。这可以是服务名称或端口号。也可以使用以下格式指定包含范围:最后一个。如果省略第一个端口,则假定为“0”如果省略最后一个,则假定为“65535”。如果第一个端口大于第二个端口,则它们将被交换。

[!] --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: 只匹配TCP数据包,SYN位置1,ACK,RST和FIN位清零。这样的数据包用于请求TCP连接启动;例如,阻塞进入接口的数据包将阻止传入的TCP连接,但传出的TCP连接将不受影响。它相当于--tcp-flags SYN,RST,ACK,FIN SYN。如果“!” 标志先于“--syn”,该选项的意义被反转。

[!] --tcp-option number : 匹配如果TCP选项设置。


tcpmss:

这与TCP头的TCP MSS(最大段大小)字段匹配。 您只能在TCP SYN或SYN / ACK数据包上使用此功能,因为只有在连接启动时TCP协商时才协商MSS。

[!] --mss value[:value] : 匹配给定的TCP MSS值或范围。


time:

如果分组到达时间/日期在给定范围内,则匹配。 所有选项都是可选的,但在指定时为AND。

--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天的月份;二月二十八日或二十九日也是如此。

[!] --weekdays day[,day...] : 只在给定的工作日匹配。可能的值分别是星期一,星期二,星期三,星期四,星期五,星期六,星期日或从1到7的值。您也可以使用两个字符的变体(Mo,  Tu, etc.)。

--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  #本月第四个星期五和当月的某几天

tos:

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

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

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


ttl:

该模块匹配IP头中的实时字段的时间。

--ttl-eq ttl : 匹配给定的TTL值。

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

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


u32:(详细使用参考man帮助文档)

U32测试从数据包提取的最多4个字节的数量是否具有指定值。 要提取的内容的规范一般足以在tcp头文件或有效载荷的给定偏移量下查找数据。



udp:

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

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

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


unclean:

该模块没有任何选项,但尝试匹配看起来格式不正确或不寻常的数据包。 这被认为是实验性的。


1.3.5.4 目标扩展:

 iptables可以使用扩展目标模块:以下内容包含在标准版本中。

AUDIT:

该目标允许创建针对目标的数据包的审计记录。 它可用于记录接收,丢弃和拒绝的数据包。
--type {accept|drop|reject}: 设置审核记录的类型。

例子:

iptables -N AUDIT_DROP
iptables -A AUDIT_DROP -j AUDIT --type drop
iptables -A AUDIT_DROP -j DROP


CHECKSUM:

 该目标允许选择性地解决破旧/旧的应用程序。 它只能在mangle表中使用。

--checksum-fill:计算并填写缺少校验和的数据包中的校验和。 如果需要解决诸如dhcp客户端之类的旧应用程序(这些应用程序对校验和卸载不能正常工作)但不想在设备中禁用校验和卸载,这一点尤其有用。


CLASSIFY:

该模块允许您设置skb->优先级值(从而将数据包分类为特定的CBQ类)。

--set-class major:minor: 设定主要和次要的价值。 即使没有给出0x前缀,这些值总是被解释为十六进制。


CLUSTERIP:

该模块允许您配置一个简单的节点群集,共享一个IP和MAC地址,而不需要在其前面显式的负载平衡器。 连接在此群集中的节点之间静态分配。

--new:创建一个新的ClusterIP。 您必须将此设置为给定ClusterIP的第一条规则。

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

--clustermac mac :  指定ClusterIP MAC地址。 必须是一个链路层组播地址.

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

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

--hash-init rnd : 指定用于哈希初始化的随机种子。


CONNMARK:

该模块设置与连接相关联的netfilter标记值。标记是32位宽。

--set-xmark value[/mask]: 将由mask和XOR值给出的位归零到ctmark中。

--save-mark [--nfmask nfmask] [--ctmask ctmask] : 使用给定的掩码将数据包标记(nfmark)复制到连接标记(ctmark)。新的nfmark值的确定如下:  ctmark =(ctmark&〜ctmask)^(nfmark&nfmask) 即ctmask定义要清除的位,nfmask将nfmark的哪些位XOR插入到ctmark中。 ctmask和nfmask默认为0xFFFFFFFF。

--restore-mark [--nfmask nfmask] [--ctmask ctmask]:   使用给定的掩码将连接标记(ctmark)复制到数据包标记(nfmark)。新ctmark值的确定如下:nfmark =(nfmark&〜nfmask)^(ctmark&ctmask); 即nfmask定义要清除哪些位,并将ctmark的哪些位转换为XOR到nfmark。 ctmask和nfmask默认为0xFFFFFFFF。

--restore-mark: 恢复标记仅在mangle表中有效。

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

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

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

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

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

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

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


CONNSECMARK:

此模块将安全标记从数据包复制到连接(如果未标记),以及从连接返回数据包(也仅在未标记的情况下)。 通常与SEC-MARK一起使用,它仅在mangle表中有效。

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

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


DNAT:

该目标仅在nat表,PREROUTING和OUTPUT链以及仅从这些链中调用的用户定义的链中有效。它指定应该修改数据包的目标地址(并且此连接中的所有未来数据包也将被破坏),并且规则应该停止检查。它需要一种类型的选项:

--to-destination [ipaddr][-ipaddr][:port[-port]]:其可以指定单个新的目的地IP地址,IP地址的包含范围,以及可选的端口范围(仅当规则还指定-p tcp或-p udp时才有效)。如果没有指定端口范围,则不会修改目的端口。如果没有指定IP地址,则仅修改目标端口。 在内核高达2.6.10,您可以添加几个到目的地的选项。对于这些内核,如果您通过地址范围或多个到目的地选项指定多个目标地址,则会在这些地址之间进行简单的循环(一个接一个循环)。后来的内核(> = 2.6.11-rc1)不再具有对多个范围的NAT的能力。

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

--persistent:为每个连接提供相同的源/目的地址。这取代了同一个目标。持续映射的支持可从2.6.29-rc2获得。


DSCP:

该目标允许改变IPv4分组的TOS报头内的DSCP比特的值。 由于这操纵一个数据包,它只能在mangle表中使用。

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

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


ECN:

 该目标允许有选择地解决已知的ECN黑洞。 它只能在mangle表中使用。

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


LOG:

打开匹配数据包的内核日志记录。当此选项设置为一个规则时,Linux内核将通过内核日志(可以使用dmesg或syslogd(8)读取)打印所有匹配数据包的一些信息(如大多数IP头域)。这是一个“非终止目标”,即规则遍历在下一个规则继续。因此,如果要对拒绝的数据包进行LOG,请使用两个具有相同匹配条件的单独规则,首先使用目标LOG然后DROP(或REJECT)

--log-level level: 记录级别(数值或见syslog.conf(5))。

--log-prefix prefix: 使用指定的前缀替代日志消息;长达29个字母,对于区分日志中的消息很有用。

--log-tcp-sequence: 记录TCP序列号。如果用户可读取日志,则这是安全隐患。

--log-tcp-options:从TCP包头记录选项。

--log-ip-options:来自IP包头的日志选项。

--log-uid:记录生成数据包的进程的userid。


MARK:

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

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

以下助记符可用:

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

--or-mark bits:  二进制OR或nfmark与位。 (用于--set-xmark位/位的助记符)

--xor-mark bits:二进制XOR nfmark与位。 (为--set-xmark位/ 0的助记符)


MASQUERADE:

该目标仅在nat表中的POSTROUTING链中有效。 只能与动态分配的IP(拨号)连接一起使用:如果您有静态IP地址,则应使用SNAT目标。 伪装等效于指定映射到数据包正在出现的接口的IP地址,但也具有当接口关闭时遗忘连接的效果。 当下一次拨号不太可能具有相同的接口地址(因此任何已建立的连接也将丢失)时,这是正确的行为。 它需要一个选项:

--to-ports port[-port]:这将指定要使用的源端口范围,覆盖默认SNAT源端口选择启发式(见上文)。 这只有在规则也指定-p tcp或-p udp时才有效。

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


MIRROR:

这是一个实验演示目标,它将IP报头中的源和目标字段反转,并重新发送数据包。 它仅在INPUT,FORWARD和PRE-ROUTING链以及仅由这些链中调用的用户定义的链中才有效。 请注意,任何数据包过滤链,连接跟踪或NAT都不会看到传出数据包,以避免环路和其他问题。


NETMAP:

该目标允许您将整个地址网络静态映射到另一个地址网络上。 它只能从nat表中的规则使用。
--to address[/mask]:网络地址映射到。 结果地址将按以下方式构建:掩码中的所有“1”位从新的“地址”填入。 掩码中的所有位都从原始地址填入。


NFLOG:

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

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

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

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

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


NFQUEUE:

此目标是QUEUE目标的延伸。与QUEUE相反,它允许您将数据包放入任何由其16位队列号标识的特定队列中。它只能与内核版本2.6.14或更高版本一起使用,因为它需要nfnetlink_queue内核支持。队列平衡选项已添加到2.6.31中的队列旁路Linux 2.6.31中。

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

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

--queue-bypass:  默认情况下,如果没有用户空间程序正在监听NFQUEUE,那么将要排队的所有数据包都被删除。使用此选项时,NFQUEUE规则将被忽略代替。数据包将移动到下一个规则。


NOTRACK:

此目标将禁用所有匹配该规则的数据包的连接跟踪。它只能在原始表中使用。


RATEEST:

RATEEST目标收集统计数据,执行费率估算计算,并使用最匹配的比例保存结果供以后评估。

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

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

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


REDIRECT:

该目标仅在nat表,PREROUTING和OUTPUT链以及仅从这些链中调用的用户定义的链中有效。 通过将目的IP更改为入接口的主地址(本地生成的数据包映射到127.0.0.1地址),将数据包重定向到机器本身。

--to-ports port[-port] : 这指定了要使用的目的端口或端口范围:没有这个,目的端口不会被更改。 这只有在规则也指定-p tcp或-p udp时才有效。

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


REJECT:

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

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

(*) : 使用icmp-admin禁止不支持内核的内核将导致纯粹的DROP而不是REJECT.


SAME:

类似于SNAT / DNAT取决于链:它需要一系列地址(' - 到1.2.3.4-1.2.3.7'),并为每个连接给客户端相同的源/目的地址.NB:DNAT目标 - 持久选项取代了同一目标。

--to ipaddr[-ipaddr] : 地址来映射源。 多个范围可以指定一次以上。

--nodst :  选择新的source-ip时,不要在计算中使用destination-ip

--random :  端口映射将被强制随机化,以避免基于端口预测的攻击(kernel> = 2.6.21)。


SECMARK:

这用于设置与数据包关联的安全标记值,以供安全子系统(如SELinux)使用。 它只在mangle表中有效。 标记是32位宽。

--selctx security_context


SET:

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

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

--del-set setname flag[,flag...] : 从集合中删除数据包的地址/端口,   哪些标志是src和/或dst规范,其中不能超过6个。使用-j SET需要提供ipset内核支持。 由于标准内核目前尚未发布,因此需要安装ipset或Xtables-addons软件包。


SNAT:

该目标仅在nat表中的POSTROUTING链中有效。它指定应该修改数据包的源地址(并且此连接中的所有未来数据包也将被破坏),并且规则应该停止检查。它需要一种类型的选项:

--to-source ipaddr[-ipaddr][:port[-port]]:它可以指定单个新的源IP地址,IP地址的包含范围,以及可选的端口范围(仅当规则还指定-p tcp或-p udp时才有效)。如果没有指定端口范围,则低于512的源端口将映射到512以下的其他端口:512和1023之间的端口将映射到低于1024的端口,其他端口将被映射到1024或更高。在可能的情况下,没有端口更改将在内核高达2.6.10,您可以添加几个到源选项。对于这些内核,如果您通过地址范围或多个指定多个源地址

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

--persistent:为每个连接提供相同的源/目的地址。这取代了同一个目标。持续映射的支持可从2.6.29-rc2获得。


TCPMSS:

此目标允许更改TCP SYN数据包的MSS值,以控制该连接的最大大小(通常将其限制为您的出站接口的MTU减去40或IPv4或60分别为IPv6)。当然,它只能与-p tcp结合使用。它只在mangle表中有效。该目标用于克服阻止“ICMP Fragmentation需要”或“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为IPv4; -60为IPv6)。这可能无法正常运行,其中存在不同路径MTU的非对称路由 - 内核使用路由MTU,它将用于将数据包从自身发送到源IP地址和目标IP地址。在Linux 2.6.25之前,此选项仅考虑到目标IP地址的路径MTU;后续内核也考虑到源IP地址的路径MTU。这些选项是相互排斥的。


TCPOPTSTRIP:

此目标将剥离TCP数据包的TCP选项。 (它实际上将被NO-OP替换)。因此,您需要添加-p tcp参数。

--strip-options option[,option...]:剥离给定的选项。 选项可以由TCP选项号或符号名指定。 通过使用-j TCPOPT-STRIP -h调用iptables可以获得已识别选项的列表。


TOS:

 该模块将IPv4报头中的“服务类型”字段(包括“优先级”位)或IPv6报头中的“优先级”字段进行设置。请注意,TOS与DSCP和ECN的位数相同。 TOS目标仅在mangle表中有效。

--set-tos value[/mask]:将由掩码和XORs值给出的位归零到TOS /优先级字段中。如果忽略mask,则假定为0xFF。

--set-tos symbol:您可以在使用IPv4的TOS目标时指定符号名称。这意味着一个0xFF的掩码。可以通过使用-j TOS -h调用iptables来获取所识别的TOS名称。

以下助记符可用:

--and-tos bits: 二进制和TOS值与位。 (对于--set-tos 0 / invbits的助记符,其中invbits是位的二进制否定)。

--or-tos bits : 二进制OR或TOS值与位。 (用于 - 设定位/位的指令)

--xor-tos bits : 二进制XOR与位的TOS值。 (对于--set-tos位/ 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:

该目标标记包装,以便内核将记录与数据包匹配的每个规则,因为它们遍历表,链,规则。 (记录需要使用ipt_LOG或ip6t_LOG模块)数据包以字符串前缀:“TRACE:tablename:chainname:type:rulenum”记录,其中type可以是“rule”,用于明文规则,“return”用于隐式规则 在用户定义的链结尾,内置链条策略的“策略”。 它只能在原始表中使用。


TTL:

这用于修改IPv4 TTL报头字段。 TTL字段确定数据包可以穿过多少跳(路由器),直到超时为止。设置或递增TTL字段可能是非常危险的,所以应该避免任何代价。不要设置或增加 离开本地网络的数据包的价值! mangle表。

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

--ttl-dec value:减去TTL值“值”次数。

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


ULOG:

该目标提供用户空间记录匹配的数据包。当这个目标设置为一个规则时,Linux内核将通过一个netlink socket来组播这个数据包。一个或多个用户空间进程可以订阅各种多播组并接收分组。像LOG一样,这是一个“非终止目标”,即规则遍历在下一个规则继续。

--ulog-nlgroup nlgroup : 这指定了发送数据包的netlink组(1-32)。默认值为1。

--ulog-prefix prefix :  使用指定的前缀替代日志消息;长度最多为32个字符,对日志中的消息进行区分很有用。
--ulog-cprange size : 要复制到用户空间的字节数。值0将始终复制整个数据包,而不管其大小。默认为0。

--ulog-qthreshold size : 内核中排队的数据包数。将此值设置为例如。 10在内核中累积10个数据包,并将它们作为一个netlink multipart消息发送给用户空间。默认值为1(用于向后兼容)。


1.3.5.5 信息状态码

各种错误信息被打印到标准错误。 退出代码为0,正常运行。 似乎由无效或滥用的命令行参数引起的错误导致退出代码为2,其他错误导致退出代码为1。


博文来自:www.51niux.com

二、iptables的基础操作

上面说了那么多,也不用记住,了解就好了,下面记录一下iptables的一些基础操作也是常用的操作。

2.1 查看防火墙操作

# iptables -L -n  #这里没有加-t指定表,所以默认就是查看filter表。这里-L后面没有跟链名称,所以默认就是查看filter表上的所有链设置。加-n的作用前面已经说了,一般是配合使用的。

# iptables -L INPUT  -n  #这里就是只查看filter表的INPUT链的规则。一般如果是指常规的防火墙设置,不会再别的表上面定义链的。

# iptables -L -n -t nat #这里就是用-t指定表名,查看nat表上面的所有链设置。

# iptables  -L -n -v  #用-v显示更详细的信息,会显示数据包啊,数据量啊等。

# iptables  -V #查看iptables的版本

# iptables -L -n  --line-numbe  #显示规则的序列号,方便我们删除和插入

# iptables -S #打印默认filter表中的所有链规则,# iptables -S  -t nat 就是打印nat表的所有链规则了。

# iptables -S INPUT #打印INPUT链的规则,这个-S的目的主要是如果你不是想将添加的所有规则都保存起来的话,可以用这种方式打印出规则,然后自己手工将规则粘贴到配置文件里面去。

# service iptables status  #查看防火墙的状态,如果是存活状态就会把所有的表和所有的链都显示出来

# cat /etc/sysconfig/iptables  #这是iptables的配置文件,设置的规则如果想要重启依旧有效的话,就要执行# iptables-save>/etc/sysconfig/iptables,或者#service iptables save 就会保存到此文件中。


2.2 清空防火墙设置

# iptables -F  #这步我们一般在初始设置iptables的时候设置,如果是云主机什么的在线机器要慎重操作,因为如果限制了IP的SSH连接,一清空所有设置的规则,会导致连接断开。清空指定表的规则。

# iptables -X  #删除指定表中的自定义规则链,默认是filter表,如果要清空别的表的自定义规则链用-t指定表名。一般也不会涉及到这步操作。

# iptables -Z  #这个是将所有表的所有链的字节和数据包计数器清零。一般也是紧跟着iptables -F做的一步操作。


2.3 添加防火墙规则

禁ping设置:

# iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP  #-p 指定icmp协议,--icmp-type 8是Echo request——回显请求(Ping请求),也可以理解为0为响应报文,8为请求报文,-s 0/0是指定原地址为0.0.0.0/0,-j DROP 是不给予应答

# iptables -A INPUT -p icmp --icmp-type echo-request -s 0/0 -j DROP  #这样也可以,跟上面一样,只不过是把8变为了echo-request

#echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all  #当然这种临时生效的方法也可以,#echo net.ipv4.icmp_echo_ignore_all=1 >>/etc/sysctl.conf  这是永久生效的方法

允许某个IP能够ping我们的主机:

#  iptables -I INPUT -p icmp --icmp-type 8 -s 192.168.1.102 -j ACCEPT  #这里主要注意这个-I,这是在规则的上面添加也就是添加到禁止所有IPping我们主机规则的上方,不能用-A。因为防火墙匹配规则是自上而下的过程,如果用-A添加到尾部的话,当匹配到禁止所有的主机ping本主机的规则后,其他的允许ping的规则也就不生效了。-j ACCEPT就是允许通过的意思。


删除一条规则:

# iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT  #比如我添加了这样一条规则,我现在想删除这条规则。

# iptables -D INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT  #这是一种方法,-D后面跟链名称,然后是我们的匹配条件以及处理结果

# iptables -L -n  --line-number  #先来查看,发现上面添加的规则在INPUT链的序列号为4的位置。当然也可以用# iptables -L -n  --line。

# iptables -D INPUT 4  #显然这种-D后面指定规则链名称,然后指定规则所在的序列号,删除的方式更好一点。


指定序列号添加:

# iptables -I INPUT 2 -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT  #这样就可以将我们的这条规则插入到INPUT链的序列号为2的位置。


指定序列号修改(这里最好是全命令的替换,用到的模块少还好,如果用到了很多其他模块,如果这里只是填写了需要替换的内容,而不需要替换的内容没有填写的话,哪些不应该被替换的规则也会变为空。所以替换不仅要将替换后的内容写上,哪些不需要替换的也要写上,要全规则命令行。):

# iptables -R INPUT 2 -j DROP  #这里就是指定将序列号为2的规则,所在的位置为INPUT链,-R就是替换,-j DROP就是要改变成的内容

# iptables -R INPUT 2 -s 192.168.1.0/32 -j ACCEPT  #通过和上面两个例子可以看出,就是让我们重新指定的规则或者处理方法去替换旧的规则或者内容


2.4 稍微正规点的iptables设置

上面我们已经说过了iptables的增删改查,也了解了iptables的格式,我们主要的还是用到的一般是禁止所有的INPUT,但是在此规则之上会放开我们指定的INPUT规则进来,严格点的话OUTPUT规则也会做限制

#cat /etc/sysconfig/iptables  #我这里就是对icmp的请求做了限制,对INPUT和OUTPUT的请求也做了严格的限制

#ptables-save v1.4.7 on Wed Jan 13 00:12:06 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp -s 192.168.1.0/24 --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp -s 192.168.1.2/32,192.168.1.3/32 --dport 873 -j ACCEPT
-A INPUT -p tcp -m tcp -s 192.168.1.4/32 --dport 5666 -j ACCEPT
-A INPUT -p udp -m udp -s 192.168.1.5/32 --dport 161 -j ACCEPT
-A INPUT -p tcp -m tcp -s 192.168.1.6 --dport 111 -j ACCEPT
-A INPUT -p udp -m udp -s 192.168.1.6 --dport 111 -j ACCEPT
-A INPUT -p tcp -m tcp -s 192.168.1.7 --dport 30001:30004 -j ACCEPT
-A INPUT -p udp -m udp -s 192.168.1.7 --dport 30001:30004 -j ACCEPT
-A INPUT -p udp -m udp --dport 123 -j ACCEPT
-A INPUT -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -p tcp -m tcp -m state --sport 53 --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp  --dport 143  -j ACCEPT
-A INPUT -p icmp -s 192.168.1.0/24 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j DROP
-A INPUT -p tcp -m tcp --dport 873 -j DROP
-A INPUT -p tcp -m tcp --dport 80 -j DROP
-A INPUT -p tcp -m tcp --dport 3306 -j DROP
-A INPUT -p tcp -m tcp --dport 5666 -j DROP
-A INPUT -p tcp -m tcp --dport 143 -j DROP
-A INPUT -p udp -m udp --dport 161 -j DROP
-A OUTPUT -p tcp -m tcp -d 192.168.1.0/24 --sport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 110 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 25 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 110 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 143 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A OUTPUT -p udp -m udp --sport 161 -j ACCEPT
-A OUTPUT -p tcp -m tcp -d 192.168.1.4/32 --sport 5666 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 873 -j ACCEPT
-A OUTPUT -p udp -m udp --sport 123 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -d 192.168.1.0/24 -p tcp -m tcp --sport 22 -j ACCEPT
-A OUTPUT -p tcp -m tcp -d 192.168.1.6 --sport 111 -j ACCEPT
-A OUTPUT -p udp -m udp -d 192.168.1.6 --sport 111 -j ACCEPT
-A OUTPUT -p tcp -m tcp -d 192.168.1.7 --sport 30001:30004 -j ACCEPT
-A OUTPUT -p udp -m udp -d 192.168.1.7 --sport 30001:30004 -j ACCEPT
-A OUTPUT -p icmp  -j ACCEPT
-A OUTPUT -p tcp -m tcp -j DROP
-A OUTPUT -p udp -m udp -j DROP
COMMIT

#从上图的规则可以看出,我们基本用到的就是-p 后面跟tcp或者udp协议,然后就是--sport源端口或者--dport目的端口,还有就是-s源IP,-d目的IP,然后IP是可以指定IP段,多IP或者多段的话用逗号隔开,多端口也是用逗号隔开,连续端口范围的话用:来指定。然后就是-m 后面就是跟我们各种模块了,但是如果不是用到多端口指定模块啊等等的一些其他的复杂点的设置也不用加-m。


2.5 对上方的配置为文件进行下操作顺便熟悉一下

2.5.1 ssh的设置

通常我们对ssh的限制还是比较严格的,一般机器只会对跳板机或者个别的机器进行ssh开放,一般不会对几个段之类的开放,如果对IP段做设置的话在交换机上面进行ACL的设置会好一点。

iptables -A INPUT -s 192.168.1.102  -p tcp --dport 22 -j ACCEPT    #我们先设置让我们的电脑能够连接此服务器
iptables -A INPUT  -j DROP                                         #然后我们将所有的INPUT请求都给禁止掉
iptables -A OUTPUT -d 192.168.1.102  -p tcp --sport 22 -j ACCEPT    
iptables -A OUTPUT  -j DROP                                       #如果还要精细的话应该某个端口的DROP信息直接在某个端口的ACCEPT下方,
这样能快速的匹配到拒绝不能规则自上而下过滤一遍,但是一般设iptables的服务器并发并请求并不会那么大,如可能是比较重要的管理机等,
所以这样设置一般就可以了。不用搞得太复杂。

# cat /etc/sysconfig/iptables  #查看一下配置文件,多了下面两条内容

-A INPUT -s 192.168.1.102/32 -p tcp -m tcp --dport 22 -j ACCEPT   #可见配置文件里面存储的东西还是有些不一样的,如192.168.1.102/32这就表示一个IP地址就是当前的IP地址,在后面自动转换成了子网掩码。-m tcp --dport 22,--dport本身是tcp模块里面的扩展,所以这里自动补全了。

-A INPUT -j DROP

-A OUTPUT -d 192.168.1.102/32 -p tcp -m tcp --sport 22 -j ACCEPT   #如果我们iptables设置的够严格的话,在出的方向也要做限制,INPUT设置一条,OUTPUT就要跟着设置一条。当然也不是每台服务器都要这么干,可以选择你觉得要做比较严格设置的服务器进行设置。
-A OUTPUT -j DROP

现在测试的话,会发现只有192.168.1.102这个IP能能ssh到我们这台服务器了。

当然如果在更好点的话,应该是将state状态都加入进来。下面是修改的步骤:

iptables -R INPUT 1 -p tcp -s 192.168.1.102 -m tcp --dport 22  -m state --state NEW,ESTABLISHED -j ACCEPT 
iptables -R OUTPUT 1 -p tcp -d 192.168.1.102 -m tcp --sport 22  -m state --state ESTABLISHED -j ACCEPT


2.5.2  对80和443端口做限制

有些web服务器我们可能只需要公司内网访问或者指定的一些服务器访问,本身web软件配置文件里面可以设置的,如果要保证文件统一性的话,还是在iptables上面做设置好一点。这个序列号是有讲究的,因为iptables是自上而下搜索,所以最常用的序列号要越小。

iptables -L -n --line-number    #首先我们要查看我们设置的所有INPUT或者所有OUTPUT链在哪个位置,我们要将内容插在他们前面。
iptables -I INPUT 2 -p tcp -m iprange --src-range 192.168.1.102-192.168.1.109 -m multiport  --destination-ports 80,443  -j ACCEPT  
iptables -I OUTPUT 2 -p tcp -m iprange --dst-range 192.168.1.102-192.168.1.109 -m multiport  --source-ports 80,443  -j ACCEPT        
#上面就是加了一条INPUT和一条OUTPUT。
#首先用到了iprange模块,它就两个功能,--src-range指定源地址的IP范围,--dst-range指定目标地址的IP范围,这样我们如果指定多IP的时候,就不用写多条了。
#multiport然后这个模块是用来指定多端口,或者端口的范围的,如果是逗号分开的多端口,最多是支持15个的,
--destination-ports 80,443,1024:65535如果这样就是目标端口除了80.443以外还有1024端口到65535
#这里没有用-m dports和sports是因为他们如果指定多端口的话,只能指定一个端口范围,而不能指定多个分散的端口。

下面是效果图:

图片.png

如果你不想指定IP的范围,只是像指定单纯的某几个IP呢,显然用iprange就不太合适了,用下面的方式:

iptables -I INPUT 2 -p tcp -s 192.168.1.102,192.168.1.109  -m multiport  --dports 80,443  -j ACCEPT
iptables -I OUTPUT 2 -p tcp -d 192.168.1.102,192.168.1.109  -m multiport  --sports 80,443  -j ACCEPT

#但是用-s这种加逗号指定IP的形式,写入到配置文件中会把IP分开,每一条IP是一条内容。如下图:

图片.png

如果你像上我上面的配置文件中192.168.1.2/32,192.168.1.3/32文件中是一条信息,应该怎么操作呢?

命令行是真不知道,直接修改iptables的配置文件就可以达到我配置文件一面一条信息的效果,但是用iptables -L -N和iptables -S查看的时候还依旧是几个IP显示的是几条信息。当然如果你用命令行添加规则的话,保存之后,配置文件里面也是几个IP是几条信息。


2.5.3 关于NFS的防火墙设置

https://blog.51niux.com/?id=75  #NFS默认的一些mount端口等是随机的,这里对这些随机端口进行了固定,将其固定为30001-3004.

iptables -I INPUT 4 -p tcp  --dport 111 -j ACCEPT
iptables -I INPUT 5 -s 127.0.0.1 -p udp  --sport 111 -j ACCEPT
iptables -I INPUT 6 -s 127.0.0.1 -p udp  --dport 111 -j ACCEPT
iptables -I OUTPUT 4 -p tcp  --dport 111 -j ACCEPT 
iptables -I OUTPUT 5 -d 127.0.0.1 -p udp  --sport 111 -j ACCEPT
iptables -I OUTPUT 6 -d 127.0.0.1 -p udp  --dport 111 -j ACCEPT
iptables -I INPUT 7 -s 192.168.1.109,192.168.1.112 -p tcp -m multiport  --dports 2049,30001:30004 -j ACCEPT      
iptables -I OUTPUT 7 -d 192.168.1.109,192.168.1.112 -p tcp -m multiport  --sports 2049,30001:30004 -j ACCEPT
#当然关于127.0.0.1的开放,也没有必要像上面似得那么麻烦,直接用下面的方法:
iptables -I INPUT 6 -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT  
iptables -I OUTPUT 6 -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
#当然要觉得sport和dport还要写两条麻烦的话,可以直接下面哪种写法:
iptables -I INPUT 5 -p udp -s 127.0.0.1 -d 127.0.0.1  -m multiport --ports 111 -j ACCEPT
iptables -I OUTPUT 5 -p udp -s 127.0.0.1 -d 127.0.0.1  -m multiport --ports 111 -j ACCEPT

#上面开放tcp的111端口是为了让其他的服务器可以访问RPC的111端口,当然这里也可以指定IP进行限制。

# 这里为了测试效果就制定了只允许哪两个IP可以访问nfs并进行挂载,当然nfs配置文件里面也可以进行IP的限制。

#上面的开放udp的111端口是为了让本地的nfs可以在rpc的111端口里面进行注册,不开放的话会注册失败。不然启动nfs的话会启动下面的信息:

Starting NFS quotas: Cannot register service: RPC: Unable to send; errno = Operation not permitted
rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp).

#上面的错误信息就是要摸就是连接不到rpc的udp的111端口,要摸就是rpc服务压根就没有启动。

基础的iptables操作就记录到这里,到这里基本我们已经可以做大部分的ip与端口的限制操作了。重点就是ip协议,来源IP或者目标IP,然后就是来源端口或者目标端口,区分清楚。让其通过我们就用ACCEPT,在拒绝的时候,我们不会直接拒绝,而是用DROP不给予应答。然后禁ping可以在交换机上面设置。

作者:忙碌的柴少 分类:防火墙 浏览:21385 评论:1
留言列表
孤独的天163
孤独的天163 受教了,内容太好了  回复
发表评论
来宾的头像