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

Наоборот. session_max_duration - это промежуток времени, через который радиусу будут посланы Stop и Start пакеты. При этом сессия не отключается, трафик ходит, авторизация не повторяется. Просто одна сессия разбивается на несколько, пользователь этого не замечает.

А вот session_idle_timeout - это время, после которого при условии отсутствия трафика сессия завершится.

Share this post


Link to post
Share on other sites
Наоборот. session_max_duration - это промежуток времени, через который радиусу будут посланы Stop и Start пакеты. При этом сессия не отключается, трафик ходит, авторизация не повторяется. Просто одна сессия разбивается на несколько, пользователь этого не замечает.

А вот session_idle_timeout - это время, после которого при условии отсутствия трафика сессия завершится.

Ну наверно так должно быть, но я поставил idle = 60 , max = 600,

и через минуту неактивности картинка, как я привел выше. т.е. сессия не делась никуда, но обнулилась. Надо глубже копнуть, мож баг :)

 

PS: и после session_max_duration сессия все еще есть.

Edited by e-AI

Share this post


Link to post
Share on other sites
Wingman, какую ревизию используете?
lISG-0.11.3-alpha из git

 

 

Ну наверно так должно быть, но я поставил idle = 60 , max = 600,

и через минуту неактивности картинка, как я привел выше. т.е. сессия не делась никуда, но обнулилась. Надо глубже копнуть, мож баг :)

 

PS: и после session_max_duration сессия все еще есть.

А трафика точно на ней не было больше? Может, продлилась? =)

 

Вообще я эти параметры радиусом отдаю:

        UNION SELECT '', '%{SQL-User-Name}', 'Session-Timeout', '86400', '='\
        UNION SELECT '', '%{SQL-User-Name}', 'Idle-Timeout', '600', '='

И в графиках четко видно, как постоянно чучуть скачет число сессий - оно берётся из "Approved sessions count", т.е. никаких "disconnected" сессий у нас не возникает, сессия просто исчезает

 

Share this post


Link to post
Share on other sites

После max_duration она должна оставаться. А по поводу обнулившихся счётчиков стоит почитать лог lISG, действительно ли сессия завершилась.

Share this post


Link to post
Share on other sites

lISGd сообщает, что

Service 'TESTSERV2' for '10.128.1.150' finished

 

при этом

> ./ISG.pl show_services Virtual1
User IP-address NAT IP-address  Port number   Uniq. Identifier Durat.  Octets-in  Octets-out Rate-in    Rate-out   Service name     Flags
10.128.1.150    0.0.0.0         Virtual1      5F66DE790FFEE324 0       0          0          1000000    1000000    TESTSERV2        SO   
10.128.1.150    0.0.0.0         Virtual1      C10FA709BA5DE6EE 0       0          0          256000     256000     TESTSERV         S

 

Комп просто выключен, уже больше 10 минут точно.

м.б. потому что назначено 2 сервиса на сессию. Правда вторая не была активирована.

Share this post


Link to post
Share on other sites
lISGd сообщает, что

Service 'TESTSERV2' for '10.128.1.150' finished

 

при этом

> ./ISG.pl show_services Virtual1
User IP-address NAT IP-address  Port number   Uniq. Identifier Durat.  Octets-in  Octets-out Rate-in    Rate-out   Service name     Flags
10.128.1.150    0.0.0.0         Virtual1      5F66DE790FFEE324 0       0          0          1000000    1000000    TESTSERV2        SO   
10.128.1.150    0.0.0.0         Virtual1      C10FA709BA5DE6EE 0       0          0          256000     256000     TESTSERV         S

 

Комп просто выключен, уже больше 10 минут точно.

м.б. потому что назначено 2 сервиса на сессию. Правда вторая не была активирована.

Может быть, где-то в сервисах косяк, я передаю скорость Class=..., сервисы не использую

Share this post


Link to post
Share on other sites
Тут надо реализовать такую схему

DHCP запрос от клиента

LISG ловит этот запрос выступая скажем релеем/прокси DHCP

LISG отправляет Radius auth запрос на биллинг

LISG получив ответ от Радиуса выдает IP клиенту и отправляет radius acct с параметрами клиента (IP, MAC, opt82 И т.п.)

Неверно.

lISG предполагает, что адрес у клиента уже есть, и их надо фильтровать.

DHCP-сервер должен быть отдельным.

Пример применения: можно отдавать разные адреса и включать/выключать клиенту сеть и так далее.

 

Насчет FreeRADIUS где-то тут же говорилось: это лишняя прослойка. В Net::DHCP::Packet есть все необходимое, включая example. Сейчас над этим работаю.

Готов спорить :)

Radius вовсе не лишняя прослойка, т.к. знаете ли, кое кто использует радиус для аутентификации и аккаутинга, в качестве альтернативы скриптам которые делают выкл/вкл фильтров на SrcIP и сбора статистики по netflow для аккаутинга.

Share this post


Link to post
Share on other sites

Насчет FreeRADIUS где-то тут же говорилось: это лишняя прослойка. В Net::DHCP::Packet есть все необходимое, включая example. Сейчас над этим работаю.

Готов спорить :)

Radius вовсе не лишняя прослойка, т.к. знаете ли, кое кто использует радиус для аутентификации и аккаутинга, в качестве альтернативы скриптам которые делают выкл/вкл фильтров на SrcIP и сбора статистики по netflow для аккаутинга.

Скажу лучше: в C есть всё необходимое, включая кучу примеров в инете! В asm, в принципе, тоже!

Вопрос - зачем, если радиус в любом случае нужен и используется?

Share this post


Link to post
Share on other sites

Насчет FreeRADIUS где-то тут же говорилось: это лишняя прослойка. В Net::DHCP::Packet есть все необходимое, включая example. Сейчас над этим работаю.

Готов спорить :)

Radius вовсе не лишняя прослойка, т.к. знаете ли, кое кто использует радиус для аутентификации и аккаутинга, в качестве альтернативы скриптам которые делают выкл/вкл фильтров на SrcIP и сбора статистики по netflow для аккаутинга.

Скажу лучше: в C есть всё необходимое, включая кучу примеров в инете! В asm, в принципе, тоже!

Вопрос - зачем, если радиус в любом случае нужен и используется?

Для DHCP, скорее всего, будет использоваться еще один радиус. Ибо держать все на одном - тот еще ад. Так зачем?

Share this post


Link to post
Share on other sites
Для DHCP, скорее всего, будет использоваться еще один радиус. Ибо держать все на одном - тот еще ад. Так зачем?

Один и тот же радиус одним модулем обрабатывает авторизацию и аккаунтинг, другим - dhcp, в чем заключается ад?

Share this post


Link to post
Share on other sites
Для DHCP, скорее всего, будет использоваться еще один радиус. Ибо держать все на одном - тот еще ад. Так зачем?

Один и тот же радиус одним модулем обрабатывает авторизацию и аккаунтинг, другим - dhcp, в чем заключается ад?

В конфигурировании.

И вообще, KISS.

Share this post


Link to post
Share on other sites

Стоп стоп, коллеги, вы хотите радиус для dhcp server юзать?

Не я имел в виду, что LISG-DHCP по идее должено быть пофиг какой там DHCP Server.

Смысл в чем, LISG-DHCP юзается как relay, который ловит DHCP-Request, отправляет запрос на Радиус-Биллинг и получив утвердительный ответ ретранслирует запрос клиента на DHCP Server. Получив от DHCP-Server ответ DHCP-ACK, отправляет на Радиус-Биллинг Acct-Start.

Ну и попутно для Биллинг-Радиус можно через поля прикнутить Opt82, IP клиента и т.д. и т.п.

Edited by shicoy

Share this post


Link to post
Share on other sites
Для DHCP, скорее всего, будет использоваться еще один радиус. Ибо держать все на одном - тот еще ад. Так зачем?

Один и тот же радиус одним модулем обрабатывает авторизацию и аккаунтинг, другим - dhcp, в чем заключается ад?

В конфигурировании.

И вообще, KISS.

Написать два конфига для разных модулей одного радиус-сервера, или два конфига для разных модулей двух серверов - в чём разница?

И в чём усложнение (с точки зрения kiss)? Даже если один из двух модулей (виртуальных серверов) заглючит - другой продолжает работу как ни в чём не бывало.

 

Стоп стоп, коллеги, вы хотите радиус для dhcp server юзать?

Не я имел в виду, что LISG-DHCP по идее должено быть пофиг какой там DHCP Server.

Смысл в чем, LISG-DHCP юзается как relay, который ловит DHCP-Request, отправляет запрос на Радиус-Биллинг и получив утвердительный ответ ретранслирует запрос клиента на DHCP Server. Получив от DHCP-Server ответ DHCP-ACK, отправляет на Радиус-Биллинг Acct-Start.

Ну и попутно для Биллинг-Радиус можно через поля прикнутить Opt82, IP клиента и т.д. и т.п.

Тут спитч о том, что проще/удобне/лучше - написать под фрирадиус логику dhcp-сервера, воспользовавшись его сетевым API, или написать dhcp-сервер на перле с нуля =)

 

Edited by Wingman

Share this post


Link to post
Share on other sites
Стоп стоп, коллеги, вы хотите радиус для dhcp server юзать?

Не я имел в виду, что LISG-DHCP по идее должено быть пофиг какой там DHCP Server.

Смысл в чем, LISG-DHCP юзается как relay, который ловит DHCP-Request, отправляет запрос на Радиус-Биллинг и получив утвердительный ответ ретранслирует запрос клиента на DHCP Server. Получив от DHCP-Server ответ DHCP-ACK, отправляет на Радиус-Биллинг Acct-Start.

Ну и попутно для Биллинг-Радиус можно через поля прикнутить Opt82, IP клиента и т.д. и т.п.

Я некоторое время назад выкладывал патч, который реализует (криво) примерно это. Чтоб работало не криво, надо дальше доделывать ISGd.pl, и видимо, ядерный модуль тоже. Короч, делаю именно это, наверно таки сделаю, если никто раньше не сделает :)

Share this post


Link to post
Share on other sites
Тут спитч о том, что проще/удобне/лучше - написать под фрирадиус логику dhcp-сервера, воспользовавшись его сетевым API, или написать dhcp-сервер на перле с нуля =)
Разве? :) А я думал мы обсужадем LISG :))))

 

Я некоторое время назад выкладывал патч, который реализует (криво) примерно это. Чтоб работало не криво, надо дальше доделывать ISGd.pl, и видимо, ядерный модуль тоже. Короч, делаю именно это, наверно таки сделаю, если никто раньше не сделает :)
Это врядли... Так что ждем-с :)

Share this post


Link to post
Share on other sites
Разве? :) А я думал мы обсужадем LISG :))))

ж)) Я имел в виду между мной и Abram =)

Share this post


Link to post
Share on other sites
Тут спитч о том, что проще/удобне/лучше - написать под фрирадиус логику dhcp-сервера, воспользовавшись его сетевым API, или написать dhcp-сервер на перле с нуля =)
Мой рабочий сорс уже работает. Включает в себя 300 строк.

Предыдущий вариант (rlm_perl) тоже работал, но мне не понравился. Слишком много FreeRADIUS-специфичных баг вылазило.

Share this post


Link to post
Share on other sites

Мой рабочий сорс уже работает. Включает в себя 300 строк.

Общественности покажите?

Share this post


Link to post
Share on other sites
Мой рабочий сорс уже работает. Включает в себя 300 строк.
Общественности покажите?

Стыдно :-D.

Могу костяк выложить (вырезать спефичные для меня куски кода), когда доделаю.

Share this post


Link to post
Share on other sites
Не ссать в компот.
Abram ( 15:25:46 )

тут?

Умник ( 15:26:00 )

Привет

Abram ( 15:26:02 )

привет

Abram ( 15:26:20 )

хочется поинтересоваться: lISG дальше развиваться будет?

Умник ( 15:26:52 )

Да, конечно. Я там сроки поставил и не выдержал их... :(

Умник ( 15:27:00 )

Свалилось тут на голову

Abram ( 15:27:23 )

в общем, будем считать это вынужденной паузой =)

Abram ( 15:27:31 )

а то народ, я смотрю, уже вовсю волноваться начал

Умник ( 15:27:39 )

Пусть не волнуются.

Умник ( 15:27:42 )

Передай им.

Abram ( 15:27:58 )

спасибо :). в принципе, всё, что хотел знать

Умник ( 15:28:01 )

В этом году я обязательно вернусь.

Подскажите последнюю версию lISG ? (ссылочку на нее)

Буду пытаться городить полисинг сетей ..

Проект жалко .

Edited by kww

Share this post


Link to post
Share on other sites

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

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

Edited by SNeon

Share this post


Link to post
Share on other sites

Красивое решение.

К сожалению намного чаще надо полисить/считать сети разного размера.

Притом вперемешку с выдачей одиночных IP /32.

Но за ваш вариант все равно скажу огромное спасибо.

Share this post


Link to post
Share on other sites

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

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

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

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

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

 

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

 

Share this post


Link to post
Share on other sites

Было-бы неплохо с биллинга для каждого клиента отдать Framed-IP-Netmask , если его нет то /32 .

Тогда каждый клиент будет сетью, хоть из 1 IP, хоть из 255.

Но дело в том что в rfc3576 (CoA) такого атрибута нет. Или я что-то путаю )))

 

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now