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

Zyxel+DHCP Relay+Option82+влан управления

Суть проблемы:

Клиент не получает IP в пользовательском влане по Option82

(Просьба не посылать подальше, а помочь разобраться, было бы неплохо услышать тех кто пользуется оборудованием zyxel у себя в сетях)+(для сведения в управляемом влане айпишка отдается без проблем)

Имеется MES3528+GS4012F->DHCP сервер(ISC)

На свичах прописано два влана:

1800 - влан управления

10 - пользователький влан.

DHCP-сервер находится в влане 1800.

Насколько я понимаю, то option и information должен вставлять только MES3528, а GS4012 - только должен релеем передать этот запрос на сервер.

Упрощенно конфиги коммутаторов:

MES3528:(Клиент включается в 24 порт, uplink-порт25)

; Product Name = MES-3528
; Firmware Version = V3.90(BHR.2) | 08/25/2009
; SysConf Engine Version = 1.2
vlan 10 
  name test 
  normal 26 
  fixed 24-25 
  forbidden 1-23,27-28 
  untagged 1-24,27-28 
exit
vlan 1800 
  name MGMT 
  normal "" 
  fixed 1-23,25-28 
  forbidden 24 
  untagged 1-24,26-28 
  ip address default-management 10.7.1.33 255.255.255.0 
  ip address default-gateway 10.7.1.1 
exit
interface port-channel 24 
  pvid 10 
exit
interface port-channel 25 
  dhcp snooping trust 
  arp inspection trust 
exit
dhcp snooping 
dhcp snooping vlan 10  
dhcp snooping vlan 10 option 
dhcp snooping vlan 10 information 
dhcp dhcp-vlan 1800 
arp inspection vlan 10 
arp inspection

 

Конфиг GS4012F(11 порт - downlink,12 порт - DHCP Server):

; Product Name = GS-4012F
; Firmware Version = V3.80(TS.4) | 10/07/2008
; SysConf Engine Version = 1.1
vlan 10 
  name test 
  normal "" 
  fixed 11 
  forbidden 1-10,12 
  untagged 1-10,12 
exit
vlan 1800 
  name MGMT 
  normal "" 
  fixed 11-12 
  forbidden 1-10 
  untagged 1-10,12 
  ip address 10.7.1.35 255.255.255.0 
  ip address default-gateway 10.7.1.1 
exit
interface port-channel 12 
  pvid 1800 
exit
interface route-domain 10.7.1.35/24 
exit
ip address 192.168.0.1 255.255.255.0 
dhcp smart-relay 
dhcp smart-relay helper-address 10.7.1.107

 

Конфиг dhcp-сервера:

ddns-update-style none;
default-lease-time 86400;
max-lease-time 86460;
authoritative;
log-facility local7;
local-address 10.7.1.107;
###Клиентский айпишник:
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.1;
option domain-name-servers 192.168.1.1;
class "test_port24" {
match if (binary-to-ascii (10, 8, "", substring( option agent.circuit-id, 1, 1))="24" and substring( option agent.circuit-id, 3, 3)="10" and substring( option agent.circuit-id, 4, 32)="test");
}
#### Адрес для 24-го порта:
pool {
range 192.168.1.10;
  allow members of "test_port24";
  }
}
###Выдача ай-пи адресов в управляемом влане:
subnet 10.7.1.0 netmask 255.255.255.0 {
option routers 10.7.1.1;
option domain-name-servers 10.7.1.1;
class "test_port26" {
match if (binary-to-ascii (10, 8, "", substring( option agent.circuit-id, 1, 1))="26" and substring( option agent.circuit-id, 4, 32)="test");
}
#### Адрес для 26го порта:
pool {
range 10.7.1.100;
  allow members of "test_port26";
  }
}

 

При попытке клиента получить ip в клиентском влане(10) сервер пишет:

May 19 11:12:41 test2 dhcpd: DHCPDISCOVER from 00:26:18:95:c3:da via eth0: network 10.7.1/24: no free leases
May 19 11:12:41 test2 dhcpd: DHCPDISCOVER from 00:26:18:95:c3:da via eth0: network 10.7.1/24: no free leases
May 19 11:12:41 test2 dhcpd: DHCPDISCOVER from 00:26:18:95:c3:da via 10.7.1.35: network 10.7.1/24: no free leases

Share this post


Link to post
Share on other sites

Тестировал на es2108 с последней прошивкой с сайта. Как не настраивал его не смог добиться добавления полей в пакет. Смотрел wireshark-ом

 

 

еще не увидел на 25 порте vlan-trunking

Edited by Tsvetkov

Share this post


Link to post
Share on other sites

vlan-trunking там нету, так как оба влана прописаны статически.

Edited by flash.one

Share this post


Link to post
Share on other sites

flash.one

Релеем должен работать MES3528, GS4012F должен пропускать DHCP прозрачно.

 

Share this post


Link to post
Share on other sites

У меня сеть на Zyxel XGS4728F , GS4012F, ES3124, MES3528 - в обязательном порядке юзаю опцию 82 и схему VLAN на дом (хотя в данном случае это пофиг). Все работает. Смогу описать логику работы и конфиги только в конце июня. Ща в отпуске и на сесии в другом городе, нет времени...соррии

Edited by white_crow

Share this post


Link to post
Share on other sites
flash.one

Релеем должен работать MES3528, GS4012F должен пропускать DHCP прозрачно.

Не хочет оно так работать. DHCP-сервер находится в другом влане, нежели клиент. Если релеем работает MES3528 - то до сервера вообще ничего не доходит. Но если релеем работает GS4012 - то запрос попадает на сервер, но сервер пишет, что no free leases.

Share this post


Link to post
Share on other sites

Ну так а с коммутатора у вас dhcp сервер пингуется.

Share this post


Link to post
Share on other sites
Ну так а с коммутатора у вас dhcp сервер пингуется.
Естественно. Я ж говорю, что если порт клиента включить во влан в котором стоит сервер - все отлично отрабатывается. Но если порт в клиентском влане, то почему-то не работает.
Если релеем работает MES3528 - то до сервера вообще ничего не доходит.
Здесь ошибся, запросы все таки есть, но опять же ответ: no free leases.
Edited by flash.one

Share this post


Link to post
Share on other sites
Здесь ошибся, запросы все таки есть, но опять же ответ: no free leases.
Значит неправильно настроен сервер. Попробуйте сети в shared-network объявить.

 

Share this post


Link to post
Share on other sites
Значит неправильно настроен сервер. Попробуйте сети в shared-network объявить.
я так и думал что косяк в самом сервере. После обьявления сетей в shared-network все заработало. Огромное спасибо!

Может есть ещё какие-то нюансы?

Share this post


Link to post
Share on other sites

#/etc/dhcpd.conf

local-address 10.7.1.107;

lease-file-name "/var/lib/dhcp3/dhcpd.leases";

one-lease-per-client true;

ddns-update-style none;

default-lease-time 172800;

max-lease-time 172800;

authoritative;

#authoritative;

log-facility local5;

if exists agent.circuit-id

{

log ( info, concat( "Lease for ", binary-to-ascii (10, 8, ".", leased-address), " is connected to interface ",

binary-to-ascii (10, 8, "/", suffix ( option agent.circuit-id, 2)), " (add 1 to port number!), VLAN ",

binary-to-ascii (10, 16, "", substring( option agent.circuit-id, 2, 2)), " on switch ",

binary-to-ascii(16, 8, ":", substring( option agent.remote-id, 2, 6))

,"IP" ,binary-to-ascii(10, 8, ".", packet(24, 4)) ));

 

log ( info, concat( "Lease for ", binary-to-ascii (10, 8, ".", leased-address),

" raw option-82 info is CID: ", binary-to-ascii (10, 8, ".", option agent.circuit-id), " AID: ",

binary-to-ascii(16, 8, ".", option agent.remote-id)));

}

option classes-static-route-ms code 249 = array of unsigned integer 8;

option classes-static-route code 121 = array of unsigned integer 8;

 

option domain-name-servers 192.168.1.1, 10.7.1.1;

include "/etc/dhcp3/dhcp_networks.conf";

 

#/etc/dhcp3/dhcp_networks.conf

shared-network Test {

subnet 10.7.1.0 netmask 255.255.255.0{}

 

###Клиентский айпишник:

subnet 10.20.114.0 netmask 255.255.255.0 {

option routers 10.20.114.1;

option subnet-mask 255.255.255.0;

option broadcast-address 10.20.114.255;

option classes-static-route-ms 8,10,10,20,114,1,16,192,168,10,20,114,1;

option classes-static-route 8,10,10,20,114,1,16,192,168,10,20,114,1;

include "/etc/dhcp3/10_7_1_33.conf";

}

 

 

#/etc/dhcp3/10_7_1_33.conf

#

 

class "24@10_7_1_33" {match if option agent.remote-id = 0:6:00:22:B0:50:9B:83 and option agent.circuit-id = 0:4:00:0A:0:18;}

pool {range 10.20.114.49; allow members of "24@10_7_1_33";}

pool {range 10.20.114.50; allow members of "24@10_7_1_33";}

 

Опоздал :)

Edited by Ivantey

Share this post


Link to post
Share on other sites

Привет.

Так, прочитал ветку, сделал всё, теперь буксую два часа уже.

Демон поднят на 10.0.0.1. Свич 4728 (прозрачно для dhcp) - 10.0.0.10. Клиентский 3528 - 10.0.0.102. Оба свича в vlan1 вместе с сервером. Влан 1002 поднята на обоих свичах, терминится на 4728 с айпи 10.0.0.129. В этой влан сидят dhcp-клиенты.

Сетки Servers (10.0.0.0/25) и Clients (тестовая vlan1002 - 10.0.0.128.25).

 

dhcpd.conf:

local-address 10.0.0.1;
lease-file-name "/var/db/dhcpd.leases";
one-lease-per-client true;
ddns-update-style none;
default-lease-time 172800;
max-lease-time 172800;
authoritative;
log-facility local3;
if exists agent.circuit-id
    {
        log ( info, concat( "Lease for ", binary-to-ascii (10, 8, ".", leased-address), " is connected to interface ",
                binary-to-ascii (10, 8, "/", suffix ( option agent.circuit-id, 2)), " (add 1 to port number!), VLAN ",
            binary-to-ascii (10, 16, "", substring( option agent.circuit-id, 2, 2)), " on switch ",
            binary-to-ascii(16, 8, ":", substring( option agent.remote-id, 2, 6)),
            "IP" ,binary-to-ascii(10, 8, ".", packet(24, 4)) ));

        log ( info, concat( "Lease for ", binary-to-ascii (10, 8, ".", leased-address),
            " raw option-82 info is CID: ", binary-to-ascii (10, 8, ".", option agent.circuit-id), " AID: ",
            binary-to-ascii(16, 8, ".", option agent.remote-id)));
    }

option domain-name-servers 10.0.1.1;

shared-network Servers {
    subnet 10.0.0.0 netmask 255.255.255.128 {}
    option routers 10.0.0.10;
}

shared-network Clients {
    class "vlan1002" {match if ( substring( option agent.circuit-id, 3, 3)="1002"); }
    subnet 10.0.0.128 netmask 255.255.255.128 {
        option routers 10.0.0.129;
        option subnet-mask 255.255.255.128;
        option broadcast-address 10.0.0.255;
        pool {range 10.0.0.150 10.0.0.170; allow members of "vlan1002";}
    }
}

 

А теперь лог!!!!

Dec  8 23:32:13 gw dhcpd:
Dec  8 23:32:13 gw dhcpd: Listening on LPF/eth0/00:1b:78:7b:8f:d4/Servers
Dec  8 23:32:13 gw dhcpd: Sending on   LPF/eth0/00:1b:78:7b:8f:d4/Servers
Dec  8 23:32:13 gw dhcpd: Sending on   Socket/fallback/fallback-net
Dec  8 23:32:22 gw dhcpd: DHCPDISCOVER from cc:08:e0:0a:ca:1d via 10.0.0.102: network Servers: no free leases

 

То есть демон пытается выдать на запрос из сетки Clients адрес из сетки Servers! И, естественно, фейл. Где я накосячил?

Пытался раскодить шаманские строки Ivantey на тему option classes-static-route-ms, но инфы по ним нигде не нашел. По запаху они не имеют прямого отношения к сабжу, но КАК сказать демону, в какой сети выдавать адреса?

 

Спасибо!

Share this post


Link to post
Share on other sites
shared-network Servers

Вот эта то сетка как раз НЕ shared.

 

Ну и посмотреть, приходит ли "1002" в нужной опции.

Share this post


Link to post
Share on other sites
shared-network Servers

Вот эта то сетка как раз НЕ shared.

 

Ну и посмотреть, приходит ли "1002" в нужной опции.

Когда я ставлю ее просто subnet, в логе отлуп, что не может дать адрес из 10.0.0.25. Те же яйцы.

А как посмотреть, приходит ли 1002 в нужной опции? Класс вроде отлавливается. Или я ошибаюсь?

 

Спасибо!

Edited by sillybilly

Share this post


Link to post
Share on other sites

shared-network Clients {

class "vlan1002" {match if ( binary-to-ascii (10, 16, "", substring( option agent.circuit-id, 2, 2))="1002");}

subnet 10.0.0.128 netmask 255.255.255.128 {

option routers 10.0.0.129;

option subnet-mask 255.255.255.128;

option broadcast-address 10.0.0.255;

pool {range 10.0.0.150; allow members of "vlan1002";}

pool {range 10.0.0.151; allow members of "vlan1002";}

}

}

Share this post


Link to post
Share on other sites

Ivantey, снаряды всё ближе, спасибо за binary-to-ascii. Однако пока не попадают. Мучаю далее!

 

Вот что дает dhcpdump:

---------------------------------------------------------------------------
  TIME: 2010-12-09 01:22:13.516
    IP: 10.0.0.10 (0:19:cb:93:1d:a7) > 10.0.0.1 (0:1b:78:7b:8f:d4)
    OP: 1 (BOOTPREQUEST)
HTYPE: 1 (Ethernet)
  HLEN: 6
  HOPS: 1
   XID: 00000178
  SECS: 42
FLAGS: 0
CIADDR: 0.0.0.0
YIADDR: 0.0.0.0
SIADDR: 0.0.0.0
GIADDR: 10.0.0.10
CHADDR: cc:08:e0:0a:ca:1d:00:00:00:00:00:00:00:00:00:00
SNAME: .
FNAME: .
OPTION:  53 (  1) DHCP message type         1 (DHCPDISCOVER)
OPTION:  55 (  6) Parameter Request List      1 (Subnet mask)
                                              3 (Routers)
                                              6 (DNS server)
                                             15 (Domainname)
                                            119 (Domain Search)
                                            252 (MSFT - WinSock Proxy Auto Detect)

OPTION:  57 (  2) Maximum DHCP message size 1500
OPTION:  61 (  7) Client-identifier         01:cc:08:e0:0a:ca:1d
OPTION:  51 (  4) IP address leasetime      7776000 (12w6d)
OPTION:  82 ( 14) Relay Agent Information
                  Circuit-ID    00:1a:03:ea:53:77:2e:64:32:34:6b:31
---------------------------------------------------------------------------

Share this post


Link to post
Share on other sites

Совсем сломал голову.

Запросы до демона доходят только тогда, когда на клиентском свиче (нахрена??) заводится mgmt-адрес, принадлежащий той вилане, в которую я релею dhcp. Это, идеологически, бред.

Я бы хотел релеить ТОЛЬКО на терминирующем свиче (4728 в моем случае), ибо бродкасты с клиентских свичей до него ДОХОДЯТ, иначе б в нем не работал встроенный dhcp-сервер, а больше ничего для счастья не надо.

Но, как ни пытаюсь я сконфигурить релей на 4728 (удалив релей на клиентском), ни одного запроса с него до демона не долетает.

Это - неправильно!

Пошел пинать инженеров зухеля.

 

Share this post


Link to post
Share on other sites

Пошел пинать инженеров зухеля.

уже пинал на счет es2108 - сказали, что покраска 82 опцией будет работать только, когда пользователь в влане управления

Edited by Tsvetkov

Share this post


Link to post
Share on other sites
Пошел пинать инженеров зухеля.
уже пинал на счет es2108 - сказали, что покраска 82 опцией будет работать только, когда пользователь в влане управления

Ага. Т.е. я не одинок в этой проблеме. О результатах доложу!

 

Share this post


Link to post
Share on other sites

sillybilly

 

У нас работает точно такая же схема, которую привели Вы. С той лишь разницей, что в ядре стоит Zyxel GS-4024, но это не принципиально, т.к. DHCP Relay поднят на абонентских MES-3528. При этом абонентские свитчи не имеют адреса в том VLANе, где находится DHCP-сервер.

 

Вот краткий конфиг свитчей.

 

GS-4024

VLAN 1: (192.168.1.1/24) (влан для маршрутизации трафика между L3-свитчами)

VLAN 100: (10.10.0.1/24) (разные серверы, в т.ч. DHCP, имеющий адрес 10.10.0.4)

 

MES-3528

VLAN 1: (192.168.1.21/24) (маршрутизирующий)

VLAN 2006: (10.20.6.1/24) (абонентский)

 

На MES-3528 настроен default gateway на 192.168.1.1, а также DHCP Snooping для VLAN 2006, где свитч выступает релеем для пересылки DHCP-запросов на адрес 10.10.0.4 (сначала делал глобальный DHCP-релей, тоже работает). На GS-4024 настроен маршрут на 10.20.6.0/24 через 192.168.1.21.

 

Фрагмент конфига DHCP:

class "vlan-2006" {
  match if binary-to-ascii(10,16,"",substring(option agent.circuit-id,2,2)) = "2006";
}

subnet 10.20.6.0 netmask 255.255.255.0 {
  pool {
    range 10.20.6.10 10.20.6.254;
    allow members of "vlan-2006";
    option routers 10.20.6.1;
  }
}

 

У Вас, возможно, не настроена маршрутизация между коммутаторами. MES должен видеть DHCP-сервер (проверяется пингом...)

 

И еще меня смущает следующая строчка из Вашего конфига:

class "vlan1002" {match if ( substring( option agent.circuit-id, 3, 3)="1002"); }

Во-первых, коммутатор добавляет номер VLANа в hex-коде, и чтобы сравнивать с символами ("1002"), соответственно, надо сперва преобразовать в ascii (binary-to-ascii). Во-вторых, почему берете три символа? Согласно документации Zyxel, он добавляет в option 82 следующие поля:

Slot ID (1 byte);
Port ID (1 byte);
VLAN ID (2 bytes);
Information (up to 64 bytes).

Поэтому правильней было бы Вам написать

class "vlan1002" {match if binary-to-ascii(10,16,"",substring( option agent.circuit-id,2,2))="1002"; }

 

Удачи :)

Edited by motorhunter

Share this post


Link to post
Share on other sites

sillybilly

так и есть, релей работает если в том вилане есть ip адрес.

 

без ip адреса работает dhcp snooping - тогда к пакету просто добавляется опция 82 и он летит дальше (только на MES в BHR4 и ниже пакет и/или ответ еще летит и другим абонентам в том же вилане на том же свитче). dhcp-vlan перехватывает *все* dhcp пакеты на свитче и отправляет их в указанный влан, с опцией или без.

 

Share this post


Link to post
Share on other sites
sillybilly

так и есть, релей работает если в том вилане есть ip адрес.

Не обязательно, если настраивать в разделе Global (а не отдельно для каждого VLANа), то работает и без адреса.

Share this post


Link to post
Share on other sites

motorhunter

да, действительно, забыл о dhcp smart-relay

 

но все виланы релеить не интересно :)

 

Share this post


Link to post
Share on other sites

motorhunter, я это всё перепробовал 33 раза в разных комбинациях.

В самом удачном случае через 4728 пролетает DHCPDISCOVER. Но на клиентский свич ответ не доходит. Полагаю, что 4728 сильно отличается от 4024, ему нужна какая-то дополнительная настройка, чтоб корректно проталкивать ответы в нужный вилан.

По сабстрингу - да, вначале тупо скопировал из топика, а потом подумал... :)

 

Спасибо!

Share this post


Link to post
Share on other sites

Дополню.

На самом деле вопрос состоит из двух - и я зря устраиваю мешанину.

 

Вопрос 1 - как донести до dhcpd, что мы хотим адрес в vlan1002, если DHCPREQUEST идет из бродкаст-домена vlan1, а про vlan1002 сервер ваще ни ухом ни рылом? Ответ пока один - завести IP-интерфейс в 3528 для vlan1002 и тогда сервак ПОНИМАЕТ, откуда дровишки. Если есть другой ответ - скажите же мне его!

Вопрос 2 - если решен вопрос 1 - как донести DHCPLEASE обратно до клиента? Напоминаю, про виланы dhcpd НЕ знает. Про них знает 4728 и 3528, но последний явно не маршрутизатор.

 

Вот где-то так.

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