Поднимаем шлюзовой сервер для локальной сети (PPPoE - Server + Radius + Nacctd +htb+squid+billing).

Пролог.
Итак разбираемся с тем что у нас имеется:
1. Сервер с Suse 9.x только что поднятый.
2. Куча клиентских машин в рабочей группе настроенных на получение адреса по DHCP.
3. /dev/hands требуется, желательно версией попрямее.
4. Пакеты rp-pppoe, freeradius, radiusclient, pppd(с поддержкой radius(библиотека radius.so)), nacctd, iptables, htb(со скриптом запуска), dhcp-server, named, mysql, также потребуется биллинг, который работает с radius.(FreeNIBS, UTM(кстати в случае с UTM лучше использовать его radius-server(тогда freeradius не нужен)Но UTM платный и это его главный минус :|)).
5. Опыт в редактировании конфигов, пользования MySQL, опыт в первоначальной настройке сервера: сетевые интерфейсы и .т.п.
Ставим пакеты, перечисленные в пункте 4 , удовлетворяем все зависимости которые они запросят. Надеюсь с установкой пакетов все справятся. Тем более что почти все они есть в Suse.
Условимся, что ip интерфейса eth0 сервера, который смотрит в инет, 21x.9x.1xx.23.
Условимся, что ip интерфейса eth1 сервера, который смотрит в локалку, 192.168.1.1.
Условимся, что локальный домен: byte.local
Сеть 192.168.2.10/24 будет использоваться для pppoe.

Настройка DHCP сервера.
Если кому хочется бегать от машины к машине и прописывать на них ip адреса, то можно пропустить данных шаг. Но я человек ленивый и считаю, что на клиентских машинах никаких настроек не должно быть ;) Чтобы не бегать =)
Ставим dhcp-server. Конфиг /etc/dhcpd.conf делаем примерно таким:

*******Начало /etc/dhcpd.conf********
authoritative;
default-lease-time 259200; # 3 days
max-lease-time 604800; # 1 week
option domain-name "byte.local"; #имя локального домена
option routers 192.168.1.1; #маршрут по умолчанию
option domain-name-servers 192.168.1.1; #DNS сервер
option broadcast-address 192.168.1.255; #Адрес широковещательных пакетов
subnet 192.168.1.0 netmask 255.255.255.0 { # Подсеть
range 192.168.1.10 192.168.1.254; #С какого по какой ip выделять адреса.
# записи ниже нужны если вдруг у кого есть жгучее желание иметь постоянный ip в
# локалке
host baltazar.byte.local { #имя хоста
hardware ethernet 00:50:BF:44:27:D5; # MAC адрес клиента
fixed-address 192.168.1.10; # ip который хотим ему давать.
}
}
*******Конец /etc/dhcpd.conf********

Вот и все.
Запускаем демон dhcpd: /etc/init.d/dhcpd start
Если что не так – смотрим логи, ищем ошибки.
Кого мучает паранойя или есть умники в сети c DHCP-серверами =), кое-что в конфиг придется добавить. Search Google.

Настройка DNS-сервера.
Зачем DNS? Ну во-первых кеш, во-вторых удобно, если есть биллинг юзер заходит stat.byte.local, вводит логин\пасс, попадает на статистику. Красиво… Можно также поставить апач и сделать небольшую информ-страничку с новостями для юзеров, типа ╚с 00:00 до 02:00 в пятницу будет проходить профилактика╩, ну и т.п.
Итак ставим named, идем править /etc/named.conf

********Начало named.conf***********
options {
directory "/var/lib/named";
dump-file "/var/log/named_dump.db";
statistics-file "/var/log/named.stats";
!!!!!!!!!!!!forwarders { ЗДЕСЬ IP ВАШЕГО ПРОВА; 192.168.1.1; };
forward first;
listen-on port 53 { any; };
notify no;
};

zone "." in {
type hint;
file "root.hint";
};

zone "localhost" in {
type master;
file "localhost.zone";
};

zone "0.0.127.in-addr.arpa" in {
type master;
file "127.0.0.zone";
};

zone "byte.local" in {
type master;
file "byte.local.zone";
};

zone "1.168.192.in-addr.arpa" in {
type master;
file "192.168.1.zone";
};

zone "2.168.192.in-addr.arpa" in {
type master;
file "192.168.2.zone";
};
********Конец named.conf***********

Теперь идем создавать файлы в директории “/var/lib/named”

byte.local.zone
192.168.1.zone
192.168.2.zone

Короче те, что описали с named.conf.

Итак содержимое этих файлов:

*************** byte.local.zone****************
$TTL 1W
@ IN SOA @ root (
42 ; serial (d. adams)
2D ; refresh
4H ; retry
6W ; expiry
1W ) ; minimum

IN NS @
IN A 192.168.1.1
ice A 192.168.1.1
ns1 CNAME ice
ns2 A 192.168.2.1
stat CNAME ns2
*************** byte.local.zone****************

*************** 192.168.1.zone****************
$TTL 1W
@ IN SOA ice. root.ice. (
42 ; serial (d. adams)
2D ; refresh
4H ; retry
6W ; expiry
1W ) ; minimum

IN NS ice.
1 IN PTR ice-ns1.
2 IN PTR ap2100-1
*************** 192.168.1.zone****************

*************** 192.168.2.zone****************
$TTL 1W
@ IN SOA ice. root.ice. (
42 ; serial (d. adams)
2D ; refresh
4H ; retry
6W ; expiry
1W ) ; minimum

IN NS ice.
1 IN PTR stat-pppoe.
*************** 192.168.2.zone****************

Вот и все.
Запускаем демон named: /etc/init.d/named start
Если что не так – смотрим логи, ищем ошибки.
Повторюсь, что кого мучает паранойя или есть умники в сети, кое-что для безопасности в конфиг named придется добавить. Search Google.

Настройка PPPoE-сервера и демона pppd.

Здесь начинается самое сложное ;) А именно найти radius.so под Вашу версию pppd. В принципе можно пересобрать pppd из сырцов c поддержкой mschap,mppe и библиотеку тоже. Короче эту часть я оставляю на откуп Вам.
Вот линк: http://www.opennet.ru/base/net/pptp_mppe_mppc.txt.html. Хоть там и про pptpd, но установка pppd таким же образом.
Если у вас лежит в /usr/lib/pppd/версия pppd/ библиотека radius.so, то можно не беспокоиться и спокойно продолжать настройку дальше.
Ставим rp-pppoe.
Конфиг /etc/ppp/pppoe-server-options:

***************pppoe-server-options****************
# PPP options for the PPPoE server
# LIC: GPL
logfile /var/log/pppoe.log
debug
mtu 1472
mru 1472
auth
require-pap
#require-chap
default-asyncmap
ktune
lcp-echo-interval 20
lcp-echo-failure 2
ms-dns 192.168.1.1
ms-dns ЗДЕСЬ IP ВАШЕГО ПРОВА
plugin radius.so
plugin radattr.so
192.168.2.1:
nobsdcomp
noccp
noendpoint
noipdefault
noipx
novj
receive-all
***************pppoe-server-options****************

К конфиге /etc/ppp/options: lock
Для запуска сервера pppoe создадим скриптик pppoed запуска в /etc/init.d
Скриптик для Suse. Для других систем подгоняйте сами ;)
**************pppoed********************
#!/bin/bash
# init file for rp-pppoe server
#
# description: PPPOE kernel mode server
#
# processname: pppoe-server
# chkconfig: - 45 45
# source function library
. /etc/rc.status

case "$1" in
start)
echo -n "Starting PPPOE server: "
/usr/sbin/pppoe-server -I eth1 -L 192.168.2.1 -R 192.168.2.10
#Здесь eth1 - ваш pppoe server интерфейс
#192.168.2.1 - IP PPPoE сервера
#192.168.2.10 - Первый IP адрес клиента
touch /var/lock/subsys/pppoed
rc_status -v
;;
stop)
echo -n "Shutting down PPPOE server: "
killproc pppoe-server
rm -f /var/lock/subsys/pppoed
rc_status -v
;;
restart)
$0 stop
$0 start
;;
status)
status pppoe-server
;;
*)
echo "Usage: pppoed {start|stop|restart|status}"
exit 1
esac

exit 0
**************pppoed********************

При желании вместо pppoe-server можно использовать pptpd. Опции практически те же ;)
Конфиги даны только с поддержкой PAP. При желании и возможностях можно прикрутить и CHAP(MSCHAP).
Для проверки работает ли pppoe-сервер можно в файле /etc/ppp/pppoe-server-options закомментировать строку “plugin radius.so” и в файле /etc/ppp/pap-secrets написать
test * test 192.168.2.10
Запускаем pppoe-server: /etc/init.d/pppoed start
На любом клиенте создаем PPPoE соединение и используя логин\пароль test подключаемся. Смотрим дал ли нам сервер ip 192.168.2.10, и есть ли DNS-сервера и есть ли default route на 192.168.2.1
Если что не так копаем логи. После экспиримента строчку из pap-secrets удалить, в файле /etc/ppp/pppoe-server-options строку “plugin radius.so” разкомментировать и перезапустить pppoed.

Настройка HTB.
Подробнее о htb можно узнать здесь: http://www.opennet.ru/base/net/htb_saga.txt.html
Скрипт запуска htb можно скачать здесь:
http://freshmeat.net/projects/htb.init

Копируем этот скрипт в /etc/init.d

Создаем директорию /etc/sysconfig/htb
Создаем там файлы:
ppp0
ppp0-2.root
ppp0-2:10.ppp
тут и прописывается ограничение пропускной способности для клиентов.

*********ppp0*******
DEFAULT=30
R2Q=10
*********ppp0*******

*****ppp0-2.root*******
RATE=96Kbit
BURST=9k
*****ppp0-2.root*******

*****ppp0-2:10.ppp*****
RATE=96Kbit
BURST=9k
LEAF=sfq
RULE=*,192.168.2.0/24
*****ppp0-2:10.ppp*****

Эти файлы рассчитаны на пропуск примерно 11-12 kb\sec. Я не буду рассказывать про то, как настраивается htb. Про это отлично написано в статье, указанной выше.

Также я написал небольшой скриптик для того, чтобы создавать такие файлы для всех интерфейсов ppp с 0 по 254

*************create.ppp.shapers*************
#!/bin/bash
COUNTER=1
while [ $COUNTER -lt 254 ]; do
echo Shaper for interface ppp$COUNTER created!

rm -f /etc/sysconfig/htb/ppp$COUNTER
rm -f /etc/sysconfig/htb/ppp$COUNTER-2.root
rm -f /etc/sysconfig/htb/ppp$COUNTER-2:10.ppp

cp /etc/sysconfig/htb/ppp0 /etc/sysconfig/htb/ppp$COUNTER
cp /etc/sysconfig/htb/ppp0-2.root /etc/sysconfig/htb/ppp$COUNTER-2.root
cp /etc/sysconfig/htb/ppp0-2:10.ppp /etc/sysconfig/htb/ppp$COUNTER-2:10.ppp

let COUNTER=COUNTER+1
done

/etc/init.d/htb.init restart
*************create.ppp.shapers*************

Т.е. для того чтобы изменить пропускную способность для всех, изменяем всё что относится к ppp0, а потом запускаем скрипт.

Для того чтобы правила применялись при подключении клиента, необходимо создать в директории /etc/ppp/ip-up.d скрипт shaper.start

********shaper.start******
#!/bin/bash
/etc/init.d/htb.init restart
********shaper.start******

а в директории /etc/ppp/ip-down.d скрипт shaper.stop

********shaper.stop******
#!/bin/bash
/etc/init.d/htb.init restart
********shaper.stop******

Настройка Iptables.
Вот скрипт, который я использую для настройки файрволла.

****************main.rules.iptables****************
#!/bin/sh
iptables --flush
iptables -t nat --flush
clear
###########################################################################
#
# 1. Configuration options.
#
#
# 1.1 Internet Configuration.
#
INET_IP="21x.9x.1xx.23"
INET_IFACE="eth0"
#
# 1.2 Local Area Network configuration.
#
#
LAN_IP="192.168.1.1"
LAN_IP_RANGE="192.168.1.0/24"
LAN_IFACE="eth1"
#
# 1.3 VPN Configuration.
#
VPN_IP="192.168.2.1"
VPN_IP_RANGE="192.168.2.0/24"
VPN_IFACE="ppp+"
#
# 1.4 Localhost Configuration.
#
LO_IFACE="lo"
LO_IP="127.0.0.1"
#
# 1.5 IPTables Configuration.
#
IPTABLES="iptables"
###########################################################################
#
# 2. Module loading.
#
/sbin/depmod -a
#
# 2.1 Required modules
#
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state
#
# 2.2 Non-Required modules
#
#/sbin/modprobe ipt_owner
#/sbin/modprobe ipt_REJECT
#/sbin/modprobe ipt_MASQUERADE
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc
###########################################################################
#
# 3. /proc set up.
#
#
# 3.1 Required proc configuration
#
echo "1" > /proc/sys/net/ipv4/ip_forward
#
# 3.2 Non-Required proc configuration
#
#echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
#echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp
#echo "1" > /proc/sys/net/ipv4/ip_dynaddr
###########################################################################
#
# 4. rules set up.
#
######
# 4.1 Filter table
#
#
# 4.1.1 Set policies
#
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
#
# 4.1.2 Create userspecified chains
#
$IPTABLES -N bad_tcp_packets
#
# Create separate chains for ICMP, TCP and UDP to traverse
#
$IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets
#
# 4.1.3 Create content in userspecified chains
#
$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
#
# allowed chain
#
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP
#
# TCP rules
#
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 25 -j allowed
#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed
#
# UDP ports
#
#$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 53 -j ACCEPT
#
# ICMP rules
#
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
#
# 4.1.4 INPUT chain
#
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets
#
# Rules for special networks not part of the Internet
#
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT
#$IPTABLES -A INPUT -p ALL -i $VPN_IFACE -s $VPN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $VPN_IP -j ACCEPT
#
# Special rule for DHCP requests from LAN, which are not caught properly
# otherwise.
#
$IPTABLES -A INPUT -p UDP -i $LAN_IFACE --dport 67 --sport 68 -j ACCEPT
#
# Rules for incoming packets from the internet.
#
$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
#
#SQUID
#
$IPTABLES -A INPUT -s 192.168.1.0/24 -p tcp --dport 3128 -j DROP
#$IPTABLES -A INPUT -p tcp --dport 3128 -s 192.168.2.0/24 -j ACCEPT
#
# Log weird packets that don't match the above.
#
$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT INPUT packet died: "
#
# 4.1.5 FORWARD chain
#
$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets
#
# Accept the packets we actually want to forward
#
$IPTABLES -A FORWARD -s 192.168.1.10 -d 192.168.0.1 -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#
# Log weird packets that don't match the above.
#
$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT FORWARD packet died: "
#
# 4.1.6 OUTPUT chain
#
$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets
#
# Special OUTPUT rules to decide which IP's to allow.
#
$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $VPN_IP -j ACCEPT
#
# Log weird packets that don't match the above.
#
$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT OUTPUT packet died: "
######
# 4.2 nat table
#
#
# 4.2.1 POSTROUTING chain
#
#
# Enable simple IP Forwarding and Network Address Translation
#
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP
$IPTABLES -t nat -A PREROUTING -i $VPN_IFACE -d ! $VPN_IP_RANGE -p tcp --dport 80 -j REDIRECT --to-port 3128
****************main.rules.iptables****************

Кроме того, чтобы пользователя пускало в сеть надо добавлять при каждом его входе правило в FORWARD и INPUT цепочки с его ip адресом, а также удалять их, когда пользователь отсоеденился. Для этого делаем скрипты:

*******/etc/ppp/ip-up.d/iptables*************
#!/bin/bash
IPT=/usr/sbin/iptables
UIP=$5
$IPT -A FORWARD -s $UIP -j ACCEPT
$IPT -A INPUT -s $UIP -j ACCEPT
*******/etc/ppp/ip-up.d/iptables*************

*******/etc/ppp/ip-down.d/iptables************
#!/bin/bash
IPT=/usr/sbin/iptables
UIP=$5
$IPT -D FORWARD -s $UIP -j ACCEPT
$IPT -D INPUT -s $UIP -j ACCEPT
*******/etc/ppp/ip-down.d/iptables************

Кстати, мысль для создания собственного биллинга: громим правило из скрипта(который кроном проходит по базе трафика и лимитов) при привышении лимита, пишем в базу пользователей что этот юзер залочен. Трафик перестает бежать, пользователь пытается переподключится и получает ошибку о неправильном логине\пароле, т.к. его аккаунт заблокирован. Я так и сделал, возможно, даже выложу скрипты и Web-интерфейс как только приведу в божеский вид. Проект типа сделаю. :)

Настройка прозрачного прокси SQUID.
В принципе эту часть можно и пропустить, если вам не интересно кеширование и блокирование баннеров, порно, а также статистика по посещенным адресам. Вот конфиг моего сквида, здесь все просто.

***********squid.conf**************
#Порт HTTP-PROXY
http_port 3128
#Порт ICP
icp_port 0
#Не кешировать скрипты
acl QUERY urlpath_regex cgi-bin/?
no_cache deny QUERY
#Кол-во ОЗУ для SQUID
cache_mem 128 MB
#Путь к директории кеша и его размер(1000)
cache_dir ufs /var/cache/squid 10000 16 256
#Путь к лог-файлу доступа к SQUID(Статистика работы через SQUID)
cache_access_log /var/log/squid/access.log
#Путь к лог-файлу SQUID - в нем события запуска SQUID и дочерних программ
cache_log /var/log/squid/cache.log
#Путь к лог-файлу Strore
cache_store_log /var/log/squid/store.log
#Ротация логов
logfile_rotate 10
#Таблица MIME-типов для SQUID
mime_table /etc/squid/mime.conf
#PID-файл SQUID
pid_filename /var/run/squid.pid
#Пользователь для анонимного доступа к FTP
ftp_user anonymous@
#SQUID формирует страницу с папками на FTP - этот параметр - кол-во папок
ftp_list_width 32
#Пассивный режим FTP
ftp_passive on
#Проверка подлинности FTP
ftp_sanitycheck on
#redirect_program /usr/local/rejik3/redirector /usr/local/rejik3/rejik.conf #это для режика
#Списки контроля доступа
acl server src 192.168.1.1/255.255.255.255 #Наш сервер
acl clients src 192.168.2.1-192.168.2.254/255.255.255.255
#Стандартные ACL
acl all src 0.0.0.0/0.0.0.0 #Все
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255 #Адрес localhost
acl SSL_ports port 443 563 #Порты SSL
acl SMTP port 25 #Для защиты от спама ;) Оказывается SQUID может делать relay
#Служебные ACL
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
#Теперь разрешаем доступ тому, кто указан в ACL
http_access allow server
http_access allow clients
http_access deny !Safe_ports
http_access deny SMTP
http_access deny all
#Разрешаем ICP-доступ всем
icp_access deny all
error_directory /etc/squid/errors
#Акселерация(для transparent прокси)
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
***********squid.conf**************

На этом настройка squid завершена, его можно запустить. Если нужна статистика по посещенным URL, советую использовать SARG (он есть в дистрибутиве)

Настройка FreeRADIUS(NetUP Radius)+RadiusClient
Решил написать различные варианты настройки с 2-мя серверами radius. Вы можете выбрать один из них. Хочу напомнить, что NetUP Radius входит в состав платного биллинга UTM. Поэтому советую использовать его, только если он куплен у производителя, а не украден в ближайшем варезнике. Тем более самописных биллинг можно очень легко заточить под свои задачи и сеть.

Итак, настраиваем radius client. Правим /etc/radiusclient/servers и /etc/radiusclient/radiusclient.conf

******servers********
127.0.0.1 oh2iFa
******servers********
Последовательность символов после ip это секрет для соединения сервера и клиента. Т.е. на сервере и на клиенте последовательность должна быть одинаковой.

********radiusclient.conf***************
auth_order radius,local
login_tries 4
login_timeout 60
nologin /etc/nologin
issue /etc/radiusclient/issue
# RADIUS settings
authserver localhost:1812
acctserver localhost:1812
servers /etc/radiusclient/servers
dictionary /etc/radiusclient/dictionary
login_radius /usr/sbin/login.radius
# RADIUS server
seqfile /var/run/radius.seq

mapfile /etc/radiusclient/port-id-map
default_realm
radius_timeout 10
radius_retries 3
login_local /bin/login
********radiusclient.conf***************

Настройка сервера NetUP Radius:
В /netup/utm/utm.cfg добавляем строки:
radius_port=1812
radius_host=127.0.0.1
radius_secret_key=oh2iFa
password_store_method=plain_text

и в автозагрузку добавляем /netup/utm/bin/netup_radius/netup_radiusd

Настройка сервера FreeRADIUS(с поддержкой MySQL).

Конфиг радиус сервера следующий(взято и опробовано из статьи Алекса Б. Юдкина):

************ radiusd.conf**********
prefix = /usr
exec_prefix = ${prefix}
sysconfdir = /etc
localstatedir = /var
sbindir = ${exec_prefix}/sbin
logdir = ${localstatedir}/log/radius
raddbdir = ${sysconfdir}/raddb
radacctdir = ${logdir}/radacct
# Месторасположение конфигурационных и лог файлов.
confdir = ${raddbdir}
run_dir = ${localstatedir}/run/radiusd
# Каталог с подгружаемыми модулями.
libdir = ${exec_prefix}/lib
# Месторасположение pid-файла. Содержащего идентификатор процесса.
pidfile = ${run_dir}/radiusd.pid
# Имя пользователя и группа от которых запускается FreeRADIUS
user = radius
group = radius
# Максимальное время (в секундах) используемое для обработки запроса.
max_request_time = 30
# Удалить запросы которые обрабатываются более чем max_request_time
delete_blocked_requests = no
# Время ожидания (в секундах) перед очисткой reply запроса отправленного NAS.
cleanup_delay = 5
# Максимальное количество запросов хранимых сервером. Это число должно быть равно
# количеству клиентов помноженному на 256.
# К примеру для четырех клиентов оно будет 1024.
max_requests = 5120
# Закрепить за ip адресом. По умолчанию RADIUS сервер при старте принимает
# запросы со всех ip адресов.
bind_address = 127.0.0.1
# Закрепить за FreeRADIUS конкретный port. Если указан ноль,
# то значение берется из /etc/services
port = 0
# Запретить/разрешить ip адреса в dns имена.
# Включение этой опции может сильно снизить производительность.
hostname_lookups = no
# Создавать/несоздавать отладочные файлы при падении сервера.
allow_core_dumps = no
# Разрешить использование регулярных выражений.
regular_expressions = yes
extended_expressions = yes
# Записывать полный User-Name аттрибут если найден в запросе.
log_stripped_names = no
# Записывать в лог попытки авторизации.
log_auth = yes
# Записывать в логи пароли при авторизации.
# log_auth_badpass - не корректные пароли
# log_auth_goodpass - корректные пароли
log_auth_badpass = yes
log_auth_goodpass = no
# Включить/выключить коллизию пользователей.
usercollide = no
# конвертировать логин и/или пароль до или после авторизации.
lower_user = no
lower_pass = no
# удалить пробелы в логине и/или пароле.
nospace_user = no
nospace_pass = no
# настройки безопасности от возможных DoS аттак.
security {
# Максимальное допустимое количество аттрибутов в RADIUS пакете.
max_attributes = 200
# Задержка (в секундах) перед отправкой Access-Reject пакета.
reject_delay = 1
# Не отвечать на запросы Status-Server
status_server = no
}
# Конфигрурация клиентов RADIUS сервера.
# Описывается в отдельном файле.
$INCLUDE ${confdir}/clients.conf
# Отключить snmp поддержку.
snmp=no
# Настрока пула процессов.
thread pool {
# количество первоначально запущенных процессов.
start_servers = 5
# Максимально возможное количество процессов.
max_servers = 32
# Динамическая регулировка количества процессов.
min_spare_servers = 3
max_spare_servers = 10

# Количество принимаемых запросов процессом. МОжет помочь при утечках памяти в
# RADIUS сервере. Если выставить 300, процессы будут периодически перегружаться
# для уборки мусора.
max_requests_per_server = 0
}

# Секция конфигурации динамических модулей.
modules {
# Модуль PAP авторизации.
# Необходим для обработки запросов с PAP авторизацией.
# encryption_scheme указывает в каком виде хранятся пароли.
# clear - подразумевает в открытом виде.
pap {
encryption_scheme = clear
}
# Модуль CHAP авторизации.
# Необходим для обработки запросов с CHAP авторизацией.
# authtype подразумевает обработку запросов только с аттрибутом Auth-Type=CHAP
chap {
authtype = CHAP
}
# Модуль преобработки запросов.
# Т.е. перед авторизацией пакета.
preprocess {
# huntgroups - хинт группы см. файл huntgoups.
# hints - хинты.
huntgroups = ${confdir}/huntgroups
hints = ${confdir}/hints

# Обработка Cisco VSA.
with_cisco_vsa_hack = no
}
# Модуль Microsoft CHAP авторизации.
# Поддерживает так же еще и Microsoft CHAP v2
# authtype подразумевает обработку запросов только с аттрибутом Auth-Type=MS-CHAP
# use_mppe = no указывает на отсутствие компресии VPN туннеля.
mschap {
authtype = MS-CHAP
use_mppe = no
}
# Модуль записей Livingston RADIUS типа.
# usersfile содержит авторизационные записи пользователей.
# Рекомендуется использовать только для тестов и выставления значений по умолчанию.
# acctusersfile содержит пользователей подлежащих учету (аккаунтингу).
# compat - совместимость. При использовании файлов только FreeRADIUS можно отключить.
files {
usersfile = ${confdir}/users
compat = no
}

# Запись детального лога аккаунтинговых пакетов.
detail {
detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d
detailperm = 0600
}

# Запись детального лога пакетов авторизации.
detail auth_log {
detailfile = ${radacctdir}/%{Client-IP-Address}/auth-detail-%Y%m%d
detailperm = 0600
}

# Запись детального лога reply пакетов.
detail reply_log {
detailfile = ${radacctdir}/%{Client-IP-Address}/reply-detail-%Y%m%d
detailperm = 0600
}

# Создать уникальный ключ для аккаунтинг сессии.
# Многие NAS повторно используют Acct-Session-ID.
# key перечисление аттрибутов для генерации Acct-Session-ID
acct_unique {
key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port-Id"
}

# Конфигурация авторизации и аккаунтинга посредством СУБД
# содержится в отдельном файле cakesql.conf
$INCLUDE ${confdir}/sql.conf

}

# Авторизация
# сначала идет пакет передается в preprocess
# где может быть модифицирован.
# Далее chap mschap обрабатывают chap и mschap авторизацию.
authorize {
preprocess
chap
mschap
# Не ведем логи пакетов авторизации.
# auth_log
files
mysql
}
# Аунтификация
# Секция содержит модули доступные, для аунтификации.
authenticate {
Auth-Type PAP {
pap
}

Auth-Type CHAP {
chap
}

Auth-Type MS-CHAP {
mschap
}

}
# Преобразование аккаунтинговых пакетов.
preacct {
preprocess
}
# Секция ведения аккаунтинга.
accounting {
# Создание Acct-Session-Id если ваш NAS генрит их вполне корректно можете убрать.
acct_unique
# Не создаем detail лог.
detail
# Помещать аккаунтинговые пакеты в СУБД
mysql
}
# Секция ведения логов reply-пакетов.
post-auth {
# Не ведем детальный лог репли пакетов.
reply_log
}

Редактируем sql.conf:
************** sql.conf***************
sql mysql {

# Database type
# Current supported are: rlm_sql_mysql, rlm_sql_postgresql,
# rlm_sql_iodbc, rlm_sql_oracle, rlm_sql_unixodbc, rlm_sql_freetds
driver = "rlm_sql_mysql"

# Connect info
server = "localhost"
login = "root"
password = "ВАШ ПАРОЛЬ НА MySQL"

# Database table configuration
radius_db = "radius"
************** sql.conf***************

Файл naslist:

localhost local other

Файл clients:

localhost oh2iFa

В пакете с радиусом идет дамп базы для него:
/usr/share/doc/freeradius/db_mysql.sql

Создаем базу данных radius и применяем sql-файл к ней.

Теперь в базу можно забивать пользователей. Руками или через самописный Web-интерфейс :). Описание полей БД можно найти в документации по FreeRADIUS.

Настройка NetAcct
Скачать netacct можно здесь: http://netacct-mysql.gabrovo.com/?section=download&PHPSESSID=a1ad535ef56...
Рекомендую скачать последний stable. Там же есть русская дока по нему.
Для пользователей NetUP UTM рекомендую использовать именно этот коллектор. Подробно о его конфигурировании можно прочитать в документации по UTM.

Net-acct необходимо сконфигурировать с опцией "--with-mysql" с указанием пути к mysql(для UTM собираем без поддержки mysql).
После компиляции и установки программы создаем базу данных для net-acct с помощью sql-файла netacct.sql, который присутствует в архиве. Также можно добавить пользователя netacct в MySQL и предоставить ему права на базу netacct.

Правим конфиг
**************/etc/naccttab**************
flush 60 #Через какой интервал кидать в базу инфу(сек)
fdelay 60 #Время (cек),через которое, после завершения сетевой активности, #данные о трафике могут быть записаны в базу.
database mysql
mysql_user netacct #пользователь в MySQL
mysql_password netacct #пароль пользователя для базы
mysql_host localhost #хост
mysql_database netacct #имя базы данных
mysql_table accounting #имя таблицы
notdev eth0 #какой интерфейс не слушать, что бы не было двойного обсчета
device eth1 #интерфейс на котором будет считаться трафик
ignoremask 255.255.255.0 # исключить из подсчета трафик идущий внутри сети
ignorenet 127.0.0.0 255.0.0.0 # игнор для loopback
debug 2 # уровень отладки
debugfile /tmp/nacctd.debug # куда класть лог отладки
headers tr 40 38
headers lo 14 12
headers isdn 4 0
headers eth 14 12
headers plip 14 12

# For dynamic slip/ppp

dynamicip /var/run # где хранятся файлы динам. ip
dynamicnet 202.36.94.0 255.255.255.0
exclude-name-lookup 202.36.94.1 255.255.255.255
exclude-name-lookup 202.36.94.253 255.255.255.255

# For disabling certain fields
# This is commented out by default
# Field 7 is disabled by default so we match the old (pre 0.5) output format
# disable 2 # disable output of protocol
# disable 3 # disable output of source address
# disable 4 # disable output of source port
# disable 5 # disable output of destination address
# disable 6 # disable output of destination port
disable 7 # disable output of packets count
# disable 8 # disable output of byte count
# disable 9 # disable output of device name
# disable 10 # disable output of user name
**************/etc/naccttab**************

Запускаем nacctd. В случае проблем проверяем права на базу, и копаем логи.

Эпилог.

Ну вот и готов наш сервер. Осталось только написать скрипты для биллинга, и почту, jabber прикрутить.
Пожелания и предложения можете отправлять на mi6@bk.ru. Можете дополнить мою статью, и я сделаю другую ее версию. Пиво отправляйте бочками =)

Автор: Морозов Иван(aka Morph), 2005 год.

RSS-материал