Megas Posted January 3, 2012 Posted January 3, 2012 В крации, в центре стоит в ядре простенький свич, но к нему подключенны как беспроводные клиенты, так и проводные. Через него проходят пакеты от коммутаторов доступа на конечных узлах с options 82, так и пакеты без options 82. Хочу сейчас все пакеты которые приходят без options 82, навешать 82 опцию, чтобы dhcpd серверу было проще жить, но и в силу определенных обстоятельств, из-за необходимых измнений в дальнейшем. На сервере нагенерил тучу конфигов, но сделал там классы с чисто распознование маков, сделал скриптец который выгружает все это из netup, рассовывает по конфигам и подключает в основной конфигурационный файл. Теперь вопрос, а правильно ли сделал на центральном свиче: Убрал, чтобы не позориться#show dhcp_relay Command: show dhcp_relay DHCP/BOOTP Relay Status : Enabled DHCP/BOOTP Hops Count Limit : 4 DHCP/BOOTP Relay Time Threshold : 0 DHCP Relay Agent Information Option 82 State : Enabled DHCP Relay Agent Information Option 82 Check : Disabled DHCP Relay Agent Information Option 82 Policy : Keep DHCP Relay Agent Information Option 82 Remote ID : 00-22-B0-50-34-9C Interface Server 1 Server 2 Server 3 Server 4 ------------ --------------- --------------- --------------- -------------- System DHCP_Server Вставить ник Quote
Megas Posted January 3, 2012 Author Posted January 3, 2012 Да, при таком раскладе работает. Но не полностью, проблема и почему так не могу понять. class "MAC-00:27:22:42:c0:0c" { match if binary-to-ascii(16, 8, ":", substring(hardware, 1, 6)) = "0:27:22:42:c0:c"; } сначала было: 00:27:22:42:c0:0c но когда посмотрел внимательно, то увидел что мак клиента с обрезаным нулем в начале и перед последней буквой, почему так делает система и можно ли повлиять чтобы она не резала? Вставить ник Quote
pppoetest Posted January 3, 2012 Posted January 3, 2012 Я не стал заморачиваться, лидирующий ноль чикает скрипт формирующий конфиг дхцп из биллинга Вставить ник Quote
Ivan_83 Posted January 3, 2012 Posted January 3, 2012 но когда посмотрел внимательно, то увидел что мак клиента с обрезаным нулем в начале и перед последней буквой, почему так делает система и можно ли повлиять чтобы она не резала? Потому что 0xc = 0x0c = 0x000000000c Просто в printf кто то поленился/забыл поставить добавление нуля, чтобы всегда было два символа, даже если второй разряд равен нулю. "%x:%x:%x:%x:%x:%x" должно быть заменено на "%02x:%02x:%02x:%02x:%02x:%02x", если я правильно помню форматирование. В вашем случае, я бы начал с чтения документации про binary-to-ascii функцию, возможно глянул бы в исходник. Вставить ник Quote
alexaaa Posted January 4, 2012 Posted January 4, 2012 (edited) Во первых что за свитчь у вас в ядре, если L3 то работать будет, и релеить нужно, либо по вланам Vlan ID, либо по IP (если L3) свитчь, либо по макам L2 свитчей, почитайте внимательно описание remote-id и circuid-id в конфиге dhcp, а вообще примеров много, особенно на форуме d-link, у нас например в ядре L3, dhcp_relay работает по vlan_id подсетей которые нужно маршрутить. Edited January 4, 2012 by alexaaa Вставить ник Quote
Megas Posted January 4, 2012 Author Posted January 4, 2012 Если оно, то кажись вот так описывают? ./common/print.c: log_debug ("chaddr = %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x", Вставить ник Quote
alexaaa Posted January 4, 2012 Posted January 4, 2012 (edited) Если оно, то кажись вот так описывают? ./common/print.c: log_debug ("chaddr = %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x", Вот так выглядеть должен кусок конфига if exists agent.circuit-id { log(info, concat("Lease" ," IP ", binary-to-ascii(10, 8, ".", leased-address) ," MAC ", binary-to-ascii(16, 8, ":", substring(hardware, 1, 6)) ," port ", binary-to-ascii(10, 16, "", substring(option agent.circuit-id, 4, 2)) ," VLAN ", binary-to-ascii(10, 16, "", substring(option agent.circuit-id, 2, 2)) ," switch ", binary-to-ascii(16, 8, ":", substring(option agent.remote-id, 2, 20)) ) ); } subnet 20.44.0.0 netmask 255.255.248.0 { } subnet 20.44.16.0 netmask 255.255.248.0 { class "vlan1777" { match if ( binary-to-ascii(10, 16, "", substring(option agent.circuit-id, 2, 2)) = "1777"); } pool { range 20.44.16.1 20.44.23.254; option routers 20.44.16.1; allow members of "vlan1777"; } } а вот детское пособие http://biparasite.ru/?p=130 Edited January 4, 2012 by alexaaa Вставить ник Quote
Megas Posted January 4, 2012 Author Posted January 4, 2012 alexaaa, спасибо, но, я же нормально написал, сеть работает, довольно большая уже и там все нормально. есть просто абоны которые приходят с беспроводных точек в свич, хоть в центре хоть где и нужно временное решение с использованием 82 опции пока каждый абон не переведен в свой vlan. по этому нужна связка как раз switch+mac, остальные связки в силу сложившихся событий не интересны. благодаря Ivan_83, проблема ясна, почему нельзя работать полноценно с маком. теперь стоит оптимизационный вопрос, по формирования класов на основе маков клиентов. понятно что обрезается первый ноль, понятно что обрезается ноль если попадается выражение 0c, теперь интересно что еще обрезается пока не наступил на очередные грабли. Вставить ник Quote
sirmax Posted January 4, 2012 Posted January 4, 2012 alexaaa, спасибо, но, я же нормально написал, сеть работает, довольно большая уже и там все нормально. есть просто абоны которые приходят с беспроводных точек в свич, хоть в центре хоть где и нужно временное решение с использованием 82 опции пока каждый абон не переведен в свой vlan. по этому нужна связка как раз switch+mac, остальные связки в силу сложившихся событий не интересны. благодаря Ivan_83, проблема ясна, почему нельзя работать полноценно с маком. теперь стоит оптимизационный вопрос, по формирования класов на основе маков клиентов. понятно что обрезается первый ноль, понятно что обрезается ноль если попадается выражение 0c, теперь интересно что еще обрезается пока не наступил на очередные грабли. нет там никаких граблей и ничего не обрезается. Вставить ник Quote
Ivan_83 Posted January 4, 2012 Posted January 4, 2012 Если оно, то кажись вот так описывают? ./common/print.c: log_debug ("chaddr = %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x", Нет, оно в лог мак пишет. class "MAC-00:27:22:42:c0:0c" { match if binary-to-ascii(16, 8, ":", substring(hardware, 1, 6)) = "0:27:22:42:c0:c"; Попробуйте наоборот: ascii-to-binary (если такая функция есть) для мака, и потом сравнивать с substring(hardware, 1, 6) И там ноль не обрезается, он просто не дописывается. Те в пакете есть 6 байт, каждый байт может быть 0x0 - 0xff, соответственно все байты меньше или равные 0xf будут без нуля впереди при преобразовании в строку, у которой шесть групп цифр. Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.