首页 > 代码库 > iptables防火墙过滤规则

iptables防火墙过滤规则

iptables  包过滤 防火墙

  •      firewall  防火墙工作在网络边缘(主机边缘)对于进出的网络数据包进行规则排查,并在匹配某规则时由规则定义的处理进行处理的功能组件

防火墙类型

  •     根据工作区域不同分为:
  •         OSI 的第三层,即网络层的防火墙
  •         OSI 的第七层,即应用层的防火墙 ,或者代理服务器/网关

网络层的防护墙:包过滤器

  •         在网络层 对数据进行条件是选择,根据访问控制表(ACL),即检查每个数据的源地址,目的地址,端口号,协议状态等.  
  •         针对端口

代理服务防火墙

  •        代理服务会把同过或者服务控制规则的数据转发给请求访问的用户,内外网的用户访问都是通过代理服务器上的链接来实现,从而起到了隔离防火墙内为计算机系统作用
  •        针对数据

主机防火墙和网络防火墙

  •         主机防火墙:服务范围为当前主机;
  •         网络防火墙: 服务范围为防火墙所在的局域网;

Iptables的组成

  •  四个表:
  •    filter :过滤规则表,该表根据管理员预定义的一组规则过滤符合条件的数据包
  •    nat : 地址转换规则表;用于修改源IP或目标IP,也可以改端口;
  •    mangle :修改数据标记位规则表;拆解报文,作出修改,并重新封装起来;
  •    raw:跟踪数据表规则表 ;关闭nat表上启用的连接追踪机制
  •  五个链接:
  •   INPUT OUTPUT FORWARD PREROUTING POSTROUTING
  •     功能<--链:
  •         raw:PREROUTING, OUTPUT
  •         mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
  •         nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING
  •         filter:INPUT,FORWARD,OUTPUT
  • 报文流向:
  •         流入本机:PREROUTING --> INPUT
  •         由本机流出:OUTPUT --> POSTROUTING
  •         转发:PREROUTING --> FORWARD --> POSTROUTING

 添加规则的考量点

  •     (1) 要实现那种功能 : 判断条件在那张表上
  •     (2) 报文流经的路径: 判断添加在那个路径上
  •   规则:
  •             组成部分:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理;
  •                 匹配条件:
  •                     基本匹配条件
  •                     扩展匹配条件
  •                 处理动作:
  •                     基本处理动作
  •                     扩展处理动作
  •                     自定义处理机制:

ipatables 命令

  •                查看:
  •                         -L:list, 列出指定鏈上的所有规则;
  •                         -n:numberic,以数字格式显示地址和端口号;
  •                         -v:verbose,详细信息;
  •                         -x:exactly,显示计数器结果的精确值; 
  •                         --line-numbers:显示规则的序号;
  •  示例: 
  •           不指定表的话默认为filter表
  •          技术分享
  •          指定查看raw表
  •     技术分享 技术分享
  •          常用选项组合-vnL 显示详细属性信息
  • 技术分享      技术分享
  •        查看指定链详细信息
  • 技术分享       技术分享
  •   链管理:

  •               -N:new, 自定义一条新的规则链;
  •               -X: delete,删除自定义的规则链;
  •               -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
  •                   ACCEPT:接受
  •                   DROP:丢弃
  •                   REJECT:拒绝
  •               -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
  • 示例: 
  •          添加一个新链
  •        技术分享技术分享
  •                   每一个自定义链都由引用计数
  •           删除自定义链
  •        技术分享技术分享
  •         注意:仅能删除用户自定义的引用计数为0的空链
  •        技术分享
  •           修改规则策略
  •        技术分享
  •             重命名自定义规则连名称
  •        技术分享技术分享

 

  规则管理:

 

  •                         -A:append,追加;
  •                         -I:insert, 插入,要指明位置,省略时表示第一条;
  •                         -D:delete,删除;
  •                             (1) 指明规则序号;
  •                             (2) 指明规则本身;
  •                         -R:replace,替换指定链上的指定规则;
  •                         -F:flush,清空指定的规则链;
  •                         -Z:zero,置零;
  •                             iptables的每条规则都有两个计数器:
  •                                 (1) 匹配到的报文的个数;
  •                                 (2) 匹配到的所有报文的大小之和;                        

匹配条件:

  •                     基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供;
  •                         [!] -s, --source  address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;      
  •                         [!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
  •                         [!] -p, --protocol protocol  指定协议 所有地址:0.0.0.0/0
  •                             protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or  "all"
  •                                 {tcp|udp|icmp}
  •                         [!] -i, --in-interface name:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;
  •                         [!] -o, --out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;
  •         示例: 
  •                        技术分享
  •       技术分享                  技术分享
  •   技术分享

扩展匹配条件: 需要加载扩展模块,方可生效;

  •                         隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块,无需再同时使用-m指明模块;
  •                   tcp:
  •                         [!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
  •                         [!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
  •                         [!] --tcp-flags  mask  comp
  •                         例如:“--tcp-flags  SYN,ACK,FIN,RST  SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0;
  •                         [!] --syn:用于匹配第一次握手,相当于”--tcp-flags  SYN,ACK,FIN,RST  SYN“;                                
  •                   udp:
  •                         [!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
  •                         [!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
  •                  icmp:
  •                         [!] --icmp-type {type[/code]|typename}
  •                              echo-request:8  发出去的请求状态码
  •                              echo-reply:0     回应的状态码                                             
  •     
  • 定义白名单规则 :  对本机开放ssh

  •     修改其默认策略
  •   技术分享技术分享
  •      如下图 表示允许基于tcp协议22端口的192.168.117.133的访问其他协议IP会被DROP 匹配
  •           技术分享技术分享   
  •             注意此时如果使用 -F 清除规则那么 就只剩下默认规则 ,此处设置为DROP,会导致客户端断开连等各种不便
  •       下面如图不需要修改其默认策略
  •    技术分享
  •       控制ping 规则 这个表示 会响应任何人  
  •    技术分享
  •             
  •     如果你本地地址有多个可以基于i o 网卡设定规则 
  •    技术分享             技术分享
  •     这个时候就可以去掉之前的REJECT 设置
  •    技术分享
  •     允许本机ping任何人反之不能ping主机       技术分享
  •    技术分享

显式扩展:必须使用-m 指明使用的扩展模块进行的扩展;调用模块

  •         1、multiport扩展
  •             此模块匹配一组源端口或目标端口。最多可指定15个端口。端口范围(端口:端口)算作两个端口。
  •             它只能用于下列协议:TCP,UDP连接,udplite,DCCP和SCTP
 
  •             [!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
  •             [!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
  •             [!] --ports port[,port|,port:port]...:指明多个端口;
 
  •           示例:
  •                   一次开放22,80,443,端口
  •             [root@wxC7 ~]# iptables -I INPUT 1 -d 192.168.117.133 -p tcp -m multiport --dports 22,80,443 -j ACCEPT
  •             [root@wxC7 ~]# iptables -I OUTPUT 1 -s 192.168.117.133 -p tcp -m multiport --dports 22,80,443 -j ACCEPT                   
  •        技术分享           技术分享
 
  •      2、iprange
  •                     以连续地址块的方式来指明多IP地址匹配条件;
  •                     [!] --src-range from[-to] 源地址
  •                     [!] --dst-range from[-to] 目标地址
  •            示例: 设定指定ip范围内的开放23端口
  •                  [root@wxC7 ~]# iptables -I INPUT 2 -d 192.168.117.133 -p tcp --dport 23 -m iprange --src-range 192.168.117.100-192.168.117.140 -j ACCEPT
  •                  [root@wxC7 ~]# iptables -I OUTPUT 2 -s 192.168.117.133 -p tcp --sport 23 -m iprange --dst-range 192.168.117.100-192.168.117.140 -j ACCEPT
  •         技术分享
  •                 技术分享  
  •   3、time  
  •            如果包到达时间/日期在给定范围内,则匹配。
 
  •                      --timestart hh:mm[:ss]
  •                      --timestop hh:mm[:ss]
 
  •                      [!] --weekdays day[,day...]
 
  •                      [!] --monthdays day[,day...]
 
  •                     --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
  •                     --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
 
  •                      --kerneltz:使用内核配置的时区而非默认的UTC;
  • 示例:
  •          定制改地址范围内与规定时间内访问基于内核时间
  •           [root@wxC7 ~]# iptables -I INPUT 3 -d 192.168.117.133 -p tcp --dport 23 -m iprange --src-range 192.168.117.130-192.168.117.135 -m time --timestart 12:00:00 --timestop 15:00:00 --weekdays 2,3,4, --kerneltz -j ACCEPT
  •      [root@wxC7 ~]# iptables -I OUTPUT 3 -s 192.168.117.133 -p tcp --sport 23 -m iprange --dst-range 192.168.117.130-192.168.117.135 -m time --timestart 12:00:00 --timestop 15:00:00 --weekdays 2,3,4, --kerneltz -j ACCEPT
 
  •      4、string         
  •                该模块使用某种模式匹配策略匹配给定的字符串
  •                     --algo {bm|kmp}
  •                     [!] --string pattern
  •                     [!] --hex-string pattern
 
  •                     --from offset
  •                     --to offset
 
  •                     ~]# iptables -I OUTPUT -m string --algo bm --string "gay" -j REJECT 
  •           示例:
  •                   凡是匹配到的字符串 都拒绝
  •                 [root@wxC7 ~]# vim /web/www/index.html 内容how are you
  •                 [root@wxC7 ~]# iptables -I OUTPUT -s 192.168.117.133 -m string --algo kmp --string "how" -j  REJECT
  •   5、connlimit
  •                     Allows  you  to  restrict  the  number  of parallel connections to a server per client IP address (or client address block).
 
  •                     --connlimit-upto n 小于..
  •                     --connlimit-above n 大于..
  • 示例:    单链接的最大并发连接控制;只需限制请求即可
  •         [root@wxC7 ~]# iptables -I INPUT -d 192.168.117.133 -s 192.168.0.0/16 -p tcp --dport 3306  -m connlimit  --connlimit-upto 2 -j ACCEPT
  •             技术分享
  •    6、limit 速率限制
  •                     This  module  matches  at  a limited rate using a token bucket filter.
  •                       采用令牌桶算法
  •                     --limit rate[/second|/minute|/hour|/day]
  •                     --limit-burst number
 
  •                     限制本机某tcp服务接收新请求的速率:--syn, -m limit
  •    示例:
  •               [root@wxC7 ~]# iptables -I INPUT 3 -d 192.168.117.133 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 20/minute -j ACCEPT
  • [root@wxC7 ~]# iptables -I OUTPUT 3 -d 192.168.117.133 -p icmp --icmp-type 0 -j ACCEPT
  •             技术分享
  •                
  • 7、state
  •                     连接跟踪模块的一部分。允许访问此包的连接跟踪状态。
  •                     [!] --state state
  •                         INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.
  •                         NEW: 新连接请求;
  •                         ESTABLISHED:已建立的连接;
  •                         INVALID:无法识别的连接;
  •                         RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;
  •                         UNTRACKED:未追踪的连接;
  •                         state扩展:
  •                             内核模块装载:
  •                                 nf_conntrack
  •                                 nf_conntrack_ipv4
  •                              手动装载:
  •                                  nf_conntrack_ftp
  •                     追踪到的连接:
  •                         /proc/net/nf_conntrack
  •                     调整可记录的连接数量最大值:
  •                         /proc/sys/net/nf_conntrack_max
  •                     超时时长:
  •                         /proc/sys/net/netfilter/*timeout*
  •                
  •         示例:设定规则 放行new及ESTABLISGED,默认规则为 拒绝        
  •     [root@wxC7 ~]# iptables -I INPUT 3 -d 192.168.117.133 -p tcp -m multiport --dport 21:23,80,139,445,443,3306 -m state --state NEW -j ACCEPT
  •     [root@wxC7 ~]# iptables -I INPUT -d 192.168.117.133 -m state  --state ESTABLISHED -j ACCEPT
  •     [root@wxC7 ~]# iptables -A OUTPUT -s 192.168.117.133 -m state  --state ESTABLISHED -j ACCEPT
  •     [root@wxC7 ~]# iptables -A INPUT -d 192.168.117.133 -j REJECT
  •     [root@wxC7 ~]# iptables -A OUTPUT -s 192.168.117.133 -j REJECT
  •     [root@wxC7 ~]# iptables -R  OUTPUT 2 -s 192.168.117.133 -p udp -m multiport --sports 123,323 -m state --state NEW -j ACCEPT
  •   要放行RELATED装态
  •           [root@wxC7 ~]# iptables -R INPUT 1 -d 192.168.117.133 -m state --state ESTABLISHED,RELATED -j ACCEPT
  •  要追踪RELATED则要手动加载模块 :
  •         modprobe  nf_conntrack_ftp
  •              技术分享
  •              技术分享技术分享技术分享

 处理动作(跳转目标):

  •         -j targetname [per-target-options]
  •             简单target:
  •                 ACCEPT, DROP
 
  •   扩展target:
  •           REJECT
  •                      这用于响应匹配包发送错误数据包:否则它相当于下降,因此它是终止目标、结束规则遍历。
  •              --reject-with type
  •                     The type given can be icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐ able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited (*), which return  the  appropriate ICMP  error  message (icmp-port-unreachable is the default).
  •                技术分享   
  •  LOG打开匹配包的内核日志记录
  •                     --log-level
  •                     --log-prefix
  •                     默认日志保存于/var/log/messages
  • 示例:  必须在其访问之前做追踪
  •     [root@wxC7 ~]# iptables -I INPUT 3 -d 192.168.117.133 -p tcp --dport 23 -m state --state NEW -j LOG
  •          也可以加个前缀表示访问telnet服务
  •      [root@wxC7 ~]# iptables -I INPUT 3 -d 192.168.117.133 -p tcp --dport 23 -m state --state NEW -j LOG --log-prefix "access telnet "              
  •                 技术分享

 

自定义规则连

  •   示例: 定义ping 的规则
  •           [root@wxC7 ~]# iptables -N in_ping_rules
  •        [root@wxC7 ~]# iptables -A in_ping_rules -d 192.168.117.133 -p icmp --icmp-type 8 -j ACCEPT
  • 拒绝指定ip访问
  •     [root@wxC7 ~]# iptables -I in_ping_rules -d 192.168.117.133 -s 192.168.117.131 -p icmp -j REJECT
  •  规则链调用
  •        [root@wxC7 ~]# iptables -I INPUT 5 -d 192.168.117.133 -p icmp -j in_ping_rules技术分享
  •    注意自定义链 一旦被引用 删不掉的
  •     要删 清空其规则链

 保存和载入规则:

  •         iptables规则定义完后都在内存中
  •         保存:iptables-save > /PATH/TO/SOME_RULE_FILE
  •         重载:iptabls-restore < /PATH/FROM/SOME_RULE_FILE
  •             -n, --noflush:不清除原有规则 追加进去       
  • 示例:
  •       [root@wxC7 ~]# iptables-save > /etc/sysconfig/iptables-20170613-01
  •       [root@wxC7 ~]# iptables-restore < /etc/sysconfig/iptables-20170613-01
  •         CentOS 6:
  •             保存规则:
  •                 service iptables save
  •                 保存规则于/etc/sysconfig/iptables文件,覆盖保存;
  •             重载规则:
  •                 service iptables restart :重载覆盖
  •                 默认重载/etc/sysconfig/iptables文件中的规则
  •             配置文件:/etc/sysconfig/iptables-config
  •      
  •     规则优化的思路:
  •         使用自定义链管理特定应用的相关规则,模块化管理规则;
  •         (1) 优先放行双方向状态为ESTABLISHED的报文;
  •         (2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
  •         (3) 服务于同一类别的功能的规则,匹配条件较严格的放在前面;
  •         (4) 设置默认策略:白名单机制
  •             (a) iptables -P,不建议;
  •             (b) 建议在规则的最后定义规则做为默认策略;
  •          

 iptables/netfilter网络防火墙

  •         (1) 网关;主机要打kail核心转发功能
  •         echo 1 >   /proc/sys/net/iPv4/ip_forward
  •         (2) filter表的FORWARD链;添加规则
  • 模拟测试首先搭建一个网络
  • 技术分享技术分享
  •    此网络联通后做访问控制
  •           对于对于外网80端口访问控制
  •  (1)   [root@wxC6 ~]# iptables -A FORWARD -j REJECT
  •         [root@wxC6 ~]# iptables -I FORWARD -s 192.168.174.0/24 -p tcp --dport 80 -j ACCEPT
  •         [root@wxC6 ~]# iptables -I FORWARD 2 -d 192.168.10.0/24 -p tcp --sport 80 -j ACCEPT
  •  (2) 基于state状态控制
  •         [root@wxC6 ~]# iptables -A FORWARD -j REJECT
  •         [root@wxC6 ~]# iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT
  •         [root@wxC6 ~]# iptables -I FORWARD 2 -s 192.168.174.0/24 -m state --state NEW -j ACCEPT 
  •         [root@wxC6 ~]# iptables -I FORWARD 3 -d 192.168.174.0/24 -p tcp --dport 80 -m state --state NEW -J ACCEPT
  • (3) 多端口放行控制
  •         [root@wxC6 ~]# iptables -I FORWARD 4 -d 192.168.174.129 -p tcp -m multiport --dports 21:23,80,139,443,445 -m state --state NEW -j ACCEPT
  •         [root@wxC6 ~]# iptables -I FORWARD 5 -d 192.168.174.129 -p udp --dport 137:138 -m state --state NEW -j ACCEPT
  • (4) 放行外网RELATED状态访问
  •      [root@wxC6 ~]# iptables -I FORWARD 6 -d 192.168.174.129 -p tcp -m state  --state RELATED -j ACCEP
 
  •         要注意的问题:
  •             (1) 请求-响应报文均会经由FORWARD链,要注意规则的方向性;
  •             (2) 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行;
 

 NAT: Network Address Translation

  •             网络地址转换:隐藏地址(把请求报文的源地址转换为网关地址)
  •             请求报文:由管理员定义;
  •             响应报文:由NAT的conntrack机制自动实现;
  •             请求报文:
  •                 改源地址:SNAT,MASQUERADE
  •                 改目标地址:DNAT
  •         iptables/netfilter:
  •             NAT定义在nat表;
  •                 PREROUTING,INPUT,OUTPUT,POSTROUTING
  •                 SNAT:POSTROUTING
  •                 DNAT:PREROUTING
  •                 PAT:
  •       target:
  •             SNAT:
  •                 This  target  is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.
 
  •                 --to-source [ipaddr[-ipaddr]]
  • 示例:  
  •           转换地址为网关地址
  •           [root@wxC6 ~]# iptables -t nat -A POSTROUTING -s 192.168.174.0/24 -j SNAT --to-source 172.16.251.106
  •            技术分享
  •               技术分享   
  •               技术分享
  •               技术分享
  •  MASQUERADE 
  •             这个目标只适用于nat表,在POSTROUTING链。它应该只被用于动态分配的IP(拨号)连接:如果你有一个静态IP地址,你应该使用SNAT目标
  •             用于SNAT场景中应用于POSTROUTING链上的规则实现源地址转换,但外网地址不固定时,使用此target;
  •  DNAT:
  •              这个目标只适用于nat表,在PREROUTING和OUTPUT链,和用户定义的调用这些链的链。
  •                 --to-destination [ipaddr[-ipaddr]][:port[-port]] 转到目标xx
  •    示例:         
  •           [root@wxC6 ~]# iptables -t nat -A PREROUTING -d 172.16.251.106 -p tcp --dport 80 -j DNAT --to-destination 192.168.174.136
  •           [root@wxC6 ~]# iptables -t nat -I PREROUTING -d 172.16.251.106 -p tcp --dport 80 -j DNAT --to-destination 192.168.174.136:8080
  •  
  •  REDIRECT
  •                  端口映射(重定向) 
  •                 这个目标只适用于nat表,在PREROUTING和OUTPUT链,和用户定义的调用这些链的链。
  •                 --to-ports port[-port]
  •      示例:
  •            [root@wxC6 ~]# iptables -A PREROUTING -t nat -d 192.168.174.136 -p tcp --dport 80 -j      REDIRECT --to-ports 8080
 
 

iptables防火墙过滤规则