LINUX.ORG.RU
решено ФорумAdmin

Проверка мак-адреса DHCP клиента перед ответом.

 , ,


0

1

Добрый день. Возникла необходимость настроить dhcp-сервер таким образом, чтобы он игнорировал discovery клиента, если его мак есть в базе биллинга.

Подскажите, какими средствами это можно сделать? Пробовал isc-dhcp, но он не может обрабатывать ответ от скрипта, да и запускать скрипт раньше отправки оффера.


тут только базу маков коммутатором разруливать, не видел такого функцинала у серверов.

anonymous
()

строить в коммутаторах ACL по макам, а вести саму базу активных/пассивных чем-то еще

anonymous
()

У некоторых серверов и роутеров есть blacklist (который denylist у сжв). Очень сильно зависит от сервера. Iptables так вроде не умеет

upcFrost ★★★★★
()

Напиши свой dhcp сервер с нужной тебе логикой. И не трахайся с этом г-ном под названием isc dhcp.

anonymous
()

В общем решил эту проблему так:

  1. Создал пустой класс, которому разрешил выдавать адреса, остальным запрещено.
  2. Теперь когда клиент, который не добавлен класс, отправляет запрос - запрос игнорируется и остается запись в логе.
  3. Rsyslog реагирует на эту запись и запускает скрипт, в который передает строку лога.
  4. Скрипт парсит строку, вынимая мак, и лезет в базу.
  5. Если мак в базе не найден - запускается expect скрипт, который через omshell добавляет клиента в ранее созданный класс.

##Конфиг isc-dhcp-server:

default-lease-time 60;
max-lease-time 120;

ddns-update-style none;

non-authoritative;
allow unknown-clients;
log-facility local7;

class "unknown" {
  match hardware;
  default-lease-time 60;
}

subnet 10.200.100.0 netmask 255.255.255.0 {
  pool {
    range 10.200.100.3 10.200.100.240;
    allow members of "unknown";
  }
    option domain-name-servers 91.195.90.2, 91.195.90.8;
    option routers 10.200.100.1;
    option broadcast-address 10.200.100.255;
}


omapi-port 7911;
key omapi_key {
     algorithm HMAC-MD5;
     secret тут будет ваш пароль;
}
omapi-key omapi_key;

expect скрипт:

#!/usr/bin/expect

set type 0
set timeout 10
set VAR [lindex $argv 0]
for { set i 0 } { $i < [ llength $argv ] } { incr i } {
switch -- [ lindex $argv $i ] {
"-m" { set macaddr [ lindex $argv [incr i] ] }
"-q" { set type 1 }
"-a" { set type 2 }
"-d" { set type 3 }
}
}

set cmdLineErr 0

if { $type == 0 } {
puts "Please specify what you want"
puts " -a Add"
puts " -q Query"
puts " -d Delete"
set cmdLineErr 1
}

if { ![info exists macaddr] } {
puts "Please specify a mac address"
set cmdLineErr 1
}

if { $cmdLineErr == 1 } { exit 1 }

puts "MAC addr = $macaddr"

spawn /usr/bin/omshell

expect "> "
send "key omapi_key тут пароль из конфига dhcpd.conf\r"
expect "> "
send "connect\r"
expect {
-re "obj: " { send "" }
timeout exit
}
expect "> "
send "new subclass\r"
expect "> "
send "set name = \"unknown\"\r"
expect "> "
send "set hashstring = 01:$macaddr\r"

if { $type == 1 } {
send "open\r"
expect "> "
}
if { $type == 2 } {
send "create\r"
expect "> "
}
if { $type == 3 } {
send "open\r"
expect {
        "can't open object: not found" {send "close\r"}
        "lease-limit " {send "remove\r"}
}

expect "> "
}

exit 0

screek
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.