dhcp костылинг для utm5

Технические вопросы по UTM 5.0
kirush
Сообщения: 699
Зарегистрирован: Пт фев 04, 2005 13:58

Сообщение kirush »

updatedb
или
/usr/libexec/locate.updatedb

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

В общем борьба была сложная.

Вроде победили и даже в /etc/dhcpd.hosts пишутся ипы и маки. Но почему то настроил dhcp сервер, делаю include "/etc/dhcpd.hosts" в конец конфига и перегружаю дхцп сервер. И нифига :( не выдает адрес почему то клиенту :(

dk, вы сталкивались с этим?

dk
Сообщения: 424
Зарегистрирован: Чт авг 10, 2006 08:52

Сообщение dk »

TiRider писал(а):В общем борьба была сложная.

Вроде победили и даже в /etc/dhcpd.hosts пишутся ипы и маки. Но почему то настроил dhcp сервер, делаю include "/etc/dhcpd.hosts" в конец конфига и перегружаю дхцп сервер. И нифига :( не выдает адрес почему то клиенту :(
Не в конце надо, в сабнете.

Код: Выделить всё

subnet 192.168.0.0 netmask 255.255.0.0 {
  deny bootp;
  deny duplicates;
  ignore declines;
  deny client-updates;
  option subnet-mask 255.255.255.0;
  option domain-name-servers  192.168.120.2;
  deny unknown-clients;
  max-lease-time 172800;
  default-lease-time 86400;
  include "/etc/dhcpd.hosts";
}

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

А есть возможность привести весь листинг dhcpd.conf?

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

Победили вроде как костылинг :D Всем спасибо кто помогал и проявил хоть какое то участие. Огромнейшая благодарность dk и Kayfolom'у!

Наше творение выложу чуток попозже, с полным описанием.

P.S: Пока обкатаю у себя, чтобы ошибок лишних не было. Запрос пришлось сильно модифицировать ;)

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

Собственно рабочий самокат :) проверено, работает!

У меня стоит следующее, вы можете поставить и посвежее версии, должно заработать:

Код: Выделить всё

1. isc-dhcp30-relay-3.0.7 
2. isc-dhcp30-server-3.0.7_5
3. p5-DBD-mysql50-4.013
4. p5-DBI-1.60.9
5. p5-Storable-2.21
6. perl-5.10.1
Далее создаем каталог dhcp в /usr/local/etc/. Мне было удобно именно в этой папке, там же лежит и dhcpd.conf.

В /usr/local/etc/dhcp/ кладем вот такой файл на перле:

Код: Выделить всё

#!/usr/bin/perl
use DBI;
use DBD::mysql;
#use lib '/cktv/perl';
#use cktv::logger;

# Инициализация
#loginfo "Обновление DHCPD";
$dbh = DBI->connect("DBI:mysql:UTM5;192.168.1.1", "login", "password", {'RaiseError' => 1}) or die crit msg "Can't connect to DB!";

open F, ">", "/tmp/dhcpd.hosts.new";

# Получаем данные (192.168.xx.xx)
my $items = $dbh->selectall_arrayref( "SELECT inet_ntoa(ip & 0xFFFFFFFF) as ip, ip_groups.mac, accounts.is_blocked FROM ip_groups,iptraffic_service_links, service_links, users, accounts WHERE ip_groups.mac!='' AND accounts.id=users.basic_account AND service_links.user_id=users.id AND service_links.is_deleted='0' AND ip_groups.is_deleted='0' AND iptraffic_service_links.ip_group_id=ip_groups.ip_group_id AND service_links.id=iptraffic_service_links.id GROUP BY ip_groups.ip ORDER BY ip_groups.ip" ); 

# Таблица для поиска дублей
my ( %MAC, %IP ) = ();

for my $item ( @$items ) {
    my ( $ip, $mac ) = @$item;

    $mac =~ s/^\s+//;
    $mac =~ s/\s+$//;
    $mac = uc $mac;

    # Проверяем мак
    unless ( $mac ) {
        # DHCP не нужен
        next;
    } elsif ( $mac =~ /^[0-9A-F]{2}(?::[0-9A-F]{2}){5}$/ ) {
        # Мак правильный
    } elsif ( $mac =~ /([0-9A-F]{2})([0-9A-F]{2})\.?
                ([0-9A-F]{2})([0-9A-F]{2})\.?
                ([0-9A-F]{2})([0-9A-F]{2})/x ) {
        # Цисковский или просто числа
        $mac = "$1:$2:$3:$4:$5:$6";
        #crit msg "Fixed: $ip $mac";
         print "Fixed: $ip $mac";
    } else {
        #msg "Wrong: $ip $mac";
        print "Wrong: $ip $mac";
        next;
    }

    # Проверка на дубликаты
    if ( $MAC{$mac} ) {
        #crit msg "Duplicate MAC: $ip $mac";
 #       print 12;
        print "Duplicate MAC: $ip $mac";
        next;
    }

    if ( $IP{$ip} ) {
        #crit msg "Duplicate IP: $ip $mac";
        print "Duplicate IP: $ip $mac";
        next;
    }

    $IP{$ip} = 1;
    $MAC{$mac} = 1;

    # Сохраняем в конфиг
    $ip =~ /^(\d+\.\d+)\.(\d+)\.(\d+)$/;
        my $opt = '';

#    if ( $ip =~ /^123\.123\.123\./ ) {
#        # Внешний адрес нашего C-класса
#        $opt .= sprintf "option host-name pc_%03s_%03s; ", $2, $3;
#    }

     if ( $ip =~ /^123\.123\.123\./ ) {
        # Внешний адрес нашего C-класса
        $opt .= sprintf "option host-name host-%0s-%0s.broadband.domain.ru; ", $2, $3;
     }

#    printf F "host pc_%03s_%03s { hardware ethernet %s; fixed-address %s; option routers %s; }\n",
#        $2, $3, $mac, $ip, "$1.$2.1",$opt;

#    printf F "host $ip { hardware ethernet %s; fixed-address %s; option routers %s; }\n",
#        $mac, $ip, "$1.$2.1",$opt;

printf F "host $ip { hardware ethernet %s; fixed-address %s; }\n",
        $mac, $ip;
}

# Отключаемся
$dbh->disconnect;
close F;
Далее создаем в этой же папке /usr/local/etc/dhcp/ файл dhcp.sh следующего содержания:

Код: Выделить всё

#!/bin/sh

/usr/local/etc/dhcp/dhcp.pl

diff /etc/dhcpd.hosts /tmp/dhcpd.hosts.new > /dev/null >> /var/log/dhcpd_updater || 
(/usr/local/sbin/dhcpd -t -cf /usr/local/etc/dhcpd.conf 2>&1 &&
cp /tmp/dhcpd.hosts.new /etc/dhcpd.hosts &&
/usr/local/etc/rc.d/isc-dhcpd forcerestart 2>&1 &&
echo Reboot: \`date\` >> /var/log/dhcpd_updater);
И ставим этот файл на запуск в крон. Как вашей душе угодно :) я выставил каждые 10 минут.

Все данные пишутся в файл /etc/dhcpd.hosts в виде:

Код: Выделить всё

host 192.168.10.2 { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.10.2; }
Дальше нам остается добавить в /usr/local/etc/dhcpd.conf в конец конфига строчку: include "/etc/dhcpd.hosts".

В общем то и все ;)

Конфиг dhcpd.conf:

Код: Выделить всё

# /usr/local/etc/dhcpd.conf
#
# Конфигурация для isc-dhcp сервера
#
# Глобальные параметры
#========================================================
# Доменый суффикс, который будет присвоен клиентам
option domain-name "domain.ru";

# Список DNS серверов, которые должен использовать клиент
option domain-name-servers 192.168.1.1;
server-name "domain";

# На какое время выдавать клиентам настройки (в секундах) 86400сек=1день
default-lease-time 86400;

# На какое максимальное время выдавать клиентам настройки (в секундах)
max-lease-time 172800;

# Минимально на сколько выдается IP-адрес
min-lease-time 86400;
#========================================================

#Параметр определяет, будет ли DHCP-сервер пытаться обновить DNS при выдаче конфигурационной информации
ddns-update-style none;
#ddns-update-style interim;

# Данный параметр говорит, что мы будем обновлять DNS зону (т.к. мы уже выбрали, что не будем ее обновлять, то комментируем эту строчку)
#ddns-update-style ad-hoc;

# Включаем IP-Forwarding
option ip-forwarding on;
#ddns-fwd-name ns.domain.ru;

# Объявляем, что наш DHCP-сервер самый авторитетный (т.е. главный в сети)
authoritative;
# Логи которые отправляет DHCP-сервер
log-facility local7;
ignore client-updates;
deny bootp;
deny client-updates;
deny duplicates;
ignore declines;

# Локальные параметры сети (настройка сети)
#==========================================
shared-network domain {

subnet 192.168.10.0 netmask 255.255.255.0 { # Сеть которую объявляем и маска данной сети
        option subnet-mask 255.255.255.0;
        option routers 192.168.10.1;
        option broadcast-address 192.168.10.255;
        option domain-name-servers 192.168.1.1;
pool {
        range 192.168.10.2 192.168.10.254;
        deny unknown-clients; # Запретить выдачу IP-адресов не известным клиентам
#       deny client-updates;
#       deny bootp;
#       deny duplicates;
#       ignore declines;
}
option netbios-node-type 8;
option ntp-servers 192.168.1.1; # Сервер синхронизации времени

default-lease-time 86400; # Поумолчанию на сколько выдается IP-адрес
max-lease-time 172800; # Максимально на сколько выдается IP-адрес, после чего мы его сами забираем
}
subnet 192.168.11.0 netmask 255.255.255.0 { # Сеть которую объявляем и маска данной сети
        option subnet-mask 255.255.255.0;
        option routers 192.168.11.1;
        option broadcast-address 192.168.11.255;
        option domain-name-servers 192.168.1.1;
pool {
        range 192.168.11.2 192.168.11.254;
        deny unknown-clients; # Запретить выдачу IP-адресов не известным клиентам
#       deny client-updates;
#       not authoritative;
#       deny bootp;
#       deny duplicates;
#       ignore declines;
}
option netbios-node-type 8;
option ntp-servers 192.168.1.1; # Сервер синхронизации времени

default-lease-time 86400; # Поумолчанию на сколько выдается IP-адрес
max-lease-time 172800; # Максимально на сколько выдается IP-адрес, после чего мы его сами забираем
}
include "/etc/dhcpd.hosts";

}
Естественно все ip-адреса и mac-адреса вымышленные ;) Удачи! :)

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

Еще добавлю, для защиты от dhcp-snooping, на порту коммутатора (у меня cisco) нужно указать следующие опции:

Код: Выделить всё

 switchport access vlan xx #VLAN в котором сидит dhcp
 switchport mode access
 no cdp enable
 ip dhcp snooping limit rate 500 #Лимит запросов
 ip dhcp snooping trust #Объявляем, что наш dhcp самый главный в сети (так называемая защита от подмены запросов)

solomon
Сообщения: 316
Зарегистрирован: Вт мар 16, 2010 08:39

Сообщение solomon »

Я так понимаю вы используете статические адреса для выдачи? или динамические из пула тоже?

если выдаются тоже динамические как они привязываются к логину или вообще как ведется учет трафика клиентов?

linx
Сообщения: 29
Зарегистрирован: Ср окт 01, 2008 12:10

Сообщение linx »

Внесу коррективу - подсмотрел процедуру коннекта в родном нетаповском скрипте по выдергиванию связки IP+MAC из таблицы temp_ip

ОС gentoo 10 (текущая), скрипт с процедурой коннекта

Код: Выделить всё

#!/usr/bin/perl

use Socket;
use DBD::mysql;
use DBI();
use Time::Local;
use Getopt::Std;


#$dbh = DBI->connect("DBI:mysql:database=YTM5;host=127.0.0.1;", "", "", {'RaiseError' => 1}) or die crit msg "No connect to DB!";

#Load settings from config
open (CONFIG, "/netup/utm5/utm5.cfg");
@config = <CONFIG>;
close &#40;CONFIG&#41;;
foreach $line &#40;@config&#41; &#123;
  if &#40;$line =~ m/^&#40;&#91;^#&#93;.+?&#41;=&#40;.*&#41;$/&#41; &#123;
    $$1 = $2;
  &#125;;
&#125;;

# Connect to the database
if &#40;$database_type eq "mysql"&#41; &#123;
  $DBI_data="DBI&#58;$database_type&#58;database=$database;host=$database_host;mysql_socket=$database_sock_path;";
&#125; elsif &#40;$database_type eq "postgres"&#41; &#123;
  $DBI_data="DBI&#58;$database_type&#58;dbname=$database";
&#125; else &#123;
  print "Unknown database $database_type! Stopped. \n";
  exit &#40;1&#41;;
&#125;;
$dbh = DBI->connect&#40;"$DBI_data","$database_login","$database_password",&#123;'RaiseError' => 1&#125;&#41;;

далее код из поста TiRider

Последний раз редактировалось linx Вт авг 24, 2010 22:36, всего редактировалось 1 раз.

dk
Сообщения: 424
Зарегистрирован: Чт авг 10, 2006 08:52

Сообщение dk »

linx писал(а):Внесу коррективу - подсмотрел процедуру коннекта в родном нетаповском скрипте по выдергиванию связки IP+MAC из таблицы temp_ip

ОС gentoo 10 (текущая), скрипт с процедурой коннекта
Впечатление, что код сканировали и распознавали. Абсолютно нерабочий. Навскидку:

Что это???

Код: Выделить всё

my &#40; %MAC, %IP &#41; - &#40;&#41;;


С каких пор в маке 8 символов?

Код: Выделить всё

    &#125; elsif &#40; $mac =~ /&#40;&#91;0-9A-F&#93;&#123;2&#125;&#41;&#40;&#91;0-9A-F&#93;&#123;2&#125;&#41;\.?
                       &#40;&#91;0-9A-F&#93;&#123;2&#125;&#41;&#40;&#91;0-9A-F&#93;&#123;2&#125;&#41;/x &#41; &#123; 
И зачем все комментарии вырезали? Поверьте, с ними проще, даже на простых скриптах.

linx
Сообщения: 29
Зарегистрирован: Ср окт 01, 2008 12:10

Сообщение linx »

К коду опубликованному TiRider добавлена процедура коннекта, т.к. при проверке им опубликованного скрипта - ошибку давала ток процедура коннекта к мускулю. А так скрипты TiRider вполне рабочие. Чье либо авторство неоспариваю

dk
Сообщения: 424
Зарегистрирован: Чт авг 10, 2006 08:52

Сообщение dk »

linx писал(а):К коду опубликованному TiRider добавлена процедура коннекта, т.к. при проверке им опубликованного скрипта - ошибку давала ток процедура коннекта к мускулю. А так скрипты TiRider вполне рабочие. Чье либо авторство неоспариваю
Сравните приведённые фрагменты с кодом хоть от TiRider, хоть оригинальным...

linx
Сообщения: 29
Зарегистрирован: Ср окт 01, 2008 12:10

Сообщение linx »

Ошибки и очепятки у всех бывают, извиняюсь за невнимательность. Комментарии срезаны - на экран нетбука больше кода влазит, легче просматривать, нужны внесу из поста TiRider.

Мне тоже нужно было сделать костыль в связке dhcp-netup. Задача была поставлена чтоб в DHCP записи были такого вида:

Код: Выделить всё

host login000001 &#123; hardware ethernet 00&#58;00&#58;00&#58;00&#58;00&#58;00; fixed-address 192.168.10.2; &#125;
Потому дополнил и изменил опубликованные коды:

Код: Выделить всё

#!/usr/bin/perl
use Socket;
use DBD&#58;&#58;mysql;
use DBI&#40;&#41;;
use Time&#58;&#58;Local;
use Getopt&#58;&#58;Std;

open &#40;CONFIG, "/netup/utm5/utm5.cfg"&#41;;
@config = <CONFIG>;
close &#40;CONFIG&#41;;
foreach $line &#40;@config&#41; &#123;
  if &#40;$line =~ m/^&#40;&#91;^#&#93;.+?&#41;=&#40;.*&#41;$/&#41; &#123;
    $$1 = $2;
  &#125;;
&#125;;


if &#40;$database_type eq "mysql"&#41; &#123;
  $DBI_data="DBI&#58;$database_type&#58;database=$database;host=$database_host;mysql_socket=$database_sock_path;";
&#125; elsif &#40;$database_type eq "postgres"&#41; &#123;
  $DBI_data="DBI&#58;$database_type&#58;dbname=$database";
&#125; else &#123;
  print "Unknown database $database_type! Stopped. \n";
  exit &#40;1&#41;;
&#125;;
$dbh = DBI->connect&#40;"$DBI_data","$database_login","$database_password",&#123;'RaiseError' => 1&#125;&#41;;


open F, ">", "/tmp/dhcpd.hosts.new";
open&#40;LOG,">/var/log/dhcp-netup.log"&#41;;

my $items = $dbh->selectall_arrayref&#40; "SELECT inet_ntoa&#40;ip & 0xFFFFFFFF&#41; as ip, ip_groups.mac, users.login FROM ip_groups, iptraffic_service_links, service_links, users, accounts WHERE ip_groups.mac!='' AND accounts.id=users.basic_account AND service_links.user_id=users.id AND service_links.is_deleted='0' AND ip_groups.is_deleted='0' AND iptraffic_service_links.ip_group_id=ip_groups.ip_group_id AND service_links.id=iptraffic_service_links.id GROUP BY ip_groups.ip ORDER BY ip_groups.ip"&#41;;

my &#40; %MAC, %IP &#41; = &#40;&#41;;

for my $item &#40; @$items &#41; &#123;
    my &#40; $ip, $mac, $login &#41; = @$item;

    $mac =~ s/^\s+//;
    $mac =~ s/\s+$//;
    $mac = uc $mac;

    unless &#40; $mac &#41; &#123;
        next;
    &#125; elsif &#40; $mac =~ /^&#91;0-9A-F&#93;&#123;2&#125;&#40;?&#58;&#58;&#91;0-9A-F&#93;&#123;2&#125;&#41;&#123;5&#125;$/ &#41; &#123;
    &#125; elsif &#40; $mac =~ /&#40;&#91;0-9A-F&#93;&#123;2&#125;&#41;&#40;&#91;0-9A-F&#93;&#123;2&#125;&#41;\.?
                       &#40;&#91;0-9A-F&#93;&#123;2&#125;&#41;&#40;&#91;0-9A-F&#93;&#123;2&#125;&#41;\.?
                       &#40;&#91;0-9A-F&#93;&#123;2&#125;&#41;&#40;&#91;0-9A-F&#93;&#123;2&#125;&#41;/x &#41; &#123;
    $mac = "$1&#58;$2&#58;$3&#58;$4&#58;$5&#58;$6";


    &#125; else &#123;
        print LOG "Wrong MAC&#58; $login $ip $mac\n";
        next;
    &#125;

    if &#40; $MAC&#123;$mac&#125; &#41; &#123;
    print LOG "Duplicate MAC&#58; $login $ip $mac\n";
    next;
    &#125;

    if &#40; $IP&#123;$ip&#125; &#41; &#123;
    printf LOG "Duplicate IP&#58; $login $ip $mac\n";
    next;
    &#125;

    $IP&#123;$ip&#125; = 1;
    $MAC&#123;$mac&#125; = 1;


    $ip =~ /^&#40;\d+\.\d+&#41;\.&#40;\d+&#41;\.&#40;\d+&#41;$/;
        my $opt = '';


    printf F "host $login &#123; hardware ethernet %s; fixed-address %s; &#125;\n",
        $mac, $ip;
    &#125;

$dbh->disconnect;
close LOG;
close F;

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

Ну и чем же ваш файлик отличается от utm5_arp.pl? Двумя строчками про мак и ип?

Pulse
Сообщения: 945
Зарегистрирован: Вт окт 03, 2006 12:58

Сообщение Pulse »

генерить каждые 10 минут конфиг это не комильфо. лучше всего использовать ldap как хранилище(хотя есть варианты и с mysql), а добавлять и удалять связки мак+айпи по событию в аффекторе "Добавление связки IP"/"Удаление связки IP"

Ответить