Dhcpsnooper
Материал из Xgu.ru
Dhcpsnooper позволяет решить задачу выдачи адресов в зависимости от порта коммутатора в том случае, если коммутатор не может работать как DHCP-рестранслятор.
Решение задачи для случая, когда коммутатор работает как DHCP-ретранслятор, описано на странице «Опция 82 DHCP».
Коммутатор должен поддерживать протокол SNMP.
Содержание |
[править] Принцип работы Dhcpsnooper
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: