Linux ISG на Debian 7.7.0 Wheezy

Система предназначена для аутентификации, авторизации, учета и применения политик к трафику пользователей, проходящему через маршрутизатор под управлением ядра Linux. Является попыткой реализовать часть функционала Cisco ISG в рамках ОС Linux.

Установка

Процесс установки описан на странице проекта, но мы, на всякий случай, напишем и здесь. Все команды исполняем от имени суперпользователя root.

  • Удовлетворяем зависимости
# aptitude install linux-headers-$(uname -r) iptables-dev build-essential
# cpan -i Net::Radius::Packet
  • Скачиваем последнюю версию Linux ISG и распаковываем
# wget --no-check-certificate https://bitbucket.org/sysoleg/lisg/get/master.tar.gz
# tar zxf master.tar.gz
  • Собираем и устанавливаем модуль ядра и модули iptables
# cd sysoleg-lisg-*/kernel
# ./configure
# make
# make install
  • Подгружаем модуль ядра
# modprobe ipt_ISG
  • Устанавливаем поддержку на стороне userspace (скрипты демона и управления на Perl)
# cd ..
# cp -r ISG /opt
  • Поправим /opt/ISG/etc/config.pl по своему вкусу (описание ниже по тексту)
  • Запускаем демон ISGd.pl
# /opt/ISG/bin/ISGd.pl

Дополнительно

  • Автоматическая загрузка модуля ядра при старте системы
# echo ipt_ISG >> /etc/modules
  • Создаём скрипт автоматического запуска демона ISGd.pl при старте системы в /etc/init.d/linux-isg
/etc/init.d/linux-isg
#!/bin/sh -e
### BEGIN INIT INFO
# Provides:          linux-isg
# Required-Start:    $networking
# Required-Stop:     $networking
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/sbin;
 
. /lib/lsb/init-functions
 
case "$1" in
  start)
    log_daemon_msg "Starting Linux ISG daemon" "linux-isg"
    if /opt/ISG/bin/ISGd.pl; then
      log_end_msg 0
    else
      log_end_msg 1
    fi
  ;;
  restart)
    log_daemon_msg "Restarting Linux ISG daemon" "linux-isg"
    start-stop-daemon --stop --quiet --oknodo --retry 180 --pidfile /var/run/ISGd.pid
    if /opt/ISG/bin/ISGd.pl; then
      log_end_msg 0
    else
      log_end_msg 1
    fi
  ;;
  stop)
    log_daemon_msg "Stopping Linux ISG daemon" "linux-isg"
    start-stop-daemon --stop --quiet --oknodo --retry 180 --pidfile /var/run/ISGd.pid
    log_end_msg 0
  ;;
  *)
    log_success_msg "Usage: /etc/init.d/linux-isg {start|stop|restart}"
    exit 1
  ;;
esac
 
exit 0 
# chmod a+x /etc/init.d/linux-isg
# update-rc.d linux-isg defaults

Настройка Linux ISG

Предположим:

  1. Адрес сервера доступа - 192.168.0.252;
  2. Адрес биллинга/FreeRADIUS - 192.168.0.250;
  3. На сервере доступа настроен DHCP-сервер или DHCP-relay. Или пользователям адреса вбиваются вручную.
  4. У нас есть сеть 10.0.0.0/24, которой нужно предоставить доступ:
    • К локальным сетям (RFC1918) на скорости 100 Мбит/сек. не зависимо от его состояния в биллинге
    • К глобальной сети (GLOBAL) на скорости 10 Мбит/сек., если абонент активный
    • Завернуть в личный кабинет, если абонент не активный (OFF-LINE), отключен принудительно (DOWN) или заморожен (PASSIVE).
    • Т.к мы очень ленивые и не имеем собственного DNS, нужен постоянный доступ к DNS серверам Google: 8.8.8.8 и 8.8.4.4

Предварительная настройка самого Linux ISG производиться в /opt/ISG/etc/config.pl. Главное, что здесь нужно - это настроить связь с сервером FreeRADIUS. Делается это приведением опций к такому виду:

/opt/ISG/etc/config.pl
$cfg{radius_auth}{0} = { server => "192.168.0.250:1812", timeout => 5, secret => "90d65aea5b99" };
$cfg{radius_acct}{0} = { server => "192.168.0.250:1813", timeout => 5, secret => "90d65aea5b99" };
 
### CoA-related settings
$cfg{coa_server} = "192.168.0.250";  ## Accept requests only from this IP (comment to accept from all)
$cfg{coa_secret} = "90d65aea5b99";   ## Shared secret
$cfg{coa_port} = 3799;               ## Local UDP port to listen for CoA requests

Также приведём файл /etc/rc.local к такому виду, чтобы заработали iptables:

/etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
 
# Flush
iptables --flush
iptables --flush -t nat
 
# NAT
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j SNAT --to-source 192.168.0.252
 
# L4 Redirects
iptables -t nat -A PREROUTING -p tcp --dport 80 -m isg --service-name OFF-LINE -j DNAT --to-destination  192.168.0.250
iptables -t nat -A PREROUTING -p tcp --dport 80 -m isg --service-name PASSIVE -j DNAT --to-destination  192.168.0.250
iptables -t nat -A PREROUTING -p tcp --dport 80 -m isg --service-name DOWN -j DNAT --to-destination  192.168.0.250
 
# Linux ISG rules
iptables -A FORWARD -s 10.0.0.0/24 -j ISG --session-init
iptables -A FORWARD -d 10.0.0.0/24 -j ISG
 
exit 0

Добавляем классы трафика

Перед добавлением сервисов, которые будут привязаны к пользователям необходимо определить классы трафика в файле /opt/ISG/etc/tc.conf. Вот его содержимое для нашего случая:

/opt/ISG/etc/tc.conf
## Traffic classes for lISG
## Format: Class name   IPv4 prefix (subnet)
RFC1918         10.0.0.0/8
RFC1918         192.168.0.0/16
RFC1918         172.16.0.0/12
 
DNS             8.8.8.8/32
DNS             8.8.4.4/32
 
GLOBAL          0.0.0.0/0

Важно! Если указываете какой-либо конкретный IP добавляйте маску /32

Добавляем сервисы

Сервисы устанавливаются в файле /opt/ISG/etc/config.pl в секции, ограниченной комментариями:

/opt/ISG/etc/config.pl
...
####################### Services description #######################
 Здесь указываем сервисы
#################### End services description ######################
...

Для нашей ситуации сервисы будут выглядеть приблизительно так:

/opt/ISG/etc/config.pl
...
####################### Services description #######################
 
# Local networks access service
$cfg{srv}{"LOCAL"}{type} = "policer";
$cfg{srv}{"LOCAL"}{rate_info} = "QD;100000000;3125000;U;100000000;3125000";
$cfg{srv}{"LOCAL"}{traffic_classes} = [ "RFC1918", "DNS" ];
 
# Mark packets from '{user[state]}' whet they are trying to go
# to addresses from 'GLOBAL'
$cfg{srv}{"ON-LINE"}{type} = "policer";
$cfg{srv}{"ON-LINE"}{rate_info} = "QD;10000000;312500;U;10000000;312500";
$cfg{srv}{"ON-LINE"}{traffic_classes} = [ "GLOBAL" ];
 
$cfg{srv}{"OFF-LINE"}{type} = "tagger";
$cfg{srv}{"OFF-LINE"}{traffic_classes} = [ "GLOBAL" ];
 
$cfg{srv}{"PASSIVE"}{type} = "tagger";
$cfg{srv}{"PASSIVE"}{traffic_classes} = [ "GLOBAL" ];
 
$cfg{srv}{"DOWN"}{type} = "tagger";
$cfg{srv}{"DOWN"}{traffic_classes} = [ "GLOBAL" ];
 
#################### End services description ######################
...

Настройка FreeRADIUS

  • Настраиваем FreeRADIUS по этой документации.
  • Добавляем новую сеть, с «Использовать RADIUS»
  • Прибиваем сеть к серверу доступа с типом «local»
  • Переназначаем атрибут User-Name в модуле «Редактирование RADIUS-атрибутов для сети»:

  • Добавляем следующие атрибуты для сети (для примера)

Ограничение по тарифным планам

Из-за особенностей самой системы Linux ISG мы не можем просто так взять и передать атрибуты скорости для пользователя. Но это ограничение легко обойти. Всё, что нужно - это добавить сервисы, названия которых будут соответствовать тарифным планам с указанием скоростей. Например для тарифа «Unlim-500» с симметричной скоростью 10 Мбит/сек. параметры будут такими:

$cfg{srv}{"Unlim-500"}{rate_info} = "QD;10000000;312500;U;10000000;312500";
$cfg{srv}{"Unlim-500"}{traffic_classes} = [ "GLOBAL" ];

После, добавляем к списку атрибутов сети следующий:

После чего пользователи начнут получать дополнительно сервис с тарифом пользователя, и скорость будет «резаться» согласно тарифу…

Тестирование

Если все прошло хорошо, то после попытки пользователя выйти в интернет, комманда /opt/ISG/bin/ISG.pl выведет нечто такое

# /opt/ISG/bin/ISG.pl
User IP-address NAT IP-address Port number Uniq. Identifier Durat. Octets-in Octets-out Rate-in Rate-out Service name Flags
10.0.0.2        0.0.0.0        Virtual1    B87A6BA0D86B93EA 1556   2984      6024       0       0        Main session A

А если нам нужно проверить сервисы, закреплённые за пользователем:

# /opt/ISG/bin/ISG.pl show_services 10.0.0.2
User IP-address NAT IP-address Port number Uniq. Identifier Durat. Octets-in Octets-out Rate-in   Rate-out  Service name Flags
10.0.0.2        0.0.0.0        Virtual1    C3D8943C8C193407 0      0         0          100000000 100000000 LOCAL        SO
10.0.0.2        0.0.0.0        Virtual1    609494475903148E 1786   2984      6024       10000000  10000000  ON-LINE      SOU
linux_isg.txt · Последние изменения: 2014/11/21 14:02 — mk_ub
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki