Преамбула.
Локальная сеть в общежитии. Сервер по линухом. Поднят арпватч, айпитаблес со связкой IP+MAC из самопального билинга с учётом абонентской месячной платой. Но есть одна проблема. Есть некоторые пользователи, которые кладут на отсутвие доступа к сервисам сервера (samba+wins, днс и др) и используют для навигации различного рода "пингователи" и платить абоненку не хотят.
Поэтому родилась идея поднимать на сервере виртуальные айпи адреса и вызывать тем асмым отвал от сети из за конфликта айпиадресов.
/sbin/ifconfig eth0:[xxx] hw ether 11:11:11:11:11:11");
/sbin/ifconfig eth0:[xxx] $ip_bad_host netmask 255.255.255.255 up");
Вопрос: где можно выковырять информацию, желательно русскую по проблеме конфликтов айпишников и маков и поведение при этом 2000\хп или как машина определяет что конфликт имеет место.
Вопрос 2: Нужно что либо добавлять в route, чтобы всё это работало "лучшЕе".
Вопрос 3: нужно ли чтото для ядра?
Вопрос 4: а вообще такое можно сделать или нет? На РедХад 8 это работало.
П.С.
При блокировании на фареволе трафика от этих машин конфликто не возникает, а с другой стороны давать этим компам лишний трафик не хочется.
П.С.С
Используея похожий метод можно попробовать продетвратить работу в корпоративной сети "левых" людей с ноутбуком. Правда придётся делать демона и пасти сеть через арпватч в реалном времени.
Вот кусок недописанного скрипта для крона(на пхп, за это просьба ногами не бить), который проверяет arping`гом сеть и конце концов должен поднимает виртуальные айпишники.
Из базы берутся данные:
- id пользователя - нужно для проверки баланся
- пара ip+mac - используется для
#!/usr/bin/php
<?
@mysql_connect ("localhost" ,"www_biling" , "12345" ) or die ( "просим прощения но база сейчас недоступна");
@mysql_select_db("billing") or die (message("Нетути"));
// выключение всех поднятых виртуальный айпишников до этого и очистка таблицы роутинка
//
$query = 'SELECT `ip` , `mac_adress` '
. ' FROM `users` '
. ' WHERE 1 AND `ip` '
. ' LIKE \'192.168.0.%\' AND `status` =1 AND `balans` >0';
$result = mysql_query($query);
// создание массивов
// массив айпишников по базе
$ip_base = array
(
"192.168.0.1"=>"00:00:00:00:00:00",
);
// массив айпишников полученных из сети
$ip_net = array
(
"192.168.0.9"=>"00:00:00:00:00:00"
);
// присвоение массиву значений айпишников с положительным балансом
$x=0;
while ($x < mysql_numrows($result)):
{
$in_base_ip[$x] = mysql_result($result, $x, 'ip' );
$in_base_mac[$x] = mysql_result ($result, $x, 'mac_adress');
// echo $in_base_ip[$x]," " ,$in_base_mac[$x], "\n";
// внесение пары ип-мак в ассив
$base_ip = $in_base_ip[$x] ; $base_mac = $in_base_mac[$x];
$ip_base[$base_ip]=$base_mac;
echo $base_ip, "-", $ip_base[$base_ip], "\n";
$x++;
};
endwhile;
echo "-----------------------------\n";
// находим айпишники у котрых балланс нулевой, но время оплаты не превысило 10 дней
$query = 'SELECT `id_user`, `ip`, `mac_adress` '
. ' FROM `users` '
. ' WHERE 1 AND `ip` '
. ' LIKE \'192.168.0%\' AND `status` =1 AND `balans` <=0 ORDER BY `ip`';
$result_bad = mysql_query($query);
$x=0;
// echo $x;
//echo mysql_numrows($result);
$res = mysql_numrows($result_bad);
// print_r($result_bad);
while ($x < $res)
{
// print "x= $x \n";
// print "res = $res \n";
$in_base_id_test[$x] = mysql_result($result_bad, $x, 'id_user' );
$in_base_ip_test[$x] = mysql_result($result_bad, $x, 'ip' );
$in_base_mac_test[$x] = mysql_result ($result_bad, $x, 'mac_adress');
echo $in_base_id_test[$x], " ", $in_base_ip_test[$x]," " ,$in_base_mac_test[$x], "\n";
// ---- проверка по транзац логу , когда были последние операции
// проверяем, были ли сьёмы денег у него по автобилингу за последние 10 дней....
$query = 'SELECT DISTINCT ( `id_user` )'
. ' FROM `trans_log` '
. ' WHERE TO_DAYS( NOW( ) ) - TO_DAYS( date ) <=10 AND `discribe` = \'auto billing\' AND `id_user` ='.$in_base_id_test[$x]
. ' ORDER BY `id_user`';
$result = mysql_query($query);
// ... если ДА, то вносим его айпишник и мак в базу хороших адресов.
if ($result)
{echo "нет платежей \n";}
else
{echo "есть платежи \n"; $ip_base[$in_base_ip_test[$x]] = $in_base_mac_test[$x];};
// ---- конец проверка по транзац логу , когда были последние операции
$x++;
};
echo "-----------------------------\n";
// построение состояния айпишников и маков сети
// $net_ip[$ip] - массив с айпишниками
// $net_mac[$ip] - массив с маками
$ip = 14;
$eth0_n=1;
do{
// echo $ip, "\n";
$hosts=shell_exec("sudo arping -c1 192.168.0.$ip | grep 192.168.*.* | grep reply");
// echo $hosts, "\n";
// если ответ ненулевой то вынуть из него мак сетевой
if ($hosts)
{
$hosts=ereg("\[(.*)\]",$hosts,$host_info);
// echo $host_info[1], "\n";
// внесение в массив РЕАЛЬНО РАБОТАЮЩИХ айпишников и маков
$ip_net["192.168.0.".$ip]=$host_info[1];
}
// сразу же выполняется мочилово чуваков для которых не совпадают данные
if (!(strcasecmp($ip_base["192.168.0.".$ip], $ip_net["192.168.0.".$ip]) == 0) AND $ip_net["192.168.0.".$ip]<>"" AND $ip_base["192.168.0.".$ip]<>"00:00:00:00:00:00")
{
// работа с ifconfig и route
echo "MA4U!!!!!! \n", "192.168.0.".$ip, "/", $ip_base["192.168.0.".$ip], "/", $ip_net["192.168.0.".$ip], "/ \n";
// само мочилово!!!!
$shell_exec = "/sbin/ifconfig eth0:". $eth0_n . " hw ether ". $ip_net["192.168.0.".$ip];
echo $shell_exec, "-", $eth0_n, "\n";
// exec ("/sbin/ifconfig eth0:"." hw ether 11:11:11:11:11:11");
// exec ("/sbin/ifconfig eth2 192.168.0.9 netmask 255.255.255.255 up");
$eth0_n++; // увеличение счётчика виртуальных интерефейсов
};
$ip++; // увеличение счётчика айпишника
}
while ($ip < 255);
?>