Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2521120
  • 博文数量: 867
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 9800
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-27 14:44
文章分类

全部博文(867)

文章存档

2007年(6)

2006年(861)

我的朋友

分类: LINUX

2006-09-13 09:57:25

构思    
  决定使用arp绑定后,接下来就要考虑arp的实现方法。arp(address resolution protocol)协议是用来向对方的计算机、设备通知自己ip对应的mac地址的。如果所有非法用户都被赋予了错误的mac地址,那么他们是无法通过这台服务器上网的。因此,arp绑定要求必须将所有可能的ip地址全部与mac地址绑定,才能够杜绝非法用户(当然,用户修改mac地址除外)。     
  经过一番思索,确定了初步的构思。首先,用linux shell的循环方法生成一张包含从10.0.0.1到10.0.3.254的无效mac地址匹配表,称之为全局表。然后根据dhcp服务器的数据得到一张合法用户的ip和mac地址表,称之为合法表。接着,读取合法表中每个用户的ip,并在全局表中寻找匹配的ip,如果找到的话就用合法用户的mac地址替换原来无效的mac地址。最后,这张全局表中的合法用户匹配正确mac地址,而非法用户匹配无效的mac地址。只要用户把这张表写入系统arp缓存,非法用户就不能通过简单的盗取ip方法来通过网关了。     
  实现     
  首先生成一张初始的全局表。它包含所有ip地址,每个ip地址与一个非法的mac地址匹配。它的格式必须是arp命令能够识别的。初始化全局表的脚本为init,内容如下:     
  #!/bin/bash  
  ipprefix=10.0.  
  count1=0  
  while (( !#36;count1 < 4 ))  
  do  
   count2=1  
   while (( !#36;count2 < 255 ))  
   do  
   echo“!#36;ipprefix!#36;count1.!#36;count2 00e000000001”  
   let !#36;count2+=1  
   done  
   let !#36;count1+=1  
  done  
    
    
  写好后存档,用“chmod +x init”命令使得脚本可执行。然后运行脚本init > arp,就可以将结果保存到当前目录的arp文件中。该文件就是10.0.0.1到10.0.3.254所有ip地址与mac地址00e000000001绑定的arp表,看上去该文件类似于下面这样:     
  10.0.0.1 00e000000001  
  10.0.0.2 00e000000001  
  10.0.0.3 00e000000001  
  10.0.0.4 00e000000001  
  10.0.0.5 00e000000001  
  ... ...  
    
  需要注意的是,shell脚本语法虽然和c语言类似,但对格式要求很严格,有些地方不能加空格,有些地方则必须加空格。比如let !#36;count1+=1就不能写成let !#36;count1 += 1;相反,while (( !#36;count1 < 4 )) 也不能写成while ((!#36;count1<4)),括号与语句之间必需有空格。  
    
  接下来通过dhcp服务器得到合法用户的ip与mac地址匹配表(即合法用户表),假设是valid.arp文件。编写一个脚本一行一行地读取该表,每得到一个ip地址记录,就在前面生成的arp文件中查找同样的ip。如果找到的话,那么就用valid.arp中该ip的mac地址替换arp文件中该ip的mac地址。valid.arp文件可能像下面这样:     
  10.0.0.2 00e00a0f1d2c  
  ...  
  10.0.1.25 00e0b2c3d5c1  
  ... 
查找替换脚本为replace,内容如下:    
  #!/bin/bash 
  # 定义并初始化三个变量,分别是合法用户表、全局表和作交换用的表 
  validarp=valid.arp 
  globalarp=arp 
  tmparp=tmp.arp 
   
  count=1 
  # 371是合法用户的总数,也就是valid.arp表的记录数,然后加1 
  while (( count < 371 )) 
  do 
  #“ sed -n‘“!#36;count”p’!#36;validarp”命令将每次打印valid.arp文件中的第!#36;count个记录 
  # 例如,当!#36;count=1的时候,该命令将打印: 10.0.0.2 00e00a0f1d2c2 
  # eval !#36;getvalid将会执行!#36;getvalid变量所包含的语句,并将结果赋给变量!#36;currec 
  getvalid=“sed -n‘“!#36;count”p’!#36;validarp” 
   currec=‘eval !#36;getvalid’ 
  # echo !#36;currec   awk‘!#123;print !#36;1!#125;’命令将打印!#36;currec内容的第一个字段,也就是ip地址 
  # 然后我们将这个ip地址赋值给!#36;curip变量 
  getip=“echo !#36;currec awk‘!#123;print \!#36;1!#125;’” 
   curip=‘eval !#36;getip’ 
  # 这样我们就得到了合法用户的ip及ip和mac地址对,接下来是最关键的一步 
  # 下面两条语句在全局表中查找与得到的ip匹配的项目,找到后就在该记录后面添加合法用户的ip 
   和mac地址对,然后删除旧的非法ip和mac地址对,并将结果存入一个新的文件tmp.arp 
  replace=“sed -e‘/!#36;curip\>/a\ !#36;currec’ -e‘/!#36;curip\>/d’!#36;globalarp >!#36;tmparp” 
   eval !#36;replace然后用新的文件覆盖全局表文件,并将计数器加1,供下次循环 
  cp -f !#36;tmparp !#36;globalarp 
   let count+=1 
  done    
  到此脚本结束。需要注意的地方有两个:第一,所有包含“eval”命令的语句,使用的都是反引号,也就是通常位于tab键上面的那个引号,这样变量才能得到语句执行的结果,而非语句本身;第二,如果出现变量和其它字母在一起的情况,用双引号将变量包含,否则会出现错误的变量名,例如下面这条语句:    
  getvalid=“sed -n‘“!#36;count”p’!#36;validarp”    
  如果不用双引号把变量!#36;count包起来,shell会认为用户的变量是!#36;countp,而不是!#36;count。    
  在执行完replace后,再查看arp文件,会发现其中所有在valid.arp文件中存在的ip和mac地址对,其中的初始化mac地址已被替换为正确的mac地址。    
  最后,将得到的arp文件拷贝为/etc/ethers,在系统启动时运行“arp -f”,就可以实现ip和mac地址匹配了。   
  总结   
  通过这件事不难发现,linux继承了unix的优秀传统,具备强大和完善的系统管理方法。只要用户掌握一些常用的命令与工具,就可以极大地提高系统管理效率,降低管理的工作强度。学习和掌握这些方法,是每个合格的linux系统管理员都应该做到的 
阅读(1667) | 评论(0) | 转发(0) |
0

上一篇:确保linux安全的十招

下一篇:linux封杀bit

给主人留下些什么吧!~~