一个分析Linux ARP日志的源代码程序

本文介绍了一个用于检测ARP攻击的C++程序。该程序通过读取配置文件中的合法MAC地址和IP地址配对,并对比日志文件中记录的ARP请求来发现潜在的攻击行为。对于不符合配置文件记录的MAC-IP配对,程序会统计出现次数并输出警告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <string>
#include <fstream>
#include <list>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
typedef list<string> ListStr;
typedef set<string> SetStr;
typedef ListStr::iterator Iter;
typedef SetStr::iterator s_iter;
typedef basic_string<char>::size_type S_T;
static S_T npos = -1;
string CONFIG_FILE;
string LOG_FILE;
const string DEFAULT_CONFIG_FILE="/root/config.txt";
const string DEFAULT_LOG_FILE="/root/log.log";

//Func Define

void splitstr(const string& _source,const string& _split,ListStr& _ls);

vector<string> split(const string& src, string delimit, string null_subst);

bool IsInMACAndIP(const ListStr& _ls,const string& _s);

int ParseArg(int argc,char *argv[]);

string getip(const string& _s);

string getmac(const string& _s);

int main(int argc,char *argv[]){
/
//Define Data
/
  ListStr IPAndMac;
  ListStr LogStr;
  ListStr ExecLogStrCount;
  SetStr ExecLogStr;
  Iter i_im;
  Iter i_ls;
  s_iter s_i;
//
//Initial Data
//
//
  int i_r = ParseArg(argc,argv);
  if(i_r <= 0){
    cout << "Error Params" << endl;
    exit(0);
  }else{
 
    fstream fs_config(CONFIG_FILE.c_str());
    //cout << CONFIG_FILE << endl;
    fstream fs_log(LOG_FILE.c_str());
    //cout << LOG_FILE << endl;
    IPAndMac.clear();
    LogStr.clear();
    ExecLogStr.clear();
    ExecLogStr.clear();
///
//Exception
///
    if(!fs_config ){
      cout <<"Can not Open Config File " <<CONFIG_FILE <<  endl;
      exit(0);
    }
    if(!fs_log){
      cout <<" Can not Open Log File " << LOG_FILE << endl;
      exit(0);
    }
    else{

//Read Config
///
      string s_config_line;
      while(getline(fs_config,s_config_line)){
        IPAndMac.push_back(s_config_line);
      }
//
//Read Log

      string s_log_line;
      while(getline(fs_log,s_log_line)){
        LogStr.push_back(s_log_line);
      }
//
//Do Test Data
/
    // NOw Get All Default Mac And Data
    //For LogStr
      //Get ARP IP And Mac
      //Is In IP And Mac
        //if In
        //else not  >>>>>> Arp Attack Cout IP And Address
      for(i_ls = LogStr.begin(); i_ls != LogStr.end() ; ++ i_ls){
        vector<string> v = split(*i_ls," ","");
        string s_IP = v[9];
        string s_MAC = v[1];
        string s_temp = s_MAC + "=" + s_IP;
        ExecLogStr.insert(s_temp);
        ExecLogStrCount.push_back(s_temp);
      }

      for(s_i = ExecLogStr.begin(); s_i != ExecLogStr.end(); ++ s_i){
        if(!IsInMACAndIP(IPAndMac,*s_i)){
          int i_num = count(ExecLogStrCount.begin(),ExecLogStrCount.end(),*s_i);
          cout << "The Computer@@@" << *s_i <<"@@@Attack@@@" <<i_num <<"@@@Times!"<< endl;
        }

      }

    }
    return 0;
  }
}
string getip(const string& _s){
  return "";
}

string getmac(const string& _s){
  return "";
}
void splitstr(const string& _source,const string& _split,ListStr& _ls){
  //todo:
  _ls.clear();
  string strtemp;
  strtemp = _source;
  string::size_type len = _source.length();
  string::size_type itmp = strtemp.find(_split);
  do{
    _ls.push_back(strtemp.substr(0,itmp));
    //cout << strtemp.substr(0,itmp) << endl;
   
    if(len-itmp-1 > 0){
      //cout << strtemp << endl;
      strtemp = strtemp.substr(itmp+1,len-itmp-1);
      //cout << strtemp << endl;
      itmp = strtemp.find(_split);
      len = strtemp.length();
    }
    else{
      cout << 2 << endl;
      break;
    }
  }while( itmp>0 );
  //ListStr.push_back(_source.substr(0,i1));
  //cout << _source.substr(0,i1) << endl;
  //cout << _source.substr(i1+1,len-i1-2)<< endl;
  //cout << il << endl;
}
bool IsInMACAndIP(const ListStr& _ls,const string& _s){
  ListStr::const_iterator i = find(_ls.begin(),_ls.end(),_s);
  if(i == _ls.end()){
    return false;
  }
  else{
    return true;
  }
}
vector<string> split(const string& src, string delimit, string null_subst="")
{
  if( src.empty() || delimit.empty() ) throw "split: empty string/0";

  vector<string> v;
  S_T deli_len = delimit.size();
  long index = npos, last_search_position = 0;
  while( (index=src.find(delimit, last_search_position))!=npos )
  {
    if(index==last_search_position)
      v.push_back(null_subst);
    else
      v.push_back( src.substr(last_search_position, index-last_search_position) );
    last_search_position = index + deli_len;
  }
  string last_one = src.substr(last_search_position);
  v.push_back( last_one.empty()? null_subst:last_one );
  return v;
}

int ParseArg(int argc,char *argv[]){
  /*
  for(int i = 0 ; i < argc ; i++)
  {
    //cout << argc << endl;
    cout << argv[i] << endl;
  }
  */
  if(argc == 1){
    CONFIG_FILE = DEFAULT_CONFIG_FILE;
    LOG_FILE = DEFAULT_LOG_FILE;
    return argc;
  }
  else if(argc == 3){
    //cout << 3333 << endl;
    char tbuf[256];
    strcpy(tbuf,argv[1]);
    string s_temp = (string)(tbuf);
    if(s_temp == "-c"){
      //cout << 1111 << endl;
      char buf[256];
      strcpy(buf,argv[2]);
      CONFIG_FILE = (string)(buf);
      LOG_FILE = DEFAULT_LOG_FILE;
      //cout << CONFIG_FILE << endl;
      return argc;
    }
    if(argv[1] == "-l"){
      char buf[256];
      strcpy(buf,argv[2]);
      LOG_FILE = (string)(buf);
      CONFIG_FILE = DEFAULT_CONFIG_FILE;
      //cout << LOG_FILE << endl;
      return argc;
    }
  }
  else if(argc == 5){
    char tbuf1[256];
    strcpy(tbuf1,argv[1]);
    string s_temp1 = (string)(tbuf1);

    char tbuf2[256];
    strcpy(tbuf2,argv[3]);
    string s_temp2 = (string)(tbuf2);
    if(s_temp1 == "-c" || s_temp1 == "-C")
      CONFIG_FILE = (string)argv[2];
    if(s_temp2 == "-l" || s_temp2 == "-L")
      LOG_FILE = (string)argv[4];
    //cout << CONFIG_FILE << "@@@@@" << LOG_FILE << endl;
    return argc;
  }
  else{
    return -1;
  }
}

 

<think>好的,用户想了解如何查看ARP告警日志。首先,我需要确定用户的使用场景。ARP告警通常出现在网络管理中,可能涉及IP地址冲突、ARP欺骗攻击等问题。用户可能是网络管理员或IT支持人员,需要排查网络故障或安全事件。 接下来,用户的需求可能不仅仅是查看日志,还可能包括如何分析日志内容,理解不同类型的告警信息,以及采取相应的解决措施。需要确保回答覆盖这些方面,提供实用步骤和示例。 然后,考虑不同操作系统和环境下的操作差异。比如,Linux系统和Windows系统查看日志的方法不同,网络设备如交换机和路由器也有各自的配置方式。需要分别说明,并给出具体命令或路径,确保用户能按步骤操作。 另外,用户可能对ARP协议本身不太熟悉,需要简要解释ARP的作用和常见告警类型,如IP冲突、ARP欺骗等。同时,提供分析方法和解决建议,帮助用户不仅找到日志,还能有效处理问题。 需要检查回答的结构是否清晰,分步骤讲解,从查看日志分析处理,逻辑顺畅。还要注意使用中文,避免专业术语过于晦涩,必要时举例说明。确保LaTeX格式正确,数学表达式和代码块用合适的符号标注,如命令行用反引号或代码块格式。 最后,验证提供的信息是否准确,命令是否正确,路径是否存在常见系统中。可能需要提醒用户权限问题,如使用sudo或管理员权限访问日志文件,以及不同网络设备厂商的日志查看方式可能有所不同,建议参考官方文档。</think>查看ARP告警日志的步骤如下,按网络环境分类说明: 一、Linux系统操作 1. 查看系统日志 ```bash sudo grep -i "arp" /var/log/syslog # Ubuntu/Debian sudo journalctl -u NetworkManager | grep -i arp # Systemd系统 ``` 2. 关键告警类型解析 - IP冲突告警示例: `arp: duplicate IP <IP地址> detected!` - ARP表异常: `arp: received packet with strange hw address` 二、Windows系统操作 1. 事件查看器路径: 事件查看器 → Windows日志 → 系统 → 筛选事件ID 4199(ARP相关) 2. PowerShell快速查询: ```powershell Get-WinEvent -FilterHashtable @{LogName='System'; ID=4199} | Where-Object {$_.Message -match 'ARP'} ``` 三、网络设备通用方法(交换机/路由器) ```cisco show log | include ARP # Cisco设备 display logbuffer | include ARP # Huawei设备 ``` 四、告警类型深度分析表 | 告警类型 | 数学表达 | 风险等级 | 处理建议 | |--------------------|--------------------------|----------|------------------------------| | IP地址冲突 | $IP_A \equiv IP_B$ | 高 | 检查DHCP配置或静态IP分配 | | ARP缓存投毒 | $MAC_{fake} \to IP_{tar}$| 危急 | 启用DAI防护,检查端口安全配置 | | 非法ARP请求 | $\exists x \notin VLAN$ | 中 | 实施ARP限速,过滤异常源MAC | 五、高级排查技巧 1. 使用ARP抓包分析: ```bash tcpdump -i eth0 arp -vvv -w arp.pcap ``` 2. 统计ARP请求频率(阈值检测): $$ f_{arp} = \frac{N_{req}}{\Delta t} > \theta_{threshold} $$ 建议处理流程: 1. 确认告警时间戳 2. 提取相关MAC/IP地址 3. 交叉验证设备合法性 4. 检查网络拓扑对应关系 5. 实施隔离或防护策略 注:企业级网络建议部署ARP防护系统,自动实现:$$ \forall arp_{pkt} \in \Gamma, \exists verify(arp_{pkt}) \leq \tau_{response} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值