Провайдеры предоставляющие доступ по PPPoE зачастую сталкиваются с проблемой, когда кто-то из клиентов поднимает PPPoE сервер смотрящий в локалку провайдера.
Т.к. «левый» PPPoE сервер принимает подключения для любого service-name, то как результат:
абоненты провайдера не могут подключиться по PPPoE и получить доступ к услуге.
Предлагаем вашему вниманию скрипт по поиску «левых» PPPoE серверов.
Файл pppoe_search.pl:
#!/usr/bin/perl
if ($#ARGV<0){
die "Usage: $0 [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 (){
if ($_=~/^$iface\s+\d+\s\\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 (){
$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 (){
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
Т.е. для того что бы скрипт начал поиск ему необходимо передать параметры: имя интерфейса, на котором будем искать, и имя service-name, который ищем.
Пример:
/getto.pl bge1 myservicename
тоже самое, но в выводом дебага:
/getto.pl bge1 myservicename debug
Скрипт желательно запускать со своего PPPoE сервера, скрипт исключит мак адрес своего сервера (на котором он был запущен).
Удачного вам поиска
З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !