用Iptables进行并发连接限制

  Iptables是一个内核状态的防火墙,也就是说它是Linux内核的一部分,所以它的功能异常强大,效率非常高。

  进入/usr/src/linux-2.6.18.8进行内核编译。

  cd /usr/src/linux-2.6.18.8  

  make mrproper #确保源代码目录下没有不正确的.o文件

  make menuconfig #内核配置,这步最重要,成不成在此一举呀。这是编译内核最麻烦的地方,不是特别熟悉的话最好先看看这些选项的意思,最好是把SELinux给关掉。如果是用vmware虚拟机的话,记住一定要选中SCSI里的LSI Logic和BusLogic相关的驱动。

  make  
 
  make modules_install  
 
  depmod –a #生成模块依赖关系  

  到这里我们就编译完成了新的内核,下面就是配置使用用新的内核启动。

  cp /usr/src/linux-2.6.18.8/arch/i386/boot/bzImage /boot/ vmlinuz-2.6.18.8 #压缩的内核文件  
 
  cp /usr/src/linux-2.6.18.8/System.map /boot/System.map-2.6.18.8  
 
  cd /boot  

  mkinitrd initrd-2.6.18.8.img #把一些系统启动时需要的模块打包

  添加新的启动项,用新的内核启动系统,这里可以参照原有的启动配置项进行设置,示例:

  用vi /etc/grub.conf打开文件,加入如下内容:

  title Linux-2.6.18.8  
 
  root (hd0,0)  
 
  kernel /vmlinuz-2.6.18.8 ro root=LABEL=/ enforcing=0 
 
  initrd /initrd-2.6.18.8.img  

  重新启动计算机,在启动菜单选择我们使用刚才新添加的启动项,启动新的内核。

  相对于2.4的内核来说我感觉2.6的内核编译起来更容易些,一般不会出现什么太大的问题,编译完成后能够正常的启动。

  Iptables有许多模块,一些不成熟的模块是以patch-o-matic的形式存在的,个人理解就是内核补丁。等这些模块代码成熟后就后直接加入内核。这里我们介绍一个限制每个IP并发连接的模块,就connlimit,这个模块还是以patch-o-matic的形式存在的,所以如果我们想要使用这个模块需要以内核补丁的形式加入到内核源码中,然后再通过编译内核,把它们编译成内核模块的形式使用。

  下面我们以linux-2.6.18-8+Iptables-1.3.7为主来说说编译内核使用connlimit。为什么要用linux-2.6.18-8内核呢?因为目前最流行的RedHat最新企业版本也就是5.0版本使用的就是2.6.18-8内核,这对后面升级操作系统后使用这个功能可能更方便一点。

  软件下载后,可以通过SSH文件传输客户端把它们上传到Linux的/usr/src目录下,然后进行解压,命令如下

  tax –jxvf linux-2.6.18.8.tar.bz2  
 
  tar –jxvf iptables-1.3.7.tar.bz2  
 
  tar –jxvf patch-o-matic-ng-20070414.tar.bz2  

  进入patch-o-matic-ng,为内核打补丁:

  cd /usr/src/patch-o-matic-ng-  
 
  ./runme --download  
 
  KERNEL_DIR=/usr/src/linux-2.6.18.8 IPTABLES_DIR=/usr/src/iptables-1.3.7 ./runme connlimit  

      重新进入Linux后我们就可以编译安装Iptables了。

  cd /usr/src/iptables-1.3.7  
 
  export KERNEL_DIR=/usr/src/linux-2.6.18.8  
 
  export IPTABLES_DIR=/usr/src/iptables-1.3.7  
 
  make BINDIR=/sbin LIBDIR=/lib MANDIR=/usr/share/man install  

  现在就可以进行设置试一下了,输入以下命令:

  iptables –A INPUT –p tcp –dport 22 –m connlimit –connlimit-above 2 –j REJECT  

  这条命令是允许每个IP最多有2个连接到本机的22端口。