DHCP MYSQL: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
Строка 59: | Строка 59: | ||
CREATE TABLE network_mask |
CREATE TABLE network_mask |
||
( |
( |
||
− | network int |
+ | network int UNSIGNED NOT NULL UNIQUE, |
− | mask int |
+ | mask int UNSIGNED, |
− | is_dhcp int |
+ | is_dhcp int DEFAULT 1 |
); |
); |
||
Строка 67: | Строка 67: | ||
INSERT into network_mask(network,mask) values(INET_ATON('10.0.136.0'), INET_ATON('255.255.255.0')); |
INSERT into network_mask(network,mask) values(INET_ATON('10.0.136.0'), INET_ATON('255.255.255.0')); |
||
INSERT into network_mask(network,mask) values(INET_ATON('10.0.137.0'), INET_ATON('255.255.255.0')); |
INSERT into network_mask(network,mask) values(INET_ATON('10.0.137.0'), INET_ATON('255.255.255.0')); |
||
+ | </PRE> |
||
+ | |||
+ | |||
+ | <PRE> |
||
+ | DROP TABLE network_gateway; |
||
+ | CREATE TABLE network_gateway |
||
+ | ( |
||
+ | network int UNSIGNED, |
||
+ | gateway int UNSIGNED |
||
+ | ); |
||
+ | |||
+ | INSERT into network_gateway values(INET_ATON('10.0.135.0'), INET_ATON('10.0.135.254')); |
||
+ | INSERT into network_gateway values(INET_ATON('10.0.136.0'), INET_ATON('10.0.136.254')); |
||
+ | INSERT into network_gateway values(INET_ATON('10.0.137.0'), INET_ATON('10.0.137.254')); |
||
+ | |||
+ | INSERT into network_gateway values(INET_ATON('10.100.135.0'), INET_ATON('10.100.135.254')); |
||
+ | INSERT into network_gateway values(INET_ATON('10.100.136.0'), INET_ATON('10.100.136.254')); |
||
+ | INSERT into network_gateway values(INET_ATON('10.100.137.0'), INET_ATON('10.100.137.254')); |
||
</PRE> |
</PRE> |
Версия 21:45, 26 марта 2010
Конфиг для DHCP средсвами MYSQL
Есть желание уйти от всяких скриптов (php, bash, perl) для получения конфига из MySQL для dhcpd а так же с помошью представлений отказаться от привязки к конкретным таблицам. Заодно проверить какое из решений будет работать быстрее.
Создание представдения
Для того что бы не быть привязаным к структуре базы (которую программист биллинга вообще-то может менять по своему усмотрению) все данные для dhcp буду получать из view. Стараюсь хранить данные в виде их "физических сущностей" - а именно IP - как INT UNSIGNED
DROP view mtraf_status; CREATE VIEW mtraf_status AS SELECT domain AS domain, IF( 0n_a<0 OR ( 0n_a=0 AND debt=0 ) ,0,1) AS status, ip AS ip, mac AS mac, IF( 0n_a<0 OR ( 0n_a=0 AND debt=0), inet_ntoa(inet_aton(ip)+6553600),ip) AS ip_dhcp, lower(substr(replace(concat(':', mac), ':0', ':') from 2)) AS mac_dhcp , INET_NTOA(network_mask.network) AS network FROM mtraf, network_mask WHERE INET_ATON(mtraf.ip)&network_mask.mask=network_mask.network;
Условие в IF - условие когда абонент "должен" - ему нужно дать другой IP (у меня вместо, например, 10,0,136,10 он получит 10,100,136,10) и соответвенно, пускать только на биллинг (если короко, то файрволл не пускает абонентов никуда кроме отдельного ДНСа (или отдельного view) который на все запросы отвечает адресом странички "дай денег, дорогой абонент" и собственно биллинга) Всем кто будет напоминать про dhcp snooping, opt 82 и прочее - это все делается для остатоков неуправляемых сегментов.
Нужно добавить данные о сетях, релеях, гейтвеях. Отмечу, что в сети есть как минимум 2 релея (т.к. сети 10.0... и 10.100... - алиасы ) и запрос прийти может через любой из них. В общем случае релеев может быть сколько угодно - по числу алиасов на интерфейсе.
DROP TABLE network_relay; CREATE TABLE network_relay ( network int(64) UNSIGNED, relay int(64) UNSIGNED ); INSERT into network_relay values(INET_ATON('10.0.135.0'), INET_ATON('10.0.135.1')); INSERT into network_relay values(INET_ATON('10.0.135.0'), INET_ATON('10.0.135.254')); INSERT into network_relay values(INET_ATON('10.0.135.0'), INET_ATON('10.100.135.1')); INSERT into network_relay values(INET_ATON('10.0.135.0'), INET_ATON('10.100.135.254')); INSERT into network_relay values(INET_ATON('10.0.136.0'), INET_ATON('10.0.136.1')); INSERT into network_relay values(INET_ATON('10.0.136.0'), INET_ATON('10.0.136.254')); INSERT into network_relay values(INET_ATON('10.0.136.0'), INET_ATON('10.100.136.1')); INSERT into network_relay values(INET_ATON('10.0.136.0'), INET_ATON('10.100.136.254')); INSERT into network_relay values(INET_ATON('10.0.137.0'), INET_ATON('10.0.137.1')); INSERT into network_relay values(INET_ATON('10.0.137.0'), INET_ATON('10.0.137.254')); INSERT into network_relay values(INET_ATON('10.0.137.0'), INET_ATON('10.100.137.1')); INSERT into network_relay values(INET_ATON('10.0.137.0'), INET_ATON('10.100.137.254'));
DROP TABLE network_mask; CREATE TABLE network_mask ( network int UNSIGNED NOT NULL UNIQUE, mask int UNSIGNED, is_dhcp int DEFAULT 1 ); INSERT into network_mask(network,mask) values(INET_ATON('10.0.135.0'), INET_ATON('255.255.255.0')); INSERT into network_mask(network,mask) values(INET_ATON('10.0.136.0'), INET_ATON('255.255.255.0')); INSERT into network_mask(network,mask) values(INET_ATON('10.0.137.0'), INET_ATON('255.255.255.0'));
DROP TABLE network_gateway; CREATE TABLE network_gateway ( network int UNSIGNED, gateway int UNSIGNED ); INSERT into network_gateway values(INET_ATON('10.0.135.0'), INET_ATON('10.0.135.254')); INSERT into network_gateway values(INET_ATON('10.0.136.0'), INET_ATON('10.0.136.254')); INSERT into network_gateway values(INET_ATON('10.0.137.0'), INET_ATON('10.0.137.254')); INSERT into network_gateway values(INET_ATON('10.100.135.0'), INET_ATON('10.100.135.254')); INSERT into network_gateway values(INET_ATON('10.100.136.0'), INET_ATON('10.100.136.254')); INSERT into network_gateway values(INET_ATON('10.100.137.0'), INET_ATON('10.100.137.254'));