Первая часть состоит из описания принципа работы, можете ее пропустить и перейти к настройке.
Mpd позволяет клиентам подключаться к серверу по pppoe/pptp протоколам.
Mysql-процедура radreply для получения ip клиента запускает функцию get_ip, которая смотрит есть ли у данного клиента статический ip в таблице ip_pool. Если нет, то пытается выделить динамический (поле type='dynamic'). При этом поле release устанавливается в значение времени, когда этот ip следует освободить. Процедура set_auth периодически обновляет это поле (аналогично полю last таблицы auth_now). Таким образом, пока клиент авторизован, поле release всегда указывает в будущее.
После того, как клиент перестает быть авторизованным и release становится равным текущему времени - динамический ip «отвязывается» от клиента (освобождается). Set_auth всегда устанавливает release на несколько минут в будущее, чтобы ip не освободился до того момента как будет получена статистика трафика. В противном случае, ip мог бы быть выдан другому абоненту, после чего ему был бы начислен трафик предыдущего.
При выдаче динамического ip, функция get_ip также проверяет есть ли у клиента услуга с тегом realip. Если да, то выбирается ip, у которого поле realip = 1.
cd /usr/ports/net/freeradius2 && make install clean
Ставим галку напротив MYSQL, если не стоит.
cp /usr/local/nodeny/etc/raddb/* /usr/local/etc/raddb/ echo radiusd_enable=YES >> /etc/rc.conf ee /usr/local/etc/raddb/radiusd.conf
$INCLUDE sql.conf
ee /usr/local/etc/raddb/sites-enabled/default
Файл default состоит из нескольких секций:
название секции { данные }
Вы должны последовательно в секциях:
раскомментировать строку sql.
mysql -u nodeny --password=`perl -e'require "/usr/local/nodeny/sat.cfg"; print $cfg::Db_pw;'` nodeny
Проверяем выдачу ip клиенту c id=1 (измените на существующий id).
SELECT get_ip(1);
Внимание! hardpass заменить на ключ из файла sat.cfg
DROP PROCEDURE IF EXISTS `radcheck`; DELIMITER $$ CREATE PROCEDURE `radcheck` (IN login VARCHAR(64)) BEGIN SELECT id,name,'Password' AS Attribute,AES_DECRYPT(passwd,'hardpass') AS Value,'==' FROM users WHERE name=login; END$$ DELIMITER ;
DROP PROCEDURE IF EXISTS `radreply`; DELIMITER $$ CREATE PROCEDURE `radreply`(IN login VARCHAR(64)) BEGIN DECLARE usr_id INT; DECLARE usr_ip VARCHAR(15) DEFAULT NULL; SELECT id INTO usr_id FROM users WHERE name=login LIMIT 1; SELECT get_ip(usr_id) INTO usr_ip; SELECT NULL,login,'Framed-IP-Address',usr_ip,'='; SELECT NULL,login,'Framed-IP-Netmask','255.255.255.255','='; SELECT NULL,login,'Framed-Protocol','PPP','='; END$$ DELIMITER ;
DROP PROCEDURE IF EXISTS `radupdate`; DELIMITER $$ CREATE PROCEDURE `radupdate`(IN login VARCHAR(64), IN ip VARCHAR(16), IN properties VARCHAR(255)) BEGIN DECLARE usr_id INT; DECLARE usr_ip VARCHAR(15) DEFAULT NULL; SELECT id INTO usr_id FROM users WHERE name=login LIMIT 1; SELECT get_ip(usr_id) INTO usr_ip; CALL set_auth(usr_ip, CONCAT('mod=pppoe;',REPLACE(properties,':',''))); END$$ DELIMITER ;
DROP PROCEDURE IF EXISTS `radstop`; DELIMITER $$ CREATE PROCEDURE `radstop`(IN login VARCHAR(64)) BEGIN DECLARE usr_id INT; SELECT id INTO usr_id FROM users WHERE name=login LIMIT 1; DELETE FROM auth_now WHERE ip = get_ip(usr_id) LIMIT 1; END$$ DELIMITER ;
/usr/local/etc/rc.d/radiusd start radtest login pass 127.0.0.1 0 hardpass5
где login и test соответственно логин и пароль реально существующей клиентской записи в NoDeny.
cd /usr/ports/net/mpd5 && make install clean
Будет выведена табличка с вопросом какие дополнительные модули установить. Они нам не понадобятся.
echo '!mpd' >> /etc/syslog.conf echo '*.* /var/log/mpd.log' >> /etc/syslog.conf touch /var/log/mpd.log killall -HUP syslogd
echo '/var/log/mpd.log 600 5 100 * JC' >> /etc/newsyslog.conf
600 - права на файлы 5 - количество файлов в ротации 100 - ротация будет произведена при достижении лога 100 кб * - ротация по времени отключена JC - упаковка файлов утилитой bzip2
echo mpd_enable=YES >> /etc/rc.conf
ee /usr/local/etc/mpd5/mpd.conf
startup: set user admin deletempd set console self 127.0.0.1 5005 set console open set web self 0.0.0.0 5006 set web open default: load pppoe_server pppoe_server: create bundle template B set ipcp ranges 1.1.1.1/32 127.0.0.2/32 set ipcp dns 1.1.1.1 set ccp yes mppc set mppc yes e40 set mppc yes e56 set mppc yes e128 set mppc yes stateless set ecp disable dese-bis dese-old create link template common pppoe set link enable multilink set link action bundle B set link disable chap pap eap set link enable pap load radius set pppoe service "*" create link template fxp1 common set link max-children 1000 set pppoe iface fxp1 set link enable incoming radius: set radius server localhost hardpass5 1812 1813 set radius retries 3 set radius timeout 3 set radius me 127.0.0.1 set auth acct-update 45 set auth enable radius-auth set auth enable radius-acct set radius enable message-authentic
admin и deletempd - логин и пароль для доступа к управлению mpd5 через консоль или web-интерфейс (http://xx.xx.xx.xx:5006/). Не забудьте в фаерволе открыть tcp порт 5006.
1.1.1.1 - один из ip вашего сервера. Этот ip будет использован в туннеле: ip сервера <-> клиентский ip. Автор обычно прописывает этот ip на локальной заглушке.
dns 1.1.1.1 - dns-сервер. Через пробел можно указать несколько.
fxp1 - Интерфейс, на который будут приниматься pppoe соединения. Обратите внимание: указывается в двух местах конфига.
acct-update 45 - период посылки accounting пакетов (используем для поддержания авторизаций) 45 секунд.
chmod 600 /usr/local/etc/mpd5/mpd.conf /usr/local/etc/rc.d/mpd5 forcestart tail -f /var/log/mpd.log