Перейти к содержимому
Калькуляторы

SNeon

Пользователи
  • Публикации

    20
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные пользователем 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. Каким запросом, зная только IP, получить из базы маску?

    Многие ли билинги это умеют?

    допустим в базе есть запись с логином 10.0.0.0. для этого логина я хочу сеть /29. Т.е. будет еще поле для Framed-Netmask = 255.255.255.248

     

    как теперь это всё провернуть, если подключается клиент с IP 10.0.0.5 ?

  5. Совершенно верно, в ISG сессию инициирует любой IP , но это же не догма ?

    Но я думаю совершенно незачем держать для /24 - 254 логина, вполне достаточно одного, с одним счетчиком для полисинга.

    как об этом уведомить ISG? Ведь хочется ж одним правилом в iptables оседлать и /24 и /30 и /32

    Проблема в том, что запрос логин-пароль (IP-IP) идут раньше, чем назначения подсетей из билинга

     

    Сессию стартовать всегда с проверкой IP по маске (Framed-IP-Netmask), в результате для любой произвольной подсети будет соответствовать одна сессия.

    Ну подумайте сами. клиент ломится в инет. что мы о нем можем узнать? IP? Да, только его IP. Сеть он не передает. Как узнать его сеть?

    Только спросить у билинга, через IP. А для этого и надо держать 254 IP для /24

    Теперь: как опросив логин (а именно IP, а он же может быть любой из диапазона) вычислить нужный шейпер?

     

    По поводу Framed-IP-Netmask - согласен, не из этой оперы, но самое близкое, ближе нет )))
    юзабельно, только вот вопросы выше...
  6. Де дело в том, что от 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 о клиентах?

  7. Framed-IP-Netmask несколько не для этого. Но боком прикрутить можно.

    А зачем он в CoA? Сессия то все равно одна будет для всей подсети. Вот этой сессии и подавать CoA по ID, опираясь на Online в билинге.

    А вот те, у кого radius/билинг шлет по умолчанию этот параметр, будут неприятно удивлены поведением.

     

    А хотя нет. Не одна сессия будет. Ведь запустить сессию может любой IP, а только потом в ISG придет атрибут Framed-IP-Netmask.

    А значит для сети /24 в базе билинга придется держать 254 логина.

    Тогда уже логичней будет считать все сессии в отдельности, и держать отдельный счетчик всей подсети в ядре для полисинга.

    Или же использовать общий счетчик через указатель. но тогда у всех активных сессий в билинге будут одинаковые счетчики трафика.

     

    В общем пока не ясно, как проще.

    Предлагайте

  8. Тогда надо придумать алгоритм. что будет посылать радиус(билинг) и каким образом на это реагировать.

    когда я раньше поднимал этот вопрос, ответ сводился к одному - не заводить кучу правил в iptables под разные нужды. А следовательно информацию надо брать либо из конфига либо из билинга.

    Предлагайте варианты - сделаем.

    Мне нужно было как минимум побить подсеть на сети класса С и подсеть на сети /30.

    Теперь 4 правила в iptables с этим справляются.

     

    Патч писал ночью от бессонницы и скуки. Для начала чтоб хотя бы разобраться с кодом (комментариев в нем к сожалению очень мало).

     

  9. Не спалось. За пару часов накидал патч для учета и полисинга подсетей.

    Естественно придется пересобрать модули 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) {
    

  10. EvilShadow, уже обсуждалось. Свелось к следующему:

    RADIUS использует атрибуты Session-Timeout и/или Idle-Timeout?

    Точно стояло radius_default_session_timeout=65000. поставил на 180. сейчас проверю. Все точно, теперь нормально!. Спасибо!

     

    Пора составить небольшой FAQ

  11. ISG вообще MAC-и клиентов не должен видеть.
    О_О это почему-же??? Наоборот! Как можно лишить себя такой полезной информации?

    Эммм... О L3-свитчах не слышали? Аль у вас локалка прямо через NAS бегает?

    если уж через L3 пускать, да еще и через циску, то зачем тогда этот проект? ;)

    Ессно прямо через NAS. Экономия должна быть экономной, как говорит директор =)

    Вся сеть сведена через .1q на soft NAS. NAS выступает таким себе 300+ портовым свитчем с ISG.

    Всё делалось для того, чтобы убрать VPN(pptp) но оставить мониторинг поклиентно. А тут такой прожект! Почти не надо модернизировать билинг, что удобно для мастеров и ТП. Остается гибкость радиуса и никаких допвложений в железо

  12. Позволю себе покритиковать.
    У меня и до этого работало. ЧЯДНТ?
    Интересно, какая система и откуда тогда берется Makefile из исходников iptables???

     

    В отдельный патч.
    Кому надо - может выдернуть из общего. Я же просто скинул свои поправки, которые необходимы были лично мне.

    Дальше тоже ковыряю и тестирую на подсети. Как будет готово -

     

    ISG вообще MAC-и клиентов не должен видеть.
    О_О это почему-же??? Наоборот! Как можно лишить себя такой полезной информации?

     

    Хотя, в некоторых случаях может пригодиться.
    Именно тот случай.
  13. Предлагаю выкладывать свои патчи, с описанием.

     

    Пользуюсь 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
    }

  14. 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 )

     

  15. Пока не могу обещать раздельный учет по IP-адресам в подсети, но суммарный подсчет/полисинг на сессию для подсети в будущем сделаю.

    Клас! А можно это в ближайший релиз? А то только отсутствие полисинга подсетей останавливает от внедрения

  16. allexch, то есть подсчет раздельный (1 сессия - 1 IP из подсети), а bandwidth один на всех?
    Мне кажется что подсчет на каждом IP не нужен, нужен суммарный (и то для информации), (обычно же нет таких тарифов, сетка на 16 IP 5 Гигов трафика в месяц каждый IP). А вот Bandwidth нужен общий на всю сеть.

    с одной стороны и не нужен. Но есть клиенты-фирмы. У них 5-30 сотрудников и 5 мегабит. Так вот один начинает качать, все начинают паниковать. Сразу звонки в т.п. де наша скорость. Если есть подсчет по IP то можно сказать, что так мол и так, пните "хакера" с IP таким-то. Даже если на той стороне трубки меня не поймут - криков поубавится. А вот если ответить "да у вас канал весь забит - сами разбирайтесь" начнутся принеприятные качели. В билинге или интерфейсе к нему просуммировать не большая проблема, даже при 3000+ онлайн.

  17. allexch, то есть подсчет раздельный (1 сессия - 1 IP из подсети), а bandwidth один на всех?

    Давно об этом думаю(мечтаю).

    Вроде лучше будет, чтобы логином приходило правило из iptables (192.168.0.0/28 например).

    Тогда не надо будет на всю сеть заводить тучу логинов.

    А в iptables добавить параметр -net, чтобы отличить разбор сети поIPшно или всю сеть.

    А вот в Calling-Station-Id чтобы пришел IP компьютера (можно и с MAC адресом).

    Так и выйдет, что подсчет раздельный (в билинге уже можно как угодно по складывать, но и носом ткнуть в конкретного качальщика), а bandwidth один на всю сеть