iptables规则初步

1.iptables基础:

iptables是包过滤型防火墙,对于防护主要是基于对于数据包的分析,然后与规则进行对比,对于规则外的进行防护,对于规则内的给与放行。iptables的规则是表与链的形式,而且遵循模块化开发的原则,方便进行管理。

1.1 表的分类:

防火墙表分类:每一种功能都是一张表(table)
       filter:过滤,防火墙;主要跟进入linux本机的数据包有关,是默认的table
       mangle:拆解报文,按需修改,并重新进行封装
       nat:network address translation,网络地址转换。用于修改源ip或目标ip,也可以修改端口。与linux主机无关,主要与linux主机后的局域网内计算机有关。
       raw:关闭nat表上启用的连接追踪机制。

1.2 链的分类:

内置链,每个链对应一个钩子
        PREROUTING
        INPUT
        OUPUT
        FORWARD
        POSTROUTING
自定义链:用于内置链的扩展与补充,可实现更灵活的规则组织管理机制,需要手动添加关联关系

1.3 表与链的联系

filter:INPUT,FORWARD,OUTPUT
mangle:PROROUTING,INPUT,FPRWADR,OUTPUT,POSTROUTING
nat:PREROUTING,INPUT,OUTPUT,POSROUTIING,nat一般只转换地址
raw:PREROUTING,OUTPUT

2.iptables的规则管理:

格式:
  1. iptables   [-t table]   COMMAND   chain   [-m matchname [per-match-options]]   -j targetname [per-target-options]   
-t table:指表的分类,包括filter、nat、mangle、raw四种,常用的只有filter、nat

2.1 规则链管理:

      -N:new,新定义一条新的规则链
      -X:delete,删除新定义的规则链。注意:内置规则链是无法删除的,只能删除自己设置的
      -P:Policy,设置默认策略,对filter表中的链而言,其默认策略有
             ACCEPT:接收,设置白名单
             DROP:丢弃,较常用
             REJECT:拒绝,一般不使用
      -E:重命名自定义链,自定义的未被引用的链,即引用次数为0的链才能被重命名,被删除
  1. iptables -F
  2. iptables -Z
  3. iptables -X

2.2 规则管理:

      -A:append,追加
      -I:insert,插入,要指明位置,省略时表示第一条
      -D:delete,删除
             1.指明规则序号
             2.指明规则本身
      -R:replace,替换指定链上的指定规则
      -F:flush,清空指定的规则链
      -Z:zero,置零
             iptables的每条规则都有两个计数器
                  1.匹配到的报文的个数
                  2.匹配到的所有报文的大小之和
       -S:selected,选择显示
  1. iptables -P INPUT DROP #将所有来自外界的请求全部丢弃
  2. iptables -P OUTPUT ACCEPT #将来自本机的请求全部接收
  3. iptables -P FORWARD ACCEPT
  4. iptables -t nat -P PROROUTING ACCEPT
  5. iptables-save #查看设置的规则
  6. iptables-save -t filter #仅查看filter相关规则

2.3 查看:

     -L:list,列出指定链上的所有规则
     -n:以数字格式显示地址和端口号
     -v:verbose,详细信息,-vv更详细的
     -x:exctly,精确值,显示计数器结果的精确值而非单位换算后的结果
            --line-number:显示规则的序号
      chain:指明是哪个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
  1. iptables -tnL
  2. iptables -nvL
  3. iptables -nvvL

2.4处理动作:

       -j  targetname  [per-target-options]
   ACCEPT, DROP, REJECT
   RETURN:返回调用的链
   REDIRECT:端口重定向
   LOG:日志
   MARK:防火墙标记
   DNAT:目标地址转换
   SNAT:源地址转换
   MASQERADE:地址伪装

3.规则设置与相应的匹配条件

3.1基本匹配条件

基本匹配:无需加载任何模块,由iptables或nefiter自行提供
[!]-s,--sorce address[/mask][,....]:对于进入的信息做匹配,检测报文中的源ip地址是否符合此处指定的地址或范围
[!]-d,--destination address[/mask][,...]:对于输入的信息做匹配,检查输出的目的ip地址是否符合
[!]-p,--protocol protocol,限定指定的协议,是一种扩展匹配,每一种协议都有相应的扩展
          protocol:常用的有tcp,udp,icmp
[!]-i,--in-interface name:限制数据报文流入的接口,只能应用于数据报文流入的环节,即只能应用于PREROUTIG,INPUT,FORWARD链
[!]-o,--out-interface name:限制数据报文流出的接口;只能应用于数据报文流出的环节,即只能应用于FORWARD,OUTPUT,POSTROUTING

3.2 隐式扩展匹配条件

经由扩展模块引入的机制,需要加载扩展模块,方可生效;分为显式匹配与隐式匹配,-m matchname

隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块

3.2.1 tcp相关

[!] --source-port,--sport port [:port]:匹配报文的源端口,也可以指定端口范围
[!] --destination-port,--dport port[:port]:匹配报文的目标端端口,也可以指定端口范围
[!] --tcp-flags mask comp
       cpmp:SYN,ACK,FIN,RST
       例:“--tcp-flags  SYN,ACK,FIN,RST  SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0;
[!] --syn:用于匹配第一次握手,相当于”--tcp-flags  SYN,ACK,FIN,RST  SYN“;  

3.2.2 udp相关

[!] --source-port,--sport port[:port]:匹配报文的源端口,可以是端口范围
[!] --destination-port,--dport port[:port]:匹配报文的目标端口,可以是端口范围

3.2.3 icmp相关

[!] --icmp-type {type[/code][typename]}
       echo-request:8,请求
       echo-reply:0,回应

3.3 显式扩展匹配条件

显示匹配:必须要手动加载扩展模块,-m matchname [per-match-options]

3.3.1 multiport扩展

         以离散方式定义多端口匹配,最多指定15个端口
[!] --source-ports,--sport port[,port|,port:port]...:指定多个源端口
[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口
[!] --ports port[,port|,port:port]...:指明多个端口
例:来自172.18.0.0/16的网络中有关tcp/80,tcp/22端口的,发往172.18.100.67(本机)的数据包全部接收
  1. iptables -A INPUT -s 172.18.0.0/16 -d 172.18.100.67 -p tcp -m multiport -dports 22,80 -j ACCEPT

3.3.2 iprange扩展

          指明连续的(但不为整个网络的)ip地址范围
[!] --src-range from[-to]:源ip地址
[!] --dst-range from[-to]:目标ip地址
例:对于来自172.18.100.5-172.18.100.10的tcp/80的web访问,172.18.100.67(本机)全部丢弃
  1. iptables -A INPUT -d 172.18.100.67 -p tcp --dport 80 -m iprange --src-range from 172.18.100.5-172.18.100.10 -j DROP

3.3.3 string扩展

         对于报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp}:字符串匹配检测算法
         bm:Boyer-Moore,BM算法在移动模式串的时候是从左到右,而进行比较的时候是从右到左的。
         kmp:
[!] --sring pattern:给定要检测的字符串模式
[!] --hex-string pattern:要检测的字符串模式,16进制格式
例:对于172.18.100.67而言,从tcp/80端口发往外部的,发出的的信息中含有old内容的全部不允许发出
  1. iptables -I OUPUT -s 172.18.100.67 -d 0/0 -p tcp ---sport 80 -m string --algo bm --string "old" -j REJECT

3.3.4 time扩展

         根据报文到达的时间日期与指定的时间日期范围进行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
可以做网络连接访问控制,限制网络连接等服务
[!] --mouthdays day[,day...]
[!] --weekdays day[,day...]
--kerneltz:使用内核上的时区,而非默认的UTC
例:限制172.18.200.67对于172.18.0.0/16区域的web访问(通过tcp/80端口),每周的周六,周日的14:30-18:30连接访问直接丢弃
  1. iptables -A INPUT -s 172.18.0.0/16 -d 172.18.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP

  2. iptables -R INPUT -d 172.18.100.6 -p tcp --dport 23 -m iprange --src-range 172.18.100.1-172.18.100.100 -m time --timestart 09:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 -j ACCEPT
来自172.18.100.0-172.18.100.100的对于172.18.100.6主机的tcp/23号端口的访问,当时间为每周的周一到周五的9:00-16:00时允许访问,其他时间拒绝

3.3.5 connlimit扩展

         根据每客户端主机做并发连接数限制,即每客户端最多可同时发起的连接数量;
--connlimit-upto n:连接的数量小于等于n时匹配;
--connlimit-above n:链接的数量大于n时匹配
例:对于172.18.100.67的tcp/21号端口的访问,每个客户端最多发起两个请求,多的拒绝
  1. iptables -A INPUT -d 172.18.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJEC
  1. iptables -A INPUT -s 0/0 -d 172.18.100.6 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT

3.3.6 limit扩展

         基于令牌桶算法对报文的速率做匹配
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
  1. iptables -R INPUT 3 -d 172.18.100.6 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 3 -j ACCEPT
  2. iptables -I INPUT 2 -p icmp -j REJECT

3.3.7 state扩展

         根据连接追踪机制去检查链接的状态
conntrack(连接追踪)机制:最终本机上的请求和响应之间的关系。状态有如下几种:
NEW:新发出的请求;连接追踪模版中不存在此连接的相关信息条目,因此,将此识别为第一次发出的请求
ESTABLISHED:NEW状态以后,连接追踪模板当中存在记录的连接
RELATED:无法识别的连接
UNTRACKED:未追踪的连接
INVALID:无法识别的连接
[!] --state state
例:
  1. iptables -A INPUT -d 172.18.100.67 -p tcp -m multiport --dport 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
  2. iptables -A OUPUT -s 172.18.100.67 -p tcp -m multiport --sport 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
已经追踪到的并记录下来的连接:/porc/net/nf_conntrack
连接追踪功能所能记录的最大连接数量(可调整):/proc/sys/net/nf_conntrack_max
        sysctl -w net.nf_conntrack_max=300000
        echo  300000 > /proc/sys/net/nf_conntrack_max 
conntrack所能追踪的连接数量的最大值取决于/proc/sys/net/nf_conntrack_max的设定,已经追踪到的并记录下来的连接位于/proc/net/nf_conntrack文件中,超时的连接将会被删除;当模版满载时,后续的型连接有可能会超时,解决办法:
        (1) 加大nf_conntrack_max的值;
        (2) 降低nf_conntrack条目的超时时长;
 不同协议的连接追踪时长:/proc/sys/net/netfilter/

3.4 如何放行被动模式的ftp服务?

        1.内核加载nf-conntrack_ftp模块:modporbe nf_conntrack_ftp
        2.放行命令连接:$sip为Sever的ip地址
  1. iptables -A INPUT -d $sip -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
  2. iptables -A OUTPUT -s $sip -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
        3.放行数据连接:
  1. iptables -A INPUT -d $sip -p tcp -m stte --state RELATED,ESTABLISHED -j ACCEPT
  2. iptables -A INPUT -s $sip -p tcp -m state --state ESTABLISHED -j ACCEPT

4.规则的其它设置

4.1 规则的添加注意事项

      添加规则时的考量点(例:应该注意哪些功能):
            (1) 要实现哪种功能:判断添加到哪个表上;
            (2) 报文流经的路径:判断添加到哪个链上;
 
            设定规则一定要考虑清楚,所写规则是为客户端还是服务端,数据流入流出

 4.2 规则的检查次序

      链:链上的规则次序,即为检查的次序;因此,隐含一定的应用法则:
                (1) 同类规则(访问同一应用),匹配范围小的放上面;
                (2) 不同类的规则(访问不同应用),匹配到报文频率较大的放在上面;
                (3) 将那些可由一条规则描述的多个规则合并起来;
                (4) 设置默认策略;

4.3 规则的有效期及如何保存规则使之一直生效

规则的有效期:iptables命令添加的规则,手动删除前,其生效期限为kernel的生命周期
保存规则:
 对于centos6:
  1. service iptables save
  2. iptables-save > /etc/sysconfig/iptables
  3. iptables-save > /PATH/TO/SOME_RULE-FILE
对于centos7:
  1. iptables -S > /PATH/TO/SOME-FILES
  2. iptables-save > /PATH/TO/SOME-FILES
重载预存的规则:
  1. iptabels-restore < /PATH/FROM/SOME-FILES
对于centos6:service iptables restart
        会自动从/etc/sysconfig/iptables文件中重载规则
自动生效文件中的规则:
1.把iptables命令放在脚本文件中,让脚本文件开机自动启动
              /etc/rc.d/rc.local
                   或把规则存放在/uar/bin/iptables.sh文件中,开机启动脚本
2.用规则文件保存规则,开机自动重载命令;
             /etc/rc.d/rc.local
                   iptables-restore  <  /PATH/FROM/SOME_RULE_FILE

5.练习:     

5.1.设置INPUT和OUTPUT默认策略为DROP;

1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
  1. iptables -A OUPUT -s 172.18.250.251 -p tcp --dport 80 -m time --weekdays 2,3,4,5,6,7 -m --limit 100/second -j ACCEPT
2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.18.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
  1. iptables -A OUTPUT -s 172.18.250.251 -d 172.18.0.0/16 -p tcp --dport 21 -m time --timestart 8:30 --timestop 18:30 -m 1,2,3,4,5 -m --limit 5/minute -j ACCEPT
3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的学号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
  1. iptables
4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
  1. iptables
5、允许本机ping别的主机;但不开放别的主机ping本机;
  1. iptables

5.2:判断下述规则的意义:

# iptables -N clean_in
# 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
# iptables -A clean_in -d 172.16.100.7 -j RETURN 
# iptables -A INPUT -d 172.16.100.7 -j clean_in
# iptables -A INPUT  -i lo -j ACCEPT  对于所有通过网卡lo进入本机的数据包全部接收
# iptables -A OUTPUT -o lo -j ACCEPT 对于通过网卡lo进入本机的数据包全部接收
                lo网卡代表127.0.0.1,代表的是本地,上面表示对于本地主机的进程间通信,全部接收
# iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
# iptables -A INPUT  -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
# iptables -A INPUT  -i eth0 -p udp --dport 1026 -j DROP
# iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP
# iptables -A INPUT  -p icmp -m limit --limit 10/second -j ACCEPT
  1. iptables -A OUTPUT -s 172.18.17.129 -d 172.18.250.251 -p tcp --sport 22 -j DROP
  2. iptables -A INPUT -s 172.18.0.0/16 -d 172.18.17.129 -p tcp --dport 22 -j DROP
posted @ 2016-07-16 10:09  flyme123  阅读(271)  评论(0编辑  收藏  举报