Подсчет траффика и ограничение доступа в сеть при оверквотинге

Вводная

Дано:

Linux-server (Debian), с установленными:

  • DHCP
  • Radius
  • MySQL
  • Transparent Squid
  • Iptables
  • PPPoE server

Сервер смотри в интернет по одному из сетевых интерфейсов (будем считать что это eth0). Внутренняя подсетка 192.168.xxx.yyy, где xxx- подсеть, для каждого филиала одна (будем считать что xxx это 001), yyy- хосты, IP адрес назначается средствами DHCP, подключение хостов происходит через PPPoE. Авторизация пользователей через Radius, база пользователей в MySQL.

Нужно:

  • Считать траффик по каждому пользователю отдельно
  • При достижении заданного лимита отключать пользователю интернет кроме почты.

Настройка окружения

FreeRADIUS

Хранить пользователей радиуса будем в базе данных MySQL. Мы не будем касать настройки мускуля в данной статье.

Для начала создадим базу для радиуса:

  1. [root]# mysqladmin -u root -p create radius
  2. [root]# mysql -u root -p radius < /usr/share/doc/freeradius/examples/mysql.sql

Далее идем в каталог с конфигурационными файлами FreeRADIUS /etc/raddb (на некоторых системах, например Debian, это может быть /etc/freeradius)

Правим файл radius.conf.Находим секцию authorize и в ней:

  • раскоментируем опцию attr_filter
  • закоментируем опцию files
  • раскоментируем опцию sql

Правим файл sql.conf:

  • опцию driver поставить в значение rlm_sql_mysql
  • опции server, login, password и radius_db поставить в соответствии с вашими настройками базы данных для RADIUS'а

Правим файл clients.conf, для клиета 127.0.0.1:

  • установить секретную фразу (выставить опцию sercrets)
  • опцию nastype поставить в other
  • можно еще установить опцию shortname в значение localhost

Можно еще создать клиентов, если вам это необходимо. Далее запускаем radius:

[root]# radiusd

Настройка RadiusClient

Идем в директорию /etc/radiusclient, правим файл servers, добавив туда строчку:

localhost <secret>

где, <secret> - это секретное слово что вы установили в clients.conf для клиентов на 127.0.0.1

PPTPD

VPN сервер, вместо него можно и PPPoE запустить, впринципе.

Правим файл /etc/pptpd.conf

  • указываем файл опций pppd (параметр option), можно оставить как есть: /etc/ppp/options.pptpd
  • указываем IP сервера на котором запущен pptpd (опция localip), адрес должен быть из внутренней сети.
  • указываем диапазон IP адресов назначаемых клиентам (опция remoteip), может быть диапазоном: 192.168.2.2-100

Создаем файл /etc/ppp/options.pptpd с примерно таким содержанием:

ipparam PoPToP
lock
mtu 1480
mru 1480
ms-dns 192.168.2.1
proxyarp
auth
+pap
-chap
ipcp-accept-local
ipcp-accept-remote
lcp-echo-failure 30
lcp-echo-interval 5
deflate 0
asyncmap 0
debug
kdebug 4
plugin radius.so
#plugin radattr.so

Теперь осталось только запустить pptpd, допустим такой командой:

[root]# pptpd -c /etc/pptpd.conf -p /var/run/pptpd.pid

ulog-acctd

Был выбран именно он по следующим причинам:

  1. ведет запись файл, что позволяет достичь несколько большей производительности и надежности (исключается MySQL как звено)
  2. данные парсятся и уже, по потребностям, раскладываются в базу, причем данные из файл можно сохранить и бекапить, в случае острой необходимости использовать как резерв для восстановления данных.
  3. маленький и шустрый

По сути, его дефолтная конфигурация вполне нам подходит, и можно ничего тут не трогать. Единственно необходимо прописать правила iptables, об этом ниже.

iptables

Нужно добавить следующие правила:

iptables -I FORWARD -p tcp -j ULOG --ulog-nlgroup 1 --ulog-cprange 48 --ulog-qthreshold 50 --ulog-prefix "FORWARD"
iptables -I FORWARD -p udp -j ULOG --ulog-nlgroup 1 --ulog-cprange 48 --ulog-qthreshold 50 --ulog-prefix "FORWARD"
iptables -I INPUT -p tcp -i ! lo -j ULOG --ulog-nlgroup 1 --ulog-cprange 48 --ulog-qthreshold 50 --ulog-prefix "INPUT"
iptables -I INPUT -p udp -i ! lo -j ULOG --ulog-nlgroup 1 --ulog-cprange 48 --ulog-qthreshold 50 --ulog-prefix "INPUT"
iptables -I OUTPUT -p tcp -o ! lo -j ULOG --ulog-nlgroup 1 --ulog-cprange 48 --ulog-qthreshold 50 --ulog-prefix "OUTPUT"
iptables -I OUTPUT -p udp -o ! lo -j ULOG --ulog-nlgroup 1 --ulog-cprange 48 --ulog-qthreshold 50 --ulog-prefix "OUTPUT"

Все после всех этих операций статистика начнет уже собираться. Осталось настроить скрипт-парсер и веб-морду биллинга.

Настройка биллинга

Материалы

Биллинг
http://www.opennet.ru/base/net/traffic_bill.txt.html
http://linux.opennet.ru/base/net/ulog_traf.txt.html
http://linux.opennet.ru/base/net/traf_mes.txt.html
http://linux.opennet.ru/base/net/iptables_squid_traf.txt.html
http://linux.opennet.ru/base/net/iptables_stat.txt.html
http://linux.opennet.ru/base/net/ipcad_traf_stat.txt.html
http://linux.opennet.ru/base/net/trafstat.txt.html
http://linux.opennet.ru/base/net/ipcad_bridge.txt.html

DHCP
http://www.linuxshare.ru/docs/distro/redhat/el4/sysadmin-guide/s1-dhcp-configuring-client.html
http://www.linuxfocus.org/Russian/May2000/article150.shtml
http://community.asplinux.ru/forum/3/20187/?sid=336de0f402b323fafa7607a04a3a343a
http://wiki.asplinuxclub.org/index.php?title=BOOK_%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_DHCP-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0
http://rus-linux.net/MyLDP/MINI-HOWTO-ru/DHCP.html

OpenLDAP
http://citforum.ru/operating_systems/linux/schema_ldap/

PPPoE сервер
http://www.linuxcenter.ru/lib/articles/networking/pppoe_firewall.phtml
http://linux.yaroslavl.ru/docs/serv/pppd/ppp-dialin.html
http://www.opennet.ru/base/net/rp_pppoe.txt.html
http://www.netup.biz/article-pppoe-server.php

Другое
Как бороться со сменой IP адресов клиентами локальной сети
Поднимаем шлюзовой сервер для локальной сети (PPPoE, HTP, Radius, биллинг)

http://pptpclient.sourceforge.net/routing.phtml
http://wiki.archlinux.org/index.php/Microsoft_VPN_client_setup_with_pptpclient

[14:03:31] <phreak255> /etc/ppp/peers/stel  -  диалап модемный, клиент
[14:03:48] <phreak255> /dev/ttyS1
[14:03:59] <phreak255> file /etc/ppp/options.ttyS1
[14:03:59] <phreak255> #init "/etc/ppp/scripts/modem-init 'ATZ' 'AT&C1&D2S7=45'"
[14:03:59] <phreak255> init "/etc/ppp/scripts/modem-init 'ATZ' 'AT&C1&D2S7=45B7&U15'"
[14:04:59] <phreak255> connect "/etc/ppp/scripts/modem-dial 550000"
[14:04:59] <phreak255> #welcome "/etc/ppp/scripts/login qwe qwe"
[14:04:59] <phreak255> disconnect "/etc/ppp/scripts/modem-hangup"
[14:04:59] <phreak255> file /etc/ppp/options.persist
[14:04:59] <phreak255> linkname stel
[14:04:59] <phreak255> noauth
[14:05:01] <phreak255> user " "
[14:05:59] <phreak255> password " "
[14:05:59] <phreak255> noipdefault
[14:05:59] <phreak255> ipcp-accept-local
[14:05:59] <phreak255> ipcp-accept-remote
[14:05:59] <phreak255> defaultroute
[14:05:59] <phreak255> usepeerdns
[14:06:01] <phreak255> mtu 1500
[14:06:04] <phreak255> mru 1500
[14:06:05] <phreak255> #debug
[14:06:07] <phreak255> #debug
[14:06:10] <phreak255> #logfile /etc/ppp/peers/stel0.log
[14:06:59] <phreak255> в /etc/ppp/options.ttyS1 лежит
[14:06:59] <phreak255> lock
[14:06:59] <phreak255> modem
[14:06:59] <phreak255> crtscts
[14:06:59] <phreak255> 115200
[14:06:59] <phreak255> в persist
[14:07:01] <phreak255> holdoff 5
[14:07:03] <phreak255> maxfail 0
[14:07:05] <phreak255> /etc/ppp/peers/sevcity - это клиент pptp
[14:07:08] <phreak255> lock
[14:07:10] <phreak255> #pty "/usr/sbin/pptp 192.168.100.33 --nolaunchpppd"
[14:07:59] <phreak255> pty "/usr/sbin/pptp vpn.sevcity --nolaunchpppd"
[14:07:59] <phreak255> persist
[14:07:59] <phreak255> holdoff 15
[14:07:59] <phreak255> maxfail 0
[14:07:59] <phreak255> linkname "sevcity"
[14:08:00] <phreak255> remotename "sevcity"
[14:08:02] <phreak255> noauth
[14:08:04] <phreak255> user "xxxxxxx"
[14:08:06] <phreak255> password "xxxxxxxx"
[14:08:59] <phreak255> noipdefault
[14:08:59] <phreak255> ipcp-accept-local
[14:08:59] <phreak255> ipcp-accept-remote
[14:08:59] <phreak255> defaultroute
[14:08:59] <phreak255> #usepeerdns
[14:09:00] <phreak255> mtu 1500
[14:09:02] <phreak255> mru 1500
[14:09:04] <phreak255> lcp-echo-failure 2
[14:09:06] <phreak255> lcp-echo-interval 30
[14:09:08] <phreak255> options для сервера обратны по смылу
[14:09:59] <phreak255> т.е. вместо noauth - auth, требование для клиента авторизоваццо
[14:09:59] <phreak255> refuse-pap  - запрещение PAP-авторизации
[14:09:59] <phreak255> ну там dns, wins передать
[14:09:59] <phreak255> запретить клиенту адреса назначать
[14:09:59] <phreak255> короче  man pppd
[14:10:00] <phreak255> там всё написано
[14:10:02] <phreak255> единственное для pppoe вроде mtu надо чуть меньше указывать
[14:10:04] <phreak255> хотя может и с 1500 работает, не помню точно
[14:10:31] <phreak255> для pptp принудительное назначение 1500 работает нормально, хотя по смыслу должно быть тоже меньше

[14:28:27] <phreak255> как поднимешь, кинь плиз debug-лог нормальной корректной сессии в пару минут со стороны клиента и сервера мне на мыло
[14:28:46] <phreak255> phreak255@mail.ru phreak255@gmail.com