Привязка IP к портам, dhcp-relay

Декабрь 15th, 2008 | Tags: ,

Часто возникает потребность раздавать IP-адреса в зависимости от порта, на котором располагается клиент. Для этого может пригодиться функция агента dhcp-relay, которую сейчас поддерживают практически все современные управляемые свитчи. В этом примере был использован ADSL-свитч ZyXEL IES1248-71.

Свитч перехватывает широковещательный UDP-запрос на 67-й порт и перенаправляет его юникастом к заранее определенному DHCP-серверу. При этом к пакету добавляется ряд полей (option 82). На основании этого поля DHCP-сервер может получить идентификатор свитча, номер порта, VLAN и пр. информацию. В результате этого выделяется адрес из того или иного пула (или пакет игнорируется).

Вначале включим поддержку dhcp-relay и option 82 на свитче:

adsl-sw> switch dhcprelay enable
adsl-sw> switch dhcprelay server 10.2.0.81
adsl-sw> switch dhcprelay option82 enable
adsl-sw> switch dhcprelay option82 set ADSL1
adsl-sw> switch dhcprelay show
status server ip       option82 info
—— ————— ——– ——————————
V    172.16.0.81          V     ADSL1
adsl-sw>

Далее приведем конфигурацию ISC-DHCPD сервера:

server-identifier 10.3.0.1;
local-address 172.16.0.81;

if exists agent.circuit-id
{
log ( info, concat(
“SW-ID: “, suffix(option agent.circuit-id, 5),
“, Port: “, binary-to-ascii (10, 8, “”, substring( option agent.circuit-id, 1, 1)))
);
}
# Логируем все запросы с указанным agent.circuit-id
# Из документации по этому свитчу стало известно,
# что первый байт option agent.circuit-id  равен номеру порта.
# Последние несколько байт составляют строку,
# задаваемую в при конфигурации свитча.
# Строка заканчивается символом .
# В данном примере мы просто берем последние 5 байтов,
# которые должны быть равны строке “ADSL1″.

class “p1″ {
match if suffix(option agent.circuit-id, 5)=”ADSL1″
and binary-to-ascii (10, 8, “”,substring( option agent.circuit-id, 1, 1))=”1″;
}
class “p2″ {
match if suffix(option agent.circuit-id, 5)=”ADSL1″
and binary-to-ascii (10, 8, “”,substring( option agent.circuit-id, 1, 1))=”2″;
}
class “p48″ {
match if suffix(option agent.circuit-id, 5)=”ADSL1″
and binary-to-ascii (10, 8, “”,substring( option agent.circuit-id, 1, 1))=”48″;
}
# В зависимости от номера порта
# (кроме того, мы проверяем пакеты на предмет наличия
# строки-идентификатора свитча)
#  указываем к какому “классу” будет относиться пул адресов, из которого,
# будет выбран адрес на этот запрос

class “ANY” {
match if not exists agent.circuit-id;
}

# Далее описываем сети, к которым dhcpd-сервер имеет отношение.
# Сеть 10.1.0.0/24 не присоединена напрямую,
# но обслуживается через агента dhcp-relay (ADSL ZyXEL)
shared-network ADSLNET {
subnet 10.1.0.0 netmask 255.255.255.0 {
option routers 10.1.0.1;
option subnet-mask 255.255.255.0;
option interface-mtu 1500;

# Пул на 10 адресов для клиентов на 1-м порту свитча
pool {
range 10.1.0.2 10.1.0.11;
allow members of “p1″;
deny members of “ANY”;
}

# Еще пул
pool {
range 10.1.0.100 10.1.0.105;
allow members of “p2″;
deny members of “ANY”;
}

# Пул на 1 адрес
pool {
range 10.1.0.103 10.1.0.103;
allow members of “p48″;
deny members of “ANY”;
}
}
}

# Описываем все сети непосредственно присоединенные к dhcp-серверу,
# но указываем, что бы сервер не откликался на запросы из этих сетей
subnet 10.3.0.1 netmask 255.255.255.240 { not authoritative; }
}
subnet 172.16.0.81 netmask 255.255.255.128 { not authoritative; }
# ADSL свитч находится в этой сети и имеет адрес 172.16.0.102
}

После запуска, в логе можно увидеть сведущие записи:

May 22 23:57:49 dhcp-serv dhcpd: SW-ID: ADSL1, Port: 1
May 22 23:57:49 dhcp-serv dhcpd: DHCPDISCOVER from 00:13:49:39:eb:6c via 172.16.0.102
May 22 23:57:50 dhcp-serv dhcpd: DHCPOFFER on 10.1.0.8 to 00:13:49:39:eb:6c (RAS) via 172.16.0.102
May 22 23:57:53 dhcp-serv dhcpd: SW-ID: ADSL1, Port: 1
May 22 23:57:53 dhcp-serv dhcpd: DHCPREQUEST for 10.1.0.8 (10.3.0.1) from 00:13:49:39:eb:6c (RAS) via 172.16.0.102
May 22 23:57:53 dhcp-serv dhcpd: DHCPACK on 10.1.0.8 to 00:13:49:39:eb:6c (RAS) via 172.16.0.102

tcpdump показывает похожую картину.
Свитч отправляет 2 запроса и получает 2 ответа.

dhcp-serv# tcpdump -npi vlan25
23:57:49.840679 IP 172.16.0.102.67 > 172.16.0.81.67: BOOTP/DHCP, Request from 00:13:49:39:eb:6c, length: 275
23:57:50.000696 IP 172.16.0.81.67 > 172.16.0.102.67: BOOTP/DHCP, Reply, length: 320
23:57:53.874134 IP 172.16.0.102.67 > 172.16.0.81.67: BOOTP/DHCP, Request from 00:13:49:39:eb:6c, length: 291
23:57:53.876282 IP 172.16.0.81.67 > 172.16.0.102.67: BOOTP/DHCP, Reply, length: 304

  1. zugerman
    Февраль 27th, 2009 at 11:02
    Reply | Quote | #1

    Бьюсь с такой же задачей. Настроил все по вышеприведенному конфигу. Но почему-то пока меня есть в конфиге запись о сети, в которой находится свитч (в данном конфиге это 172.16.0.81), сервер упорно отвечает:

    DHCPDISCOVER from 00:90:f5:2c:da:5a via 192.168.1.13: network 192.168.1/24: no free leases

    Если же я описываю для этой сети пул адресов, то адрес выдается из этого пула и на классы сервер чихает. В чем же затык?

  2. Февраль 27th, 2009 at 11:48
    Reply | Quote | #2

    1-й случай. Нет пула, соответственно нет свободных адресов.
    2-й случай. Скорее всего для пулов не прописано какие классы могут получать адреса, а какие нет.

  3. Сентябрь 1st, 2009 at 19:21
    Reply | Quote | #3

    Я также настраивал, ничего из этого не получается, no free leases замучил :(

  4. Сентябрь 2nd, 2009 at 09:09
    Reply | Quote | #4

    no free leases обычно бывает когда dhcpd не может соотнести запрос к какому-либо пулу. Логируйте содержимое option agent.circuit-id. Скорее всего какое-то поле не проставлено.

You must be logged in to post a comment.
TOP