Linux系统下封杀非法IP

2008/9/12 来源:www.arpun.com 作者:小白

构思  

  决定使用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 (( $count1 < 4 ))

  do

  count2=1

  while (( $count2 < 255 ))

  do

  echo“$ipprefix$count1.$count2 00e000000001”

  let $count2+=1

  done

  let $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 $count1+=1就不能写成let $count1 += 1;相反, while (( $count1 < 4 )) 也不能写成while (($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‘“$count”p’$validArp”命令将每次打印valid.arp文件中的第$count个记录

  # 例如, 当$count=1的时候, 该命令将打印: 10.0.0.2 00e00a0f1d2c2

  # eval $getValid将会执行$getValid变量所包含的语句, 并将结果赋给变量$curRec

  getValid=“sed -n‘“$count”p’$validArp”

  curRec=‘eval $getValid’

  # echo $curRec   awk‘{print }’命令将打印$curRec内容的第一个字段, 也就是IP地址

  # 然后我们将这个IP地址赋值给$curIP变量

  getIP=“echo $curRec awk‘{print }’”

  curIP=‘eval $getIP’

  # 这样我们就得到了合法用户的IP及IP和MAC地址对, 接下来是最关键的一步

  # 下面两条语句在全局表中查找与得到的IP匹配的项目, 找到后就在该记录后面添加合法用户的IP

  和MAC地址对, 然后删除旧的非法IP和MAC地址对, 并将结果存入一个新的文件tmp.arp

  replace=“sed -e‘/$curIP>/a $curRec’ -e‘/$curIP>/d’$globalArp >$tmpArp”

  eval $replace然后用新的文件覆盖全局表文件, 并将计数器加1, 供下次循环

  cp -f $tmpArp $globalArp

  let count+=1

  done   

  到此脚本结束。 需要注意的地方有两个:第一, 所有包含“eval”命令的语句, 使用的都是反引号, 也就是通常位于Tab键上面的那个引号, 这样变量才能得到语句执行的结果, 而非语句本身;第二, 如果出现变量和其它字母在一起的情况, 用双引号将变量包含, 否则会出现错误的变量名, 例如下面这条语句:   

  getValid=“sed -n‘“$count”p’$validArp”   

  如果不用双引号把变量$count包起来, Shell会认为用户的变量是$countp, 而不是$count。   

  在执行完replace后, 再查看arp文件, 会发现其中所有在valid.arp文件中存在的IP和MAC地址对, 其中的初始化MAC地址已被替换为正确的MAC地址。   

  最后, 将得到的arp文件拷贝为/etc/ethers, 在系统启动时运行“arp -f”, 就可以实现IP和MAC地址匹配了。  

  总结  

    通过这件事不难发现, Linux继承了Unix的优秀传统, 具备强大和完善的系统管理方法。 只要用户掌握一些常用的命令与工具, 就可以极大地提高系统管理效率, 降低管理的工作强度。 学习和掌握这些方法, 是每个合格的Linux系统管理员都应该做到的

网友评论
评论(...
全部评论