Dhcp: відмінності між версіями

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку
 
(Не показано 76 проміжних версій цього користувача)
Рядок 1: Рядок 1:
==Два варианта==
==Модуль==
NoDeny+ предоставляет 2 принципиально разных варианта работы Dhcp-модуля:


* С Radius: dhcp-сервер получает ip от NoDeny+ и выдает клиенту
Для работы по dhcp в NoDeny Plus необходим модуль dhcp, который нужно приобрести дополнительно на главном сайте NoDeny. В NoDeny Next модуль входит в базовую поставку.
* Без Radius: dhcp-сервер выдает клиенту ip на свое усмотрение и информирует NoDeny+
<br><br>


Если вы не можете определиться какой из вариантов использовать - рекомендуем без Radius - он проще в настройке. Прицип работы обоих вариантов:
==Варианты настройки==
NoDeny+ предоставляет 3 принципиально разных варианта работы Dhcp-модуля:
<br><br>
* [[Dhcp+Radius|С Radius]]: dhcp-сервер получает ip от NoDeny+ и выдает клиенту
* [[Dhcp без Radius|Без Radius]]: dhcp-сервер выдает клиенту ip на свое усмотрение и передает данные NoDeny+
* [[dhcp-конфиг с помощью make config|Автогенерация конфига]]: NoDeny периодически формирует dhcpd-конфиг с прописанными связками mac-ip
<br><br>
Если вы не можете определиться какой из вариантов использовать, рекомендуем без Radius - он проще в настройке.<br><br>


===Схема работы без Radius===
==С использованием Radius==


Dhcp-сервер работает автономно от NoDeny. Т.е. выдает ip адреса на свое усмотрение!  Dhcp-сервер запоминает какому мак-адресу выдавал какой ip, т.е одно устройства скорее всего будет получать постоянно один и тот же ip. Тем не менее, это не гарантируется и вообще неважно для NoDeny.
Устанавливается radius-сервер, который будет посредником между dhcp-сервером и NoDeny.


Как выглядит сам процесс:
# Абонент включает компьютер, тот делает dhcp запрос на получение ip
# Dhcp-сервер принимает запрос и посылает mac на Radius
# Radius запускает mysql-процедуры, которые по mac находят абонента и получают его ip
# Radius посылает ip dhcp-серверу
# Dhcp выдает ip абоненту
<br>


* Абонент включает компьютер и получает ip от dhcp-сервера. При этом посылается сигнал в NoDeny через скрипт modules/dhcp/events.pl.
==Без использования Radius==
* NoDeny смотрит какому абоненту принадлежит мак-адрес (либо же комбинация мак+свич+порт) и привязывает ip, который выдал dhcpd, к его учетке. Абонент получает доступ в интернет.
* В первый раз абонент, естественно, не будет найден, поэтому ip не привязывается. Абонент, открыв браузер и введя любой адрес, попадает на заглушку, на которой ему сообщается "для получения доступа в интернет введите логин и пароль".
* После ввода логина и пароля, NoDeny запоминает, что мак-адрес (либо же комбинация мак+свич+порт) принадлежит такому-то абоненту.
* При последующих подключениях логин и пароль запрашиваться не будут пока не будет сменено устройство либо точка подключения (в случае использования option 82).


====Комментарий по Option 82====
# Абонент включает компьютер, тот делает dhcp запрос на получение ip
# Dhcp выдает ip адрес из своего пула. Обратите внимание - ip не запрашивается у NoDeny
# Dhcp сообщает NoDeny какой ip он выдал абоненту
# NoDeny у себя отмечает, что данный  ip привязан такому-то абоненту
<br>


Без использования управляемого оборудования, dhcp не достаточно безопасно т.к. злоумышленник может подделать мак-адрес. Option 82 заставляет свичи информировать dhcp-сервер о том, с какого свича и какого порта пришел запрос. Поэтому подделка мака не приведет к успеху, поскольку мак свича и номер порта, злоумышленник не сможет подделать (если он подключен к свичу с option 82, естественно).
==Формирование конфига==


==Схема работы с Radius (например, accel-ppp)==
NoDeny периодически формирует для dhcp конфигурационный файл, в котором по данным, взятым из биллинга, прописываются связки mac -> ip
Dhcp-сервер работает с NoDeny через Radius аналогично pppoe.
 
* Клиент включает компьютер, который шлет запрос на dhcp-сервер. Тот в свою очередь шлет запрос в Radius.
* Радиус запускает NoDeny mysql-процедуру получения ip по мак адресу (комбинации мак+свич+порт). В ответ получает гостевой ip (в админке помечаются тегом guest в пуле ip)
 
==Вариант без Radius==
 
Ставим dhcp-сервер
 
<source lang="bash">
pkg install isc-dhcp42-server
</source>
 
Автозапуск и логирование
 
<source lang="bash">
echo 'dhcpd_enable=YES' >> /etc/rc.conf
echo 'dhcpd_flags="-q"' >> /etc/rc.conf
echo 'dhcpd_withuser=root' >> /etc/rc.conf
#echo /usr/local/etc/rc.d/isc-dhcpd forcestart >> /etc/rc.local
echo '!dhcpd' >> /etc/syslog.conf
echo 'local7.*  /var/log/dhcpd.log' >> /etc/syslog.conf
touch /var/log/dhcpd.log
touch /usr/local/nodeny/logs/dhcp.events.log
killall -HUP syslogd
</source>
 
Настраиваем dhcp-сервер: /usr/local/etc/dhcpd.conf
 
<pre>
log-facility local7;
option domain-name-servers 1.1.1.1;
 
subnet 10.100.0.0 netmask 255.255.0.0 {
    range 10.100.64.0 10.100.80.255;
    interface igb0;
    option routers 10.100.0.1;
    default-lease-time 2400;
    max-lease-time 1800;
    on commit {
        set ClientIP  = binary-to-ascii(10, 8, ".", leased-address);
        set ClientMac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));
        set SwitchMac = "";
        set SwitchPort ="";
        if exists agent.circuit-id
        {
            set SwitchMac = binary-to-ascii(16, 8, ":", suffix(option agent.remote-id, 6));
            set SwitchPort = binary-to-ascii(10, 8, ":", suffix(option agent.circuit-id, 1));
        }
        execute("/usr/bin/perl", "/usr/local/nodeny/modules/dhcp/events.pl", "commit",
                ClientIP, ClientMac, SwitchMac, SwitchPort);
    }
    on expiry {
        set ClientIP  = binary-to-ascii(10, 8, ".", leased-address);
        execute("/usr/bin/perl", "/usr/local/nodeny/modules/dhcp/events.pl", "expiry", ClientIP);
    }
    on release {
        set ClientIP  = binary-to-ascii(10, 8, ".", leased-address);
        execute("/usr/bin/perl", "/usr/local/nodeny/modules/dhcp/events.pl", "release", ClientIP);
    }
}
</pre>
 
* interface igb0 - интерфейс, к которому подключены клиенты
* option routers 10.100.0.1 - ip вашего сервера на интерфейсе igb0, т.е. gateway для клиентов
* subnet - клиентская сеть
* range - диапазон ip адресов, которые выдает dhcp сервер клиентам. Должен попадать в subnet. Желательно взять диапазон с запасом: ip должно быть в несколько раз больше чем ваших клиентов.
 
В админке NoDeny в настройках в разделе «ip pool» создаем ту же сеть, какая указана в конфиге в параметре range, при этом тип ip должен быть «динамический».
 
В разделе «Кабинет клиента» добавляем модуль dhcp.
 
===Для того чтобы фаервол перенаправлял клиентов на веб-заглушку===
 
В файле /usr/local/nodeny/cfg/noserver.cfg.pm устанавливаем в 1 параметр
 
<pre>
$forward_enabled = 1;
</pre>
 
Перезапускаем noserver.pl
 
<source lang="bash">
kill -9 `ps axu | grep noserver | grep -v grep | awk '{ print $2 }'`
perl /usr/local/nodeny/noserver.pl -d &
</source>
 
Смотрим, появилась ли команда fwd в правилах фаервола:
 
<source lang="bash">
ipfw show | grep fwd
</source>
 
Если не появилась, пробуем:
 
<source lang="bash">
ipfw add 65534 fwd 127.0.0.1,8080 tcp from any to any 80
</source>
 
Если ошибка - необходимо скомпилировать ядро FreeBSD с опцией «options IPFIREWALL_FORWARD»
 
Если web-заглушка (модуль cap) не запускается по умолчанию, то либо в ее конфиге ставим параметр run => 1 либо (рекомендуется) запускаем отдельным процессом (и ставим автозапуск в /etc/rc.local):
 
<source lang="bash">
/usr/bin/perl /usr/local/nodeny/nokernel.pl -m=cap -d &
</source>
 
Также запускаем модуль dhcp, но его не обязательно запускать отдельным процессом как в примере:
 
<source lang="bash">
/usr/bin/perl /usr/local/nodeny/nokernel.pl -m=dhcp -d &
</source>
 
Тестируем
 
Запускаем dhcp-сервер и смотрим лог NoDeny
 
<source lang="bash">
/usr/local/etc/rc.d/isc-dhcpd forcestart
tail -f /usr/local/nodeny/logs/dhcp.events.log
</source>
 
Включаем клиентский компьютер и убеждаемся, что он получил ip по dhcp.
 
В логе должно отобразиться подобное
 
<pre>
[commit] ip=10.100.65.98, mac=0:1d:2a:ff:22:88, mac_ok=001d2aff2288 | Необходима регистрация мака
</pre>
 
Это означает, что клиенту выдан ip, но мак пока не известен NoDeny. Если есть желание (или у вас что-то не получается), вы можете посмотреть в БД таблицу mac_uid - там будет зарегистрирован данный мак, ip, время, а uid = 0. Команда mysql:
 
<source lang="sql">
SELECT *, INET_NTOA(ip) FROM mac_uid;
</source>
 
Если с клиентского компьютера открыть любую страницу, то запрос будет перехвачен заглушкой и выведено сообщение, что необходимо ввести логин и пароль. После их ввода, мак адрес должен быть привязан к id клиента - это можно проверить той же mysql командой, указанной выше.
 
Вы должны ввести логин и пароль не позднее чем через 10 минут от момента получения ip - это защита от ситуации, когда кто-то вручную пропишет ip и попытается его зарегистрировать.
 
==Модуль dchp + Radius==
 
В настройках админки в разделе «клиентская статистика» добавляем модуль dhcp.
 
Создаем пул ip адресов:
 
<pre>
    тип: динамические
    теги: guest
</pre>
 
Это гостевые ip, с которых нельзя будет получить интернет. Количество ip должно превышать в несколько раз число устройств в сети, поскольку для каждого нового мак-адреса выделяется свой персональный гостевой ip (предусмотрено удаление старых записей, но запас должен быть).
 
 
===Установка Radius===
 
Поскольку понадобится radius с модулем mysql, установим его не из бинарных пакетов (''pkg install freeradius''), а из портов:
 
<source lang="bash">
cd /usr/ports/net/freeradius2 && make install clean
</source>
 
Обязательно поставим галку напротив опции ''MYSQL''
 
<source lang="bash">
rm /usr/local/etc/raddb/sites-enabled/default
ee /usr/local/etc/raddb/sites-enabled/nodeny
</source>
 
Вставляем следующий текст:
 
<pre>
authorize {
        sql
}
authenticate {
        Auth-Type PAP {
                pap
        }
}
preacct {
        acct_unique
        preprocess
}
accounting {
        detail
        sql
        exec
}
session {
        radutmp
        sql
}
post-auth {
        sql
}
</pre>
 
 
<source lang="bash">
cp /usr/local/nodeny/etc/raddb/* /usr/local/etc/raddb/
echo radiusd_enable=YES >> /etc/rc.conf
ee /usr/local/etc/raddb/radiusd.conf
</source>
 
Раскомментируем строку (найти проще всего так: ctrl+y, затем текст "sql.conf", затем enter):
 
<pre>
$INCLUDE sql.conf
</pre>
 
<source lang="bash">
ee /usr/local/etc/raddb/sql.conf
</source>
 
Изменим postauth_query и accounting_update_query:
 
<pre>
        postauth_query = "call radupdate('%{User-Name}','%{reply:Framed-IP-Address}',\
                'nas=%{NAS-IP-Address}')"
        accounting_update_query = "call radupdate('%{User-Name}','%{Framed-IP-Address}',\
                'nas=%{NAS-IP-Address}')"}
</pre>
 
Создаем в mysql:
 
<source lang="sql">
DROP PROCEDURE IF EXISTS `radreply`;
DELIMITER $$
CREATE PROCEDURE `radreply`(IN login VARCHAR(64))
BEGIN
    DECLARE usr_ip VARCHAR(15) DEFAULT NULL;
    INSERT INTO mac_uid (
        SELECT NULL, login, p.ip, 0, UNIX_TIMESTAMP(), 0, 0 ,0
        FROM ip_pool p WHERE uid=0 AND tags LIKE '%,guest,%'
            AND NOT EXISTS (SELECT ip FROM mac_uid WHERE ip=p.ip)
        LIMIT 1)
        ON DUPLICATE KEY UPDATE time=UNIX_TIMESTAMP();
    SELECT INET_NTOA(ip) INTO usr_ip FROM mac_uid WHERE mac=login;
    IF usr_ip IS NULL THEN
        DELETE FROM mac_uid WHERE uid=0 AND time<(UNIX_TIMESTAMP()-3600);
    END IF;
    SELECT NULL, login, 'Framed-IP-Address', usr_ip, '=';
END$$
DELIMITER ;
</source>
 
<source lang="sql">
DROP PROCEDURE IF EXISTS `radupdate`;
DELIMITER $$
CREATE PROCEDURE `radupdate`(IN login VARCHAR(64), IN ip VARCHAR(16), IN properties VARCHAR(255))
BEGIN
    CALL set_auth(ip, CONCAT('mod=dhcp;',REPLACE(properties,':','')));
END$$
DELIMITER ;
</source>
 
Проверим:
 
<source lang="sql">
call radreply('123');
select mac, inet_ntoa(ip) as ip, uid, time from mac_uid;
</source>
 
Получаем в ответ
 
<pre>
+------+----------+-----+------------+
| mac  | ip      | uid | time      |
+------+----------+-----+------------+
| 123  | 10.0.0.2 |  0 | 1403783705 |
+------+----------+-----+------------+
</pre>
 
Здесь 10.0.0.2 - один из гостевых ip. При повторном выполнении call radreply('123') мы должны получать этот же ip, при этом должно изменяться поле time.
 
<source lang="bash">
ee /usr/local/etc/raddb/sql.conf
</source>
 
Cтроку: authorize_reply_query = "call radreply('%{User-Name}')" меняем на
 
<pre>
authorize_check_query = "SELECT NULL,'%{User-Name}','Auth-Type','Accept','='"
</pre>
 
Заметим, что User-Name - это не логин пользователя, а мак-адрес. Например в accel-ppp можно получить так:
 
<pre>
function username(pkt)                                                                             
        local interface = string.gsub(pkt:ifname(),'(eth%d+)%.(%d+)%.(%d+)$','%2-%3')             
        local mac = string.gsub(pkt:hdr("chaddr"),':','')                                         
        local username=mac..':'..string.gsub(interface,'-$','')                                   
        print(username)                                                                           
        return username                                                                           
end
</pre>
 
Здесь мы логин представили в виде мак:интерфейс.
 
В конфиге модуля dhcp меняем параметр run => 0 - этим мы отключили его запуск, поскольку он был предназначен для поддержания авторизации, а в случае Radius - он занимается этим.
 
Настраиваем NoDeny загрушку как это описано выше для работы с isc dhcpd.
 
Тестируем. Включаем клиентский компьютер и убеждаемся, что он получил гостевой ip по dhcp. Разлогиниваемся в админке, если до этого были в ней залогинены с тестируемого компьютера. Открываем в браузере любой url и попадаем на заглушку. После ввода логина и пароля должны получить сообщение, что компьютер зарегистрирован в системе. Необходимо получить новый не гостевой адрес (вкл/выкл соединение или передернуть кабель).

Поточна версія на 14:22, 29 жовтня 2020

Модуль

Для работы по dhcp в NoDeny Plus необходим модуль dhcp, который нужно приобрести дополнительно на главном сайте NoDeny. В NoDeny Next модуль входит в базовую поставку.

Варианты настройки

NoDeny+ предоставляет 3 принципиально разных варианта работы Dhcp-модуля:

  • С Radius: dhcp-сервер получает ip от NoDeny+ и выдает клиенту
  • Без Radius: dhcp-сервер выдает клиенту ip на свое усмотрение и передает данные NoDeny+
  • Автогенерация конфига: NoDeny периодически формирует dhcpd-конфиг с прописанными связками mac-ip



Если вы не можете определиться какой из вариантов использовать, рекомендуем без Radius - он проще в настройке.

С использованием Radius

Устанавливается radius-сервер, который будет посредником между dhcp-сервером и NoDeny.

  1. Абонент включает компьютер, тот делает dhcp запрос на получение ip
  2. Dhcp-сервер принимает запрос и посылает mac на Radius
  3. Radius запускает mysql-процедуры, которые по mac находят абонента и получают его ip
  4. Radius посылает ip dhcp-серверу
  5. Dhcp выдает ip абоненту


Без использования Radius

  1. Абонент включает компьютер, тот делает dhcp запрос на получение ip
  2. Dhcp выдает ip адрес из своего пула. Обратите внимание - ip не запрашивается у NoDeny
  3. Dhcp сообщает NoDeny какой ip он выдал абоненту
  4. NoDeny у себя отмечает, что данный ip привязан такому-то абоненту


Формирование конфига

NoDeny периодически формирует для dhcp конфигурационный файл, в котором по данным, взятым из биллинга, прописываются связки mac -> ip