DHCP-Server + DHCP-Relay - что как настраивать? [Решено]

Доброго времени суток.
Есть вопрос - как нужно настроить DHCP-Server и DHCP-Relay чтобы они работали в связке?
На даный момент у меня ситуация следующая: клиент посылает запрос в сеть, Relay его принимает, и пересылает на Server, тот его обрабатывает, отсылает (куда? - хз), но Relay ничего от него не получает - клиент остается без ip-шника.

Конфиги обоих:

Server:

#cat /etc/dhcp/dhcpd.conf
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;
log-facility local7;
subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.100 192.168.1.200;
}
local-address 192.168.1.1;
subnet 192.168.2.0 netmask 255.255.255.0 {
  range 192.168.2.100 192.168.2.200;
}
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)));
}
#ifconfig
eth1      Link encap:Ethernet  HWaddr 00:0c:29:98:00:3a
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe98:3a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:777 errors:0 dropped:0 overruns:0 frame:0
          TX packets:579 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:181525 (177.2 KiB)  TX bytes:79026 (77.1 KiB)
          Interrupt:19 Base address:0x2080
#cat /etc/conf.d/dhcpd
 DHCPD_IFACE="eth1"

Relay:

#cat /etc/conf.d/dhcrelay
IFACE="eth3"
DHCRELAY_SERVERS="192.168.1.1"

#ifconfig

gentoo ~ # ifconfig
eth1      Link encap:Ethernet  HWaddr 00:0c:29:9d:c8:39
          inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe9d:c839/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:582 errors:0 dropped:0 overruns:0 frame:0
          TX packets:824 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:86120 (84.1 KiB)  TX bytes:182815 (178.5 KiB)
          Interrupt:19 Base address:0x2080
eth3      Link encap:Ethernet  HWaddr 00:0c:29:9d:c8:43
          inet addr:192.168.2.1  Bcast:192.168.2.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe9d:c843/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:595 errors:0 dropped:0 overruns:0 frame:0
          TX packets:56 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:175290 (171.1 KiB)  TX bytes:11700 (11.4 KiB)
          Interrupt:16 Base address:0x2400

О топологии:
Server находится в сети 192.168.1.0/24 и имеет ip - 192.168.1.1
Relay находится в сетях 192.168.1.0/24 и 192.168.2.0/24, имеет адреса 192.168.1.100 и 192.168.2.1 соответственно.

Вот выдержки из логов обоих при попытке клиентом получить адрес:
Relay:

#/usr/sbin/dhcrelay -i eth3 -d 192.168.1.1
Internet Systems Consortium DHCP Relay Agent V3.1.2p1-Gentoo
Copyright 2004-2009 Internet Systems Consortium.
All rights reserved.
For info, please visit http://www.isc.org/sw/dhcp/
Listening on LPF/eth3/00:0c:29:9d:c8:43
Sending on   LPF/eth3/00:0c:29:9d:c8:43
Sending on   Socket/fallback
forwarded BOOTREQUEST for 00:0c:29:b0:94:06 to 192.168.1.1
forwarded BOOTREQUEST for 00:0c:29:6b:4a:95 to 192.168.1.1
forwarded BOOTREQUEST for 00:0c:29:b0:94:06 to 192.168.1.1

Server:

#tailf /var/log/messages
Aug 16 23:20:23 gentoo dhcpd: DHCPDISCOVER from 00:0c:29:6b:4a:95 (gentoo) via 192.168.2.1
Aug 16 23:20:23 gentoo dhcpd: DHCPDISCOVER from 00:0c:29:b0:94:06 (gentoo) via 192.168.2.1
Aug 16 23:20:24 gentoo dhcpd: ns1.example.org: host unknown.
Aug 16 23:20:24 gentoo dhcpd: ns2.example.org: host unknown.
Aug 16 23:20:24 gentoo dhcpd: DHCPOFFER on 192.168.2.100 to 00:0c:29:b0:94:06 (gentoo) via 192.168.2.1
Aug 16 23:20:24 gentoo dhcpd: DHCPOFFER on 192.168.2.101 to 00:0c:29:6b:4a:95 (gentoo) via 192.168.2.1
Aug 16 23:20:31 gentoo dhcpd: DHCPDISCOVER from 00:0c:29:b0:94:06 (gentoo) via 192.168.2.1
Aug 16 23:20:31 gentoo dhcpd: DHCPOFFER on 192.168.2.100 to 00:0c:29:b0:94:06 (gentoo) via 192.168.2.1
Aug 16 23:20:47 gentoo dhcpd: DHCPDISCOVER from 00:0c:29:b0:94:06 (gentoo) via 192.168.2.1
Aug 16 23:20:47 gentoo dhcpd: DHCPOFFER on 192.168.2.100 to 00:0c:29:b0:94:06 (gentoo) via 192.168.2.1

Сюдя по всему Server отправляет ответ в свою подсеть, а не на Relay, а как это исправить я уже не понимаю.

Маршрутизация из

Маршрутизация из 192.168.2.0/24 в 192.168.1.0/24 настроена/работает?
Т.е. если вручную присвоить клиенту 192.168.2.х адрес, то он видит DHCP-Server (ping etc)?

Kстати, у вас gateway'и не прописаны! :)

А можно по-подробнее?

Нужно чтобы от сети DHCP-клиентов к сети DHCP-Server (и наоборот) была связь через DHCP-Relay который должен выполнять функцию роутера?
Еще один вопрос - можно ли посредством DHCP-Server выставлять на клиенте дополнительные маршруты (к сети A через шлюз R)?

Статичесские маршруты в протоколе описаны.

Исходя из RFC 2132 - DHCP Options and BOOTP Vendor Extensions:

5.8. Static Route Option

   This option specifies a list of static routes that the client should
   install in its routing cache.  If multiple routes to the same
   destination are specified, they are listed in descending order of
   priority.

   The routes consist of a list of IP address pairs.  The first address
   is the destination address, and the second address is the router for
   the destination.

   The default route (0.0.0.0) is an illegal destination for a static
   route.  See section 3.5 for information about the router option.

   The code for this option is 33.  The minimum length of this option is
   8, and the length MUST be a multiple of 8.

    Code   Len         Destination 1           Router 1
   +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
   |  33 |  n  |  d1 |  d2 |  d3 |  d4 |  r1 |  r2 |  r3 |  r4 |
   +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
           Destination 2           Router 2
   +-----+-----+-----+-----+-----+-----+-----+-----+---
   |  d1 |  d2 |  d3 |  d4 |  r1 |  r2 |  r3 |  r4 | ...
   +-----+-----+-----+-----+-----+-----+-----+-----+---

Значит остается узнать как их можно в dhcpd.conf описать.

Статические маршруты описать

Статические маршруты описать можно. Но для UNIX и M$ систем (принимающих маршруты) это делается по-разному.
Например:

1. В глобальной секции конфига описывается следующее:

#M$ Windows
option ms-routes code 249 = string;
#Non-M$
option routes code 121 = string;

2. Либо в глобальной, либо в секциях "network" или "host" описываются маршруты:
Например, 192.168.10.0/24 -> 192.168.200.220

option ms-routes 18:c0:a8:0a:c0:a8:c8:dc;
option routes 18:c0:a8:0a:c0:a8:c8:dc;

Как перевести в этот вид (по смещениям) [все в HEX]:
0: (1 байт) - маска (/24) - 18
Маска /24 - это три значимых байта в адресе сети, далее:
1: (3 байта) - адрес сети назначения маршрута(192.168.10.0) - c0:a8:0a
4: (4 байта) - адрес шлюза (192.168.200.220) c0:a8:c8:dc

И так далее, если есть еще маршруты.

На самом деле - это еще далеко не все, куча подводных камней. Например - M$ XP не принимает маршрутов типа link (с gw=0.0.0.0), а M$ Vista/M$ Win7/Linux - принимают.
Но принцип именно такой, далее простыми экспериментами можно добиться желаемого.

Кстати - есть и другие варианты описания в конфиге dhcp, но приведенный мне почему-то понравился более всего.

Спасибо, уже немного легче.

А что ж так... У *nix одно, у MS - другое, это два стандарта выходит?
На всякий случай можно будет две опции указать (если в сети есть и *nix, и MS)?

Именно так, можно две. Я так

Именно так, можно две. Я так и делаю (и так же привел в примере), потому что мой домашний комп может быть загружен как под M$, так и под Linux. Однако, DHCP он принимает и таблицу маршрутизации тоже.

PS:
Это описано по другому RFC, 3442, в приведенном в вашем посте документе есть ссылка на него. Что касается Linux, то если передаются classless-routes, то требуется прямо указать default. Указывается он так: 00 (маска) и 4 байта шлюза. Адрес назначения пропускается, ибо его длина согласно маске 0 байт.

Что касается relay - не настраивал никогда, для каждого сегмента есть отдельный DHCP сервер - потому подсказать что-то мне сложно - не сталкивался непосредственно, только теоретически.

Немного потестил конфигурацию...

В общем, если на клиенте прописать статику - то сервера он пингует нормально, но - до перезапуска net.eth2 (что в общем ожидаемо), но на перед этапом получения адреса он и есть в состоянии down. То есть, все что ему нужно знать о сети он должен получить от DHCP-Server'a, а вот сервер я настроить не могу...
Есть кусок конфига, предназначеный для моих целей (взято с xgu.ru):

# Запросы, пришедшие с 5го порта коммутатора: 
class "port-5"
{
 match if binary-to-ascii (10, 8, "", suffix( option agent.circuit-id, 1)) = "5";
}

# Адрес для 5го порта: 
pool {
  range 192.168.1.55;
  allow members of "port-5";
}

но сервер ругается на строчку pool, ругня идет на счет того что эта строка находится не в описании сети.
И знаю что мне нужно сюда копать, т.к. Relay - работает, запрос пересылает, ответ нет, но не потому что не хочет, а потому что ему ответа никто не дает. Server ему не отвечает.
Где можно почитать про настройку DHCP-Server для обработки DHCP-Relay запросов. Я что-то нашел аз один источник, остальные касаются железок.

Вопрос снят, косяки найдены.

Во-первых, на dhcp-сервере надо было указать маршруты к сети (сетям) DHCP-клиентов, но этого не было достаточно.
Окончательно все начало работать как надо после правильной настройки DHCP-Relay, а именно:
в файле /etc/conf.d/dhcrelay, в строке IFACE="eth1 eth2 ..." должны быть указаны не только интерфейсы клиентов, а и интерфейс смотрящий в подсеть сервера. А я его тут не указал.
Помогла сообщение из похожей темы на OpenNet.ru
Связка заработала.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".