LINUX.ORG.RU
решено ФорумAdmin

раздача IP по номерам физических портов

 ,


3

2

Исходные данные: Linux, поднят isc-dhcp-server и выдаются данные устройству - это работает, минимально работающий DHCP-сервер по факту есть.

Есть коммутатор у которого есть DHCP Relay agent (DHCP option 82). Еще есть компьютер с Linux на котором можно поднять isc-dhcp-relay.

Вопрос: как в настройках isc-dhcp-server (файл dhcpd.conf) указать что такой то порт должен получать конкретный IP-адрес? Причем как для случая коммутатора, так и компьютера (где интерфейсы именуются eth*).

В интернете находил примеры, однако способ определения физического порта так и не был мной понят. Как вообще называется эта нотация номера порта коммутатора? А для Linux выступающего в роли DHCP Relay тоже сохраняется это именование портов?

Приветствуется простейший пример с двумя устройствами (одно воткнуто в порт [3/2] и у него адрес 192.168.2.32, а другое в порт [4/5] и должно всегда получать адрес 192.168.2.45 будучи воткнуто в этот порт).

Как вообще называется эта нотация номера порта коммутатора?

circuit id чтоли?

snaf ★★★★★
()
Ответ на: комментарий от snaf

Да, оно! Захожу я на коммутатор - как узнать что порт [3/2] это тот или иной circuit id? Или нужно экспериментально это определять - потыкать и посмотреть логи чтобы определить закономерность?

Вот что только что нашел:

# Если сервер получит запрос, содержащий опцию 82, он сгенерирует сообщение в системный журнал

if exists agent.circuit-id
{
 log ( info, concat( " Lease for ", 
                     binary-to-ascii (10, 8, ".", leased-address),
                     " Switch port: ", 
                     binary-to-ascii (10, 8, ".", option agent.circuit-id), 
                     " Switch MAC: ",
                     binary-to-ascii(16, 8, ".", option agent.remote-id)));
}

I-Love-Microsoft ★★★★★
() автор топика

Никогда не настраивал, но вот пытаясь побороть сломанный инет «внедрение IPoE провом» как раз по запросам близким к IPoE натыкался на статьи с подробным описанием как это поднять как на linux так и настройку коммутаторов разных моделей (причем с одной стороны и теория была, а с другой достаточно просто расписано а-ля step-by-step)

anc ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

у меня не первый год живет контрукция

if exists agent.remote-id and exists agent.circuit-id {
 set cl-mac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));
 set switch-mac = binary-to-ascii(16, 8, ":", substring(option agent.remote-id, 2, 6));
 set switch-port = binary-to-ascii(10, 8, "", substring(option agent.circuit-id, 5, 1));
 set switch-port-vlan = binary-to-ascii(10, 16, "", substring(option agent.circuit-id, 2, 2));
 log (info, concat("Query from client:",cl-mac," sw-mac:",switch-mac," port:",switch-port," vlan:",switch-port-vlan));
}
генерируешь для dhcpd классы соответствующие портам.
class "s-l3" { match if binary-to-ascii (16, 8, "-", suffix ( option agent.remote-id, 6)) = "84-c9-b2-74-c4-31"; }
ну и дальше pool-ы с адресами с разрешением одного класса и запретом остальных.

Возможно есть более простой способ.

vel ★★★★★
()
Ответ на: комментарий от vel

Адреса MAC в примере твоем вижу я...

ну и дальше pool-ы с адресами с разрешением одного класса и запретом остальных

На самом интересном месте :)

Хочется конкретики на примере номера порта (не MAC адреса) и каких-то IP адресов (вымышленных для примера). Я попробую сегодня разобраться самостоятельно и потом обязательно выложу сюда свое решение вопроса в теме.

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

У меня где-то использовались классы по mac-ам коммутаторов, которые стояли по одному на этаже.

а тебе нужно что-то типа

class "port3" { match if nary-to-ascii (10, 8, "-", substring(option agent.circuit-id, 5, 1) = "3"; }

vel ★★★★★
()
Ответ на: комментарий от vel

snaf Добавив

if exists agent.circuit-id
{
 log ( info, concat( " Lease for ", 
                     binary-to-ascii (10, 8, ".", leased-address),
                     " Switch port: ", 
                     binary-to-ascii (10, 8, ".", option agent.circuit-id), 
                     " Switch MAC: ",
                     binary-to-ascii(16, 8, ".", option agent.remote-id)));
}
и настроив DHCP Relay на коммутаторе я увидел что всё заработало:
Dec 23 16:30:17 user dhcpd:  Lease for 192.168.1.51 Switch port: 50.48.49 Switch MAC: 
Dec 23 16:30:17 user dhcpd: DHCPDISCOVER from 00:90:e8:1c:86:0c via 192.168.1.10
Dec 23 16:30:17 user dhcpd: ICMP Echo reply while lease 192.168.1.51 valid.
Dec 23 16:30:17 user dhcpd: Abandoning IP address 192.168.1.51: pinged before offer
Dec 23 16:30:19 user dhcpd:  Lease for 192.168.1.52 Switch port: 50.48.49 Switch MAC: 
Dec 23 16:30:19 user dhcpd: DHCPDISCOVER from 00:90:e8:1c:86:0c via 192.168.1.10
Dec 23 16:30:20 user dhcpd: ns1.example.org: temporary name server failure
Dec 23 16:30:20 user dhcpd: ns2.example.org: temporary name server failure
Dec 23 16:30:20 user dhcpd: DHCPOFFER on 192.168.1.52 to 00:90:e8:1c:86:0c via 192.168.1.10
Dec 23 16:30:22 user dhcpd:  Lease for 192.168.1.52 Switch port: 50.48.49 Switch MAC: 
Dec 23 16:30:22 user dhcpd: DHCPREQUEST for 192.168.1.52 (192.168.1.30) from 00:90:e8:1c:86:0c via 192.168.1.10
Dec 23 16:30:22 user dhcpd: DHCPACK on 192.168.1.52 to 00:90:e8:1c:86:0c via 192.168.1.10
Dec 23 16:31:15 user dhcpd:  Lease for 192.168.1.52 Switch port: 50.48.49 Switch MAC: 
Dec 23 16:31:15 user dhcpd: DHCPREQUEST for 192.168.1.52 from 00:90:e8:1c:86:0c via 192.168.1.10
Dec 23 16:31:15 user dhcpd: DHCPACK on 192.168.1.52 to 00:90:e8:1c:86:0c via 192.168.1.10
Dec 23 16:32:37 user dhcpd:  Lease for 192.168.1.52 Switch port: 51.48.50 Switch MAC: 
Dec 23 16:32:37 user dhcpd: DHCPDISCOVER from 00:90:e8:1c:86:0c via 192.168.1.10
Dec 23 16:32:37 user dhcpd: ICMP Echo reply while lease 192.168.1.52 valid.
Dec 23 16:32:37 user dhcpd: Abandoning IP address 192.168.1.52: pinged before offer
Dec 23 16:32:39 user dhcpd:  Lease for 192.168.1.53 Switch port: 51.48.50 Switch MAC: 
Dec 23 16:32:39 user dhcpd: DHCPDISCOVER from 00:90:e8:1c:86:0c via 192.168.1.10
Dec 23 16:32:40 user dhcpd: DHCPOFFER on 192.168.1.53 to 00:90:e8:1c:86:0c via 192.168.1.10
Dec 23 16:32:41 user dhcpd:  Lease for 192.168.1.53 Switch port: 51.48.50 Switch MAC: 
Dec 23 16:32:41 user dhcpd: DHCPDISCOVER from 00:90:e8:1c:86:0c via 192.168.1.10
Dec 23 16:32:41 user dhcpd: DHCPOFFER on 192.168.1.53 to 00:90:e8:1c:86:0c via 192.168.1.10
Однако

Switch port: 50.48.49

это [2/1], а 51.48.50 это порт [3/2].

Правильно ли я понимаю что [2/2] будет 50.48.50 а [2/3] это 50.48.51, а [3/7] это 51.48.55? Не верится что надо играть в угадайки, должна быть закономерность...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Правильно ли я понимаю что [2/2] будет 50.48.50 а [2/3] это 50.48.51, а [3/7] это 51.48.55? Не верится что надо играть в угадайки, должна быть закономерность...

А это надо доки читать к твоим свитчам.

У D-link например DHCP-Relay-Circuit-Id так выглядит:

cid type - 1 байт
len - 1 байт
vlan - 2 байта
module - 1 байт
port - 1 байт

Я, правда, FreeRADIUS в качестве DHCP-сервера пользую, но вряд-ли и в ISC будет встроена какая-то обработка всей этой шняги.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

но вряд-ли и в ISC будет встроена какая-то обработка всей этой шняги

я как раз с d-link-ами и isc-dhcp живу. Вроде все работает.

vel ★★★★★
()
Ответ на: комментарий от vel

я как раз с d-link-ами и isc-dhcp живу. Вроде все работает.

Ну а куда оно денется. :)

Stanson ★★★★★
()
Ответ на: комментарий от vel

Задача темы успешно решена. Всем спасибо за подсказки!

Предварительно был раскоментирован блок «range 192.168.1.60 192.168.1.99;» и таким образом была собрана статистика при помощи «if exists agent.circuit-id» - так была определена закономерность значений circuit-id в зависимости от номера порта. При этом на самом коммутаторе нужно явно включать функцию relay и option_82 для каждого порта.

cat /etc/dhcp/dhcpd.conf

default-lease-time 5;
max-lease-time 10;

if exists agent.circuit-id
{
        log ( info, concat( "Lease for ",
        binary-to-ascii (10, 8, ".", leased-address),
        " Switch port: ",
        binary-to-ascii (10, 8, ".", option agent.circuit-id),
        " Switch MAC: ",
        binary-to-ascii(16, 8, ".", option agent.remote-id)));
}

subnet 192.168.1.0 netmask 255.255.255.0 {
        #range 192.168.1.60 192.168.1.99;

class "port21" {
        match if binary-to-ascii (10, 8, ".", option agent.circuit-id) = "50.48.49";
}
pool {
        range 192.168.1.21;
        allow members of "port21";
}

class "port32" {
        match if binary-to-ascii (10, 8, ".", option agent.circuit-id) = "51.48.50";
}
pool {
        range 192.168.1.32;
        allow members of "port32";
}

class "port55" {
        match if binary-to-ascii (10, 8, ".", option agent.circuit-id) = "53.48.53";
}
pool {
        range 192.168.1.55;
        allow members of "port55";
}

}

I-Love-Microsoft ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.