iptables 命令应用详解

iptables的语法格式及其语法如下:

iptables   [-t  TABLE]    COMMAND   CHAIN  [CHAIN_NUMBER]   匹配标准    -j   执行动作

其中-t  TABLE指定要编辑的表名,如果此处不写,默认表为filter表

COMMAND表示要执行的命令,这些命令包括这几大类:

    mangment command:

         -A:表示附加一条规则,添加在链的尾部

         -I:表示插入一天规则,默认插在链的首部

         -D:表示要删除指定链中的某条规则

         -R:修改某条链的某个规则


   管理链类命令:

        -F [CHAIN]:flush,表示清空指定链的所有规则,如果省略CHAIN,则表示清空指定表中的所有规则(除默认规则之外),默认清空的是filter表

       -P:修改指定链的默认规则(或者叫默认策略)

       -N:自定义一个新的空链

       -X:删除一个自定义的空链

       -E:重命名自定义的链

       -Z:将指定链中所有规则的计数器置零


    查看规则类命令

        -L:显示指定表中的所有规则,不加表名则显示所有表中的所有规则,-L还有子选项:

          -n:以数字格式显示主机地址和端口号

          -v:显示链及其规则的详细信息

          -vv:显示链及其规则的更佳的详细信息(不是-w哦,是两个v)

          -x:显示规则中的计数器的精确值

          --line-numbers:显示规则号码


CHAIN:指定链名

CHAIN_NUMBER:表示指定链的第几条规则


匹配条件有通用匹配条件和扩展匹配条件,其中扩展匹配包含隐式扩展匹配和显式扩展匹配。

隐含扩展:不用特别指明由哪个模块进行的扩展,因为此时使用-p {tcp|udp|icmp}即可

显式扩展:必须指明由哪个模块进行的扩展,在iptables中使用-m选项可完成此功能

     通用匹配条件有:

         -s SIP:根据源ip进行匹配

         -d DIP:根据目标ip进行匹配

         -p {tcp|udp|icmp}:根据指定协议来进行匹配

         -i interface:根据数据包入向接口来进行匹配,可用于定义标准的链有:PREROUTING,INPUT,FORWARD

         -o interface:根据数据包出接口进行匹配,可用于标准定义的链:OUTPUT,POSTROUTING,FORWARD


  扩展匹配条件:

      隐式扩展匹配条件:

        (1)、tcp协议隐式扩展

           -p  tcp  --sport  PORT[-PORT]:对tcp的源端口做匹配。

           -p  tcp  --dport  PORT[-PORT]:对tcp的目标端口做匹配。多个连续的端口可以使用PORT-PORT的形式给出。

           -p  tcp  --tcp-flags  mask  comp: 只检查mask指定的标志位,是逗号分隔的标志位列表;comp:此列表中出现的标记位必须为1,comp中没出现,而mask中出现的,必须为0;

     例如:只检查tcp三次握手中的第一次:

          -p tcp --tcp-flags  SYN,ACK,FIN,RST  SYN

          -p  tcp   --syn:只检查tcp三次握手中的第一次,和上面的作用一样

 

       (2)、icmp隐式扩展

           -p icmp  --icmp-type {0|8}:根据icmp的报文类型进行匹配。其中0表示响应报文类型,8表示请求报文类型

                                

       (3)、udp隐式扩展

           -p  udp  --sport   PORT[-PORT]:根据udp源端口进行匹配

            -p  udp  --dport   PORT[-PORT]:根据目标端口进行匹配


    显式扩展匹配:必须加上选项-m

        state:状态扩展:是结合ip_conntrack这个模块来追踪会话的

           -m  state --state  NEW:根据新请求(第一次请求)进行匹配

           -m  state  --state ESTABLISHED:根据已建立的连接进行匹配

           -m  state  --state RELATED:根据相关联的连接进行匹配,多用于开放ftp服务

           -m   state  --state INVALID:根据非法连接进行匹配


使用状态扩展还要装载ip_conntrack_ftp和ip_nat_ftp模块

在iptables中,可以利用ip_conntrack这个模块来追踪客户端和服务器端的连接状态(包括tcp、udp、icmp连接) ,它是内核中的一个模块,实时记录了客户端和服务器端的连接状态,并记录每一个连接处于哪种状态。

在/proc/net/ip_conntrack这个文件中保存了客户端和服务端之间的tcp连接信息

在/proc/sys/net/ipv4/ip_conntrack_max这个文件中保存了客户端和服务器的最大连接数,默认为65535

在/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established文件里定义了tcp连接的超时时间,默认为5天(432000秒).如果在这个时间内还没有数据传输,则会断开该连接。并且也会将这个连接的信息删除。

对于高并发的服务器而言,尽量不要启用ip_conntrack这个模块。避免后续的大量请求被丢弃

对于服务请求不是很多的服务器而言,可以启用ip_conntrack这个模块

注意:使用iptables  -t nat  -L命令时会启动ip_nat这个模块,而这个模块会依赖于ip_conntrack这个模块。因此,执行该命令,也会启用ip_conntrack这个模块

可以使用iptstate命令来查看客户端和服务器端的连接状态信息

iptstate -t:还可以显示所有的连接个数

 


     multiport: 离散的多端口匹配扩展

          -m  multiport  --source-ports  PORT1,PORT2...:对源端口进行匹配

          -m  multiport  --destination-ports  PORT1,PORT2...:对目标端口进行匹配

          -m  multiport  --ports  PORT1,PORT2...:对指定端口进行匹配


     iprange:连续的ip地址或地址范围扩展

          -m   iprange  --src-range   {IP-IP|NETWORK/MASK}:对指定返回内的源地址匹配

         -m   iprange  --dst-range  {IP-IP|NETWORK/MASK}:对指定范围内的目的地址进行匹陪

这里的ip范围可以是连续的ip,例如-m iprange 192.168.1.10-192.168.1.100

也可以是某一个网段内,例如-m  iprange 192.168.1.0/24        


      connlimit:限制每一个客户端连接数扩展

          -m  connlimit  ! --connlimit-above  num   ACCEPT:允许每个客户端的最大连接数

              在这里不加! 则后面的动作为DROP或REJECT

              !表示取反的意思。在前面的选项当中也可以使用


  limit:数据包速率限制扩展

        -m limit  --limit RATE:表示达到最大值时,单位时间内允许通过的请求数

        ---limit-burst :表示初始时的最大并发数为多少(即请求刚开始时能够匹配的最大数据包)


  string:字符串匹配扩展

        -m string  --algo  {bm|kmp}  :指定匹配算法

       --string  ”STRING”  :对指定的字符串进行匹配


-j   执行动作有:

        ACCEPT:表示接受或放行

        DROP:表示丢弃

        REJECT:表示拒绝

        DNAT:表示做目标地址转换

        SNAT:表示做源地址转换

        REDIRECT:表示端口重定向 (一种特殊的DNAT)

        RETURN:如果应用在主链上,则表示执行相应的策略。如果应用于自定义链上,则表示将匹配权返回给主链。

        MASQUERADE:如果上网ip不固定,可以使用该参数。系统会自动将私有源ip转换成可以上网的公网ip。用发送数据的网卡上的IP来替换源IP,因此,对于那些IP不固定的场合,比如拨号网络或者通过dhcp分配IP的情况下,就得用MASQUERADE。一般由于源地址转换中。(一种特殊的SNAT)

        LOG:表示将数据包相关信息记录下来。不影响报文的比对规则

             其中子选项--log-prefix  "STRING"表示定义日志前缀。用于方便查看是哪种类型的日志。

        MASK:表示对报文打标记


iptables的规则保存

默认情况下,当系统重启后,之前写的规则如果没有保存的话,这些规则就会丢失。使用service  iptables  save可以将规则保存起来。且这些规则默认保存在/etc/sysconfig/iptables里。

自定义规则保存文件

默认iptables将写好的规则保存在/etc/sysconfig/iptables这个文件里,使用iptables-save  > /etc/sysconfig/iptables.20141031可以将规则保存至自己定义的文件里。这里的文件自行定义。

系统重启后,自定义的规则保存文件需要手动加载到内存中才会生效。使用命令iptables-restore  <  /etc/sysconfig/iptables.20141031即可完成此功能。 


利用iptables的recent模块来抵御DOS攻击         

在这里以ssh服务来说明

步骤如下:

1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;

2.利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制五分钟后即可恢复访问。                        

iptables规则如下:

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP

下面对最后两句做一个说明:

1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

2.第三句是指SSH记录中的IP,300s内发起达到3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用

3.iptables的记录:保存在/proc/net/ipt_recent/SSH这个文件中


NAT:Network    Address   Transfer

NAT叫做网络地址转换,NAT分为源地址转换SNAT和目标地址转换DNAT

SNAT:源地址转换,由于某一个局域网内使用的基本都是私有ip地址,而私有ip地址是不能在公网上路由的。因此,当私有ip向外发送请求时,会先将请求时的源ip转换成能够路由的公网ip,并最终与互联网上的服务进行通信。不过,当互联网的服务对本地请求进行响应时,则会自动进行DNAT。SNAT一般用在nat表的POSTROUTING上。

做SNAT需要执行的地址为-j   SNAT  --to-source  SIP

SNAT工作流程如下:


DNAT:目标地址转换,当公网上的某个客户访问某个企业的服务器时,它首先会与该企业的nat服务器(或边缘路由器)进行通信。然后根据写好的规则,将该请求的目的ip转换成私有ip地址,在经过路由功能就可以实现和企业服务器进行通信(一般为私有ip地址)。不过,当本地服务器响应服务请求时(一来一回)会自动完成源地址转换。DNAT一般用在nat表的PREROUTING链上。

做SNAT需要执行的地址为-j   DNAT  --to-destination  DIP

DNAT工作流程如下:

      


 自定义规则链

步骤如下:

1、创建一条空链

 # iptables -N clean_in

2、在该链上创建相关规则

# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP

# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP

3、将匹配权返回交给主链 处理。如果目标地址为172.16.100.7报文一条规则都没匹配,则将由主链中的规则来继续匹配。                   

# iptables -A clean_in -d 172.16.100.7 -j RETURN                               

 4、主链调用自定义规则链。目标地址为172.16.100.7的报文将与自定义规则链中的规则进行匹配。
# iptables -A INPUT -d 172.16.100.7 -j clean_in

 

自定义规则链和主链中的规则都是按顺序来匹配的,它们之间没有优先级,谁在前就最先使用第一条规则进行匹配。

主链是netfilter中的5个链

说明一下:当某个报文被自定义规则链上的规则匹配时,则执行相应的动作;如果报文没被自定义规则链中的任何一条规则匹配,则将返回主链,继续与主链上的其他规则进行匹配。

 

 

猜你喜欢

转载自blog.csdn.net/sdc20102010/article/details/53944103