Привязка клиента к конкретноиу порту NAS
Привязка клиента к конкретноиу порту NAS
А можно ли как-то организовать сабж? То бишь чтобы клиенту vasya ВСЕГДА назначался ифейс ppp150, а клиенту pupkin - ppp49? Юзается pppoe server + radius + pppd. Проблем в том, что когда клиент устанавливает пппое соединение, у сервера нет о клиенте никакой информации, кроме его MAC. Далее, насколько я понимаю, пппое запускает пппд, который выделяет динамически ппп ифейс и его номер передаёт его радиусу в качестве номера порта. А хоцца (ну очень), чтоб Абиллс хранил где-то в базе (это не проблема) номер порта клиента и радиус его возвращал бы... НО... ДО запуска пппд. А уж потом запуск pppd например с параметром ifname ...
-
- Сообщения: 16
- Зарегистрирован: Чт янв 24, 2008 3:52 pm
А тебе Мака мало?! из таблички абиллса выдергиваешь логин да и делов то, если нанешн ДШСП поднят))у сервера нет о клиенте никакой информации, кроме его MAC.
ну а дальше....канешн ифконфигом уже после поднятия ифэйса....но эт извращение))
Сам хочу сделать имена ифэйсов но логину юзверей...ток пока не придумал как))
да переименовать-то его не проблема... можно и до поднятия - из скрипта /etc/ppp/ip-pre-up сделать:
ip link set $1name pppvasya
Только вот ведёт себя pppd после такого фокуса отвратительно. Всё дело в том, что к этому моменту в логах уже присутствует запись:
Feb 4 18:06:33 billing pppd[17429]: Connect: ppp14 <--> /dev/pts/15
И только потом вот эта:
Feb 4 18:06:36 billing pppd[17429]: Script /etc/ppp/ip-pre-up finished (pid 17448), status = 0x0
А первая запись говорит о том, что пппд уже "запомнил", что выделился интерфейс ppp14. И если его переименовать... то пппд становится раком. Потому как будет искать ppp14. И не найдёт
Тут надо именно запускать pppd с параметром ifname pppvasya. Тогда в логах будет запись:
Connect: pppvasya <--> /dev/pts/15
И всё будет пучком... Но... В моём случае (pppoe) pppd запускает pppoe сервер (по входящему от клиента линку). И на этом этапе о клиенте ничего, кроме его мака неизвестно (до авторизации-то дело ещё совсем не дошло). А в базу за именем интерфейса, который надо назначить данному клиенту надо лезть именно в этот момент, чтобы запустить pppd с нужным параметром ifname, иначе потом будет поздно... Вот в чём проблем...
ip link set $1name pppvasya
Только вот ведёт себя pppd после такого фокуса отвратительно. Всё дело в том, что к этому моменту в логах уже присутствует запись:
Feb 4 18:06:33 billing pppd[17429]: Connect: ppp14 <--> /dev/pts/15
И только потом вот эта:
Feb 4 18:06:36 billing pppd[17429]: Script /etc/ppp/ip-pre-up finished (pid 17448), status = 0x0
А первая запись говорит о том, что пппд уже "запомнил", что выделился интерфейс ppp14. И если его переименовать... то пппд становится раком. Потому как будет искать ppp14. И не найдёт
Тут надо именно запускать pppd с параметром ifname pppvasya. Тогда в логах будет запись:
Connect: pppvasya <--> /dev/pts/15
И всё будет пучком... Но... В моём случае (pppoe) pppd запускает pppoe сервер (по входящему от клиента линку). И на этом этапе о клиенте ничего, кроме его мака неизвестно (до авторизации-то дело ещё совсем не дошло). А в базу за именем интерфейса, который надо назначить данному клиенту надо лезть именно в этот момент, чтобы запустить pppd с нужным параметром ifname, иначе потом будет поздно... Вот в чём проблем...
-
- Сообщения: 16
- Зарегистрирован: Чт янв 24, 2008 3:52 pm
УРА!!!! убив день всё таки всё получилось)))
/var/log/pptp.log:
Как спросишь ты....а я возьму и отвечу...и так по порядку!!!
1. Пропатчил pppd-2.4.4 для использования ifname....нашел лишь под чуть старее версию, ну да благо всё обошлось без косяков)))
2. Заварив n-ый литраж чаю взялся за сорцы pptpd-1.3.4 и нашел...в итоге организовал перенаправление всех параметров передаваемых pppd в свой скрипт под кодовым названием pptp_ifnameиз которого pppd и стартует
pptp_ifname:
чуть поясню суть скрипта...в скрипт поступают параметры от pptpd вместе с которыми и ip адрес клиента, по Ip адресу определяется uid клиента в абиллсе, а по uid`у уж и его логин, который и передается pppd в качестве аргумента параметра ifname
P.S. За возможные косяки в скрипте прошу не пинать, ибо на перле пишу ооочччеенннььь не часто...прост захотелось)))
P.S.S. патчи не оформлял, а по сему не выкладываю...да и...нужно еще подправить сорцы pptpd да бы в скрипт пердавалось и количество параметров но если есть интузиасты - выложу)))
P.S.S.S. ran у тебя похожая история...дерзайте судырь)))
/var/log/pptp.log:
Код: Выделить всё
Renamed interface ppp1 to 1234
Using interface 1234
Connect: 1234 <--> /dev/pts/18
1. Пропатчил pppd-2.4.4 для использования ifname....нашел лишь под чуть старее версию, ну да благо всё обошлось без косяков)))
2. Заварив n-ый литраж чаю взялся за сорцы pptpd-1.3.4 и нашел...в итоге организовал перенаправление всех параметров передаваемых pppd в свой скрипт под кодовым названием pptp_ifnameиз которого pppd и стартует
pptp_ifname:
Код: Выделить всё
#!/usr/bin/perl
use DBI;
my $dbh = DBI->connect("DBI:mysql:database=abills;host=localhost","root", "MyFuckingPass") || die $DBI::errstr;
my $result = $dbh->prepare("SELECT uid FROM dhcphosts_hosts WHERE ip=INET_ATON('$ARGV[6]')");
$result->execute();
my $ln = $result->fetchrow_hashref();
my $result = $dbh->prepare("SELECT id FROM users WHERE uid=$ln->{'uid'}");
$result->execute();
my $ln = $result->fetchrow_hashref();
print $ln->{'id'};
exec('/usr/sbin/pppd',$ARGV[1],$ARGV[2],$ARGV[3],$ARGV[4],$ARGV[5],$ARGV[6],$ARGV[7],$ARGV[8],'ifname',$ln->{'id'});
$dbh->disconnect();
P.S. За возможные косяки в скрипте прошу не пинать, ибо на перле пишу ооочччеенннььь не часто...прост захотелось)))
P.S.S. патчи не оформлял, а по сему не выкладываю...да и...нужно еще подправить сорцы pptpd да бы в скрипт пердавалось и количество параметров но если есть интузиасты - выложу)))
P.S.S.S. ran у тебя похожая история...дерзайте судырь)))
-
- Сообщения: 16
- Зарегистрирован: Чт янв 24, 2008 3:52 pm
Я тоже так сначала подумал, но потом решил все перенаправлять в скрипт по двум причинам:я уж лучше на сях в сырцы пппд вставлю Very Happy
1. При смене скажем пароля к мускулу ты предлагаешь опять лезть в сырцы? или же добавить параметры в конфиги?!...как по мне геморно и безсмысленно
2. удобней манипулировать...