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

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку
Немає опису редагування
Рядок 7: Рядок 7:


Если вы не можете определиться какой из вариантов использовать - рекомендуем без Radius - он проще в настройке. Более того, isc-dhcpd не работает с Radius, поэтому в  качестве  dhcp-сервера придется использовать либо accel-ppp (если у вас Linux) либо запустить виртуалку с mikrotik  и использовать его dhcpd.
Если вы не можете определиться какой из вариантов использовать - рекомендуем без Radius - он проще в настройке. Более того, isc-dhcpd не работает с Radius, поэтому в  качестве  dhcp-сервера придется использовать либо accel-ppp (если у вас Linux) либо запустить виртуалку с mikrotik  и использовать его dhcpd.
===Схема работы без Radius===
Dhcp-сервер работает автономно от NoDeny. Т.е. выдает ip адреса на свое усмотрение! Dhcp-сервер обычно запоминает какому мак-адресу выдавал какой ip, т.е одно устройства скорее всего будет получать постоянно один и тот же ip, однако, это не гарантируется и, вообще, неважно для NoDeny.
Как выглядит сам процесс:
* Абонент включает компьютер и получает ip от dhcp-сервера. При этом dhcp-сервер запускает скрипт modules/dhcp/events.pl.
* events.pl смотрит какому абоненту принадлежит мак-адрес (либо же комбинация мак+свич+порт) и привязывает ip, который выдал dhcpd, к его учетке. Абонент получает доступ в интернет.
* В случае, если мак устройства абонента неизвестен биллингу, абонент, открыв браузер и введя любой адрес, попадает на заглушку, на которой ему сообщается "для получения доступа в интернет введите логин и пароль".
* После ввода логина и пароля, NoDeny запоминает, что мак-адрес (либо же комбинация мак+свич+порт) принадлежит такому-то абоненту.
* При последующих подключениях логин и пароль запрашиваться не будут пока не будет сменено устройство либо точка подключения (в случае использования option 82).
====Комментарий по Option 82====
Без использования управляемого оборудования, dhcp не достаточно безопасно т.к. злоумышленник может подделать мак-адрес. Option 82 заставляет свичи информировать dhcp-сервер о том, с какого свича и какого порта пришел запрос. Поэтому подделка мака не приведет к успеху, поскольку мак свича и номер порта, злоумышленник не сможет подделать (если он подключен к свичу с option 82, естественно).
===Схема работы с Radius===
Dhcp-сервер работает с NoDeny через Radius аналогично pppoe.
* Клиент включает компьютер, который шлет запрос на dhcp-сервер. Тот в свою очередь шлет запрос в Radius.
* Радиус запускает NoDeny mysql-процедуру получения ip по мак адресу (комбинации мак+свич+порт). В ответ получает гостевой ip (в админке помечаются тегом guest в пуле ip)
==Вариант без Radius==
Ставим dhcp-сервер
<source lang="bash">
pkg install isc-dhcp43-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 '!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-сервер
<source lang="bash">
ee /usr/local/etc/dhcpd.conf
</source>
<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 1800;
    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 10.100.0.0 netmask 255.255.0.0 - клиентская сеть
* range 10.100.64.0 10.100.80.255 - диапазон 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) не запускается по умолчанию, то либо в настройках Ядро -> Web-заглушка устанавливаем параметр "Запускать модуль при запуске ядра NoDeny" в "да", либо (рекомендуется) запускаем отдельным процессом (и ставим автозапуск в /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==
Настройка Radius описана <b>[[Dhcp+Radius|здесь]]</b>
Теперь необходимо настроить  dhcp-сервер, чтобы он делал запросы на Radius. Isc-dhcpd пока не умеет это. Поэтому установим виртуальную машину с mikrotik os и будем использовать его dhcp. Установим virtualbox:
<source lang="bash">
pkg install virtualbox-ose
</source>
<source lang="bash">
pkg install virtualbox-ose-additions
</source>
<source lang="bash">
kldload vboxdrv
</source>
<source lang="bash">
echo 'vboxdrv_load="YES"' >> /boot/loader.conf
echo 'vboxnet_enable="YES"' >> /etc/rc.conf
/usr/local/etc/rc.d/vboxnet onestart
</source>
Создаем виртуальный интерфейс для связи с Mikrotik:
<source lang="bash">
VBoxManage hostonlyif create
VBoxManage hostonlyif ipconfig vboxnet0 --ip 192.168.255.1
</source>
Качаем виртуальную машину с Mikrotik
<source lang="bash">
cd /usr/local/nodeny
pkg install wget
wget http://nodeny.com.ua/Mikrotik-disk1.vmdk
wget http://nodeny.com.ua/Mikrotik.ovf
</source>
Импортируем
<source lang="bash">
VBoxManage import Mikrotik.ovf
</source>
Меняем мак интерфейса, поскольку он меняется в импортированной виртуальной машине.
<source lang="bash">
VBoxManage modifyvm Microtik --macaddress1=080027F3F92B
VBoxManage modifyvm Microtik --macaddress2=0800277719E8
</source>
Интерфейс, который смотрит в сеть клиентов (em1):
<source lang="bash">
VBoxManage modifyvm Microtik --bridgeadapter1 em1
</source>
Запускаем виртуалку:
<source lang="bash">
VBoxManage startvm Microtik --type headless
</source>
Через минуту логинимся:
<source lang="bash">
telnet -l admin 192.168.255.2
</source>
Логин: admin, пароль пустой
Выполняем на Mikrotik
<pre>
/ip dhcp-server network set dns-server=192.168.2.1 gateway=192.168.2.1 netmask=24 0
</pre>
Здесь 192.168.2.1 - ip шлюза, т.е сервера NoDeny
Автозапуск
<source lang="bash">
echo 'vboxheadless_enable=YES' >> /etc/rc.conf
echo 'vboxheadless_machines=Microtik' >> /etc/rc.conf
echo 'vboxheadless_user=root' >> /etc/rc.conf
</source>

Версія за 09:50, 20 вересня 2019

Варианты

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

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

Если вы не можете определиться какой из вариантов использовать - рекомендуем без Radius - он проще в настройке. Более того, isc-dhcpd не работает с Radius, поэтому в качестве dhcp-сервера придется использовать либо accel-ppp (если у вас Linux) либо запустить виртуалку с mikrotik и использовать его dhcpd.