#!/usr/bin/perl -Tw use constant EMAIL => 'email@yourdomain.com'; use constant SERVER => 'mail.yourdomain.com'; use Net::PcapUtils; use Net::SMTP; use NetPacket::ARP; use NetPacket::Ethernet qw/:types/; use strict; my %ether; my $mail = Net::SMTP->new(SERVER); Net::PcapUtils::loop( sub { my ($arg, $header, $packet) = @_; my $ethernet = NetPacket::Ethernet->decode($packet); if ($ethernet->{'type'} == ETH_TYPE_ARP) { my $arp = NetPacket::ARP->decode($ethernet->{'data'}, $ethernet); my $ip = join '.', map { hex } ($arp->{'spa'} =~ /([[:xdigit:]]{2})/g); my $mac = join ':', ($arp->{'sha'} =~ /([[:xdigit:]]{2})/g); if ((exists $ether{$ip}) && ($ether{$ip} ne $mac)) { $mail->to(EMAIL); $mail->mail('root@yourdomain.com'); $mail->data; $mail->datasend("There has been a change in the MAC address associated with IP address ", $ip, "!\n\n"); $mail->datasend(" Previous hardware MAC address -> ", $ether{$ip}, "\n"); $mail->datasend(" Current hardware MAC address -> ", $mac, "\n"); $mail->dataend; $mail->quit; } $ether{$ip} = $mac; } }, 'DEV' => 'eth0' );