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

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

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

Поделиться сообщением


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

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

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

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

 

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

Изменено пользователем e-AI

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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" сессий у нас не возникает, сессия просто исчезает

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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 сервиса на сессию. Правда вторая не была активирована.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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=..., сервисы не использую

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Тут надо реализовать такую схему

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

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

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

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

Неверно.

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

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

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

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

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

Поделиться сообщением


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

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

Поделиться сообщением


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

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

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

И вообще, KISS.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Изменено пользователем shicoy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Для 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-сервер на перле с нуля =)

 

Изменено пользователем Wingman

Поделиться сообщением


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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Тут спитч о том, что проще/удобне/лучше - написать под фрирадиус логику dhcp-сервера, воспользовавшись его сетевым API, или написать dhcp-сервер на перле с нуля =)
Разве? :) А я думал мы обсужадем LISG :))))

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Разве? :) А я думал мы обсужадем LISG :))))

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

Поделиться сообщением


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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Мой рабочий сорс уже работает. Включает в себя 300 строк.
Общественности покажите?

Стыдно :-D.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Не ссать в компот.
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 ? (ссылочку на нее)

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

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

Изменено пользователем kww

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Изменено пользователем SNeon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

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

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас