Jump to content
Калькуляторы

SNeon

Пользователи
  • Content Count

    20
  • Joined

  • Last visited

Everything posted by SNeon


  1. Думаю можно реализовать так-же как и 1-to-1 NAT. При помощи добавления правил в -t nat из perl скрипта Попробую вечерком поколдовать на эту тему
  2. Патч на динамическое распределение на подсети по атрибуту Framed-IP-Netmask (атрибут можно изменить в конфиге, опция $cfg{network_ident}. Атрибут должен быть типа ipaddr (см. в файле dictionary) Сессию запускает первый обратившийся IP из подсети. С-но логин/пароль будет этот же IP. Вся статистика будет также идти от этого IP. Но полиситься и учитываться будет вся подсеть. Если Framed-IP-Netmask не указан, то считается что маска 255.255.255.255 (то есть 1 IP) Это АЛЬФА версия патча на голую версию http://bitbucket.org/sysoleg/lisg/get/tip.tar.gz Альфа, потому как не тестировал сервисы и классы. Есть мнение, работать будет, но тестировать негде т.к. у меня не используется. Эта версия уже трудится 4 часа. Мин нет. Кому не страшно - тестируйте и отписывайте. в iptables ничего не изменилось в конфиг добавлена опция $cfg{network_ident} = "Framed-IP-Netmask"; изменены файлы: ./ISG/bin/ISG.pl ./ISG/bin/ISGd.pl ./lib/ISG.pm ./kernel/isg_main.c ./kernel/isg_main.h так что потребуется пересборка модуля ядра, перезапись поверх библиотеки, демона и управляющей программы. перезагрузка модуля, перезапуск демона diff -ruN lisg/ISG/bin/ISGd.pl lisg-framed-net/ISG/bin/ISGd.pl --- lisg/ISG/bin/ISGd.pl 2010-10-02 22:10:08.000000000 +0300 +++ lisg-framed-net/ISG/bin/ISGd.pl 2011-01-16 15:05:58.957575888 +0200 @@ -287,6 +287,7 @@ $oev->{'alive_interval'} = defined($alive_interval) ? $alive_interval : $cfg{session_alive_interval}; $oev->{'max_duration'} = defined($max_duration) ? $max_duration : $cfg{session_max_duration}; $oev->{'idle_timeout'} = defined($idle_timeout) ? $idle_timeout : $cfg{idle_timeout}; + $oev->{'ipnetmask'} = ISG::ip2long($rp->attr(defined($cfg{network_ident}) ? $cfg{network_ident} : 'Framed-IP-Netmask')); if (defined($speed_info) && $speed_info =~ /^(\d{1,})\/(\d{1,})$/) { $oev->{'in_rate'} = $2 * 1000; diff -ruN lisg/ISG/etc/config.pl lisg-framed-net/ISG/etc/config.pl --- lisg/ISG/etc/config.pl 2010-10-02 22:10:08.000000000 +0300 +++ lisg-framed-net/ISG/etc/config.pl 2011-01-16 15:05:58.972575673 +0200 @@ -35,6 +35,9 @@ ### Check traffic classification file MD5 sum every N seconds. If sum was changed re-read this file. $cfg{tc_check_interval} = 300; ## Every 5 minutes +### Network identifier. Param from dictionary. Type is ipaddr. Default - Framed-IP-Netmask +$cfg{network_ident} = "Framed-IP-Netmask"; + ####################### Services description ####################### ### Begin ``TESTSERV'' service ### diff -ruN lisg/ISG/lib/ISG.pm lisg-framed-net/ISG/lib/ISG.pm --- lisg/ISG/lib/ISG.pm 2010-10-02 22:10:08.000000000 +0300 +++ lisg-framed-net/ISG/lib/ISG.pm 2011-01-16 15:05:58.981575546 +0200 @@ -22,7 +22,7 @@ use constant NLMSG_ALIGNTO => 4; use constant NLMSG_DONE => 0x3; use constant NLM_F_MULTI => 0x2; -use constant IN_EVENT_MSG_LEN => 140; +use constant IN_EVENT_MSG_LEN => 148; use constant EVENT_LISTENER_REG => 0x01; use constant EVENT_SESS_APPROVE => 0x04; @@ -178,6 +178,8 @@ $pars->{'session_id'} = ""; $pars->{'ipaddr'} = 0; + $pars->{'ipnetwork'} = 0; + $pars->{'ipnetmask'} = 4294967295; $pars->{'nat_ipaddr'} = 0; $pars->{'port_number'} = 0; $pars->{'flags'} = 0; @@ -220,10 +222,12 @@ } else { - return pack("I a8 N2 H12 v I8 a32 C", + return pack("I a8 N4 H12 v I8 a32 C", $pars->{'type'}, $pars->{'session_id'}, $pars->{'ipaddr'}, + $pars->{'ipnetwork'}, + $pars->{'ipnetmask'}, $pars->{'nat_ipaddr'}, 0, # MAC-Address is read-only $pars->{'flags'}, @@ -255,6 +259,8 @@ $session_id_hi, $session_id_lo, $pars->{'ipaddr'}, + $pars->{'ipnetwork'}, + $pars->{'ipnetmask'}, $pars->{'nat_ipaddr'}, $pars->{'macaddr'}, $pars->{'flags'}, @@ -279,7 +285,7 @@ $p_session_id_hi, $p_session_id_lo, $pars->{'service_name'} - ) = unpack("I I2 N2 H12 v I8 I i I10 a32", shift); + ) = unpack("I I2 N4 H12 v I8 I i I10 a32", shift); $pars->{'service_name'} =~ s/\000//g; if (!length($pars->{'service_name'})) { diff -ruN lisg/kernel/isg_main.c lisg-framed-net/kernel/isg_main.c --- lisg/kernel/isg_main.c 2010-10-02 22:10:08.000000000 +0300 +++ lisg-framed-net/kernel/isg_main.c 2011-01-16 15:05:58.982575531 +0200 @@ -491,6 +491,8 @@ } is->info.ipaddr = ipaddr; + is->info.ipnetwork = ipaddr; + is->info.ipnetmask = 0xFFFFFFFFL; is->start_ktime = ts_now.tv_sec; is->isg_net = isg_net; @@ -556,6 +558,9 @@ is->info.out_rate = ev->si.sinfo.out_rate; is->info.out_burst = ev->si.sinfo.out_burst; + is->info.ipnetmask = ev->si.sinfo.ipnetmask; + is->info.ipnetwork = (is->info.ipnetmask & is->info.ipaddr); + if (ev->si.sinfo.nat_ipaddr) { is->info.nat_ipaddr = ev->si.sinfo.nat_ipaddr; } @@ -674,14 +679,17 @@ } static inline struct isg_session *isg_lookup_session(struct isg_net *isg_net, u_int32_t ipaddr) { + unsigned int i; struct isg_session *is; struct hlist_node *n; - unsigned int h = get_isg_hash(ipaddr); +// unsigned int h = get_isg_hash(ipaddr); - hlist_for_each_entry(is, n, &isg_net->hash[h], list) { - if (is->info.ipaddr == ipaddr) { - return is; - } + for (i = 0; i < nr_buckets; i++) { + hlist_for_each_entry(is, n, &isg_net->hash[i], list) { + if (is->info.ipnetwork == (ipaddr & is->info.ipnetmask)) { + return is; + } + } } return NULL; @@ -690,7 +698,7 @@ static inline int isg_equal(struct isg_in_event *ev, struct isg_session *is) { if ((ev->si.sinfo.id && ev->si.sinfo.id == is->info.id) || (is->info.port_number == ev->si.sinfo.port_number) || - (is->info.ipaddr == ev->si.sinfo.ipaddr)) { + (is->info.ipnetwork == (is->info.ipnetmask & ev->si.sinfo.ipaddr))) { return 1; } else { return 0; diff -ruN lisg/kernel/isg_main.h lisg-framed-net/kernel/isg_main.h --- lisg/kernel/isg_main.h 2010-10-02 22:10:08.000000000 +0300 +++ lisg-framed-net/kernel/isg_main.h 2011-01-16 15:05:58.983575515 +0200 @@ -83,6 +83,8 @@ u_int64_t id; u_int32_t ipaddr; /* User's IP-address */ + u_int32_t ipnetwork; /* User's NetWork */ + u_int32_t ipnetmask; /* User's NetMask */ u_int32_t nat_ipaddr; /* User's 1-to-1 NAT IP-address */ u_int8_t macaddr[ETH_ALEN]; /* User's MAC-address */
  3. Именно! Уже заканчиваю реализацию. Днем поставлю на тест. Для каждой авторизованной сессии будет держаться связка сеть/маска. пакеты будут сравниваться так: сеть == IP & маска. на всю подсеть 1 сессия. Но инициализированная по любому IP. Билинг уже перековырял =)
  4. уговорили ) сделаю под Framed-Netmask =) Не обещаю, что скоро. Пока продумываю алгоритм
  5. но мы же не знаем какая маска. у нас всё с точностью до наоборот! известен IP а надо подобрать ему в базе соответствующую маску же!
  6. Каким запросом, зная только IP, получить из базы маску? Многие ли билинги это умеют? допустим в базе есть запись с логином 10.0.0.0. для этого логина я хочу сеть /29. Т.е. будет еще поле для Framed-Netmask = 255.255.255.248 как теперь это всё провернуть, если подключается клиент с IP 10.0.0.5 ?
  7. как об этом уведомить ISG? Ведь хочется ж одним правилом в iptables оседлать и /24 и /30 и /32 Проблема в том, что запрос логин-пароль (IP-IP) идут раньше, чем назначения подсетей из билинга Ну подумайте сами. клиент ломится в инет. что мы о нем можем узнать? IP? Да, только его IP. Сеть он не передает. Как узнать его сеть? Только спросить у билинга, через IP. А для этого и надо держать 254 IP для /24 Теперь: как опросив логин (а именно IP, а он же может быть любой из диапазона) вычислить нужный шейпер? юзабельно, только вот вопросы выше...
  8. Де дело в том, что от ISG не придет Framed-IP-Netmask с самого начала, ибо ISG не знает как бить сети. Допустим нет ни одной сессии. Допустим надо полисить сеть 1.0.0.0/24 Теперь приходит клиент и включает камп: Идет auth-request примерно следующего типа логин: 1.0.0.24 пароль: 1.0.0.24 id: random port: первый свободный и вот как ему назначить сеть? а логин и пароль нужен в билинге, иначе как идентифицировать? ISG в запросе не может передать сеть! никак! он же не знает того, что знает билинг!!! дальше: допустим билинг ответил ацептом (по связке IP-пароль). Выдал атрибуты... .... Framed-IP-Netmask .... и как с атриутом дальше поступить? а теперь допустим, что первым включили камп с IP 1.0.0.21... мысли? а теперь случай - уже зареган 1.0.0.24. А тут запрос от 1.0.0.98 Чо дальше делать? Как отчитаться radius о клиентах?
  9. Framed-IP-Netmask несколько не для этого. Но боком прикрутить можно. А зачем он в CoA? Сессия то все равно одна будет для всей подсети. Вот этой сессии и подавать CoA по ID, опираясь на Online в билинге. А вот те, у кого radius/билинг шлет по умолчанию этот параметр, будут неприятно удивлены поведением. А хотя нет. Не одна сессия будет. Ведь запустить сессию может любой IP, а только потом в ISG придет атрибут Framed-IP-Netmask. А значит для сети /24 в базе билинга придется держать 254 логина. Тогда уже логичней будет считать все сессии в отдельности, и держать отдельный счетчик всей подсети в ядре для полисинга. Или же использовать общий счетчик через указатель. но тогда у всех активных сессий в билинге будут одинаковые счетчики трафика. В общем пока не ясно, как проще. Предлагайте
  10. Тогда надо придумать алгоритм. что будет посылать радиус(билинг) и каким образом на это реагировать. когда я раньше поднимал этот вопрос, ответ сводился к одному - не заводить кучу правил в iptables под разные нужды. А следовательно информацию надо брать либо из конфига либо из билинга. Предлагайте варианты - сделаем. Мне нужно было как минимум побить подсеть на сети класса С и подсеть на сети /30. Теперь 4 правила в iptables с этим справляются. Патч писал ночью от бессонницы и скуки. Для начала чтоб хотя бы разобраться с кодом (комментариев в нем к сожалению очень мало).
  11. Не спалось. За пару часов накидал патч для учета и полисинга подсетей. Естественно придется пересобрать модули iptables и ядра. Не забыть перезагрузить модуль ядра. В цепочку FORWARD в оба правила (-s и -d) добавить в конец параметр --init-net например: -A FORWARD -s 192.168.0.0/16 -j ISG --session-init --init-net 24 -A FORWARD -d 192.168.0.0/16 -j ISG --init-net 24 Это разобъет всю сеть 192.168.0.0/16 на подсети /24 Логины и пароли с-но будут 192.168.0.0, 192.168.1.0 ... 192.168.254.0 можно бить на любые подсети, хоть /31 использую вот эту версию http://bitbucket.org/sysoleg/lisg/get/tip.tar.gz diff -ruN lisg-oct-2-neon/kernel/isg_main.c lisg-oct-2-neon-net/kernel/isg_main.c --- lisg-oct-2-neon/kernel/isg_main.c 2010-10-02 22:10:08.000000000 +0300 +++ lisg-oct-2-neon-net/kernel/isg_main.c 2011-01-11 07:44:46.500072709 +0200 @@ -477,7 +477,7 @@ return 1; } -static struct isg_session *isg_create_session(struct isg_net *isg_net, u_int32_t ipaddr, u_int8_t *src_mac) { +static struct isg_session *isg_create_session(struct isg_net *isg_net, u_int32_t ipaddr, u_int8_t *src_mac, u_int32_t init_net) { struct isg_session *is; unsigned int port_number; struct timespec ts_now; @@ -493,6 +493,7 @@ is->info.ipaddr = ipaddr; is->start_ktime = ts_now.tv_sec; is->isg_net = isg_net; + is->init_net = init_net; port_number = find_next_zero_bit(isg_net->port_bitmap, PORT_BITMAP_SIZE, 1); set_bit(port_number, isg_net->port_bitmap); @@ -690,7 +691,7 @@ static inline int isg_equal(struct isg_in_event *ev, struct isg_session *is) { if ((ev->si.sinfo.id && ev->si.sinfo.id == is->info.id) || (is->info.port_number == ev->si.sinfo.port_number) || - (is->info.ipaddr == ev->si.sinfo.ipaddr)) { + (is->info.ipaddr == ((is->init_net) ? (ev->si.sinfo.ipaddr & is->init_net) : ev->si.sinfo.ipaddr))) { return 1; } else { return 0; @@ -964,6 +965,7 @@ struct nehash_entry *ne; struct traffic_class **tc_list; __be32 laddr, raddr; + u_int32_t init_net = 0; struct isg_net *isg_net; u_int32_t pkt_len, pkt_len_bits; @@ -998,6 +1000,12 @@ raddr = iph->saddr; } + if (iinfo->flags & INIT_NET) { /* Init NET */ + init_net = htonl(0xFFFFFFFF << (32 - iinfo->init_net)); + laddr &= init_net; + raddr &= init_net; + } + is = isg_lookup_session(isg_net, laddr); if (is == NULL) { @@ -1010,7 +1018,7 @@ } } - isg_create_session(isg_net, laddr, src_mac); + isg_create_session(isg_net, laddr, src_mac, init_net); } else if (isg_net->pass_outgoing) { goto ACCEPT; } diff -ruN lisg-oct-2-neon/kernel/isg_main.h lisg-oct-2-neon-net/kernel/isg_main.h --- lisg-oct-2-neon/kernel/isg_main.h 2010-10-02 22:10:08.000000000 +0300 +++ lisg-oct-2-neon-net/kernel/isg_main.h 2011-01-11 06:47:54.342145989 +0200 @@ -21,6 +21,7 @@ #define INIT_SESSION 0x01 #define INIT_BY_SRC 0x02 #define INIT_BY_DST 0x04 +#define INIT_NET 0x08 #define ISG_DIR_IN 0x01 #define ISG_DIR_OUT 0x02 @@ -77,6 +78,7 @@ struct ipt_ISG_info { u_int8_t flags; + u_int8_t init_net; /* Init NETWORK */ }; struct isg_session_info { @@ -119,6 +121,8 @@ u_int64_t in_last_seen; u_int64_t out_last_seen; + u_int32_t init_net; /* Init NETWORK */ + time_t start_ktime; time_t last_export; diff -ruN lisg-oct-2-neon/kernel/libipt_ISG.c lisg-oct-2-neon-net/kernel/libipt_ISG.c --- lisg-oct-2-neon/kernel/libipt_ISG.c 2010-10-02 22:10:08.000000000 +0300 +++ lisg-oct-2-neon-net/kernel/libipt_ISG.c 2011-01-11 07:22:49.369311708 +0200 @@ -9,11 +9,13 @@ struct ipt_ISG_info { u_int8_t flags; + u_int8_t init_net; /* Init NETWORK */ }; static const struct option opts[] = { { "session-init", 0, NULL, '1' }, { "init-mode", 1, NULL, '2' }, + { "init-net", 1, NULL, '3' }, { .name = NULL } }; @@ -24,12 +26,14 @@ " --init-mode <mode> Session initialization mode:\n" " src - use src IP-address as username\n" " dst - use dst IP-address as username\n" -" If --init-mode is not specified, `src' is assumed\n"); +" If --init-mode is not specified, `src' is assumed\n" +" --init-net Net Prefix\n"); } #define INIT_SESSION 0x01 #define INIT_BY_SRC 0x02 #define INIT_BY_DST 0x04 +#define INIT_NET 0x08 #if defined NEWSTYLE #define _EXIT_ERROR xtables_error @@ -73,6 +77,20 @@ break; + case '3': + if (*flags & INIT_NET) { + _EXIT_ERROR(PARAMETER_PROBLEM, "Can't specify --init-net twice\n"); + } + + isg->flags |= INIT_NET; + if (strlen(optarg)) { + isg->init_net = atoi(optarg); + } else { + isg->init_net = 24; + } + + break; + default: return 0; } @@ -92,6 +110,10 @@ printf("--init-mode dst"); } } + + if (isg->flags & INIT_NET) { + printf(" --init-net %d", isg->init_net); + } } static void print(const void *ip, @@ -111,6 +133,10 @@ printf("dst mode"); } } + + if (isg->flags & INIT_NET) { + printf(" net %d", isg->init_net); + } } static void check(unsigned int flags) { diff -ruN lisg-oct-2-neon/kernel/old_iptables/libipt_ISG.c lisg-oct-2-neon-net/kernel/old_iptables/libipt_ISG.c --- lisg-oct-2-neon/kernel/old_iptables/libipt_ISG.c 2010-10-02 22:10:08.000000000 +0300 +++ lisg-oct-2-neon-net/kernel/old_iptables/libipt_ISG.c 2011-01-11 07:22:54.146230240 +0200 @@ -9,11 +9,13 @@ struct ipt_ISG_info { u_int8_t flags; + u_int8_t init_net; /* Init NETWORK */ }; static struct option opts[] = { { "session-init", 0, NULL, '1' }, { "init-mode", 1, NULL, '2' }, + { "init-net", 1, NULL, '3' }, { .name = NULL } }; @@ -24,12 +26,14 @@ " --init-mode <mode> Session initialization mode:\n" " src - use src IP-address as username\n" " dst - use dst IP-address as username\n" -" If --init-mode is not specified, `src' is assumed\n"); +" If --init-mode is not specified, `src' is assumed\n" +" --init-net Net Prefix\n"); } #define INIT_SESSION 0x01 #define INIT_BY_SRC 0x02 #define INIT_BY_DST 0x04 +#define INIT_NET 0x08 static int parse(int c, char **argv, int invert, unsigned int *flags, const struct ipt_entry *entry, @@ -65,6 +69,20 @@ break; + case '3': + if (*flags & INIT_NET) { + exit_error(PARAMETER_PROBLEM, "Can't specify --init-net twice\n"); + } + + isg->flags |= INIT_NET; + if (strlen(optarg)) { + isg->init_net = atoi(optarg); + } else { + isg->init_net = 24; + } + + break; + default: return 0; } @@ -84,6 +102,10 @@ printf("--init-mode dst"); } } + + if (isg->flags & INIT_NET) { + printf(" --init-net %d", isg->init_net); + } } static void print(const struct ipt_ip *ip, @@ -103,6 +125,10 @@ printf("dst mode"); } } + + if (isg->flags & INIT_NET) { + printf(" net %d", isg->init_net); + } } static void check(unsigned int flags) {
  12. EvilShadow, уже обсуждалось. Свелось к следующему: RADIUS использует атрибуты Session-Timeout и/или Idle-Timeout? Точно стояло radius_default_session_timeout=65000. поставил на 180. сейчас проверю. Все точно, теперь нормально!. Спасибо! Пора составить небольшой FAQ
  13. О_О это почему-же??? Наоборот! Как можно лишить себя такой полезной информации? Эммм... О L3-свитчах не слышали? Аль у вас локалка прямо через NAS бегает? если уж через L3 пускать, да еще и через циску, то зачем тогда этот проект? ;) Ессно прямо через NAS. Экономия должна быть экономной, как говорит директор =) Вся сеть сведена через .1q на soft NAS. NAS выступает таким себе 300+ портовым свитчем с ISG. Всё делалось для того, чтобы убрать VPN(pptp) но оставить мониторинг поклиентно. А тут такой прожект! Почти не надо модернизировать билинг, что удобно для мастеров и ТП. Остается гибкость радиуса и никаких допвложений в железо
  14. Интересно, какая система и откуда тогда берется Makefile из исходников iptables??? Кому надо - может выдернуть из общего. Я же просто скинул свои поправки, которые необходимы были лично мне.Дальше тоже ковыряю и тестирую на подсети. Как будет готово - О_О это почему-же??? Наоборот! Как можно лишить себя такой полезной информации? Именно тот случай.
  15. Предлагаю выкладывать свои патчи, с описанием. Пользуюсь Fedora 13 и 14. Полёт нормальный. Патч изменяет configure скрипт, чтобы не тянуть исходники ядра и iptables. достаточно поставить devel пакеты. Изменяет стартовый скрипт, на более подходящий для Fedora Изменяет Calling-Station-Id на формат IP - MAC Добавляет параметр конфигурации #$cfg{nas_ip} = "192.168.0.1"; ## By default equals to hostname diff -ruN lisg/ISG/bin/ISGd.pl lisg-oct-2-neon/ISG/bin/ISGd.pl --- lisg/ISG/bin/ISGd.pl 2010-10-02 22:10:08.000000000 +0300 +++ lisg-oct-2-neon/ISG/bin/ISGd.pl 2010-10-27 01:41:59.501692727 +0300 @@ -46,7 +46,11 @@ exit(0); } -$nas_ip = ISG::isg_get_nas_ip(); +if (defined($cfg{nas_ip})) { + $nas_ip = $cfg{nas_ip}; +} else { + $nas_ip = ISG::isg_get_nas_ip(); +} if (!length($nas_ip)) { do_log("warning", "Unable to get my own IP-address, using 127.0.0.1"); @@ -649,7 +653,7 @@ } $p->set_attr("User-Name", $username); - $p->set_attr("Calling-Station-Id", $username); + $p->set_attr("Calling-Station-Id", $username . " - " . ISG::format_mac($ev->{'macaddr'}, 2, ":")); $p->set_attr("Service-Type", "Framed-User"); @@ -662,7 +666,7 @@ $p->set_attr("NAS-Port-Type", "Virtual"); if (defined($ev->{'macaddr'})) { - $p->set_vsattr("Cisco", "Cisco-AVPair", "client-mac-address=" . ISG::format_mac($ev->{'macaddr'}, 4)); + $p->set_vsattr("Cisco", "Cisco-AVPair", "client-mac-address=" . ISG::format_mac($ev->{'macaddr'}, 4, ".")); } if ($code eq "Accounting-Request") { diff -ruN lisg/ISG/contrib/rc.ISGd lisg-oct-2-neon/ISG/contrib/rc.ISGd --- lisg/ISG/contrib/rc.ISGd 2010-10-02 22:10:08.000000000 +0300 +++ lisg-oct-2-neon/ISG/contrib/rc.ISGd 2010-08-02 15:41:42.000000000 +0300 @@ -1,44 +1,70 @@ #!/bin/sh +# +# Startup script for ISGd +# +# chkconfig: 345 86 15 +# description: ISG server +# processname: ISGd +# config: /etc/ISG/config.pl + +# Source function library. +. /etc/rc.d/init.d/functions +# Source networking configuration. +. /etc/sysconfig/network + +RETVAL=0 ulimit -n 8192 -ISGd_RUN="ISGd" +prog=ISGd ISGd_RUN="/usr/local/ISG/bin/ISGd.pl" NAME=`basename $0` -case $* in -start) +start() { + # Check that networking is up. + [ ${NETWORKING} = "no" ] && exit 1 + if pgrep -f $ISGd_RUN > /dev/null; then echo "$NAME: Already running" exit 1 fi - - echo "$NAME: Starting ISGd" - echo "1048576" > /proc/sys/net/core/rmem_max - $ISGd_RUN + # Start daemons. + echo -n $"Starting $prog: " + daemon $ISGd_RUN + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog + return $RETVAL +} + +stop() { + echo -n $"Stopping $prog: " + killproc $ISGd_RUN + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog + return $RETVAL +} - echo "$NAME: ISGd started" +case $* in +start) + start ;; stop) - PID=`cat /var/run/ISGd.pid 2> /dev/null` - - if [ "$PID" = "" ]; then - echo "$NAME: Not running" - exit 1 - fi - - echo "$NAME: Stopping ISGd (PID $PID)" + stop + ;; - kill $PID - echo "$NAME: ISGd stopped" +restart) + stop + start ;; *) - echo "Usage: $0 {start|stop}" >&2 + echo "Usage: $0 {start|stop|restart}" >&2 exit 1 ;; esac diff -ruN lisg/ISG/etc/config.pl lisg-oct-2-neon/ISG/etc/config.pl --- lisg/ISG/etc/config.pl 2010-10-02 22:10:08.000000000 +0300 +++ lisg-oct-2-neon/ISG/etc/config.pl 2010-10-27 01:42:28.928568147 +0300 @@ -13,6 +13,7 @@ $cfg{radius_auth}{0} = { server => "127.0.0.1:1812", timeout => 5, secret => "apple" }; $cfg{radius_acct}{0} = { server => "127.0.0.1:1813", timeout => 5, secret => "apple" }; +#$cfg{nas_ip} = "192.168.0.1"; ## By default equals to hostname #$cfg{nas_identifier} = "lISG"; ## By default equals to NAS IP-address ### CoA-related settings diff -ruN lisg/ISG/lib/ISG.pm lisg-oct-2-neon/ISG/lib/ISG.pm --- lisg/ISG/lib/ISG.pm 2010-10-02 22:10:08.000000000 +0300 +++ lisg-oct-2-neon/ISG/lib/ISG.pm 2010-10-27 01:43:14.255692743 +0300 @@ -115,14 +115,14 @@ } sub format_mac { - my ($mac, $step) = @_; + my ($mac, $step, $dl) = @_; my @pts; for (my $i = 0; $i <= 8 && $step; $i += $step) { push(@pts, substr($mac, $i, $step)); } - return join(".", @pts); + return join($dl, @pts); } sub hex_session_id_to_llu { diff -ruN lisg/kernel/configure lisg-oct-2-neon/kernel/configure --- lisg/kernel/configure 2010-10-02 22:10:08.000000000 +0300 +++ lisg-oct-2-neon/kernel/configure 2010-11-07 23:35:31.829350555 +0200 @@ -9,9 +9,9 @@ iptables_src_version() { echo -n "Checking iptables sources version: " - SRC="$IPTSRC/Makefile" - test -s "$SRC" || error "Please build iptables first." - VER=`sed -n 's/^\(IPTABLES_\)\?VERSION[ :]= \?//p' "$SRC"` + SRC="$IPTSRC/include/iptables/internal.h" + test -s "$SRC" || error "Please build iptables or install iptables-devel first." + VER=`sed -n 's/#define IPTABLES_VERSION //p' "$SRC" | tr -d "\""` test "$VER" || error "Unknown version of iptables." if [ "$VER" = "$IPTVER" ]; then echo "$VER (ok)" @@ -106,6 +106,7 @@ try_dirg "iptables" && return 0 try_dirg "../iptables" && return 0 try_dirg "/usr/src/iptables" && return 0 + try_dirg "/usr" && return 0 error "Can not find iptables source directory, try setting it with --ipt-src=" fi }
  16. Fedora 13 - полёт нормальный! Немного про автоматизацию... После установки нового ядра, для автоматической сборки модулей isg в Fedora использую dkms Для начала ставим сам пакет # yum install -y dkms Беглый анализ показал, что dkms добавил свой сервис в автозапуск: # chkconfig --list | grep dkms dkms_autoinstaller 0:off 1:off 2:on 3:on 4:on 5:on 6:off Создаем папку для исходников модуля: В моем случае это будет: # mkdir /usr/src/lISG Копируем в созданный католог файлы isg_main.c isg_main.h isg_nehash.c libipt_ISG.c создаем файл конфигурации dkms.conf Туда вписываем следующее: PACKAGE_NAME="ipt_ISG" PACKAGE_VERSION="0.11" BUILT_MODULE_NAME[0]="ipt_ISG" DEST_MODULE_LOCATION[0]="/extra/" AUTOINSTALL="yes" создаем Makefile Туда вписываем следующее: # # Makefile for the ipt_ISG Linux ISG Access Control # obj-m = ipt_ISG.o ipt_ISG-objs = isg_main.o isg_nehash.o создаем build.h Туда вписываем следующее: /* Compilation date. * Written by Makefile (userspace) */ #define _BUILD_DATE "2010-08-02 15:06:38" Теперь добавляем модуль в репозиторий dkms: # dkms add -m ipt_ISG -v 0.11 Собираем модуль: # dkms build -m ipt_ISG -v 0.11 Теперь ставим его в текущее ядро: # dkms install -m ipt_ISG -v 0.11 Все! Теперь после yum update в новом ядре всегда будет isg )
  17. Окончательный срок - середина следующей недели. Как продвигается? Ужо и конец недели (((
  18. Клас! А можно это в ближайший релиз? А то только отсутствие полисинга подсетей останавливает от внедрения
  19. Мне кажется что подсчет на каждом IP не нужен, нужен суммарный (и то для информации), (обычно же нет таких тарифов, сетка на 16 IP 5 Гигов трафика в месяц каждый IP). А вот Bandwidth нужен общий на всю сеть. с одной стороны и не нужен. Но есть клиенты-фирмы. У них 5-30 сотрудников и 5 мегабит. Так вот один начинает качать, все начинают паниковать. Сразу звонки в т.п. де наша скорость. Если есть подсчет по IP то можно сказать, что так мол и так, пните "хакера" с IP таким-то. Даже если на той стороне трубки меня не поймут - криков поубавится. А вот если ответить "да у вас канал весь забит - сами разбирайтесь" начнутся принеприятные качели. В билинге или интерфейсе к нему просуммировать не большая проблема, даже при 3000+ онлайн.
  20. Давно об этом думаю(мечтаю). Вроде лучше будет, чтобы логином приходило правило из iptables (192.168.0.0/28 например). Тогда не надо будет на всю сеть заводить тучу логинов. А в iptables добавить параметр -net, чтобы отличить разбор сети поIPшно или всю сеть. А вот в Calling-Station-Id чтобы пришел IP компьютера (можно и с MAC адресом). Так и выйдет, что подсчет раздельный (в билинге уже можно как угодно по складывать, но и носом ткнуть в конкретного качальщика), а bandwidth один на всю сеть