Провайдеры предоставляющие доступ по 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] [debug]
Т.е. для того что бы скрипт начал поиск ему необходимо передать параметры: имя интерфейса, на котором будем искать, и имя service-name, который ищем.
Пример:
/getto.pl bge1 myservicename
тоже самое, но в выводом дебага:
/getto.pl bge1 myservicename debug
Скрипт желательно запускать со своего PPPoE сервера, скрипт исключит мак адрес своего сервера (на котором он был запущен).
Удачного вам поиска
Источник