Запуск NAS MikroTik _ Abills

Здесь можно задать вопросы не связанные с работой АСР. FreeBSD/Linux
Ответить
eGuru
Сообщения: 36
Зарегистрирован: Вс апр 27, 2008 5:43 am
Откуда: Украина, Запорожье.
Контактная информация:

Запуск NAS MikroTik _ Abills

Сообщение eGuru »

Сейчас запускаю сабдж. Как обычно, без напильника не идет.

Вкратце, что исправлял:

1. Скрипт из инструкции по настройке не работает, его необходимо править.
Вот исправленный:

Код: Выделить всё

#!/bin/sh
# Mikrotik multi traffic class shaper


DEBUG=1;
ACT_STATUS_TYPE=$1;
NAS_IP_ADDRESS=$2;
NAS_PORT=$3;
NAS_TYPE=$4;
USER_NAME=$5;
FRAMED_IP_ADDRESS=$6;

if [ w${ACT_STATUS_TYPE} = w1 ] ; then
    if [ w${NAS_TYPE} = wmikrotik ] ; then
      /usr/abills/libexec/linkupdown mikrotik up INTERFACE ${USER_NAME} ${FRAMED_IP_ADDRESS} NAS_HOST=${NAS_IP_ADDRESS} NAS_ADMIN=admin_ssh PROTO=pptp debug
    echo "===> Started ${USER_NAME} session [NAS: ${NAS_IP_ADDRESS}]" >> /var/log/shaper
  fi;

else if [ w${ACT_STATUS_TYPE} = w2 ] ; then
  if [ w${NAS_TYPE} = wmikrotik ] ; then
      /usr/abills/libexec/linkupdown mikrotik down INTERFACE ${USER_NAME} ${FRAMED_IP_ADDRESS}  NAS_HOST=$2 NAS_ADMIN=admin_ssh PROTO=pptp debug
      echo "===> Stopped ${USER_NAME} session" >> /var/log/shaper
  fi;
  else
    echo "Not enough arguments";
  fi;
fi;
2. Сгенерированный по инструкции ssh ключ никак не используется при вызове команд на микротике. Необходимо исправить код в libexec/linkupdown.

Правки такие:

Строка 90:
Было: use vars qw(%RAD %conf $db @START_FW $DATE $TIME);
Стало: use vars qw(%RAD %conf $db @START_FW $DATE $TIME $base_dir);

Строка 674:
Было: my $SSH = "/usr/bin/ssh";
Стало: my $SSH = "/usr/bin/ssh -i $base_dir/Certs/id_dsa.$nas_admin";

Строка 726:
Было: my $SSH = $argv->{SSH_CMD} || "/usr/bin/ssh";
Стало: my $SSH = $argv->{SSH_CMD} || "/usr/bin/ssh -i $base_dir/Certs/id_dsa.$nas_admin";

С правками пока все.

eGuru
Сообщения: 36
Зарегистрирован: Вс апр 27, 2008 5:43 am
Откуда: Украина, Запорожье.
Контактная информация:

Re: Запуск NAS MikroTik _ Abills

Сообщение eGuru »

Вопросы остались.

Команды в сервер доступа выдаются с темпом примерно 1 в секунду. Это очень мало. Например, заполнение списка адресов UA-IX займет более 5 минут. Как ускорить процесс?

eGuru
Сообщения: 36
Зарегистрирован: Вс апр 27, 2008 5:43 am
Откуда: Украина, Запорожье.
Контактная информация:

Re: Запуск NAS MikroTik _ Abills

Сообщение eGuru »

Темп выполнения команд низкий потому, что ssh сессия устанавливается длительное время, а команды микротику выдаются по одной штуке за сессию.
Я исправил участок кода в libexec/linkupdown, отправляющий команды на NAS. Мой вариант отправляет все команды за один раз.

Вот новый код (начиная с 831 строки):

Код: Выделить всё

#Make ssh command
        my $result = '';
        $result .= `echo "===> Initialising remote commands executing:" >> /var/log/shaper`;
        my $fname= "/tmp/cmdl." . int(rand(1000));
        open(FILE, "> $fname");
        foreach my $cmd (@commands)  {
                print FILE "$cmd\n";
        }
        close(FILE);
        sleep 2;
        $result .= `$SSH $nas_admin\@$nas_host < $fname`;
        $result .= `cat $fname >> /var/log/shaper` if ($debug > 0);
        $result .= `rm $fname`;

  print $result;

eGuru
Сообщения: 36
Зарегистрирован: Вс апр 27, 2008 5:43 am
Откуда: Украина, Запорожье.
Контактная информация:

Re: Запуск NAS MikroTik _ Abills

Сообщение eGuru »

Скрипт linkupdown для каждого пользователя создает свои списки адресов для каждого класса трафика. Это очень расточительно нагружает память микротика.

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

eGuru
Сообщения: 36
Зарегистрирован: Вс апр 27, 2008 5:43 am
Откуда: Украина, Запорожье.
Контактная информация:

Re: Запуск NAS MikroTik _ Abills

Сообщение eGuru »

В моей сети кроме микротика используются сервера доступа на mpd5-pppoe.
mpd5 выдает CID в виде 12 шестнадцатеричных цифр без разделителя: "010a030b050d", а микротик в виде 6 групп по две цифры, разделенных двоеточиями: "01:0A:03:0B:05:0D". Чтобы обеспечить правильную проверку MAC адреса клиентов для обоих типов NAS, была доработана функция Auth_CID в файле Abills/mysql/Auth.pm

Со строки 804 вставить код:

Код: Выделить всё

    elsif( $TEMP_CID !~ /[:\-\.]/ ) {
        my $CID_TEMP = $RAD->{CALLING_STATION_ID};
        $CID_TEMP =~ s/[:\-\.]//g;
        if( (lc $CID_TEMP) eq (lc $TEMP_CID) ) {
            return 0;
        }
     }

eGuru
Сообщения: 36
Зарегистрирован: Вс апр 27, 2008 5:43 am
Откуда: Украина, Запорожье.
Контактная информация:

Re: Запуск NAS MikroTik _ Abills

Сообщение eGuru »

Нашел интересный глюк.
Клиент нормально аутентифицируется если после своего логина укажет пробелы. В скрипты инициализации шейперов mikrotik логин пользователя попадет уже без пробелов в конце, из-за чего имена интерфейсов, указанные в параметрах правил, не будут совпадать с реальными.

Например:
1. Пользователь с логином 'xyz' указал в настройках соединения 'xyz '. Аутентификация в этом случае пройдет нормально, так как mysql игнорирует концевые пробелы в условиях where.
2. На микротике будет создан интерфейс <pppoe-xyz > (обрати внимание на пробел перед '>').
3. Правила шейпера будут сгенерированы примерно такие:
/ip firewall mangle add chain=forward out-interface=<pppoe-xyz> action=mark-packet new-packet-mark=TT_23_0_xyz_mark_in comment=TT_23_0_xyz_mark_in passthrough=yes
Обрати внимание, <pppoe-xyz> записано без пробела.
Имена интерфейсов не совпадают, микротик игнорирует такие правила.

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

В файле Abills/mysql/Auth.pm после строки 874 добавить:

Код: Выделить всё

  # Mark trailing spaces in login
  $RAD->{USER_NAME} =~ s/ /_/g;

Ответить