dolphinik Опубликовано 23 декабря, 2009 (изменено) Не получается собрать. Система Debian root /opt/isg/lISG-0.1-alpha/kernel # make && make install echo "" > build.h printf "/* Compilation date.\n * Written by Makefile (userspace) */\n#define _BUILD_DATE \"%s %s\"\n" `date +'%F %T'` > build.h make -C /lib/modules/2.6.25-2-686/build M=/opt/isg/lISG-0.1-alpha/kernel modules make[1]: Entering directory `/usr/src/linux-headers-2.6.25-2-686' Building modules, stage 2. MODPOST 0 modules make[1]: Leaving directory `/usr/src/linux-headers-2.6.25-2-686' gcc -O2 -Wall -Wunused -I/lib/modules/2.6.25-2-686/build/include -I../../iptables-1.4.6/include -DIPTABLES_VERSION=\"1.4.6\" -fPIC -o libipt_ISG_sh.o -c libipt_ISG.c libipt_ISG.c: In function ‘parse’: libipt_ISG.c:37: warning: implicit declaration of function ‘exit_error’ libipt_ISG.c: In function ‘save’: libipt_ISG.c:65: warning: implicit declaration of function ‘save_string’ gcc -shared -o libipt_ISG.so libipt_ISG_sh.o make -C /lib/modules/2.6.25-2-686/build M=/opt/isg/lISG-0.1-alpha/kernel modules_install make[1]: Entering directory `/usr/src/linux-headers-2.6.25-2-686' DEPMOD 2.6.25-2-686 make[1]: Leaving directory `/usr/src/linux-headers-2.6.25-2-686' make: *** Нет правила для сборки цели `ipt_ISG.ko', требуемой для `iinstall'. Останов. Изменено 23 декабря, 2009 пользователем dolphinik Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Умник Опубликовано 23 декабря, 2009 (изменено) Исправил глупую ошибку, выложил новую версию. Попробуйте, теперь модуль ядра должен собираться. Ядро ваше довольно старое (2.6.25), а модуль писался всего пол-года назад, поэтому поддержку старых ядер я не делал, есть вероятность что не соберется. Но попробуйте. Если что, пишите. По поводу iptables. К сожалению придется использовать версию 1.4.2. Это ограничение, которое накладывает IPTables::libiptc. Я подумаю, что можно сделать с этим, но пока это единственный workaround. UPD: Подумал. Скорее всего откажусь от использования IPTables::libiptc. Особого смысла в нем нет. UPD2: Ядро для текущего релиза потребуется не ниже 2.6.28. Либо обновите ядро, либо подождите, пока я допилю модуль для 2.6.25. Изменено 23 декабря, 2009 пользователем Умник Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Умник Опубликовано 24 декабря, 2009 Выложил 0.3-alpha. http://www.progtech.ru/~oleg/lISG Модуль ядра теперь собирается под ядрами >= 2.6.24, но нужно протестировать как это будет работать. Все еще обязателен iptables 1.4.2. Работаю над этим - ограничение будет снято в 0.4-alpha. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dolphinik Опубликовано 24 декабря, 2009 Ждём :) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Умник Опубликовано 25 декабря, 2009 Вышла версия 0.4-alpha. http://www.progtech.ru/~oleg/lISG/ * Исправлен ряд мелких багов * Теперь не требуются модули IPTables::libiptc и Time::HiRes * Поддержка версий iptables 1.4.x Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
shicoy Опубликовано 26 декабря, 2009 Собственно не до конца понятно, что есть haha в --session-init "haha", т.е. в --session-init можно подставить любую строку? Для чего используется? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Умник Опубликовано 26 декабря, 2009 shicoy, можно подставить все что угодно. Имя сессии сейчас не используется. Сделано это для того, чтобы в будущем можно было как-то классифицировать трафик по направлениям. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
shicoy Опубликовано 26 декабря, 2009 Где можно выставить частоту обновлений аккунтинга через радиус? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Умник Опубликовано 26 декабря, 2009 В etc/config.pl $cfg{alive_interval} и $cfg{unlim_alive_interval} (в секундах). Первое значение - для сессий, на которые не назначена скорость через RADIUS-атрибут Class = ... (на них по-умолчанию вешается rate $cfg{default_speed}), второе - для сессий с ограниченной скоростью. Разделение сделано для того, чтобы не перегружать биллинг постоянными Alive-ами от анлимитчиков (для них не требуется real-time accounting). Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
shicoy Опубликовано 26 декабря, 2009 Ну осталось дождаться CoA что бы отказаться от iptables для блокировки доступа, и будет шикарно =) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Умник Опубликовано 26 декабря, 2009 (изменено) Постараюсь сделать в этом году. :) У кого-нибудь в текущем виде заработал дистрибутив? Ну или хотя бы без ошибок собрался и загрузился... :) Изменено 26 декабря, 2009 пользователем Умник Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dolphinik Опубликовано 28 декабря, 2009 (изменено) Ещё есть просьба добавить атрибут NAS-Identifier в радиус пакет. И, по возможности, в Called-Station-Id добавить значение из --session-init Изменено 28 декабря, 2009 пользователем dolphinik Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dolphinik Опубликовано 28 декабря, 2009 Скомпилилось, iptables съел правила, ISGd запустился, и ничего ISG.pl показывает user /usr/local/ISG/bin # ./ISG.pl show_all 10.10.1.1 0.0.0.0 0.0.0.0 Async0 0000000000000000 0 0 0 0 0 0 0 0 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Умник Опубликовано 28 декабря, 2009 dolphinik, NAS-Identifier добавлю. По поводу --session-init: важно только само наличие параметра, значение его игнорируется в текущей реализации. То есть классифицировать трафик не получится. В дальшейшем я планирую сделать классификацию по-другому, чтобы не плодить на каждую подсеть по паре правил -j ISG, как я планировал ранее. По поводу проблемы. Сейчас я попробую воспроизвести у себя, но пока покажите вывод хвоста команды dmesg, файлов /var/log/syslog (или messages) и /tmp/ISGd_dbg.log. Возможно эта информация ускорит процесс поиска причины проблемы. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dolphinik Опубликовано 28 декабря, 2009 (изменено) Проблема решилась. Ошиблись с IP адресом в конфиге. Изменено 28 декабря, 2009 пользователем dolphinik Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Умник Опубликовано 28 декабря, 2009 dolphinik, странно что проблема решилась. Я нашел ошибку, по идее не должны были уходить запросы на RADIUS-сервер. Скачайте пожалуйста 0.5-alpha. Там еще кое-какие исправления. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dolphinik Опубликовано 29 декабря, 2009 Есть предложение вынести NAS-Identifier в конфиг. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dolphinik Опубликовано 29 декабря, 2009 И ещё, просьба, вынести установку NAS-Port-Type = Async до if Нужно как-то отличать запросы на авторизацию ISG от PPTP/PPPOE/DHCP сессий. $p->set_attr('NAS-Port-Type', 'Async'); if ($code eq 'Accounting-Request') { switch ($ev->{'type'}) { case ISG::EVENT_SESS_START { $p->set_attr('Acct-Status-Type', 'Start'); } case ISG::EVENT_SESS_UPDATE { $p->set_attr('Acct-Status-Type', 'Alive'); } case ISG::EVENT_SESS_STOP { $p->set_attr('Acct-Status-Type', 'Stop'); } case ISG::EVENT_SESS_RESTART { $p->set_attr('Acct-Status-Type', 'Stop'); } } $p->set_attr('Framed-IP-Address', ISG::long2ip($ev->{'nat_ipaddr'})); Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dolphinik Опубликовано 29 декабря, 2009 После некоторых боданий пришёл к следующему набору атрибутов в пакетах: $p->set_password($username, $cfg{radius_secret}); $p->set_attr('User-Name', $username); $p->set_attr('Service-Type', 'Framed-User'); $p->set_attr('NAS-IP-Address', $nas_ip); $p->set_attr('NAS-Identifier', $nas_ip); $p->set_attr('NAS-Port', $ev->{'port_number'}); $p->set_attr('NAS-Port-Type', 'Async'); if ($code eq 'Accounting-Request') { switch ($ev->{'type'}) { case ISG::EVENT_SESS_START { $p->set_attr('Acct-Status-Type', 'Start'); } case ISG::EVENT_SESS_UPDATE { $p->set_attr('Acct-Status-Type', 'Alive'); } case ISG::EVENT_SESS_STOP { $p->set_attr('Acct-Status-Type', 'Stop'); } case ISG::EVENT_SESS_RESTART { $p->set_attr('Acct-Status-Type', 'Stop'); } } $p->set_attr('Framed-IP-Address', ISG::long2ip($ev->{'nat_ipaddr'})); $p->set_attr('Acct-Authentic', 'RADIUS'); $p->set_attr('Acct-Session-Id', $ev->{'session_id'}); $p->set_attr('Calling-Station-Id', $username); $p->set_attr('Called-Station-Id', $nas_ip); $p->set_attr('Acct-Session-Time', $ev->{'duration'}); $p->set_attr('Acct-Input-Packets', $ev->{'in_packets'}); $p->set_attr('Acct-Output-Packets', $ev->{'out_packets'}); { use bigint; $p->set_attr('Acct-Input-String', $ev->{'in_bytes'} & 0xffffffff); $p->set_attr('Acct-Output-String', $ev->{'out_bytes'} & 0xffffffff); $p->set_attr('Acct-Input-Gigawords', $ev->{'in_bytes'} >> 32); $p->set_attr('Acct-Output-Gigawords', $ev->{'out_bytes'} >> 32); } } $rad_reqs{"$src_port"}{'pk_user'} = $username; $rad_reqs{"$src_port"}{'pk_port'} = $ev->{'port_number'}; $rad_reqs{"$src_port"}{'pk_rid'} = $rid; $rad_reqs{"$src_port"}{'pk_time'} = time(); if (!$sock->send($p->pack)) { do_log("err", "Unable to send RADIUS request"); return 0; } return 1; } Ещё прошу привести правильную конфигурацию iptables для работы с этим модулем. Так, как изображено ниже, не работает. Клиент авторизацию проходит успешно, аккаунтинг работает, сессия видна, а данные через маршрутизатор не ходят. ISG all -- 10.10.1.110 0.0.0.0/0 ISG initiator, service `inet' ISG all -- 10.10.1.110 0.0.0.0/0 ISG ACCEPT all -- 10.10.1.110 0.0.0.0/0 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Умник Опубликовано 29 декабря, 2009 (изменено) dolphinik, в 0.6-alpha NAS-Identifier вынесу в конфиг, сочетание атрибутов сделаю как у вас, спасибо. А это: ISG all -- 10.10.1.110 0.0.0.0/0 ISG initiator, service `inet' ISG all -- 10.10.1.110 0.0.0.0/0 ISG ACCEPT all -- 10.10.1.110 0.0.0.0/0 Должно выглядить так: ISG all -- 10.10.1.110 0.0.0.0/0 ISG initiator, service `inet' ISG all -- 0.0.0.0/0 10.10.1.110 ISG ACCEPT all -- 10.10.1.110 0.0.0.0/0 <-- не уверен, зачем это правило (впрочем, после обработки -j ISG пакет [если ISG его не зарубил] продолжает движение дальше по вашим правилам, так что если политика по-умолачанию для FORWARD - DROP, то после двух ISG должны идти разрешающие правила) Параметр --session-init говорит, что пакеты, попавшие в это правило будут инициализировать сессию. После успешной инициализации это правило будет использоваться для полисинга и для аккаунтинга исходящего трафика (от пользователя). Правило без параметра --session-init используется для аккаунтинга и обработки трафика на клиента. Я планировал также делать классификацию трафика по подсетям на базе "сервисов", где "сервис" это по-сути два зеркальных правила "-j ISG", но сделаю это позже - по-другому. Поэтому значение параметра --session-init (в вашем случае - inet) не имеет смысла. Чтобы больше не путаться, в 0.6-alpha нужно будет писать просто: -j ISG --session-init, а не -j ISG --session-init somename. Изменено 29 декабря, 2009 пользователем Умник Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Умник Опубликовано 29 декабря, 2009 На всякий случай еще раз замечу, что вместо 10.10.1.110 можно писать сеть - 10.10.1.0/24 или 10.10.1.0/16, не важно. В результате lISG будет учитывать отдельно каждый IP-адрес этой сети, а не сеть целиком (суммарно). Другими словами не нужно плодить по два правила -j ISG для каждого клиента. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Max P Опубликовано 29 декабря, 2009 наблюдаю за темой с самого начала... пока что не понял как будет клиент блочится, если прописать подсеть? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Умник Опубликовано 29 декабря, 2009 (изменено) Max P, а в чем проблема? Трафик от конкретного IP, если его отреджектил RADIUS, подропается в первом правиле (initiator, см. выше). Во втором (которое не initiator) подропается трафик на этот IP, потому что сессия для такого IP-адреса не инициирована initiator-ом. В итоге этот клиент не заработает. Если же RADIUS подтвердил доступ, то сессия стартует, трафик для этого IP будет ходить через два правила -j ISG, там учитываться и полиситься. Target ISG выносит вердикт (либо DROP, либо пакет продолжает движение по другим правилам iptables) в зависимости от IP-адреса (src IP для initiator направления и dst IP для не initiator). Изменено 29 декабря, 2009 пользователем Умник Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Max P Опубликовано 29 декабря, 2009 спасибо, понял, попробую поднять на каникулах, как раз сервачок новый появился :) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dolphinik Опубликовано 30 декабря, 2009 (изменено) На всякий случай еще раз замечу, что вместо 10.10.1.110 можно писать сеть - 10.10.1.0/24 или 10.10.1.0/16, не важно. В результате lISG будет учитывать отдельно каждый IP-адрес этой сети, а не сеть целиком (суммарно). Другими словами не нужно плодить по два правила -j ISG для каждого клиента. Если я в правиле сейчас пропишу всю сеть, то оставлю её без интернета :) 10.10.1.110 - тестовая клиентская виртуальная машина. Ещё просьба сделать изменение скорости и сессии и её сброс по идентификатору, а не номеру порта. Изменено 30 декабря, 2009 пользователем dolphinik Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...