linux下防御arp攻击完美策略

最近朋友服务器每天经常遭遇arp病毒攻击导致网站无法正常运营,问我有没有好的解决策略,经过google了一番尝试了一下终于得到了解决方案,并找出感染病毒的机器为一台windows机器通知机房,并在本机做好防御策略,问题得到了很好的解决,在这个过程中得到了cuci的热心帮助,在此表示感谢!好了!话不多说具体操作方法如下:
1./*找出ARP攻击的机器*/
获取同一网段下所有机器MAC地址的办法
         
机房有机器中毒,发arp包,通过arpspoof虽然可以解决,也可以找到中毒机器的mac地址,但在机房设备不足的情况下,很难查到mac地址对应的IP。然后我们可以通过一个循环,使用arping来对整个子网下面的机器发一个包,这样就可以在arp下面查看到相应的mac缓存,进而得到对
应的IP地址。

#!/bin/sh
#感谢作者:吴洪声
for ((i = 1; i < 254; i++))      这里应该改为255保险点,看你自己喜欢
do
arping -I eth0 60.191.82.$i -c 1
done
arp -a > mac_table


脚本跑完后,查看当前目录生成的mac_table。
#arp -a 查找你中毒时网关的MAC地址,并记录下来在mac_table里寻找到相对应的机器,仍后就可以找出那台机器感染了ARP病毒。
2./*使用arpspoof抵御ARP攻击*/
#提供方案原创者:yk103,在此表示感谢!
先安装libnet
http://www.packetfactory.net/libnet/dist/libnet.tar.gz
tar -xvzf libnet.tar.gz
cd libnet
./configure
make
make install
安装arpoison
http://www.arpoison.net/arpoison-0.6.tar.gz
tar -xvzf arpoison-0.6.tar.gz
cd arpoison
gcc arpoison.c /usr/lib/libnet.a -o arpoison
mv arpoison /usr/sbin
编写arpDefend.sh脚本.
#!bash
#arpDefend.sh
#yk103
#网关mac地址
GATEWAY_MAC=00:11:BB:A52:40
#目的mac地址
DEST_MAC=ff:ff:ff:ff:ff:ff
#目的ip地址(网段广播地址)
DEST_IP=60.191.82.254

#本地网卡接口
INTERFACE=eth0
#$INTERFACE的mac地址
MY_MAC=00:30:48:33:F0:BA
#$INTERFACE的ip地址
MY_IP=60.191.82.247

#在本机建立静态ip/mac入口 $DEST_IP--$GATEWAY_MAC
arp -s $DEST_IP $GATEWAY_MAC

#发送arp reply ,使$DEST_IP更新$MY_IP的mac地址为$MY_MAC
arpoison -i $INTERFACE -d $DEST_IP -s $MY_IP -t $DEST_MAC -r $MY_MAC 1>/dev/null &


内核一样,只是shell环境可能有些差别,
在ubuntu下应改成这样才能运行

#!/bin/bash
#感谢作者:吴洪声
for ((i = 1; i < 254; i++))
do
arping -I eth0 60.191.82.$i -c 1
done
arp -a > mac_table




Usage: -i device -d dest_IP -s src_IP -t target_MAC -r src_MAC [-a] [-w time between packets] [-n number to send]
示例:arpoison -i eth0 -d 172.16.18.254 -s 172.16.18.19 -t ff:ff:ff:ff:ff:ff -r 00:11:09:E8:78D   



-i eth0 指定发送arp包的网卡接口eth0
-d 172.16.18.254 指定目的ip为172.16.18.254
-s 172.16.18.19  指定源ip为172.16.18.19
-t ff:ff:ff:ff:ff:ff 指定目的mac地址为ff:ff:ff:ff:ff:ff(arp广播地址)
-r 00:11:09:E8:C8:ED  指定源mac地址为00:11:09:E8:C8:ED
上次说到生成了一个MAC_TABLE的一个文件里面存的是ARP表对吧,如果有重复的,怎么快速的把重复的找出来呢,让同事用C做了个小程序,在这里谢谢同事毛毛了!因为这个C是他做的


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* mac_addr[1000];
read_file(char* filename)
{
//fstream f_dir;
FILE *file_stream = NULL;
file_stream = fopen(filename, "r");
if(file_stream == NULL)
{
printf("can not open file ! /n");
return;
}   
//f_dir.open(filename,   ios::in |ios:ut | ios::app);  
int line_num=0;
int i=0;
int j=0;
while(feof(file_stream) == 0)
  {   
   char * mac = malloc(256);
   //f_dir.getline(charword,256);//读出文件中的一行
   fgets(mac,255,file_stream);
   //printf("line:%s/n",mac);
   mac_addr[line_num]=mac;
   line_num++;   
  }
line_num--;
//printf("line num : %d /n",line_num);
fclose(file_stream);
for(i;i<line_num;i++)
{
for(j=i+1;j<line_num;j++)
{
  char mac_perline_1[18];
  char mac_perline_2[18];
  char * line_1 = mac_addr;
  char * line_2 = mac_addr[j];
  int position = 0;
  int count = 0;
  //printf("line_1:%s/n",line_1);
  //printf("line_2:%s/n",line_2);
  while(line_1[position]!='/n')
  {
   //printf("position:%d/n",position);
   if(line_1[position]==' ')
    {
     count++;
     if(count == 3)
      {
       //printf("befor copy /n");
       memcpy(mac_perline_1,line_1+position+1,17);
       //printf("bbbbb/n");
       mac_perline_1[17]='/0';
              //printf("mac addr1 %s/n",mac_perline_1);
       break;
      }     
    }
   position++;   
  }
  position = 0;
  count = 0;
  while(line_2[position]!='/n')
  {
   if(line_2[position]==' ')
    {
     count++;
     if(count == 3)
      {
       memcpy(mac_perline_2,line_2+position+1,17);
       mac_perline_2[17]='/0';
              //printf("mac addr2 %s/n",mac_perline_2);
       break;
      }     
    }
   position++;   
  }
  if(strcmp(mac_perline_2,mac_perline_1)==0)
   {
    printf("same MAC_ADDR find in line %d and %d /n",i,j);
    printf(" %s %s /n",mac_addr,mac_addr[j]);
   }
}
}
for(i=0;i<line_num+1;i++)
{
  free(mac_addr);
}
  
}
main(int argc, char *argv[])
{
  int err, nargc, i;
  if(argc<2)
   {
     printf("please input the filename/n");                        
     return -1;
   }
         
         
  read_file(argv[1]);
           
  return 0;         
         
         
}




这个是原码,
下面说用法,
在附件里有一个叫file.c的文件,还有一个叫Makefile的文件,还有一个用来测试的mac_table,到时候把file.c 和Makefile放到同一个目录下,执行
make
./mac mac_table
就把重复MAC的那一行ARP表列出来了,能快速的知道那台电脑在发ARP广播,快速的找到中毒的电脑!!!
http://www.kklinux.com/uploads/soft/mac_addr.rar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值