Jump to content

Recommended Posts

Posted

Есть Сеть, частный сектор вся на мыльницах, контроля никакого, настройки по DHCP(ISC? FreeBSD6.1) динамически, интернет по PPtP. Сбор маков откладывали, откладывали... Теперь сеть приближается к 1000 абонентов.

 

И появилось необходимость в контроле, для начала хотя бы на магистралях МАК+Ип, что бы пассажиры не грузили ФТП, ДЦ и сеть в общем. Для сбора Мак адресов придумал следующий ход, время от времени те IP адресса, которые DHCP выдал на маки динамически, просто закреплять за абонентами и так постепенно пока все не "закрепятся", потом по логам NAS(MPD) просто сопоставить ИП + лог и получить инфу кто есть кто. Примерно так.

 

Как это лучше и быстрее(более автоматизированно реализовать) ? Есть идеи?

Posted

Скрипт, который будет читать лог mpd, находить там пользователя и адрес, с которого произошло поключение. Дальше открывает логи DHCP за все время лизинга адреса, ищет DHCPACK для этого IP, получает MAC.

Если сеть все еще плоская(все юзеры в одном сегменте, нет маршрутизации), то просто периодически дергать ARP на серверах, на его основании править dhcpd.conf

Posted

В ближайшее время как раз собираемся Л3 поставить на место ПС роутера, он же DHCP. fdb - это что? Арп затра начну собирать и просто перебивать в dhcp.conf , а когда соберу маков+IP 400-500 начну их же по NAS базе буду перебивать в биллинг. Какие прелести от Л3 свича можно заиметь кроме роутинга, ДХЦП и ВКЛ,ВЫКЛ по макам+ИП ?

Posted

В подобной сети использовал следущую технологию )))

Стояла машинка на винде с службой crond которая исполняла каждые 10 минут сканирование nmap всей сети, а программа IPMON вела статистику записывала маки, отслеживала отсмену ip-mac.

Интересует подробнее в аське обьясню.

Posted
поставь arpwatch на сервак он тебе за 2 суток все маки отловит
согласен.. в свое время, когда стояла такая задача (да и сейчас в принЦипе тоже иногда пользуюсь) использовал арпвотч и перловый скрипт, распихивающий в БД

#!/usr/bin/perl

use DBI;
use Mail::POP3Client;

$dbh = DBI->connect('dbi:Pg:dbname=arp;host=127.0.0.1', 'user', 'passwd', {PrintError=>1, RaiseError=>1});

$pop = new Mail::POP3Client( USER     => "arpwatch",
                             PASSWORD => "arpwatch",
                             HOST     => "127.0.0.1" ) || die "error";

for( $kk = 1; $kk <= $pop->Count(); $kk++ ) 
{
    $body = $pop->Body($kk);
    $body =~ s/\s/ /g;

    if ($body =~ /ip address: (\d+\.\d+\.\d+\.\d+).+ethernet address: (\w+:\w+:\w+:\w+:\w+:\w+)/) 
    {
        $sql = "SELECT user_id, user_mac FROM pron_users WHERE state<>0 AND user_ip='$1'";
        $sth = $dbh->prepare($sql);
        if ($sth) { $sth->execute(); }
        ($user_id, $user_mac) = $sth->fetchrow_array();

        if (defined($user_id)) 
        {
            if (!defined($user_mac) || $user_mac eq '') 
            {
                $sql = "UPDATE pron_users SET user_mac='$2' WHERE user_id=$user_id";
                $sth = $dbh->prepare($sql);
                if ($sth) { $sth->execute(); }
            } 
            else 
            {
                $sql = "SELECT user_id FROM pron_users WHERE state<>0 AND user_mac='$2'";
                $sth = $dbh->prepare($sql);
                if ($sth) { $sth->execute(); }
                ($user_id) = $sth->fetchrow_array();

                if (!defined($userid)) 
                {
                    print "mac changed. ip: $1, mac: $2\n";
                }
            }
        }
    }
    $pop->Delete($kk);
}
$pop->Close;

 

смысл заключается в том, что арпвотч шлёт письма на указанный в его конфиге ящик, после чего скрипт проверяет данный ящик, парсит письма и выполняет определенные деиствия..

Posted

можно проще arp -a > и в базу.

типа такого.

 

CREATE TABLE ip_mac (

id int(11) NOT NULL auto_increment,

ip int(11) default '0',

mac varchar(255) default '',

PRIMARY KEY (id)

);

 

 

#!/usr/bin/perl

 

use DBI();

use Socket;

use DBD::mysql;

use Time::Local;

use Getopt::Std;

 

$database=arp

$database_host=localhost

$database_sock_path=/var/lib/mysql.sock

$database_login=arp

$database_password=arp

 

$arp_command = "arp -a";

if($^O =~ m/(linux|freebsd)/){

$arp_command = "arp -na";

};

 

$DBI_data="DBI:mysql:database=$database;host=$database_host;mysql_socket=$database_sock_path;";

 

$dbh = DBI->connect("$DBI_data","$database_login","$database_password",{'RaiseError' => 1});

open(MAC,"$arp_command|");

@mac = <MAC>;

close (MAC);

foreach (@mac){

if ($_ =~ m/[^0-9]*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)[^0-9]+(.{2}(:|-).{2}(:|-).{2}(:|-).{2}(:|-).{2}(:|-).{2}).+/){

$bin_ip = unpack("N",inet_aton($1));

$bin_ip = $bin_ip > 2147483647 ? ($bin_ip - 0xFFFFFFFF - 1):$bin_ip;

 

my $duplicated = 0;

$q = "SELECT ip FROM ip_mac WHERE ip=$bin_ip LIMIT 1";

$sth = $dbh->prepare( $q );

$sth->execute();

while( $zzz = $sth->fetchrow_hashref )

{

$duplicated = 1;

};

if (!$duplicated){

$dbh->do("INSERT INTO ip_mac (ip, mac) VALUES ($bin_ip, '$2')");

printf ("Inserted ip/mac $1/$2 to database \n");

};

};

};

 

 

запускать по крону например каждые 10 минут.

потом обычным запросом с применением select inet_ntoa(4294967295 & ip) выковыриваем данные.

всё просто и понятно :)

Posted

можно проще arp -a > и в базу.

можно, но в моем случае именно так, ибо есть еще один скрипт - который строит статическую арп таблиЦу, и блокирует левые связки IP+MAC.. а если мне не изменяет память, то arpwatch использует libpcap, переводящий интерфейс в промискмод, тем самым позволяя сниферить пролетающие мимо (не адресованные серверу) пакеты, что, опять же - в моем случае, очень даже удобно ;)

  • 2 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...