Morty Опубликовано 20 декабря, 2020 (изменено) Всем привет! Имеется: 1)Linux Router (10.0.0.1/24; 10.0.1.1/24; 10.0.2.1/24) 2)Linux ISC DHCP server 4.4.2 собранный из исходников с использованием USE_SOCKETS (10.0.0.2/24) 3)Dlink DGS-3000-28XS (10.0.1.2/24) 4)Клиентские устройства (10.0.2.2/24 - 10.0.2.250/24) На DGS-3000-28XS необходимо настроить Relay + option 82, чтобы была связка IP + порт: 1 порт - 10.0.2.2/24 2 порт - 10.0.2.3/24 ... 24 порт - 10.0.2.25/24 Настраиваю dhcp_relay на Dlink: config dhcp_relay add ipif System 10.0.0.2 config dhcp_relay option_82 state enable enable dhcp_relay Конфиг ISC DHCP: local-address 10.0.0.2; authoritative; ddns-update-style none; log-facility local7; default-lease-time 43200; max-lease-time 43200; class "SW0Port1" { match if binary-to-ascii(16, 8, ":", substring(option agent.remote-id, 2, 6)) = "00:19:5b:fd:b0:6e" and binary-to-ascii(10, 8, "", substring(option agent.circuit-id, 5, 1)) = "1"; } shared-network net0 { subnet 10.0.2.0 netmask 255.255.255.0 { option routers 10.0.2.1; pool { range 10.0.2.2; allow members of "SW0Port1"; } } Подключаю клиента к 1 порту коммутатора. Клиент не получает IP-адрес. В логах DHCP сервера тишина. Сделал tcpdump на DHCP сервере, пакет с option 82 в котором содержится Agent Circuit ID и Agent Remote ID прилетает. Но dhcp сервер никак не реагирует. iptables на DHCP сервере отключен. В чём я ошибся? Изменено 20 декабря, 2020 пользователем zervu1boris Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zhenya` Опубликовано 20 декабря, 2020 В отдельный шаред нетворк добавьте сабнет интерфейса дхцп сервера. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
_J_ Опубликовано 20 декабря, 2020 Попробуйте заменить match if binary-to-ascii(16, 8, ":", substring(option agent.remote-id, 2, 6)) = "00:19:5b:fd:b0:6e" на match if binary-to-ascii(16, 8, ":", substring(option agent.remote-id, 2, 6)) = "0:19:5b:fd:b0:6e" Убираем лидирующий 0 в октете Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Morty Опубликовано 21 декабря, 2020 20 часов назад, zhenya` сказал: В отдельный шаред нетворк добавьте сабнет интерфейса дхцп сервера. Сделал сначала так: shared-network net1 { subnet 10.0.1.0 netmask 255.255.255.0 { } } Получил: DHCPDISCOVER from e8:03:9a:18:82:4b via 10.0.0.2: network net1: no free leases Потом сделал так: shared-network net1 { subnet 10.0.1.0 netmask 255.255.255.0 { range 10.0.1.2 10.0.1.10; option routers 10.0.1.1; } } Клиент получил IP-адрес 10.0.1.3. А должен был получить 10.0.2.2 15 часов назад, _J_ сказал: Попробуйте заменить match if binary-to-ascii(16, 8, ":", substring(option agent.remote-id, 2, 6)) = "00:19:5b:fd:b0:6e" на match if binary-to-ascii(16, 8, ":", substring(option agent.remote-id, 2, 6)) = "0:19:5b:fd:b0:6e" Убираем лидирующий 0 в октете Пока убрал проверку мака, сделал только по номеру порта Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zhenya` Опубликовано 21 декабря, 2020 Сабнет пустой сделайте и в один шареднетворк. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Morty Опубликовано 23 декабря, 2020 В 21.12.2020 в 17:36, zhenya` сказал: Сабнет пустой сделайте и в один шареднетворк. Спасибо, заработало! local-address 10.0.1.2; class "SW0Port1" { match if binary-to-ascii(10, 8, "", suffix( option agent.circuit-id, 1)) = "1"; } shared-network net { subnet 10.0.1.0 netmask 255.255.255.0 { } subnet 10.0.2.0 netmask 255.255.255.0 { option routers 10.0.2.1; pool { range 10.0.2.2; allow members of "SW0Port1"; } } } Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Morty Опубликовано 23 декабря, 2020 (изменено) Теперь есть другой вопрос. У нас половина сети построена на управляемых свитчах, а половина на неуправляемых. В неуправляемом сегменте реализована авторизация клиентов с помощью IP + MAC. Вопрос стоит в том, как настроить dhcp сервер так, чтобы можно было выдавать IP по порту и выдавать IP в соответствии с МАКом, и чтоб всё это работало через relay. У меня в голове крутится только такой вариант: local-address 10.0.1.2; class "SW0Port1" { match if binary-to-ascii(10, 8, "", suffix( option agent.circuit-id, 1)) = "1"; } shared-network net { subnet 10.0.1.0 netmask 255.255.255.0 { } subnet 10.0.2.0 netmask 255.255.255.0 { option routers 10.0.2.1; pool { range 10.0.2.2; allow members of "SW0Port1"; } host id1 { hardware ethernet e8:03:9a:18:82:4b; fixed-address 10.0.2.121; option routers 10.0.2.1;} } } Но при таком варианте IP-адрес будет выдан из любого влана Изменено 23 декабря, 2020 пользователем zervu1boris Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
passer Опубликовано 24 декабря, 2020 В 23.12.2020 в 12:10, zervu1boris сказал: как настроить dhcp сервер так, чтобы можно было выдавать IP по порту и выдавать IP в соответствии с МАКом, и чтоб всё это работало через relay. deny unknown clients для dhcp-сервера обслуживающего неуправляемые свитчи обязательно! а для подсетки с opt82 allow unknown-clients точно также необходимо. Можете попробовать совместить, но мне когда-то проще было 2 отдельных dhcp-сервера держать. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Morty Опубликовано 24 декабря, 2020 (изменено) Всем спасибо! Удалось реализовать. Пока не знаю на сколько это правильно, нагрузка на CPU покажет. Может кому-то пригодится: local-address 10.0.1.2; class "SW0Port1" { match if binary-to-ascii(10, 8, "", suffix( option agent.circuit-id, 1)) = "1"; } class "abonent0" { match if binary-to-ascii(10, 16, "", suffix(substring(option agent.circuit-id, 0,4), 2)) = "100" and binary-to-ascii(16, 8, ":", substring(hardware, 1, 7)) = "e8:3:9a:18:82:4b"; } shared-network net { subnet 10.0.1.0 netmask 255.255.255.0 { } subnet 10.0.2.0 netmask 255.255.255.0 { option routers 10.0.2.1; pool { range 10.0.2.2; allow members of "SW0Port1"; } pool { range 10.0.2.100; allow members of "abonent0"; } } } В классе abonent0 сначала проверяется с какого vlan пришёл запрос. В моём случае 100. Потом проверяется MAC абонента, в моём случае e8:3:9a:18:82:4b. Абоненту выдаётся IP-адрес: 10.0.2.100 В классе SW0Port1 проверяется с какого порта пришёл запрос. Тут ещё необходимо сделать проверку по MACу свитча, если свитчей больше 1. И ещё пока не разобрался с deny/allow unknown-clients Изменено 24 декабря, 2020 пользователем zervu1boris Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
pppoetest Опубликовано 24 декабря, 2020 Если ВСЕ клиенты за релеями, я бы глянул в сторону https://forum.nag.ru/index.php?/topic/64849-dhcp-server-with-sql-support-on-perl/ Работает уже лет 7, аптайм сервиса == аптайму железного сервака. Нагрузка околонулевая. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...