Це стара версія документу!
Зміст
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
Предположим:
- Адрес сервера доступа - 192.168.0.252;
- Адрес биллинга/FreeRADIUS - 192.168.0.250;
- На сервере доступа настроен DHCP-сервер или DHCP-relay. Или пользователям адреса вбиваются вручную.
- У нас есть сеть 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


