dhcp костылинг для utm5
Не в конце надо, в сабнете.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";
}
Собственно рабочий самокат проверено, работает!
У меня стоит следующее, вы можете поставить и посвежее версии, должно заработать:
Далее создаем каталог dhcp в /usr/local/etc/. Мне было удобно именно в этой папке, там же лежит и dhcpd.conf.
В /usr/local/etc/dhcp/ кладем вот такой файл на перле:
Далее создаем в этой же папке /usr/local/etc/dhcp/ файл dhcp.sh следующего содержания:
И ставим этот файл на запуск в крон. Как вашей душе угодно я выставил каждые 10 минут.
Все данные пишутся в файл /etc/dhcpd.hosts в виде:
Дальше нам остается добавить в /usr/local/etc/dhcpd.conf в конец конфига строчку: include "/etc/dhcpd.hosts".
В общем то и все
Конфиг dhcpd.conf:
Естественно все ip-адреса и mac-адреса вымышленные Удачи!
У меня стоит следующее, вы можете поставить и посвежее версии, должно заработать:
Код: Выделить всё
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
В /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;
Код: Выделить всё
#!/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);
Все данные пишутся в файл /etc/dhcpd.hosts в виде:
Код: Выделить всё
host 192.168.10.2 { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.10.2; }
В общем то и все
Конфиг 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";
}
Еще добавлю, для защиты от 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 самый главный в сети (так называемая защита от подмены запросов)
Внесу коррективу - подсмотрел процедуру коннекта в родном нетаповском скрипте по выдергиванию связки IP+MAC из таблицы temp_ip
ОС gentoo 10 (текущая), скрипт с процедурой коннекта
ОС 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 (CONFIG);
foreach $line (@config) {
if ($line =~ m/^([^#].+?)=(.*)$/) {
$$1 = $2;
};
};
# Connect to the database
if ($database_type eq "mysql") {
$DBI_data="DBI:$database_type:database=$database;host=$database_host;mysql_socket=$database_sock_path;";
} elsif ($database_type eq "postgres") {
$DBI_data="DBI:$database_type:dbname=$database";
} else {
print "Unknown database $database_type! Stopped. \n";
exit (1);
};
$dbh = DBI->connect("$DBI_data","$database_login","$database_password",{'RaiseError' => 1});
далее код из поста TiRider
Последний раз редактировалось linx Вт авг 24, 2010 22:36, всего редактировалось 1 раз.
Впечатление, что код сканировали и распознавали. Абсолютно нерабочий. Навскидку:linx писал(а):Внесу коррективу - подсмотрел процедуру коннекта в родном нетаповском скрипте по выдергиванию связки IP+MAC из таблицы temp_ip
ОС gentoo 10 (текущая), скрипт с процедурой коннекта
Что это???
Код: Выделить всё
my ( %MAC, %IP ) - ();
С каких пор в маке 8 символов?
Код: Выделить всё
} elsif ( $mac =~ /([0-9A-F]{2})([0-9A-F]{2})\.?
([0-9A-F]{2})([0-9A-F]{2})/x ) {
Сравните приведённые фрагменты с кодом хоть от TiRider, хоть оригинальным...linx писал(а):К коду опубликованному TiRider добавлена процедура коннекта, т.к. при проверке им опубликованного скрипта - ошибку давала ток процедура коннекта к мускулю. А так скрипты TiRider вполне рабочие. Чье либо авторство неоспариваю
Ошибки и очепятки у всех бывают, извиняюсь за невнимательность. Комментарии срезаны - на экран нетбука больше кода влазит, легче просматривать, нужны внесу из поста TiRider.
Мне тоже нужно было сделать костыль в связке dhcp-netup. Задача была поставлена чтоб в DHCP записи были такого вида:
Потому дополнил и изменил опубликованные коды:
Мне тоже нужно было сделать костыль в связке dhcp-netup. Задача была поставлена чтоб в DHCP записи были такого вида:
Код: Выделить всё
host login000001 { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.10.2; }
Код: Выделить всё
#!/usr/bin/perl
use Socket;
use DBD::mysql;
use DBI();
use Time::Local;
use Getopt::Std;
open (CONFIG, "/netup/utm5/utm5.cfg");
@config = <CONFIG>;
close (CONFIG);
foreach $line (@config) {
if ($line =~ m/^([^#].+?)=(.*)$/) {
$$1 = $2;
};
};
if ($database_type eq "mysql") {
$DBI_data="DBI:$database_type:database=$database;host=$database_host;mysql_socket=$database_sock_path;";
} elsif ($database_type eq "postgres") {
$DBI_data="DBI:$database_type:dbname=$database";
} else {
print "Unknown database $database_type! Stopped. \n";
exit (1);
};
$dbh = DBI->connect("$DBI_data","$database_login","$database_password",{'RaiseError' => 1});
open F, ">", "/tmp/dhcpd.hosts.new";
open(LOG,">/var/log/dhcp-netup.log");
my $items = $dbh->selectall_arrayref( "SELECT inet_ntoa(ip & 0xFFFFFFFF) 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");
my ( %MAC, %IP ) = ();
for my $item ( @$items ) {
my ( $ip, $mac, $login ) = @$item;
$mac =~ s/^\s+//;
$mac =~ s/\s+$//;
$mac = uc $mac;
unless ( $mac ) {
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";
} else {
print LOG "Wrong MAC: $login $ip $mac\n";
next;
}
if ( $MAC{$mac} ) {
print LOG "Duplicate MAC: $login $ip $mac\n";
next;
}
if ( $IP{$ip} ) {
printf LOG "Duplicate IP: $login $ip $mac\n";
next;
}
$IP{$ip} = 1;
$MAC{$mac} = 1;
$ip =~ /^(\d+\.\d+)\.(\d+)\.(\d+)$/;
my $opt = '';
printf F "host $login { hardware ethernet %s; fixed-address %s; }\n",
$mac, $ip;
}
$dbh->disconnect;
close LOG;
close F;