Jump to content
Калькуляторы

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

Edited by zervu1boris

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
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 в октете

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

Share this post


Link to post
Share on other sites
В 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";
                }

        }
}

 

Share this post


Link to post
Share on other sites

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

Edited by zervu1boris

Share this post


Link to post
Share on other sites
В 23.12.2020 в 12:10, zervu1boris сказал:

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

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

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

Share this post


Link to post
Share on other sites

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

Edited by zervu1boris

Share this post


Link to post
Share on other sites

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

123.png

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this