Провайдеры предоставляющие доступ по PPPoE зачастую сталкиваются с проблемой, когда кто-то из клиентов поднимает PPPoE сервер смотрящий в локалку провайдера.
Т.к. «левый» PPPoE сервер принимает подключения для любого service-name, то как результат:
абоненты провайдера не могут подключиться по PPPoE и получить доступ к услуге.
Предлагаем вашему вниманию скрипт по поиску «левых» PPPoE серверов.
Файл pppoe_search.pl:
#!/usr/bin/perl
if ($#ARGV<0){
die "Usage: $0 <iface> [service name] [debug]\n";
}else{
$iface=$ARGV[0];
if ($ARGV[1] ne '' && $ARGV[1] ne 'debug'){
$sn=":".$ARGV[1];
$debug=$ARGV[2];
}else{
$debug=$ARGV[1];
}
}
open F, "netstat -Wni | grep Link | grep -v tun | grep -v ng | grep -v '*' | grep -v lo0 | grep $iface |" or die "Can't exec finding MAC addresses\n";
while (<F>){
if ($_=~/^$iface\s+\d+\s\<Link#\d{1,3}\>\s+(\S{17})\s/){
$mac=$1;
}
}
if (!$mac){
die "Can't find MAC for [$iface]. Exit...\n";
}
open F, ">/tmp/ppp.conf";
print F "client:
set device PPPoE:$iface$sn
set redial 2 2
";
close F;
open F , "grep -w '/tmp/ppp.conf' /etc/ppp/ppp.conf |" or die "Can't exec grep\n";
while (<F>){
$c=$_;
}
close F;
if (!$c){
die "Can't find include client's section\n";
}else{
print "Found MAC [$mac] at $iface\n";
}
if(($pid = fork)) {
$SIG{CHLD} = 'IGNORE';
$cmd=sprintf "/usr/sbin/tcpdump -e -n -c 1 -i %s ether proto 0x8863 and ether dst %s and 'ether[0xF:1]=0x7' 2>&1 |",$iface,$mac;
if ($debug){
print "DEBUG: ===>[$cmd]<===\n";
}
open F,$cmd or die "Can't start tcpdump\n";
while (<F>){
chomp($_);
if ($debug){
print "DEBUG: ===>[$_]<===\n";
}
if ($_=~/^.+\s(.{17})\s\>\s(.{17}).+PPPoE\sPADO\s\[(.*)\]\s\[(.*)\]\s\[(.*)\]\s\[Host\-Uniq.+/){
print "\nFound asshole on iface $iface (iface's MAC: $2)\n
======================================================\n
PPPoE at MAC: [$1]\nComp name: [$3]\nListening service name: [$5]\n
======================================================\n\n";
}elsif ($_=~/^.+\s(.{17})\s\>\s(.{17}).+PPPoE\sPADO\s\[(.*)\]\s\[(.*)\]\s\[Host\-Uniq.+/){
print "\nFound asshole on iface $iface (iface's MAC: $2)\n
======================================================\n
PPPoE at MAC: [$1]\nComp name: [$3]\nListening service name: [$4]\n
======================================================\n\n";
}elsif ($_=~/ Device not configured/){
die "Wrong iface name [$iface]\n";
}
}
close F;
}else{
`/usr/sbin/ppp -foreground client`;
}
Далее в файл /etc/ppp/ppp.conf добавляем строчку:
!include /tmp/ppp.conf
Внимание, эта строка НЕ должна начинаться с пробела.
Осталось сделать файл запускным:
chmod a+x pppoe_search.pl
Ну и запускаем его на исполнение и видим:
Usage: ./getto.pl <iface> [service name] [debug]
Т.е. для того что бы скрипт начал поиск ему необходимо передать параметры: имя интерфейса, на котором будем искать, и имя service-name, который ищем.
Пример:
/getto.pl bge1 myservicename
тоже самое, но в выводом дебага:
/getto.pl bge1 myservicename debug
Скрипт желательно запускать со своего PPPoE сервера, скрипт исключит мак адрес своего сервера (на котором он был запущен).
Удачного вам поиска 😉
З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !
Авторы: Николаев Дмитрий (virus (at) subnets.ru) и Панфилов Алексей (lehis (at) subnets.ru)
Похожие статьи:
- Не найдено
Добавить комментарий
Вам следует авторизоваться для размещения комментария.