Перейти к содержимому
Калькуляторы

DHCP Relay

Всем привет!

Имеется:
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 сервере отключен.
В чём я ошибся?

dhcp relay.png

option 82.png

Изменено пользователем zervu1boris

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В отдельный шаред нетворк добавьте сабнет интерфейса дхцп сервера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Попробуйте заменить

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 в октете

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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 в октете

Пока убрал проверку мака, сделал только по номеру порта

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В 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";
                }

        }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Теперь есть другой вопрос.
У нас половина сети построена на управляемых свитчах, а половина на неуправляемых.
В неуправляемом сегменте реализована авторизация клиентов с помощью 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-адрес будет выдан из любого влана
 

схема0.png

Изменено пользователем zervu1boris

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В 23.12.2020 в 12:10, zervu1boris сказал:

как настроить dhcp сервер так, чтобы можно было выдавать IP по порту и выдавать IP в соответствии с МАКом, и чтоб всё это работало через relay.

deny unknown clients для dhcp-сервера обслуживающего неуправляемые свитчи обязательно!
а для подсетки с opt82 allow unknown-clients точно также необходимо.

Можете попробовать совместить, но мне когда-то проще было 2 отдельных dhcp-сервера держать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем спасибо!
Удалось реализовать. Пока не знаю на сколько это правильно, нагрузка на 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

Изменено пользователем zervu1boris

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если ВСЕ клиенты за релеями, я бы глянул в сторону https://forum.nag.ru/index.php?/topic/64849-dhcp-server-with-sql-support-on-perl/
Работает уже лет 7, аптайм сервиса == аптайму железного сервака. Нагрузка околонулевая.

123.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.