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

ISG в Linux

Не получается собрать.

Система 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 by dolphinik

Share this post


Link to post
Share on other sites

Исправил глупую ошибку, выложил новую версию. Попробуйте, теперь модуль ядра должен собираться. Ядро ваше довольно старое (2.6.25), а модуль писался всего пол-года назад, поэтому поддержку старых ядер я не делал, есть вероятность что не соберется. Но попробуйте. Если что, пишите.

 

По поводу iptables. К сожалению придется использовать версию 1.4.2. Это ограничение, которое накладывает IPTables::libiptc. Я подумаю, что можно сделать с этим, но пока это единственный workaround.

 

UPD: Подумал. Скорее всего откажусь от использования IPTables::libiptc. Особого смысла в нем нет.

UPD2: Ядро для текущего релиза потребуется не ниже 2.6.28. Либо обновите ядро, либо подождите, пока я допилю модуль для 2.6.25.

Edited by Умник

Share this post


Link to post
Share on other sites

Выложил 0.3-alpha.

 

http://www.progtech.ru/~oleg/lISG

 

Модуль ядра теперь собирается под ядрами >= 2.6.24, но нужно протестировать как это будет работать.

Все еще обязателен iptables 1.4.2. Работаю над этим - ограничение будет снято в 0.4-alpha.

Share this post


Link to post
Share on other sites

Собственно не до конца понятно, что есть haha в --session-init "haha", т.е. в --session-init можно подставить любую строку? Для чего используется?

Share this post


Link to post
Share on other sites
shicoy, можно подставить все что угодно. Имя сессии сейчас не используется. Сделано это для того, чтобы в будущем можно было как-то классифицировать трафик по направлениям.

Share this post


Link to post
Share on other sites

Где можно выставить частоту обновлений аккунтинга через радиус?

Share this post


Link to post
Share on other sites

В etc/config.pl $cfg{alive_interval} и $cfg{unlim_alive_interval} (в секундах). Первое значение - для сессий, на которые не назначена скорость через RADIUS-атрибут Class = ... (на них по-умолчанию вешается rate $cfg{default_speed}), второе - для сессий с ограниченной скоростью. Разделение сделано для того, чтобы не перегружать биллинг постоянными Alive-ами от анлимитчиков (для них не требуется real-time accounting).

Share this post


Link to post
Share on other sites

Ну осталось дождаться CoA что бы отказаться от iptables для блокировки доступа, и будет шикарно =)

Share this post


Link to post
Share on other sites

Постараюсь сделать в этом году. :)

У кого-нибудь в текущем виде заработал дистрибутив? Ну или хотя бы без ошибок собрался и загрузился... :)

Edited by Умник

Share this post


Link to post
Share on other sites

Ещё есть просьба добавить атрибут NAS-Identifier в радиус пакет.

И, по возможности, в Called-Station-Id добавить значение из --session-init

Edited by dolphinik

Share this post


Link to post
Share on other sites

Скомпилилось, 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

Share this post


Link to post
Share on other sites

dolphinik, NAS-Identifier добавлю. По поводу --session-init: важно только само наличие параметра, значение его игнорируется в текущей реализации. То есть классифицировать трафик не получится. В дальшейшем я планирую сделать классификацию по-другому, чтобы не плодить на каждую подсеть по паре правил -j ISG, как я планировал ранее.

 

По поводу проблемы. Сейчас я попробую воспроизвести у себя, но пока покажите вывод хвоста команды dmesg, файлов /var/log/syslog (или messages) и /tmp/ISGd_dbg.log. Возможно эта информация ускорит процесс поиска причины проблемы.

Share this post


Link to post
Share on other sites

Проблема решилась. Ошиблись с IP адресом в конфиге.

Edited by dolphinik

Share this post


Link to post
Share on other sites

dolphinik, странно что проблема решилась. Я нашел ошибку, по идее не должны были уходить запросы на RADIUS-сервер. Скачайте пожалуйста 0.5-alpha. Там еще кое-какие исправления.

 

Share this post


Link to post
Share on other sites

И ещё, просьба, вынести установку 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'}));

Share this post


Link to post
Share on other sites

После некоторых боданий пришёл к следующему набору атрибутов в пакетах:

    $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

Share this post


Link to post
Share on other sites

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 by Умник

Share this post


Link to post
Share on other sites

На всякий случай еще раз замечу, что вместо 10.10.1.110 можно писать сеть - 10.10.1.0/24 или 10.10.1.0/16, не важно. В результате lISG будет учитывать отдельно каждый IP-адрес этой сети, а не сеть целиком (суммарно). Другими словами не нужно плодить по два правила -j ISG для каждого клиента.

Share this post


Link to post
Share on other sites

наблюдаю за темой с самого начала... пока что не понял как будет клиент блочится, если прописать подсеть?

Share this post


Link to post
Share on other sites
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 by Умник

Share this post


Link to post
Share on other sites

спасибо, понял, попробую поднять на каникулах, как раз сервачок новый появился :)

Share this post


Link to post
Share on other sites
На всякий случай еще раз замечу, что вместо 10.10.1.110 можно писать сеть - 10.10.1.0/24 или 10.10.1.0/16, не важно. В результате lISG будет учитывать отдельно каждый IP-адрес этой сети, а не сеть целиком (суммарно). Другими словами не нужно плодить по два правила -j ISG для каждого клиента.

Если я в правиле сейчас пропишу всю сеть, то оставлю её без интернета :)

10.10.1.110 - тестовая клиентская виртуальная машина.

 

Ещё просьба сделать изменение скорости и сессии и её сброс по идентификатору, а не номеру порта.

Edited by dolphinik

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