Dhcp + Radius 3
Выдача ip может быть основана на разных критериях, например:
- авторизация по мак-адресу клиента (преимущественно используется в неуправляемых сетях)
- по комбинации мак клиента, мак свича, порт свича
- по номеру vlan
- по имени nas, vlan свича, vlan клиента
- по имени nas, маку и vlan клиента
Вариантов может быть множество, в зависимости от того, что придумает админ. Но суть везде одна: на radius приходят параметры, с которыми подключается клиента, а radius возвращает параметры: обычно ip + любое множество иных параметров.
В данном документе будет описан самый простой вариант: авторизация по мак-адресу клиента. Потом сложнее.
Мы настраиваем Radius так, чтобы он "принимал" любого, в том числе неизвестного, клиента, поскольку неизвестным клиентам будет выдан ip из пула динамических адресов. После чего у клиента появится возможность через личный кабинет зарегистрировать свое подключение и и данный мак-адрес перестанет быть неизвестным.
Установка Radius
Поскольку понадобится radius с модулем mysql, установим его не из бинарных пакетов (pkg install freeradius), а из портов:
cd /usr/ports/net/freeradius3 && make install clean
Обязательно поставим галку напротив опции MYSQL
Автозапуск:
sysrc radiusd_enable="yes"
Конфигурирование
cp /usr/local/nodeny/etc/raddb/* /usr/local/etc/raddb/
rm /usr/local/etc/raddb/sites-enabled/default
ee /usr/local/etc/raddb/sites-enabled/nodeny
Вставляем следующий текст:
server default { listen { type = auth ipaddr = * port = 1812 } listen { type = acct ipaddr = * port = 0 } authorize { sql update control { Auth-Type := Accept } } authenticate { } preacct { acct_unique preprocess } accounting { sql } session { radutmp sql } post-auth { sql } Post-Auth-Type ACCEPT { sql } }
Sql конфиг
В консоли:
ee /usr/local/etc/raddb/mods-enabled/sql
Вставляем следующий текст:
sql { driver = "rlm_sql_mysql" mysql { warnings = auto } server = "localhost" port = 3306 login = "nodeny" password = "hardpass" radius_db = "nodeny" read_groups = no authorize_reply_query = "call radreply('%{User-Name}')" accounting { reference = "%{tolower:type.%{Acct-Status-Type}.query}" type { start { query = "call radupdate('%{User-Name}','%{Framed-IP-Address}',\ 'user=%{Calling-Station-Id};nas=%{NAS-IP-Address};ses=%{Acct-Session-Id}')" } interim-update { query = "${..start.query}" } stop { query = "call radstop('%{User-Name}', '%{Framed-IP-Address}')" } } } post-auth { query = "call radupdate('%{User-Name}','%{reply:Framed-IP-Address}',\ 'user=%{Calling-Station-Id};nas=%{NAS-IP-Address};ses=%{Acct-Session-Id}')" } }