感谢支持
我们一直在努力

iptables防火墙详解及使用layer7阻止qq,酷狗,等P2P软件

防火墙其实就是一个加固主机或者网络安全的一个设备或者软件而已,通过防火墙可以隔离风险区域与安全区域的连接,同时不会妨碍风险区域的访问.当然需要注意的是世界上没有绝对的安全,防火墙也只是启到一定的安全防护,那么下面来说下防火墙的几种分类,


第一种软件防火墙,软件防火墙需要运行在特定的计算机上,而且需要计算机的操作系统的支持,


第二种硬件防火墙,硬件防火墙其实就是一个普通pc机的架构,然后上面跑有专门的操作系统.


第三种芯片级的防火墙,这种防火墙基于专门的硬件平台,没有操作系统,专有的ASIC芯片使它们比其他类的防火墙速度更快,处理能力极强,性能更高,但是价格却极其昂贵,


从技术方面实现的防火墙也可分为三种,


第一种包过滤型防火墙,这类的防火墙主要是工作在网络层,根据事先设定好的规则进行检查,检查结果根据事先设定好的处理机制进行处理


第二种应用层防火墙,它是工作在TCP/IP模型中的最高层应用层,相比较来说速度要慢一点


第三种状态监视器,状态监视做为防火墙其安全性为最佳,但配置比较复杂,且网络速度较慢


一般在企业中防火墙的部署有以下几种


一,单宿主堡垒主机  ,由于使用的rhel6.2的系统,做图不是很好做,所以没有图,只有简单的介绍


单宿主堡垒主机其实就是单台服务器有防火墙,只为单台服务器防护,


二,双宿主堡垒主机,


双宿主堡垒主机是一台装有两块网卡的堡垒主机,一般这台堡垒主机应用在网关,防护局域网跟广域网之间通信等安全


三,三宿主堡垒主机


三宿主堡垒主机是一台装有三块网卡的堡垒主机,那么他将外网,内网,DMZ 三个区域隔离开来,同时保护内网已经DMZ区域的安全等


四,背靠背,  这个的话没图解释起来比较复杂,我在网上搜一张图片吧



不用解释一看图就知道是怎么回事了. 实际上前端防火墙是防护外网到DMZ区域以及到内网,后端防火墙是防护内网到DMZ区域的安全


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
说了这么多下面来说说linux上面的iptables的应用吧,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
目录
一,IPTABLES的简介
二,IPTABLES的表和链
三,IPTABLES的几个状态
四,IPTABLES的命令及使用
五,IPTABLES的脚本编写
六,给内核打layer7补丁,并重新编译内核及IPTABLES来实现封杀QQ,酷狗,迅雷,等软件


注:个人的总结,当然也从一些书籍里面找了一些资料,写的不全,还望大家多多指点,thx!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

一,IPTABLES的简介
1.  简介
     IPTABLES/netfilter(http://www.netfilter.org) 其实大多数人都认为iptables是linux系统上的一个服务,其实不是的. 我们linux系统上的服务比如说httpd服务在启动起来的时候,是不是在后台启动一个相应的服务进程且在网卡上监听一个端口,而iptables却不然,那么iptables到底是什么呢?其实iptables只是一个工具而已.我们的linux系统有用户空间,和内核空间,而iptables有两个组件,一是netfilter,  netfilter组件只是用来过滤防火墙规则,及作出相应的处理机制的,它是集成在内核中的一部分,也就是说它是工作在内核空间的,那么大家都知道用户是不可能直接跟内核空间打交道的,那么netfilter只是工作在内核空间对规则进行处理的,那么规则从何而来呢? 是从iptables的第二个组件iptables而来的,我们上面说了IPTABLES只是一个工作在用户空间的一个工具而已,那么用户就使用这个工具的一个命令来跟工作在内核空间中的netfiter组件打交道的.其实IPTABLES防火墙就是这样的.

二,IPTABLES的表和链
     IPTABLES常用的表和链有三个filter表 nat表 mangle表, 和五个链 INPUT链 OUTPUT链 FORWARE链 POSTROUTING链 PREROUTING链,  下面来介绍下它们的各个功能呢个功能,
1.filter表
   filter表主要是过滤数据包的,IPTABLES几乎所有的数据包过滤都在此表中实现的,filter表也是IPTABLES中默认的表,此表中还包含三个链如下
1.1 INPUT链
      过滤所有的目标地址是本机的数据包
1.2 OUTPUT链
      过滤所有从本机出去的数据包
1.3 FORWORD链
      过滤所有从本机路过的数据包

2.nat表
   nat表主要是用于做网络地址转换的(NAT) 在IPTABLES中可以做SNAT(源地址转换),DNAT(目标地址转换),PANT(即跟SNAT差不多,不一样的是SNAT的源地址是固定的,而PNAT的源地址是不固定的,当使用ppp 或pppoe的方式连接互联网的时候一般适应这中) 。 nat表中包含两个链如下
2.1 PREROUTING链
      在数据包到达防火墙的时候改变目标地址 DNAT应用于此链.
2.2 OUTPUT链
      可以改变本地产生的数据包的目标地址
2.3 POSTROUTING链
      在数据包离开防火墙的时候改变源地址,SNAT应用于次链

3. mangle表
    mangle表主要是修改数据包头部信息的,此表中包含以下5条链
3.1 PREROUTING链,
      在数据包进入防火墙之后,也称为路由前,
3.2 POSTROUTING链,
       在数据包确定目标地址后,也称为路由后,
3.3 OUTPUT链
       从本机出去的时间包路由前
3.4 INPUT链
       数据包进入本机后,路由后
3.5 FORWARD链
       第一次路由判断之后,最后一次路由判断之前改变数据包

三,IPABLES的状态
     IPTABLES的状态跟踪连接有4种,分别是,NEW,ESTABLISHED,RELATED,INVALID,除了从本机出去的数据包有nat表的OUTPUT链处理外,其他说有的状态跟踪都在nat表中的PREROUTING链中处理,下面来说下4种状态是什么,
1,NEW状态
   NEW状态的数据包说明这个数据包是收到的第一个数据包,
2,ESTABLISHED状态,
   只要发送并接到应答,一个数据包的状态就从NEW变为ESTABLEISHED,而且该状态会继续匹配这个连接后继数据包,
3,RELATED状态
   当一个数据包的状态处于ESTABLSHED状态的连接有关系的时候,就会被认为是RELATED,也就是说一个链接想要是RELATED状态,首先要有一个ESTABLISHED的连接,
4,INVALID状态
   不能被识别属于哪个连接状态或没有任何关系的状态,一般这中数据包要被拒绝的

四,IPTABLES命令的使用详解
    iptables在RHEL的系统上默认安装的, IPTABLES的命令选项主要分为这么几大类,规则管理,链管理,默认管理,查看,匹配条件,处理动作,基本应该就这些了吧,下面来一一说名,
1,规则管理类
  1. #iptables -A    添加一条新规则 
  2. #iptables -I    插入一条新规则 -I 后面加一数字表示插入到哪行 
  3. #iptables -D    删除一条新规则 -D 后面加一数字表示删除哪行 
  4. #iptables -R    替换一条新规则 -R 后面加一数字表示替换哪行 

2.链管理类

  1. #iptables -F    清空链中的所有规则 
  2. #iptables -N    新建一个链 
  3. #iptables -X    删除一个自定义链,删除之前要保证次链是空的,而且没有被引用 
  4. #iptables -E    重命名链 

3.默认管理类

  1. #iptables -P    设置默认策略 

4,查看类

  1. #iptables -L    查看规则 -L还有几个子选项如下 
  2. #iptables -L -n 以数字的方式显示 
  3. #iptables -L -v 显示详细信息 
  4. #iptables -L -x 显示精确信息 
  5. #iptables -L –line-numbers 显示行号

5,条件匹配类
5.1 基本匹配

  1. 条件匹配也可以使用 ! 取反 
  2. -s    源地址 
  3. -d    目标地址 
  4. -p    协议{tcp|udp|icmp} 
  5. -i    从哪个网络接口进入,比如 -i eth0 
  6. -o    从哪个网络接口出去,比如 -o eth0 

5.2扩展匹配
5.2.1隐含扩展匹配

  1. -p {tcp|udp} –sport   指定源端口 
  2. -p {tcp|udp} –dport   指定目标端口 

5.2.2显示扩展匹配

  1. -m state –state   匹配状态的 
  2. -m mutiport –source-port   端口匹配 ,指定一组端口 
  3. -m limit –limit 3/minute   每三分种一次 
  4. -m limit –limit-burst  5   只匹配5个数据包 
  5. -m string –string –algo bm|kmp –string “xxxx”  匹配字符串 
  6. -m time –timestart 8:00 –timestop 12:00  表示从哪个时间到哪个时间段 
  7. -m time –days    表示那天 
  8. -m mac –mac-source xx:xx:xx:xx:xx:xx 匹配源MAC地址 
  9. -m layer7 –l7proto qq   表示匹配腾讯qq的 当然也支持很多协议,这个默认是没有的,需要我们给内核打补丁并重新编译内核及iptables才可以使用 -m layer7 这个显示扩展匹配,  

6,处理动作类

  1. -j ACCEPT     允许 
  2. -j REJECT     拒绝 
  3. -j DROP       拒绝并提示信息 
  4. -j SNAT       源地址转换 
  5. -j DNAT       目标地址转换 
  6. -j REDIRECT   重定向 
  7. -j MASQUERAED 地址伪装 
  8. -j LOG –log-prefix “说明信息,自己随便定义”      记录日志 
五,IPTABLES脚本的编写
     IPTABLES 脚本里面其实就是敲的一系列命令而已下面给个例子,介绍下iptables命令的使用及IPTABLES脚本的编写
1.IPTABLES脚本实例
  1. #vim /ipt.sh
  2. #!/bin/bash 
  3. # 2012,07,09 
  4. # andy_f 
  5. #定义变量 
  6. mynet=192.168.0.0/24 
  7. myip=192.168.0.100 
  8. IPT=/sbin/iptables 
  9.  
  10. #加载ftp模块 
  11. modprobe ip_conntrack-ftp 
  12. modprobe ip_nat_ftp 
  13.  
  14. #开启路由转发功能 
  15. echo “1” /proc/sys/net/ipv4/ip_forward 
  16.  
  17. #清空所有表中的规则 
  18. $IPT -F 
  19. $IPT -t nat -F 
  20. $IPT -t mangle -F 
  21.  
  22. #删除所有自定义链 
  23. $IPT -X 
  24. $IPT -t nat -X 
  25. $IPT -t mangle -X 
  26.  
  27. #设置默认策略 
  28. $IPT -P INPUT DROP 
  29. $IPT -P OUTPUT DROP 
  30. $IPT -P FORWARD ACCEPT 
  31.  
  32. #允许状态为ESTABLISHED,RELATED的访问本机,及状态为NEW的从本机出去 
  33. $IPT -A INOUT -m state –state ESTABLISHED,RELATED -j ACCEPT 
  34.  
  35. #允许本地环回口访问 
  36. $IPT -A INPUT -i lo -j ACCEPT 
  37. $IPT -A OUTPUT -o lo -j ACCEPT 
  38.  
  39. #允许管理员主机访问本地ssh服务 
  40. $IPT -A INPUT -s $myip -m state –state NEW -p tcp –dport 22 -j ACCEPT 
  41. $IPT -A OUTPUT -d $myip -p tcp –sport 22 -j ACCEPT 
  42.  
  43. #允许局域网的ping请求 
  44. $IPT -A INPUT -s $mynet -p icmp –icmp-type 8 -j ACCEPT 
  45. $IPT -A OUTPUT -d $mynet -p icmp –icmp-type 0 -j ACCEPT 
  46.  
  47. #为局域网做SNAT 
  48. $IPT -t nat -A POSTROUTING -s $mynet -j SNAT –to-source 172.16.100.1 
  49.  
  50. #为局域网内部的web服务器做DNAT 
  51. $IPT -t nat -A PREROUTING -d 172.16.100.1 -p tcp –dport 80 -j DNAT –to-destination 192.168.0.2 
  1. 让下次开机自动加载脚本 
  2. #echo “/bin/bash /ipt.sh” >> /etc/rc.local 



六,给内核打layer7补丁,并重新编译内核及IPTABLES来实现封杀QQ,酷狗,迅雷,等软件
     做为网络管理员,对P2P,QQ,酷狗,等软件是又爱又恨,大多数公司,为了提高工作效率禁止公司员工上QQ,看视频等,  在市场上买专门的上网行为管理设备,随便都是好几W,而使用linux来做网关,一样可以禁止qq,酷狗等软件,成本才几千块,下面将介绍下怎么实现的,
1.重新编译内核
1.1 ,安装基本来发库及相关依赖软件,这里使用yum安装

  1. #yum -y groupinstall “Development Libraries” “Development Tools” 
  2. #yum -y install ncurses-devel 

1.2下载内核源代码,及layer7补丁,并重修编译内核,这里使用的内核版本是2.6.28
      准备两个源码包
       linux-2.6.28.10.tar.gz
       netfilter-layer7-v2.22.tar.gz  准备好了之后讲其复制到/usr/src目录下然后如下

  1. #cd /usr/scr 
  2. #tar xzvf linux-2.6.28.10.tar.gz  
  3. #tar xavf netfilter-layer7-v2.22.tar.gz 
  4. #ln -s linux-2.6.28.10 linux 
  5. #cd /usr/src/linux 
  6. #patch -p1 < ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch 
  7. #cp /boot/config-2.6.28-164.el5 /usr/src/linux/.config 
  8. #make menuconfig  执行之后会出现一个让用户选择内核模块的界面,进入相应的菜单,将下面的模块选上 
  9. Networking support —>>Networking Options —>>Network packet filtering framework —>>Core Netfilter Configuration 
  10. <M>  Netfilter connection tracking support  
  11. <M>  “layer7” match support 
  12. <M>  “string” match support 
  13. <M>  “time”  match support 
  14. <M>  “iprange”  match support 
  15. <M>  “connlimit”  match support 
  16. <M>  “state”  match support 
  17. <M>  “conntrack”  connection  match support 
  18. <M>  “mac”  address  match support 
  19. <M>   “multiport” Multiple port match support 
  20.  
  21.  
  22. Networking support —>Networking Options —>Network packet filtering framework —>IP: Netfilter Configuration 
  23. <M> IPv4 connection tracking support (required for NAT) 
  24. <M>   Full NAT 
  25.     <M>     MASQUERADE target support    
  26.     <M>     NETMAP target support                           
  27.     <M>     REDIRECT target support  
  28.  
  29.  
  30.  
  31.  
  32. 选择完成后保存退出, 
  33. #make 
  34. #make modules_install 
  35. #make install 
  36. 编译完成后重启 
  37. #shutdown -r now 
  38. 需要注意的是系统默认是启动原先的内核的,在开机的时候在grub界面选择启动新的内核 

2.编译安装iptables
2.1卸载系统上自带的rpm格式的iptables

  1. 在卸载之前我们先把iptables的启动脚本及脚本配置文件拷贝到/目录下待会有用 
  2. #cp /etc/init.d/iptables / 
  3. #cp /etc/sysconfig/iptables-config / 
  4. 卸载iptables 
  5. #rpm -e iptables-ipv6  iptables iptstate –nodeps 

2.2编译安装iptables
     首先下载iptables-1.4.6.tar.bz2包到系统的/usr/src目录,然后如下

  1. #cd /usr/src
  2. #tar jxvf iptables-1.4.6.tar.bz2 
  3. #cd iptables-1.4.6 
  4. #cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.* ./extensions/ 
  5. #./configure –prefix=/usr –with-ksource=/usr/src/linux 
  6. #make 
  7. #make install 

3.安装l7protocols 
    l7protocols 是layer7所能够支持的协议包
   下载l7-protocols-2009-05-28.tar.gz到/usr/src目录,然后如下,

  1. #cd /usr/src 
  2. #tar xzvf l7-protocols-2009-05-28.tar.gz 
  3. #cd l7-protocols-2009-05-28 
  4. #make install 

4.修改iptables启动脚本
    就是上面2.1复制的两个文件,在根目录下
4.1 修改iptables启动脚本

  1. 首先将脚本跟配置文件复制到相应的目录然后再做修改  
  2. #cp /iptables-config /etc/sysconfig/  
  3. #cp /iptables /etc/init.d/  
  4. #chmod a+x /etc/init.d/iptables  
  5. #vim /etc/init.d/iptables 把所有/sbin/$IPTABLES替换为/usr/sbin/$IPTABLES   在vim命令模式下:%s@/sbin/$IPTABLES@/usr/sbin/$IPTABLES@g  然后保存退出,  
  6. 我们把修改后的/etc/init.d/iptables 脚本文件贴出来,如下  
  7.  
  8. #!/bin/sh 
  9. # iptables  Start iptables firewall 
  10. # chkconfig: 2345 08 92 
  11. # description:  Starts, stops and saves iptables firewall 
  12. # config: /etc/sysconfig/iptables 
  13. # config: /etc/sysconfig/iptables-config 
  14.  
  15. # Source function library. 
  16. . /etc/init.d/functions 
  17.  
  18. IPTABLES=iptables 
  19. IPTABLES_DATA=/etc/sysconfig/$IPTABLES 
  20. IPTABLES_CONFIG=/etc/sysconfig/${IPTABLES}-config 
  21. IPV=${IPTABLES%tables} # ip for ipv4 | ip6 for ipv6 
  22. PROC_IPTABLES_NAMES=/proc/net/${IPV}_tables_names 
  23. VAR_SUBSYS_IPTABLES=/var/lock/subsys/$IPTABLES 
  24.  
  25. if [ ! -x /usr/sbin/$IPTABLES ]; then 
  26.     echo -n $”/usr/sbin/$IPTABLES does not exist.”; warning; echo 
  27.     exit 0 
  28. fi 
  29.  
  30. if lsmod 2>/dev/null | grep -q ipchains ; then 
  31.     echo -n $”ipchains and $IPTABLES can not be used together.”; warning; echo 
  32.     exit 1 
  33. fi 
  34.  
  35. # Old or new modutils 
  36. /sbin/modprobe –version 2>&1 | grep -q module-init-tools \ 
  37.     && NEW_MODUTILS=1 \ 
  38.     || NEW_MODUTILS=0 
  39.  
  40. # Default firewall configuration: 
  41. IPTABLES_MODULES=“” 
  42. IPTABLES_MODULES_UNLOAD=“yes” 
  43. IPTABLES_SAVE_ON_STOP=“no” 
  44. IPTABLES_SAVE_ON_RESTART=“no” 
  45. IPTABLES_SAVE_COUNTER=“no” 
  46. IPTABLES_STATUS_NUMERIC=“yes” 
  47. IPTABLES_SYSCTL_LOAD_LIST=“” 
  48.  
  49. # Load firewall configuration. 
  50. [ -f “$IPTABLES_CONFIG” ] && . “$IPTABLES_CONFIG” 
  51.  
  52. rmmod_r() { 
  53.     # Unload module with all referring modules. 
  54.     # At first all referring modules will be unloaded, then the module itself. 
  55.     local mod=$1 
  56.     local ret=0 
  57.     local ref
  58.  
  59.     # Get referring modules. 
  60.     # New modutils have another output format. 
  61.     [ $NEW_MODUTILS = 1 ] \ 
  62.     && ref=`lsmod | awk “/^${mod}/ { print \\\$4; }” | tr ‘,’ ‘ ‘` \ 
  63.     || ref=`lsmod | grep ^${mod} | cut -d “[” -s -f 2 | cut -d “]” -s -f 1` 
  64.  
  65.     # recursive call for all referring modules 
  66.     for i in $ref; do 
  67.     rmmod_r $i 
  68.     let ret+=$?; 
  69.     done 
  70.  
  71.     # Unload module. 
  72.     # The extra test is for 2.6: The module might have autocleaned, 
  73.     # after all referring modules are unloaded. 
  74.     if grep -q “^${mod}” /proc/modules ; then 
  75.     modprobe -r $mod > /dev/null 2>&1 
  76.     let ret+=$?; 
  77.     fi 
  78.  
  79.     return $ret 
  80.  
  81. flush_n_delete() { 
  82.     # Flush firewall rules and delete chains. 
  83.     [ -e “$PROC_IPTABLES_NAMES” ] || return 1 
  84.  
  85.     # Check if firewall is configured (has tables) 
  86.     tables=`cat $PROC_IPTABLES_NAMES 2>/dev/null` 
  87.     [ -z “$tables” ] && return 1 
  88.  
  89.     echo -n $”Flushing firewall rules: ” 
  90.     ret=0 
  91.     # For all tables 
  92.     for i in $tables; do 
  93.         # Flush firewall rules. 
  94.     $IPTABLES -t $i -F; 
  95.     let ret+=$?; 
  96.  
  97.         # Delete firewall chains. 
  98.     $IPTABLES -t $i -X; 
  99.     let ret+=$?; 
  100.  
  101.     # Set counter to zero. 
  102.     $IPTABLES -t $i -Z; 
  103.     let ret+=$?; 
  104.     done 
  105.  
  106.     [ $ret -eq 0 ] && success || failure 
  107.     echo 
  108.     return $ret 
  109.  
  110. set_policy() { 
  111.     # Set policy for configured tables. 
  112.     policy=$1 
  113.  
  114.     # Check if iptable module is loaded 
  115.     [ ! -e “$PROC_IPTABLES_NAMES” ] && return 1 
  116.  
  117.     # Check if firewall is configured (has tables) 
  118.     tables=`cat $PROC_IPTABLES_NAMES 2>/dev/null` 
  119.     [ -z “$tables” ] && return 1 
  120.  
  121.     echo -n $”Setting chains to policy $policy: ” 
  122.     ret=0 
  123.     for i in $tables; do 
  124.     echo -n “$i ” 
  125.     case “$i” in 
  126.         raw) 
  127.         $IPTABLES -t raw -P PREROUTING $policy \ 
  128.             && $IPTABLES -t raw -P OUTPUT $policy \ 
  129.             || let ret+=1 
  130.         ;; 
  131.         filter) 
  132.                 $IPTABLES -t filter -P INPUT $policy \ 
  133.             && $IPTABLES -t filter -P OUTPUT $policy \ 
  134.             && $IPTABLES -t filter -P FORWARD $policy \ 
  135.             || let ret+=1 
  136.         ;; 
  137.         nat) 
  138.         $IPTABLES -t nat -P PREROUTING $policy \ 
  139.             && $IPTABLES -t nat -P POSTROUTING $policy \ 
  140.             && $IPTABLES -t nat -P OUTPUT $policy \ 
  141.             || let ret+=1 
  142.         ;; 
  143.         mangle) 
  144.             $IPTABLES -t mangle -P PREROUTING $policy \ 
  145.             && $IPTABLES -t mangle -P POSTROUTING $policy \ 
  146.             && $IPTABLES -t mangle -P INPUT $policy \ 
  147.             && $IPTABLES -t mangle -P OUTPUT $policy \ 
  148.             && $IPTABLES -t mangle -P FORWARD $policy \ 
  149.             || let ret+=1 
  150.         ;; 
  151.         *) 
  152.             let ret+=1 
  153.         ;; 
  154.         esac 
  155.     done 
  156.  
  157.     [ $ret -eq 0 ] && success || failure 
  158.     echo 
  159.     return $ret 
  160.  
  161. load_sysctl() { 
  162.     # load matched sysctl values 
  163.     if [ -n “$IPTABLES_SYSCTL_LOAD_LIST” ]; then 
  164.         echo -n $”Loading sysctl settings: ” 
  165.         ret=0 
  166.         for item in $IPTABLES_SYSCTL_LOAD_LIST; do 
  167.             fgrep $item /etc/sysctl.conf | sysctl -p – >/dev/null 
  168.             let ret+=$?; 
  169.         done 
  170.         [ $ret -eq 0 ] && success || failure 
  171.         echo 
  172.     fi 
  173.     return $ret 
  174.  
  175. start() { 
  176.     # Do not start if there is no config file. 
  177.     [ -f “$IPTABLES_DATA” ] || return 1 
  178.  
  179.     echo -n $”Applying $IPTABLES firewall rules: ” 
  180.  
  181.     OPT
  182.     [ “x$IPTABLES_SAVE_COUNTER” = “xyes” ] && OPT=“-c” 
  183.  
  184.     $IPTABLES-restore $OPT $IPTABLES_DATA 
  185.     if [ $? -eq 0 ]; then 
  186.     success; echo 
  187.     else 
  188.     failure; echo; return 1 
  189.     fi 
  190.      
  191.     # Load additional modules (helpers) 
  192.     if [ -n “$IPTABLES_MODULES” ]; then 
  193.     echo -n $”Loading additional $IPTABLES modules: ” 
  194.     ret=0 
  195.     for mod in $IPTABLES_MODULES; do 
  196.         echo -n “$mod ” 
  197.         modprobe $mod > /dev/null 2>&1 
  198.         let ret+=$?; 
  199.     done 
  200.     [ $ret -eq 0 ] && success || failure 
  201.     echo 
  202.     fi 
  203.      
  204.     # Load sysctl settings 
  205.     load_sysctl 
  206.  
  207.     touch $VAR_SUBSYS_IPTABLES 
  208.     return $ret 
  209.  
  210. stop() { 
  211.     # Do not stop if iptables module is not loaded. 
  212.     [ -e “$PROC_IPTABLES_NAMES” ] || return 1 
  213.  
  214.     flush_n_delete 
  215.     set_policy ACCEPT 
  216.      
  217.     if [ “x$IPTABLES_MODULES_UNLOAD” = “xyes” ]; then 
  218.     echo -n $”Unloading $IPTABLES modules: ” 
  219.     ret=0 
  220.     rmmod_r ${IPV}_tables 
  221.     let ret+=$?; 
  222.     rmmod_r ${IPV}_conntrack 
  223.     let ret+=$?; 
  224.     [ $ret -eq 0 ] && success || failure 
  225.     echo 
  226.     fi 
  227.      
  228.     rm -f $VAR_SUBSYS_IPTABLES 
  229.     return $ret 
  230.  
  231. save() { 
  232.     # Check if iptable module is loaded 
  233.     [ ! -e “$PROC_IPTABLES_NAMES” ] && return 1 
  234.  
  235.     # Check if firewall is configured (has tables) 
  236.     tables=`cat $PROC_IPTABLES_NAMES 2>/dev/null` 
  237.     [ -z “$tables” ] && return 1 
  238.  
  239.     echo -n $”Saving firewall rules to $IPTABLES_DATA: ” 
  240.  
  241.     OPT
  242.     [ “x$IPTABLES_SAVE_COUNTER” = “xyes” ] && OPT=“-c” 
  243.  
  244.     ret=0 
  245.     TMP_FILE=`/bin/mktemp -q /tmp/$IPTABLES.XXXXXX` \ 
  246.     && chmod 600 “$TMP_FILE” \ 
  247.     && $IPTABLES-save $OPT > $TMP_FILE 2>/dev/null \ 
  248.     && size=`stat -c ‘%s’ $TMP_FILE` && [ $size -gt 0 ] \ 
  249.     || ret=1 
  250.     if [ $ret -eq 0 ]; then 
  251.     if [ -e $IPTABLES_DATA ]; then 
  252.         cp -f $IPTABLES_DATA $IPTABLES_DATA.save \ 
  253.         && chmod 600 $IPTABLES_DATA.save \ 
  254.         || ret=1 
  255.     fi 
  256.     if [ $ret -eq 0 ]; then 
  257.         cp -f $TMP_FILE $IPTABLES_DATA \ 
  258.         && chmod 600 $IPTABLES_DATA \ 
  259.             || ret=1 
  260.     fi 
  261.     fi 
  262.     [ $ret -eq 0 ] && success || failure 
  263.     echo 
  264.     rm -f $TMP_FILE 
  265.     return $ret 
  266.  
  267. status() { 
  268.     tables=`cat $PROC_IPTABLES_NAMES 2>/dev/null` 
  269.  
  270.     # Do not print status if lockfile is missing and iptables modules are not  
  271.     # loaded. 
  272.     # Check if iptable module is loaded 
  273.     if [ ! -f “$VAR_SUBSYS_IPTABLES” -a -z “$tables” ]; then 
  274.     echo $”Firewall is stopped.” 
  275.     return 1 
  276.     fi 
  277.  
  278.     # Check if firewall is configured (has tables) 
  279.     if [ ! -e “$PROC_IPTABLES_NAMES” ]; then 
  280.     echo $”Firewall is not configured. ” 
  281.     return 1 
  282.     fi 
  283.     if [ -z “$tables” ]; then 
  284.     echo $”Firewall is not configured. ” 
  285.     return 1 
  286.     fi 
  287.  
  288.     NUM
  289.     [ “x$IPTABLES_STATUS_NUMERIC” = “xyes” ] && NUM=“-n” 
  290.     VERBOSE=  
  291.     [ “x$IPTABLES_STATUS_VERBOSE” = “xyes” ] && VERBOSE=“–verbose” 
  292.     COUNT
  293.     [ “x$IPTABLES_STATUS_LINENUMBERS” = “xyes” ] && COUNT=“–line-numbers” 
  294.  
  295.     for table in $tables; do 
  296.     echo $”Table: $table” 
  297.     $IPTABLES -t $table –list $NUM $VERBOSE $COUNT && echo 
  298.     done 
  299.  
  300.     return 0 
  301.  
  302. reload() { 
  303.     IPTABLES_MODULES_UNLOAD=“no” 
  304.     restart 
  305.  
  306. restart() { 
  307.     [ “x$IPTABLES_SAVE_ON_RESTART” = “xyes” ] && save 
  308.     stop 
  309.     start 
  310.  
  311. case “$1” in 
  312.     start) 
  313.     stop 
  314.     start 
  315.     RETVAL=$? 
  316.     ;; 
  317.     stop) 
  318.     [ “x$IPTABLES_SAVE_ON_STOP” = “xyes” ] && save 
  319.     stop 
  320.     RETVAL=$? 
  321.     ;; 
  322.     reload) 
  323.     [ -e “$VAR_SUBSYS_IPTABLES” ] && reload 
  324.     ;;   
  325.     restart) 
  326.     restart 
  327.     RETVAL=$? 
  328.     ;; 
  329.     condrestart) 
  330.     [ -e “$VAR_SUBSYS_IPTABLES” ] && restart 
  331.     ;; 
  332.     status) 
  333.     status 
  334.     RETVAL=$? 
  335.     ;; 
  336.     panic) 
  337.     flush_n_delete 
  338.     set_policy DROP 
  339.     RETVAL=$? 
  340.         ;; 
  341.     save) 
  342.     save 
  343.     RETVAL=$? 
  344.     ;; 
  345.     *) 
  346.     echo $”Usage: $0 {start|stop|reload|restart|condrestart|status|panic|save}” 
  347.     exit 1 
  348.     ;; 
  349. esac 
  350.  
  351. exit $RETVAL 

5.重新启动iptables 

  1. #service iptables restart 

6.封qq,酷狗,迅雷等,

  1. 假如本机是一个网关的情况下 
  2. 封QQ 
  3. #iptables -A FORWARD -s 192.168.0.0/24 -m layer7 –l7proto qq -j DROP 
  4. 封酷狗 
  5. #iptables -A FORWARD -s 192.168.0.0/24 -m layer7 –l7proto kugoo -j DROP 
  6. 封迅雷 
  7. #iptables -A FORWARD -s 192.168.0.0/24 -m layer7 –l7proto xunlei -j DROP 

7,测试封QQ的效果



我用的是rhel6.2的系统,所以qq的界面跟你们的不太一样,


 8,那有人说了,只能封这几个吗?, 不是的layer7 支持一百多种协议,如下命令查看

  1. #ls /etc/l7-protocols/protocols/  只要里面有的都可以封杀,使用方法跟上面的一样,将其目录中对应文件的后缀名去掉, 
  2. 比如说,此目录里有个pplive.pat 的文件,想实现封杀pplive的方法如下 
  3. #iptables -A FORWARD -s 192.168.0.0/24 -m layer7 –l7proto pplive -j DROP 

 


ok 到这里此篇博客算是草草完工了, 写的不好还忘见谅.

赞(0) 打赏
转载请注明出处:服务器评测 » iptables防火墙详解及使用layer7阻止qq,酷狗,等P2P软件
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏