dolphinik Posted December 23, 2009 Posted December 23, 2009 (edited) Не получается собрать. Система 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'. Останов. Edited December 23, 2009 by dolphinik Вставить ник Quote
Умник Posted December 23, 2009 Author Posted December 23, 2009 (edited) Исправил глупую ошибку, выложил новую версию. Попробуйте, теперь модуль ядра должен собираться. Ядро ваше довольно старое (2.6.25), а модуль писался всего пол-года назад, поэтому поддержку старых ядер я не делал, есть вероятность что не соберется. Но попробуйте. Если что, пишите. По поводу iptables. К сожалению придется использовать версию 1.4.2. Это ограничение, которое накладывает IPTables::libiptc. Я подумаю, что можно сделать с этим, но пока это единственный workaround. UPD: Подумал. Скорее всего откажусь от использования IPTables::libiptc. Особого смысла в нем нет. UPD2: Ядро для текущего релиза потребуется не ниже 2.6.28. Либо обновите ядро, либо подождите, пока я допилю модуль для 2.6.25. Edited December 23, 2009 by Умник Вставить ник Quote
Умник Posted December 24, 2009 Author Posted December 24, 2009 Выложил 0.3-alpha. http://www.progtech.ru/~oleg/lISG Модуль ядра теперь собирается под ядрами >= 2.6.24, но нужно протестировать как это будет работать. Все еще обязателен iptables 1.4.2. Работаю над этим - ограничение будет снято в 0.4-alpha. Вставить ник Quote
Умник Posted December 25, 2009 Author Posted December 25, 2009 Вышла версия 0.4-alpha. http://www.progtech.ru/~oleg/lISG/ * Исправлен ряд мелких багов * Теперь не требуются модули IPTables::libiptc и Time::HiRes * Поддержка версий iptables 1.4.x Вставить ник Quote
shicoy Posted December 26, 2009 Posted December 26, 2009 Собственно не до конца понятно, что есть haha в --session-init "haha", т.е. в --session-init можно подставить любую строку? Для чего используется? Вставить ник Quote
Умник Posted December 26, 2009 Author Posted December 26, 2009 shicoy, можно подставить все что угодно. Имя сессии сейчас не используется. Сделано это для того, чтобы в будущем можно было как-то классифицировать трафик по направлениям. Вставить ник Quote
shicoy Posted December 26, 2009 Posted December 26, 2009 Где можно выставить частоту обновлений аккунтинга через радиус? Вставить ник Quote
Умник Posted December 26, 2009 Author Posted December 26, 2009 В etc/config.pl $cfg{alive_interval} и $cfg{unlim_alive_interval} (в секундах). Первое значение - для сессий, на которые не назначена скорость через RADIUS-атрибут Class = ... (на них по-умолчанию вешается rate $cfg{default_speed}), второе - для сессий с ограниченной скоростью. Разделение сделано для того, чтобы не перегружать биллинг постоянными Alive-ами от анлимитчиков (для них не требуется real-time accounting). Вставить ник Quote
shicoy Posted December 26, 2009 Posted December 26, 2009 Ну осталось дождаться CoA что бы отказаться от iptables для блокировки доступа, и будет шикарно =) Вставить ник Quote
Умник Posted December 26, 2009 Author Posted December 26, 2009 (edited) Постараюсь сделать в этом году. :) У кого-нибудь в текущем виде заработал дистрибутив? Ну или хотя бы без ошибок собрался и загрузился... :) Edited December 26, 2009 by Умник Вставить ник Quote
dolphinik Posted December 28, 2009 Posted December 28, 2009 (edited) Ещё есть просьба добавить атрибут NAS-Identifier в радиус пакет. И, по возможности, в Called-Station-Id добавить значение из --session-init Edited December 28, 2009 by dolphinik Вставить ник Quote
dolphinik Posted December 28, 2009 Posted December 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 Вставить ник Quote
Умник Posted December 28, 2009 Author Posted December 28, 2009 dolphinik, NAS-Identifier добавлю. По поводу --session-init: важно только само наличие параметра, значение его игнорируется в текущей реализации. То есть классифицировать трафик не получится. В дальшейшем я планирую сделать классификацию по-другому, чтобы не плодить на каждую подсеть по паре правил -j ISG, как я планировал ранее. По поводу проблемы. Сейчас я попробую воспроизвести у себя, но пока покажите вывод хвоста команды dmesg, файлов /var/log/syslog (или messages) и /tmp/ISGd_dbg.log. Возможно эта информация ускорит процесс поиска причины проблемы. Вставить ник Quote
dolphinik Posted December 28, 2009 Posted December 28, 2009 (edited) Проблема решилась. Ошиблись с IP адресом в конфиге. Edited December 28, 2009 by dolphinik Вставить ник Quote
Умник Posted December 28, 2009 Author Posted December 28, 2009 dolphinik, странно что проблема решилась. Я нашел ошибку, по идее не должны были уходить запросы на RADIUS-сервер. Скачайте пожалуйста 0.5-alpha. Там еще кое-какие исправления. Вставить ник Quote
dolphinik Posted December 29, 2009 Posted December 29, 2009 Есть предложение вынести NAS-Identifier в конфиг. Вставить ник Quote
dolphinik Posted December 29, 2009 Posted December 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'})); Вставить ник Quote
dolphinik Posted December 29, 2009 Posted December 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 Вставить ник Quote
Умник Posted December 29, 2009 Author Posted December 29, 2009 (edited) 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. Edited December 29, 2009 by Умник Вставить ник Quote
Умник Posted December 29, 2009 Author Posted December 29, 2009 На всякий случай еще раз замечу, что вместо 10.10.1.110 можно писать сеть - 10.10.1.0/24 или 10.10.1.0/16, не важно. В результате lISG будет учитывать отдельно каждый IP-адрес этой сети, а не сеть целиком (суммарно). Другими словами не нужно плодить по два правила -j ISG для каждого клиента. Вставить ник Quote
Max P Posted December 29, 2009 Posted December 29, 2009 наблюдаю за темой с самого начала... пока что не понял как будет клиент блочится, если прописать подсеть? Вставить ник Quote
Умник Posted December 29, 2009 Author Posted December 29, 2009 (edited) Max P, а в чем проблема? Трафик от конкретного IP, если его отреджектил RADIUS, подропается в первом правиле (initiator, см. выше). Во втором (которое не initiator) подропается трафик на этот IP, потому что сессия для такого IP-адреса не инициирована initiator-ом. В итоге этот клиент не заработает. Если же RADIUS подтвердил доступ, то сессия стартует, трафик для этого IP будет ходить через два правила -j ISG, там учитываться и полиситься. Target ISG выносит вердикт (либо DROP, либо пакет продолжает движение по другим правилам iptables) в зависимости от IP-адреса (src IP для initiator направления и dst IP для не initiator). Edited December 29, 2009 by Умник Вставить ник Quote
Max P Posted December 29, 2009 Posted December 29, 2009 спасибо, понял, попробую поднять на каникулах, как раз сервачок новый появился :) Вставить ник Quote
dolphinik Posted December 30, 2009 Posted December 30, 2009 (edited) На всякий случай еще раз замечу, что вместо 10.10.1.110 можно писать сеть - 10.10.1.0/24 или 10.10.1.0/16, не важно. В результате lISG будет учитывать отдельно каждый IP-адрес этой сети, а не сеть целиком (суммарно). Другими словами не нужно плодить по два правила -j ISG для каждого клиента. Если я в правиле сейчас пропишу всю сеть, то оставлю её без интернета :) 10.10.1.110 - тестовая клиентская виртуальная машина. Ещё просьба сделать изменение скорости и сессии и её сброс по идентификатору, а не номеру порта. Edited December 30, 2009 by dolphinik Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.