互联网的公开,我们面临很多便利,同时也面临许多安全问题,数据加密,安全访问控制,等等,我们最常见的就是在网络的进出口进行访问的控制,这时防火墙就出现了,常见的防火墙分为硬件防火墙和软件防火墙,硬件防火墙在进行数据处理上会较快,控制比较严格,但价格都不菲,现在很多中小型企业都会采用软件防火墙。下面我们就深入介绍linux下iptables的设置。

原理简介:防火墙工作在网络边缘或者主机边缘,防火墙为了实现访问控制,会包括很多策略(policy),数条规则(rules)就组成了策略,常见的防火墙根据工作的层次不同可以分为工作在三层的网络层防火墙和七层的代理服务器(应用型网关),网络层防火墙根据数据包首部的ip地址或端口进行规则匹配,七层防火墙根据数据包的应用协议进行规则匹配和处理,安全性更高但效率较低,为了防止防火墙成为瓶颈,我们常会采用分布式防火墙,负载均衡的防火墙,或防火墙联动系统。

linux下的防火墙:iptables,早期叫ipfirewall,能够实现对数据包进行检查并进行过滤的软件,而tcp/ip协议栈是放在内核(kernel)中,所以要想规则生效,就必须把这些规则放进内核中;当两个网络进行通信时,由于网卡的驱动程序都放在内核中,主机会检查路由表,直接将数据包进行转发,而我们的防火墙规则则是在用户空间中,无法对数据进行控制,这是早期ipfirewall遇到的问题。当发展到2.0版本时就变成ipchains,发展到现在就演变成iptables,他们都是工作在用户空间定义的规则。工作在内核空间的结合iptables的规则叫做netfilter。



1)防火墙的三表五链:三表分别是filter,nat,mangle,五链分别PREROUTING,INPUT,FORWRAD,OUTPUT,POSTROUTING。     

  1. filter:允许/不允许 

  2.   INPUT,FORWARD,OUTPUT 

  3.  nat:地址修改 

  4.   PREROUTING,OUTPUT,POSTROUTING 

  5.  mangle:修改报文数据 

  6.   PREROUTING,INPUT,FORWRAD,OUTPUT,POSTROUTING

防火墙策略:通则全通,堵则单堵,自上而下匹配规则

 

2)iptables的规则:

   iptables [-t  table] COMMAND chain  CRETIRIA  -j  ACTION

   COMMAND

   链管理命令:

  1. -P  设定默认策略(门是否开) 
  2.   # iptables  -P INPUT {DROP|ACCECT} 立即生效 
  3. -F  清空规则链 
  4.   # iptables  -t  nat -F PREROUTING(表类型必须指定,链类型也要指定) 
  5. -N  用户自定义的新链  必须和系统链关联才能生效 
  6.   # iptables  -N  inbound_tcp_web 
  7. -X  删除链,之前必须清空链 
  8. -E  给自定义的name改名 
  9. -Z  清空链默认规则及其他规则的计数器    
  规则管理命令:
  1. -A  在链的最后追加 
  2. -I  num 3 插入链中第几条 
  3. -R  修改(替换)规则 
  4.  # iptables -R  -s  172.16.0.0/16  -p udp  --dport 
  5.  # iptables  -R 3  替换第几行 
  6. -D  num  删除第几行  
   查看命令:
  1. -L  
  2.   -n  以数字方式显示 
  3.   -v  显示详细信息 -vv更详细的 -vvv更详细的 
  4.   -x  查看计数器的精确值(默认当增加时会换算单位) 
  5.   --line-numbers  显示行号
   匹配标准:      通用匹配:
  1. -s,--src,--source  源地址匹配(必须指定ip/netmask) 
  2.    IP,NETWORK/NETMASK,0.0.0.0/0.0.0.0 
  3. -d 目标地址 
  4. -p 协议匹配(tcp|udp|icmp) 
  5. -i 数据的流入接口 
  6.   -i  eth0 
  7. -o  数据流出接口 
  8.   -o  eth0 
  9.  用在OUTPUT,POSTROUTING,使用的范围不同
     扩展匹配:        隐含扩展(指定某种特定端口,协议的扩展)
  1. -p tcp 
  2.   --dport 不能指定间隔端口,只能21-23 
  3.   --sport 
  4.   --tcp-flags 参数两个:检查的标志位,必须为1的标志位 
  5.       SYN,ACK,FIN,PSH,RST,URG  tcp的标志位 
  6.       例:--tcp-flags SYN,ACK,FIN,RST  syn 相当于--syn   第一次连接的数据包 
  7.     (匹配syn为1,其他为零的数据包) 
  8. -p  udp 
  9.     --dport 不能指定间隔端口,只能21-23 
  10.     --sport 
  11.  
  12. -p   icmp 
  13.     --icmp-type 
  14.       echo-request  8 请求回显 
  15.       echo-reply    0 响应  
  16.        
       显式扩展         -m 指定模块           -p tcp -m  multiport --dports 21,23,80  匹配多个端口    
  1. l7-filter  (应用层模块) 
  2.           connlimit   限制某个服务对于每个ip每次最多发起的最大连接数 
  3.            --connlimit-above 5   大于5个   拒绝 
  4.            !--connlimit-above  5  小于5的 接受 
  5.        例: #iptables  -p tcp --syn --dport 23 -m !--connlimit-above 2 -j ACCEPT 


          iprange     

  1. --src-range 
  2. --dst-range 
  3.        例:#iptables -A FORWARD -m  iprange  --src-range  172.16.0.1-172.16.0.100  -dst-range 172.16.0.1-172.16.0.2 -p tcp --dport 80 -j  ACCEPT 


          limit
            

  1. --limit rate 3/minutes    限制匹配数据包的频率 
  2. --limit-burst number      限制峰值
           mac             
  1. --mac-source  匹配mac的源地址,和防火墙在同一网段的主机的mac地址 


 
          multiport
           

  1. --source-ports       源端口 
  2. --destination-ports  目标端口 最多一次指定15个端口 
  3. --ports 


          string
           

  1. --algo   字符串匹配算法 bm|kmp 
  2. --from offset 
  3. --to 
  4. --string 
  5. 例: 
  6. #iptables  -A  FORWARD  -m  string --string "qq" --algo bm -j REJECT 

          time 
           
  1.  --timestart   HH:MM 
  2.  
  3.  --timestop    HH:MM 
  4.  
  5.  --days        周几 
  6.  
  7. --datestart    YYYY:MM:DD:hh:mm 
  8.  
  9. --datestop 

      
          LOG
            
  1. --log-prefix 
  2.  例: 
  3. #iptables  -A INPUT  -d  172.16.100.1 -p  tcp --dport 22  -j  LOG  --log-prefix  "IPTABLES  ..." 

    
 ACTION:
   -j 
   
  1. DROP           默默的拒绝 
  2.  
  3.  REJECT         悄悄丢弃 
  4.  
  5.  ACCEPT         接受 
  6.  
  7.  custom_chain   转向自定义的链 
  8.  
  9.  SNAT          源地址转换 
  10.  
  11.  DNAT          目标地址转换 
  12.  
  13.  MASQUERADE    源地址伪装 
  14.  
  15.  REDIRECT      端口重定向 
  16.  
  17.  MARK(mangle)标记 
  18.  
  19.  RETURN        返回重新匹配 
  20.  
  21.  LOG           显示日志 


 状态检测:防止其他木马的伪装(基于tcp)
   
  1. NEW          第一次连接(SYN为1,其他位为0) 
  2.  
  3. ESTABLISHED  已经建立的连接(ACK为1,其他位为0) 
  4.  
  5. INVALID      不合法的连接(ACK和RST均为1) 
  6.  
  7. RELATED      相关联的连接(一般是用于ftp) 

 
  1.  例:#iptables -A INPUT  -s 192.168.0.0/24 -d 192.168.0.100 -p tcp --dport 22 -m state --state NEW,ESTABLSHED  -j ACCEPT 
  2.  
  3.     放行所有的已建立连接的服务出去 
  4. #iptables -A OUTPUT -s 192.168.0.100  -m state --state ESTABLSHED -j ACCEPT 

3)iptables的相关配置文件:
  规则的配置文件:/etc/sysconfig/iptables  
    
  1. #service iptables  save 
  2.  
  3. #iptables-save > /etc/sysconfig/iptables.2    保存文件 
  4.  
  5. #iptables-restore < /etc/sysconfig/iptables.2 手动生效 


4)iptables相关规则的书写:
 允许ssh连入,
  
  1. #iptables -t filter -A  INOUT  -s  192.168.0.0/24 -d  192.168.0.100 -p tcp --dport 22 -j ACCECT 
  2.  
  3.  #iptables -t filter -A  INOUT  -s  192.168.0.100 -d  192.168.0.0/24 -p tcp --sport 22 -j ACCECT 


 允许192.168.0.0/24网段ping本主机及本主机ping本主机
 
  1. #ipables  -R  INPUT 2 -s 192.168.0.0/24 -d 192.168.0.100  -p  tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT 
  2.  
  3.  #iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT 
  4.  
  5.  #iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT 

  
   允许172.16.0.0/16网段连接192.168.0.100的httpd,samba,sshd服务,但拒绝172.16.0.100:
   
  1. #iptables -A INPUT -s 172.16.0.100 -d 192.168.0.100 -m multiport --destination-ports 22,80,139,445,137,139  -j  DROP 
  2.  
  3. #iptables -A INPUT -s 172.16.0.0/16 -d 192.168.0.100 -p tcp -m multiport --destination-ports  22,80,139,445 -m state --state NEW,ESTABLSHED -j ACCEPT 
  4.  
  5. #iptables -A INPUT -s 172.16.0.0/16 -d 192.168.0.100 -p udp -m multiport --destination-ports  137,138 -m state --state NEW -j ACCEPT 
  6.  
  7. #iptables -A OUTPUT -m state --state ESTABLSHED -j ACCEPT 
  8.  
  9. #iptables -P INPUT DROP 
  10.  
  11. #iptables -P OUTPUT DROP 

  
  允许外网172.16.0.100访问内网192.168.10.0/24
   
  1. #iptables  -A FORWARD -s 172.16.0.0/16 -p icmp --icmp-type 8 ACCEPT 
  2.  
  3. #iptables  -A FORWARD -d 172.16.0.0/16 -p icmp --icmp-type 0 ACCEPT 


  限制dns:
  #iptables  -t filter -A  INPUT -s 172.16.0.0/16  -p  udp  --dport  53  -j DROP
  
  源地址转换:SNAT
   
  1. #iptables -t nat -A POSTROUTING  -s 192.168.0.0/24 -j SNAT --to-source 172.16.100.1 

 
 目标地址转换:DNAT 
   
  1. #iptables -t nat -A PREROUTING  -d 192.168.0.15 -j DNAT --to-destination 172.16.0.50 
  2.  
  3. 地址伪装 :MASQUERADE(当访问的外网地址是动态时使用地址伪装) 
  4.  
  5. #iptables -t nat -A POSTROUTING  -s 192.168.0.0/24 -j MASQUERADE 


#########################################################################
5)编译 l7-filter,扩展iptables,现在由clearfoundation组织接收进行开发
   对内核打补丁
    
  1. # tar zxvf  linux-2.6.28.10.tar.gz  -C  /usr/src 
  2.  
  3. # tar zxvf  netfilter-layer7-v2.22.tar.gz  -C  /usr/src 
  4.  
  5. # ln –s  /usr/src/linux-2.6.28.10/   /usr/src/linux 
  6.  
  7. # cd /usr/src/linux/ 
  8.  
  9. # patch -p1  <  ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch  
  10.  
  11.  
  12.  
  13. # cp /boot/config-2.6.18-164.el5  /usr/src/linux/.config 
  14.  
  15. # make  menuconfig 

这里为编译内核特别注意几个选项:
   Networking support → Networking Options →Network packet filtering framework    →Core Netfilter Configuration

  1. <M>  Netfilter connection tracking support  
  2.  
  3. <M>  “layer7” match support 
  4.  
  5. <M>  “string” match support 
  6.  
  7. <M>  “time”  match support 
  8.  
  9. <M>  “iprange”  match support 
  10.  
  11. <M>  “connlimit”  match support 
  12.  
  13. <M>  “state”  match support 
  14.  
  15. <M>  “conntrack”  connection  match support 
  16.  
  17. <M>  “mac”  address  match support 
  18.  
  19. <M>   "multiport" Multiple port match support 

 
 Networking support → Networking Options →Network packet filtering framework → IP: Netfilter Configuration
 
  1. 
    
  2. <M> IPv4 connection tracking support (required for NAT) 
  3.  
  4. <M>   Full NAT 
  5.  
  6. <M>     MASQUERADE target support                                               
  7. <M>     NETMA target support                                                  
  8.  <M>     REDIRECT target support  

注:这里的其他选项可以根据自己的需要安装相应的模块

开始编译内核
  
  1. #make  
  2.  
  3. #make modules_install 
  4.  
  5. #make install 
  6.  
  7. #reboot《-------这里必须要重启并选用编译的内核 

配置iptables:
    
  1. # cp /etc/init.d/iptables ~/iptables 
  2.  
  3. # cp /etc/init.d/iptables-config  ~/ 
  4.  
  5. # rpm  -e  iptables-ipv6  iptables  iptstate  --nodeps《----卸载原来的iptables 
  6.  
  7. # tar jxvf iptables-1.4.6.tar.bz2 –C  /usr/src 
  8.  
  9. # cd /usr/src/iptables-1.4.6 
  10.  
  11. # cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-    2.6.20forward/libxt_layer7.*   ./extensions/《----拷贝扩展模块文件 
  12.  
  13. #./configure  --prefix=/usr  --with-ksource=/usr/src/linux 
  14.  
  15. #make  && make install 


编译l7-filter:
    
  1. # tar zxvf l7-protocols-2009-05-28.tar.gz 
  2.  
  3. # cd l7-protocols-2009-05-28 
  4.  
  5. # make install 
  6.  
  7. # vim ~/iptables 
  8.  
  9.    把文中/sbin/$IPTABLES 都改为/usr/sbin/$IPTABLES 
  10.  
  11. # mv ~/iptables  /etc/rc.d/init.d/ 
  12.  
  13. # cp  ~/iptables-config  /etc/sysconfig/ 
  14.  
  15. # service iptables start 
  16.  
  17. # hash -r 

    
这里您就可以使用l7的扩展功能了,可以基于各种应用层协议进行控制。

  1. 控制192.168.0.0/24网段的主机不能访问qq: 
  2.  
  3. #iptables -t filter -A FORWARD -s 192.168.0.0/24 -m layer7 --l7proto qq -j REJECT