Dhcpsnooper

Материал из Xgu.ru

Перейти к: навигация, поиск
stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Если вы считаете, что её стоило бы доработать как можно быстрее, пожалуйста, скажите об этом.


Dhcpsnooper позволяет решить задачу выдачи адресов в зависимости от порта коммутатора в том случае, если коммутатор не может работать как DHCP-рестранслятор.

Решение задачи для случая, когда коммутатор работает как DHCP-ретранслятор, описано на странице «Опция 82 DHCP».

Коммутатор должен поддерживать протокол SNMP.


Содержание

[править] Принцип работы Dhcpsnooper

Dhcp opt82.jpeg


Dhcpsnooper выполняет функции DHCP-ретранслятора в сети. Он перехватывает пакеты от клиента и перенаправляет их dhcp-серверу.

Кроме того, Dhcpsnooper перехватив пакет от клиента, начинает выяснять откуда пришел пакет. Он опрашивает коммутаторы в сети и собирает информацию о том откуда пришел пакет средствами протокола snmp. После этого он генерирует option 82 и вставляет ее в dhcp пакет. Dhcp-сервер (ISC DHCP) умеет распознавать эту опцию и предоставляет возможность назначения адресов согласно информации передаваемой в опции 82.

Используя информацию, которая передается в опции 82, можно поставить в соответствие портам коммутатора IP адреса.


Dhcpsnooper генерирует часть конфигурационного файла для сервера ISC DHCPD.

Dhcpsnooper может некорректно генерировать конфигурационный файл для некоторых коммутаторов.

[править] Настройка snmp (Debian, Ubuntu)

Для работы dhcpsnooper необходимо установить пакет snmp.

sudo apt-get install snmp

После этого, необходимо выполнить:

/usr/bin/snmpconf

и ответить на необходимые вопросы, это упрощает настройку snmp.

Для простоты настраиваем snmp v1, так как, например, v3 требует указания множества дополнительных параметров.

Результат выполнения файла snmpconf:

The following files were created:

  snmp.conf  

These files should be moved to /usr/share/snmp if you
want them used by everyone on the system.  In the future, if you add 
the -i option to the command line I'll copy them there automatically for you.

Or, if you want them for your personal use only, copy them to
/home/nata/.snmp .  In the future, if you add the -p option to the
command line I'll copy them there automatically for you.


Пример запроса информации о коммутаторе по snmp. Предварительно надо настроить на коммутаторе snmp.

[nata@naomi:~]$ snmpget -c public -v 1 192.168.1.1  system.sysDescr.0

Sending 43 bytes to UDP: [192.168.1.1]:161
0000: 30 29 02 01  00 04 06 70  75 62 6C 69  63 A0 1C 02    0).....public...
0016: 04 1B 17 FD  E3 02 01 00  02 01 00 30  0E 30 0C 06    ...........0.0..
0032: 08 2B 06 01  02 01 01 01  00 05 00                    .+.........

Received 139 bytes from UDP: [192.168.1.1]:161
0000: 30 81 88 02  01 00 04 06  70 75 62 6C  69 63 A2 7B    0.......public.{
0016: 02 04 1B 17  FD E3 02 01  00 02 01 00  30 6D 30 6B    ............0m0k
0032: 06 08 2B 06  01 02 01 01  01 00 04 5F  50 72 6F 43    ..+........_ProC
0048: 75 72 76 65  20 4A 34 39  30 36 41 20  53 77 69 74    urve J4906A Swit
0064: 63 68 20 33  34 30 30 63  6C 2D 34 38  47 2C 20 72    ch 3400cl-48G, r
0080: 65 76 69 73  69 6F 6E 20  4D 2E 31 30  2E 30 36 2C    evision M.10.06,
0096: 20 52 4F 4D  20 49 2E 30  38 2E 31 31  20 28 2F 73     ROM I.08.11 (/s
0112: 77 2F 63 6F  64 65 2F 62  75 69 6C 64  2F 6D 61 6B    w/code/build/mak
0128: 66 28 74 73  5F 30 38 5F  35 29 29                    f(ts_08_5))

SNMPv2-MIB::sysDescr.0 = STRING: ProCurve J4906A Switch 3400cl-48G, 
revision M.10.06, ROM I.08.11 (/sw/code/build/makf(ts_08_5))

[править] Опции команды Dhcpsnooper

Посмотреть доступные опции:

[nata@naomi:dhcpsnooper-1.0]$ ./dhcpsnooper -h
./dhcpsnooper: invalid option -- h
Allowed Parameters:
        -q <IP OF SWITCH>   # Displays general and interface information about switch
        -t                  # Displays the topology structure specified in the configs
        -p                  # Displays the complete tree structure specified in the configs
        -d                  # Debug mode, lots of output
        -l                  # Show time usage for snmp queries

Опция -t. Выводит структуру топологии, указанной в конфигурационных файлах:

[nata@naomi:dhcpsnooper-1.0]$ ./dhcpsnooper -t
Printing topology
Please wait, polling switches and building internal representation
 SWITCH(192.168.1.1, procurve, 0:15:60:79:28:0, snmpconfig: -v1 -c public)  <<<< TOP
       |--- PORT (3, 3)
              |--- HOST(192.168.1.13), 

       |--- PORT (4, 4)
              |--- HOST(192.168.1.14), 

       |--- PORT (5, 5)
              |--- HOST(192.168.1.15), 

       |--- PORT (10, 10)
              |---10 DHCPD(192.168.1.10) <<<<<<

Опция -p. Выводит полностью структуру дерева, указанного в конфигурационных файлах:

[nata@naomi:dhcpsnooper-1.0]$ ./dhcpsnooper -p
Printing complete tree structure
Please wait, polling switches and building internal representation
 SWITCH(192.168.1.1, procurve, 0:15:60:79:28:0, snmpconfig: -v1 -c public)  <<<< TOP
       |--- PORT (1, 1)

       |--- PORT (2, 2)

       |--- PORT (3, 3)
              |--- HOST(192.168.1.13), 

       |--- PORT (4, 4)
              |--- HOST(192.168.1.14), 

       |--- PORT (5, 5)
              |--- HOST(192.168.1.15), 

       |--- PORT (6, 6)

       |--- PORT (7, 7)

       |--- PORT (8, 8)

       |--- PORT (9, 9)

       |--- PORT (10, 10)
              |---10 DHCPD(192.168.1.10) <<<<<<

       |--- PORT (11, 11)

       |--- PORT (12, 12)
       ..................
       |--- PORT (47, 47)

       |--- PORT (48, 48)

       |--- PORT (DEFAULT_VLAN, 102)

       |--- PORT (VLAN2, 103)

       |--- PORT (lo0, 4197)

[править] Конфигурационные файлы Dhcpsnooper

Для работы dhcpsnooper необходимо настроить 3 конфигурационных файла:

  • base.conf
  • topology.conf
  • ipscheme.conf

[править] Файл base.conf

Пример конфигурационного файла:

dhcpserverip=192.168.3.3
dhcprelayip=192.168.3.10
listeninterface=eth1
snmpgetpath=/usr/bin/snmpget
snmpwalkpath=/usr/bin/snmpwalk
dhcpconfigpath=./include4dhcpd.conf

[править] Файл topology.conf

{
        # IP адрес по которому доступно управление коммутатором по snmp
        192.168.1.1,

        # alias коммутатора
        "procurve",

        # MAC адрес коммутатора
        00:15:60:79:28:00,

        # Параметры SNMP - версия 1, имя community public
        "-v1 -c public",

}

[править] Файл ipscheme.conf

procurve,       10,             192.168.3.10
procurve,       3,              192.168.1.13
procurve,       3,              192.168.1.23
procurve,       4,              192.168.1.14
procurve,       5,              192.168.1.15


[править] Работа Dhcpsnooper

Для того чтобы dhcp сервер использовал информацию Dhcpsnooper'а необходимо добавить в конфигурационный файл:

subnet 192.168.1.0 netmask 255.255.255.0 {

      include "/home/nata/Option_82/include4dhcpd.conf";

}

Это полный путь к файлу, который генерирует dhcpsnooper (его необходимо скопировать руками в необходимое место).

Пример конфигурационного файла, который Dhcpsnooper генерирует для DHCP сервера:

#---------------------------------------------------------------------------------
#
# Switch: procurve
# Port: 3
# Assigned IP addresses: 192.168.1.13  192.168.1.23  
#

class "procurve-3-3"
{
 match if (

      # Matches the edge-switch
      binary-to-ascii (16,  8, ":",  substring ( option agent.remote-id,  2, 6)  ) = "0:15:60:79:28:0"
   and

      # Matches the Port connection (Interface index) of the edge-switch
      binary-to-ascii (10, 32, "",   suffix    ( option agent.circuit-id, 4)     ) = "3"
           );
}

pool {
  range 192.168.1.13;
  range 192.168.1.23;

  allow members of "procurve-3-3";
}


#---------------------------------------------------------------------------------
#
# Switch: procurve
# Port: 4
# Assigned IP addresses: 192.168.1.14  
#

class "procurve-4-4"
{
 match if (

      # Matches the edge-switch
      binary-to-ascii (16,  8, ":",  substring ( option agent.remote-id,  2, 6)  ) = "0:15:60:79:28:0"
            and

      # Matches the Port connection (Interface index) of the edge-switch
      binary-to-ascii (10, 32, "",   suffix    ( option agent.circuit-id, 4)     ) = "4"
           );
}

pool {
  range 192.168.1.14;

  allow members of "procurve-4-4";
}


#---------------------------------------------------------------------------------
#
# Switch: procurve
# Port: 5
# Assigned IP addresses: 192.168.1.15  
#

class "procurve-5-5"
{
 match if (

      # Matches the edge-switch
      binary-to-ascii (16,  8, ":",  substring ( option agent.remote-id,  2, 6)  ) = "0:15:60:79:28:0"
            and

      # Matches the Port connection (Interface index) of the edge-switch
      binary-to-ascii (10, 32, "",   suffix    ( option agent.circuit-id, 4)     ) = "5"
           );
}

pool {
  range 192.168.1.15;

  allow members of "procurve-5-5";
}

Если порту коммутатора поставлен в соответствие IP адрес, то вывод будет следующим (в режиме отладки):

[nata@naomi:dhcpsnooper-1.0]$ sudo ./dhcpsnooper -d
Debugging mode enabled
Loaded config IP for dhcp server: 192.168.3.3
Loaded config IP for dhcp relay: 192.168.3.10
Loaded listen interface for relayer: eth1
Loaded config snmpgetpath: /usr/bin/snmpget
Loaded config snmpwalkpath: /usr/bin/snmpget
Loaded dhcpd config path: ./include4dhcpd.conf
Please wait, polling switches and building internal representation
Spawning switch with IP 192.168.1.1
Setting alias for switch to (procurve)
MAC, got String: 00:15:60:79:28:00 converted it into bin and OID .0.21.96.121.40.0
MAC Address specification found in topology, no ARP check
Setting snmpconfig for switch to (-v1 -c public)
Appending Port (1,1) on Switch (192.168.1.1, procurve)
Appending Port (2,2) on Switch (192.168.1.1, procurve)
Appending Port (3,3) on Switch (192.168.1.1, procurve)
Appending Port (4,4) on Switch (192.168.1.1, procurve)
......................................................
Appending Port (48,48) on Switch (192.168.1.1, procurve)
Appending Port (DEFAULT_VLAN,102) on Switch (192.168.1.1, procurve)
Appending Port (VLAN2,103) on Switch (192.168.1.1, procurve)
Appending Port (lo0,4197) on Switch (192.168.1.1, procurve)
Appending Dhcpd for switch (192.168.1.1) in Port (10)
Appending Host for switch (192.168.1.1) in Port (3)
Appending Host for switch (192.168.1.1) in Port (3)
Appending Host for switch (192.168.1.1) in Port (4)
Appending Host for switch (192.168.1.1) in Port (5)
Generating ISC DHCPd output
Generating output for hosts on switch (procurve)
Locating DHCPRelay in tree structure
Trying to locate Dhcp Relay with IP 192.168.3.10 in tree
I am Dhcpserver with IP: 192.168.3.10 and depth in tree: 1
I have following parents (first parents listed first): Switch(procurve)
Initializing resolver engine
Resetting internal timer
Initializing relayer subengine
Relaying engine sending requests to server 192.168.3.3
Relaying engine listening on interface eth1
Handling boot request
MAC, got String: 0:7:e9:3c:29:f9 converted it into bin and OID .0.7.233.60.41.249
Would snoop on Packet
Found OPTION 53 in dhcp packet
Found OPTION 251 in dhcp packet
Found OPTION 61 in dhcp packet
Found OPTION 50 in dhcp packet
Found OPTION 12 in dhcp packet
Found OPTION 60 in dhcp packet
Found OPTION 55 in dhcp packet
Inserting Option82 at position 48
Resolving information for this packet, begining at DHCP Master Switch
Resetting internal timer
0:7:e9:3c:29:f9> Resetting timer for this lookup
Should resolve 0:7:e9:3c:29:f9 in snmp Mode
SNMP: Querying switch (192.168.1.1) for MAC (0:7:e9:3c:29:f9) with resulting IFindex (5)
0:7:e9:3c:29:f9> Quering switch (procurve) took 0.213 seconds
0:7:e9:3c:29:f9> Total query time, including all asked switches was about 0.213 seconds
For host with MAC 0:7:e9:3c:29:f9, found out mother Switch MAC: 0:15:60:79:28:0 and Interface Index 5, 
would give IP 192.168.1.15
Growing size of packet from 300 to 322
Forwarding Bootrequest

Если порту коммутатора не поставлен в соответствие IP адрес, то вывод будет следующим (в режиме отладки):

[nata@naomi:dhcpsnooper-1.0]$ sudo ./dhcpsnooper -d
Debugging mode enabled
Loaded config IP for dhcp server: 192.168.3.3
Loaded config IP for dhcp relay: 192.168.3.10
Loaded listen interface for relayer: eth1
Loaded config snmpgetpath: /usr/bin/snmpget
Loaded config snmpwalkpath: /usr/bin/snmpget
Loaded dhcpd config path: ./include4dhcpd.conf
Please wait, polling switches and building internal representation
Spawning switch with IP 192.168.1.1
Setting alias for switch to (procurve)
MAC, got String: 00:15:60:79:28:00 converted it into bin and OID .0.21.96.121.40.0
MAC Address specification found in topology, no ARP check
Setting snmpconfig for switch to (-v1 -c public)
Appending Port (1,1) on Switch (192.168.1.1, procurve)
Appending Port (2,2) on Switch (192.168.1.1, procurve)
Appending Port (3,3) on Switch (192.168.1.1, procurve)
......................................................
Appending Port (47,47) on Switch (192.168.1.1, procurve)
Appending Port (48,48) on Switch (192.168.1.1, procurve)
Appending Port (DEFAULT_VLAN,102) on Switch (192.168.1.1, procurve)
Appending Port (VLAN2,103) on Switch (192.168.1.1, procurve)
Appending Port (lo0,4197) on Switch (192.168.1.1, procurve)
Appending Dhcpd for switch (192.168.1.1) in Port (10)
Appending Host for switch (192.168.1.1) in Port (3)
Appending Host for switch (192.168.1.1) in Port (3)
Appending Host for switch (192.168.1.1) in Port (4)
Appending Host for switch (192.168.1.1) in Port (5)
Generating ISC DHCPd output
Generating output for hosts on switch (procurve)
Locating DHCPRelay in tree structure
Trying to locate Dhcp Relay with IP 192.168.3.10 in tree
I am Dhcpserver with IP: 192.168.3.10 and depth in tree: 1
I have following parents (first parents listed first): Switch(procurve)
Initializing resolver engine
Resetting internal timer
Initializing relayer subengine
Relaying engine sending requests to server 192.168.3.3
Relaying engine listening on interface eth1
Handling boot request
MAC, got String: 0:7:e9:3c:29:f9 converted it into bin and OID .0.7.233.60.41.249
Would snoop on Packet
Found OPTION 53 in dhcp packet
Found OPTION 251 in dhcp packet
Found OPTION 61 in dhcp packet
Found OPTION 50 in dhcp packet
Found OPTION 12 in dhcp packet
Found OPTION 60 in dhcp packet
Found OPTION 55 in dhcp packet
Inserting Option82 at position 48
Resolving information for this packet, begining at DHCP Master Switch
Resetting internal timer
0:7:e9:3c:29:f9> Resetting timer for this lookup
Should resolve 0:7:e9:3c:29:f9 in snmp Mode
SNMP: Querying switch (192.168.1.1) for MAC (0:7:e9:3c:29:f9) with resulting IFindex (15)
0:7:e9:3c:29:f9> Quering switch (procurve) took 0.22 seconds
Nothing configured for IFIndex (15,15) on switch (procurve)
Could no resolve Host for MAC 0:7:e9:3c:29:f9
Packet size left unchanged
Forwarding Bootrequest

[править] Возможные ошибки

При выполнении make возможна ошибка:

$ make

-------- Compiling linkedlist.cpp
g++ -DVERBOSE -DFFLINETREE -O2 -fomit-frame-pointer -L/usr/lib -I /usr/local/lib  -c linkedlist.cpp
make: g++: Command not found
make: *** [linkedlist.o] Error 127

Для исправления необходимо обновит пакет g++.

Если возникает следующая ошибка:

$ make

-------- Compiling snoop82.cpp
g++ -DVERBOSE -DFFLINETREE -O2 -fomit-frame-pointer -L/usr/lib -I /usr/local/lib  -c snoop82.cpp
In file included from networkswitch.h:11,
                 from nettree.h:6,
                 from snoop82.cpp:2:
dhcpd.h:34: error: extra qualification ‘dhcpd::’ on member ‘dhcpd’
make: *** [snoop82.o] Error 1

Необходимо в файле dhcpd.h в классе "dhcpd" исправить "dhcp::dhcpd(networkcomponent * pParent)" на "dhcpd(networkcomponent * pParent)"

class dhcpd : public host
{
public:
#было:  dhcp::dhcpd(networkcomponent * pParent);
        dhcpd(networkcomponent * pParent);
        virtual ~dhcpd();

        void dump(bool  pDeadsToo = false);
};

Подробнее об этой ошибке можно почитать по ссылке error: extra qualification

[править] Дополнительная информация

Dhcpsnooper:

Источник — «http://xgu.ru/wiki/Dhcpsnooper»