DHCP+Mysql сервер на Python
- среда, 27 марта 2019 г. в 00:21:04



| Позиция в пакете | Название значения | Пример | Представление | Байт | Пояснение | |
| 1 | Boot Request | 1 | Hex | 1 | Тип сообщения. 1 — запрос от клиента к серверу, 2 — ответ от сервера клиенту | |
| 2 | Hardware type | 1 | Hex | 1 | Тип аппаратного адреса, в данном протоколе 1 — MAC | |
| 3 | Hardware adrees length | 6 | Hex | 1 | Длина MAC адреса устройства | |
| 4 | Hops | 1 | Hex | 1 | Количество промежуточных маршрутов | |
| 5 | Transaction ID | 23:cf:de:1d | Hex | 4 | Уникальный идентификатор транзакции. Генерирует клиент в начале операции запроса | |
| 7 | Second elapsed | 0 | Hex | 4 | Время в секундах с начала процесса получения адреса | |
| 9 | Bootp flags | 0 | Hex | 2 | Некие флаги, которые могут устанавливаться, в качестве указания параметров протокола | |
| 11 | Client IP address | 0.0.0.0 | Строка | 4 | IP адрес клиента (если есть) | |
| 15 | Your client IP address | 0.0.0.0 | Строка | 4 | IP адрес предложенный сервером (если есть) | |
| 19 | Next server IP address | 0.0.0.0 | Строка | 4 | IP адрес сервера (если известен) | |
| 23 | Relay agent IP address | 172.16.114.41 | Строка | 4 | IP адрес агента ретрансляции (например свича) | |
| 27 | Client MAC address | 14:d6:4d:a7:c9:55 | Hex | 6 | MAC адрес отправителя пакета (клиента) | |
| 31 | Client hardware address padding | Hex | 10 | Зарезервированное место. Обычно забито нулями | ||
| 41 | Server host name | Строка | 64 | Имя сервера DHCP. Обычно не передается | ||
| 105 | Boot file name | Строка | 128 | Имя файла на сервере, используемое бездисковыми станциями при загрузке | ||
| 235 | Magic cookie | 63:82:53:63 | Hex | 4 | «Магическое» число, по которому в т.ч. можно определить, что этот пакет — принадлежит протоколу DHCP | |
| Опции DHCP. Могут идти в любом порядке | ||||||
| 236 | Номер опции | 53 | Dec | 1 | Опция 53, определяющая тип пакета DHCP 1 — DHCPDISCOVER 3 — DHCPREQUEST 2 — DHCPOFFER 5 — DHCPACK 8 — DHCPINFORM |
|
| Длина опции | 1 | Dec | 1 | |||
| Значение опции | 1 | Dec | 1 | |||
| Номер опции | 50 | Dec | 1 | Какой IP адрес хочет получить клиент | ||
| Длина опции | 4 | Dec | 1 | |||
| Значение опции | 172.16.134.61 | Строка | 4 | |||
| Номер опции | 55 | 1 | Запрашиваемые клиентом сетевые параметры. Состав может быть различным 01 — Маска сети 03 — Шлюз 06 — DNS oc — Имя хоста 0f — имя домена сети 1c — адрес широковещательного запроса (бродкаста) 42 — имя сервера TFTP 79 — Classless Static Route |
|||
| Длина опции | 8 | 1 | ||||
| Значение опции | 01:03:06:0c:0f:1c:42:79 | 8 | ||||
| Номер опции | 82 | Dec | Опция 82, в которой передается MAC адрес устройства — ретранслятора и какие-то дополнительные значения. Чаще всего — порт свича на котором работает конечный клиент DHCPВ данной опции «вложены» дополнительные параметры.Первый байт — номер «подопции», второй её длина, далее её значение. В данном случае в опции 82, вложены подопции: Agent Circuit ID = 00:04:00:01:00:04, где последние два байта — порт клиента DHCP с которого пришел запрос Agent Remote ID = 00:06:c8:be:19:93:11:48 — MAC адрес устройства ретранслятора DHCP |
|||
| Длина опции | 18 | Dec | ||||
| Значение опции | 01:06 00:04:00:01:00:04 02:08 00:06:c8:be:19:93:11:48 |
Hex | ||||
| Окончание пакета | 255 | Dec | 1 | 255 символизирует окончание пакета | ||
| Позиция в пакете | Название значения (общепринятое) | Пример | Представление | Байт | Пояснение |
| 1 | Boot Request | 1 | Hex | 1 | Тип сообщения. 1 — запрос от клиента к серверу, 2 — ответ от сервера клиенту |
| 2 | Hardware type | 1 | Hex | 1 | Тип аппаратного адреса, в данном протоколе 1 — MAC |
| 3 | Hardware adrees length | 6 | Hex | 1 | Длина MAC адреса устройства |
| 4 | Hops | 1 | Hex | 1 | Количество промежуточных маршрутов |
| 5 | Transaction ID | 23:cf:de:1d | Hex | 4 | Уникальный идентификатор транзакции. Генерирует клиент в начале операции запроса |
| 7 | Second elapsed | 0 | Hex | 4 | Время в секундах с начала процесса получения адреса |
| 9 | Bootp flags | 0 | Hex | 2 | Некие флаги, которые могут устанавливаться, в качестве указания параметров протокола. В данном случае, 0 — означает тип запроса Unicast |
| 11 | Client IP address | 0.0.0.0 | Строка | 4 | IP адрес клиента (если есть) |
| 15 | Your client IP address | 172.16.134.61 | Строка | 4 | IP адрес предложенный сервером (если есть) |
| 19 | Next server IP address | 0.0.0.0 | Строка | 4 | IP адрес сервера (если известен) |
| 23 | Relay agent IP address | 172.16.114.41 | Строка | 4 | IP адрес агента ретрансляции (например свича) |
| 27 | Client MAC address | 14:d6:4d:a7:c9:55 | Hex | 6 | MAC адрес отправителя пакета (клиента) |
| 31 | Client hardware address padding | Hex | 10 | Зарезервированное место. Обычно забито нулями | |
| 41 | Server host name | Строка | 64 | Имя сервера DHCP. Обычно не передается | |
| 105 | Boot file name | Строка | 128 | Имя файла на сервере, используемое бездисковыми станциями при загрузке | |
| 235 | Magic cookie | 63:82:53:63 | Hex | 4 | «Магическое» число, по которому в т.ч. можно определить, что этот пакет — принадлежит протоколу DHCP |
| Опции DHCP. Могут идти в любом порядке | |||||
| 236 | Номер опции | 53 | Dec | 1 | Опция 53, определяющая тип пакета DHCP 2 — DHCPOFFER |
| Длина опции | 1 | Dec | 1 | ||
| Значение опции | 2 | Dec | 1 | ||
| Номер опции | 1 | Dec | 1 | Опция предлагающая DHCP клиенту маску сети | |
| Длина опции | 4 | Dec | 1 | ||
| Значение опции | 255.255.224.0 | Строка | 4 | ||
| Номер опции | 3 | Dec | 1 | Опция предлагающая DHCP клиенту шлюз по умолчанию | |
| Длина опции | 4 | Dec | 1 | ||
| Значение опции | 172.16.12.1 | Строка | 4 | ||
| Номер опции | 6 | Dec | 1 | Опция предлагающая DHCP клиенту DNS | |
| Длина опции | 4 | Dec | 1 | ||
| Значение опции | 8.8.8.8 | Строка | 4 | ||
| Номер опции | 51 | Dec | 1 | Время жизни выданных сетевых параметров в секундах, через которое DHCP клиент должен запросить их снова | |
| Длина опции | 4 | Dec | 1 | ||
| Значение опции | 86400 | Dec | 4 | ||
| Номер опции | 82 | Dec | 1 | Опция 82, повторяет то что пришло в DHCPDISCOVER | |
| Длина опции | 18 | Dec | 1 | ||
| Значение опции | 01:08:00:06:00 01:01:00:00:01 02:06:00:03:0f 26:4d:ec |
Dec | 18 | ||
| Окончание пакета | 255 | Dec | 1 | 255 символизирует окончание пакета | |
| Позиция в пакете | Название значения (общепринятое) | Пример | Представление | Байт | Пояснение |
| 1 | Boot Request | 1 | Hex | 1 | Тип сообщения. 1 — запрос от клиента к серверу, 2 — ответ от сервера клиенту |
| 2 | Hardware type | 1 | Hex | 1 | Тип аппаратного адреса, в данном протоколе 1 — MAC |
| 3 | Hardware adrees length | 6 | Hex | 1 | Длина MAC адреса устройства |
| 4 | Hops | 1 | Hex | 1 | Количество промежуточных маршрутов |
| 5 | Transaction ID | 23:cf:de:1d | Hex | 4 | Уникальный идентификатор транзакции. Генерирует клиент в начале операции запроса |
| 7 | Second elapsed | 0 | Hex | 4 | Время в секундах с начала процесса получения адреса |
| 9 | Bootp flags | 8000 | Hex | 2 | Некие флаги, которые могут устанавливаться, в качестве указания параметров протокол. В данном случае выставлено «бродкаст» |
| 11 | Client IP address | 0.0.0.0 | Строка | 4 | IP адрес клиента (если есть) |
| 15 | Your client IP address | 172.16.134.61 | Строка | 4 | IP адрес предложенный сервером (если есть) |
| 19 | Next server IP address | 0.0.0.0 | Строка | 4 | IP адрес сервера (если известен) |
| 23 | Relay agent IP address | 172.16.114.41 | Строка | 4 | IP адрес агента ретрансляции (например свича) |
| 27 | Client MAC address | 14:d6:4d:a7:c9:55 | Hex | 6 | MAC адрес отправителя пакета (клиента) |
| 31 | Client hardware address padding | Hex | 10 | Зарезервированное место. Обычно забито нулями | |
| 41 | Server host name | Строка | 64 | Имя сервера DHCP. Обычно не передается | |
| 105 | Boot file name | Строка | 128 | Имя файла на сервере, используемое бездисковыми станциями при загрузке | |
| 235 | Magic cookie | 63:82:53:63 | Hex | 4 | «Магическое» число, по которому в т.ч. можно определить, что этот пакет — принадлежит протоколу DHCP |
| Опции DHCP. Могут идти в любом порядке | |||||
| 236 | Номер опции | 53 | Dec | 3 | Опция 53, определяющая тип пакета DHCP 3 — DHCPREQUEST |
| Длина опции | 1 | Dec | 1 | ||
| Значение опции | 3 | Dec | 1 | ||
| Номер опции | 61 | Dec | 1 | Идентификатор клиента: 01 (для Ehernet) + MAC адрес клиента | |
| Длина опции | 7 | Dec | 1 | ||
| Значение опции | 01:2c:ab:25:ff:72:a6 | Hex | 7 | ||
| Номер опции | 60 | Dec | «Vendor class identifier». В моем случае сообает версию DHCP клиента. Возможно другие устройства, возвращают что-то другое. Windows например сообщает MSFT 5.0 | ||
| Длина опции | 11 | Dec | |||
| Значение опции | udhcp 0.9.8 | Строка | |||
| Номер опции | 55 | 1 | Запрашиваемые клиентом сетевые параметры. Состав может быть различным 01 — Маска сети 03 — Шлюз 06 — DNS oc — Имя хоста 0f — имя домена сети 1c — адрес широковещательного запроса (бродкаста) 42 — имя сервера TFTP 79 — Classless Static Route |
||
| Длина опции | 8 | 1 | |||
| Значение опции | 01:03:06:0c:0f:1c:42:79 | 8 | |||
| Номер опции | 82 | Dec | 1 | Опция 82, повторяет то что пришло в DHCPDISCOVER | |
| Длина опции | 18 | Dec | 1 | ||
| Значение опции | 01:08:00:06:00 01:01:00:00:01 02:06:00:03:0f 26:4d:ec |
Dec | 18 | ||
| Окончание пакета | 255 | Dec | 1 | 255 символизирует окончание пакета | |
| Позиция в пакете | Название значения (общепринятое) | Пример | Представление | Байт | Пояснение |
| 1 | Boot Request | 2 | Hex | 1 | Тип сообщения. 1 — запрос от клиента к серверу, 2 — ответ от сервера клиенту |
| 2 | Hardware type | 1 | Hex | 1 | Тип аппаратного адреса, в данном протоколе 1 — MAC |
| 3 | Hardware adrees length | 6 | Hex | 1 | Длина MAC адреса устройства |
| 4 | Hops | 1 | Hex | 1 | Количество промежуточных маршрутов |
| 5 | Transaction ID | 23:cf:de:1d | Hex | 4 | Уникальный идентификатор транзакции. Генерирует клиент в начале операции запроса |
| 7 | Second elapsed | 0 | Hex | 4 | Время в секундах с начала процесса получения адреса |
| 9 | Bootp flags | 8000 | Hex | 2 | Некие флаги, которые могут устанавливаться, в качестве указания параметров протокол. В данном случае выставлено «бродкаст» |
| 11 | Client IP address | 0.0.0.0 | Строка | 4 | IP адрес клиента (если есть) |
| 15 | Your client IP address | 172.16.134.61 | Строка | 4 | IP адрес предложенный сервером (если есть) |
| 19 | Next server IP address | 0.0.0.0 | Строка | 4 | IP адрес сервера (если известен) |
| 23 | Relay agent IP address | 172.16.114.41 | Строка | 4 | IP адрес агента ретрансляции (например свича) |
| 27 | Client MAC address | 14:d6:4d:a7:c9:55 | Hex | 6 | MAC адрес отправителя пакета (клиента) |
| 31 | Client hardware address padding | Hex | 10 | Зарезервированное место. Обычно забито нулями | |
| 41 | Server host name | Строка | 64 | Имя сервера DHCP. Обычно не передается | |
| 105 | Boot file name | Строка | 128 | Имя файла на сервере, используемое бездисковыми станциями при загрузке | |
| 235 | Magic cookie | 63:82:53:63 | Hex | 4 | «Магическое» число, по которому в т.ч. можно определить, что этот пакет — принадлежит протоколу DHCP |
| Опции DHCP. Могут идти в любом порядке | |||||
| 236 | Номер опции | 53 | Dec | 3 | Опция 53, определяющая тип пакета DHCP 5 — DHCPACK |
| Длина опции | 1 | Dec | 1 | ||
| Значение опции | 5 | Dec | 1 | ||
| Номер опции | 1 | Dec | 1 | Опция предлагающая DHCP клиенту маску сети | |
| Длина опции | 4 | Dec | 1 | ||
| Значение опции | 255.255.224.0 | Строка | 4 | ||
| Номер опции | 3 | Dec | 1 | Опция предлагающая DHCP клиенту шлюз по умолчанию | |
| Длина опции | 4 | Dec | 1 | ||
| Значение опции | 172.16.12.1 | Строка | 4 | ||
| Номер опции | 6 | Dec | 1 | Опция предлагающая DHCP клиенту DNS | |
| Длина опции | 4 | Dec | 1 | ||
| Значение опции | 8.8.8.8 | Строка | 4 | ||
| Номер опции | 51 | Dec | 1 | Время жизни выданных сетевых параметров в секундах, через которое DHCP клиент должен запросить их снова | |
| Длина опции | 4 | Dec | 1 | ||
| Значение опции | 86400 | Dec | 4 | ||
| Номер опции | 82 | Dec | 1 | Опция 82, повторяет то что пришло в DHCPDISCOVER | |
| Длина опции | 18 | Dec | 1 | ||
| Значение опции | 01:08:00:06:00 01:01:00:00:01 02:06:00:03:0f 26:4d:ec |
Dec | 18 | ||
| Окончание пакета | 255 | Dec | 1 | 255 символизирует окончание пакета | |
pkg install python3 python3 -m ensurepip pip3 install mysql-connector
sudo apt-get install python3 sudo apt-get install pip3 sudo pip3 install mysql-connector
<?xml version="1.0" ?>
<config>
<dhcpserver>
<host>0.0.0.0</host>
<broadcast>255.255.255.255</broadcast>
<DHCPServer>192.168.0.71</DHCPServer>
<LeaseTime>8600</LeaseTime>
<ThreadLimit>1</ThreadLimit>
<defaultMask>255.255.255.0</defaultMask>
<defaultRouter>192.168.0.1</defaultRouter>
<defaultDNS>8.8.8.8</defaultDNS>
</dhcpserver>
<mysql>
<host>localhost</host>
<username>test</username>
<password>test</password>
<basename>pydhcp</basename>
</mysql>
<options>
<option>option_82_hex:sw_port1:20:22</option>
<option>option_82_hex:sw_port2:16:18</option>
<option>option_82_hex:sw_mac:26:40</option>
</options>
<query>
<offer_count>3</offer_count>
<offer_1>select ip,mask,router,dns from users where upper(mac)=upper('{option_82_AgentRemoteId_hex}') and upper(port)=upper('{option_82_AgentCircuitId_port_hex}')</offer_1>
<offer_2>select ip,mask,router,dns from users where upper(mac)=upper('{sw_mac}') and upper(port)=upper('{sw_port2}')</offer_2>
<offer_3>select ip,mask,router,dns from users where upper(mac)=upper('{ClientMacAddress}')</offer_3>
<history_sql>insert into history (id,dt,mac,ip,comment) values (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')</history_sql>
</query>
</config>option_82_hex:sw_port1:20:22option_82_hex:sw_mac:26:40--пришел пакет DHCPINFORM на 67 порт,от 0025224ad764 , b'\x91\xa5\xe0\xa3\xa5\xa9-\x8f\x8a' , ('172.30.114.25', 68)
{'ClientMacAddress': '0025224ad764',
'ClientMacAddressByte': b'\x00%"J\xd7d',
'HType': 'Ethernet',
'HostName': b'\x91\xa5\xe0\xa3\xa5\xa9-\x8f\x8a',
'ReqListDNS': True,
'ReqListDomainName': True,
'ReqListPerfowmRouterDiscover': True,
'ReqListRouter': True,
'ReqListStaticRoute': True,
'ReqListSubnetMask': True,
'ReqListVendorSpecInfo': 43,
'RequestedIpAddress': '0.0.0.0',
'Vendor': b'MSFT 5.0',
'chaddr': '0025224ad764',
'ciaddr': '172.30.128.13',
'flags': b'\x00\x00',
'giaddr': '172.30.114.25',
'gpoz': 308,
'hlen': 6,
'hops': 1,
'htype': 'MAC',
'magic_cookie': b'c\x82Sc',
'op': 'DHCPINFORM',
'option12': 12,
'option53': 53,
'option55': 55,
'option60': 60,
'option61': 61,
'option82': 82,
'option_82_byte': b'\x12\x01\x06\x00\x04\x00\x01\x00\x06\x02\x08\x00'
b'\x06\x00\x1eX\x9e\xb2\xad',
'option_82_hex': '12010600040001000602080006001e589eb2ad',
'option_82_len': 18,
'option_82_str': "b'\\x12\\x01\\x06\\x00\\x04\\x00\\x01\\x00\\x06\\x02\\x08\\x00\\x06\\x00\\x1eX\\x9e\\xb2\\xad'",
'result': False,
'secs': 768,
'siaddr': '0.0.0.0',
'sw_mac': '001e589eb2ad',
'sw_port1': '06',
'xidbyte': b'<\x89}\x8c',
'xidhex': '3c897d8c',
'yiaddr': '0.0.0.0'}

tree = minidom.parse(gconfig["config_file"])
mconfig=tree.getElementsByTagName("mysql")
for elem in mconfig:
gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firstChild.data
gconfig["mysql_username"]=elem.getElementsByTagName("username")[0].firstChild.data
gconfig["mysql_password"]=elem.getElementsByTagName("password")[0].firstChild.data
gconfig["mysql_basename"]=elem.getElementsByTagName("basename")[0].firstChild.data
dconfig=tree.getElementsByTagName("dhcpserver")
for elem in dconfig:
gconfig["broadcast"]=elem.getElementsByTagName("broadcast")[0].firstChild.data
gconfig["dhcp_host"]=elem.getElementsByTagName("host")[0].firstChild.data
gconfig["dhcp_LeaseTime"]=elem.getElementsByTagName("LeaseTime")[0].firstChild.data
gconfig["dhcp_ThreadLimit"]=int(elem.getElementsByTagName("ThreadLimit")[0].firstChild.data)
gconfig["dhcp_Server"]=elem.getElementsByTagName("DHCPServer")[0].firstChild.data
gconfig["dhcp_defaultMask"]=elem.getElementsByTagName("defaultMask")[0].firstChild.data
gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data
gconfig["dhcp_defaultDNS"]=elem.getElementsByTagName("defaultDNS")[0].firstChild.data
qconfig=tree.getElementsByTagName("query")
for elem in qconfig:
gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild.data
for num in range(int(gconfig["offer_count"])):
gconfig["offer_"+str(num+1)]=elem.getElementsByTagName("offer_"+str(num+1))[0].firstChild.data
gconfig["history_sql"]=elem.getElementsByTagName("history_sql")[0].firstChild.data
options=tree.getElementsByTagName("options")
for elem in options:
node=elem.getElementsByTagName("option")
for options in node:
optionsMod.append(options.firstChild.data)def PacketWork(data,addr):
...
# реализация разбора пришедшего пакета, и ответа на него
...
while True:
data, addr = udp_socket.recvfrom(1024) # ждем пакет UDP
thread = threading.Thread(target=PacketWork, args=(data,addr,)).start() # как пришел - запускаем в фоне определенную ранее функцию PacketWork с параметрами
while threading.active_count() >gconfig["dhcp_ThreadLimit"]:
time.sleep(1) # если число уже запущеных потоков больше чем в настройках, ждем пока их станет меньшеudp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,socket.IPPROTO_UDP) udp_socket.bind((gconfig["dhcp_host"],67))
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #переключаем сокет в режим отправки бродкаста
rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68)) udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # переключаем сокет в режим "много слушаетелей"
rz=udp_socket.sendto(packetack, addr) res["xidhex"]=data[4:8].hex()
res["xidbyte"]=data[4:8]res["flags"]=pack('BB',data[10],data[11])res["ciaddr"]=socket.inet_ntoa(pack('BBBB',data[12],data[13],data[14],data[15]));res=res+socket.inet_pton(socket.AF_INET, gconfig["dhcp_Server"])