Ip абонента: відмінності між версіями
Sv (обговорення | внесок) Немає опису редагування |
Sv (обговорення | внесок) Немає опису редагування |
||
(Не показано 19 проміжних версій цього користувача) | |||
Рядок 1: | Рядок 1: | ||
<h2>Типы ip</h2> | |||
< | <br> | ||
* В зависимости от географического положения. Необходимо установить модули <b>place ip</b> и <b>географических карт</b>. На карте создаются узлы, а в учетке абонента соответствующее поле указывает к какому узлу подключен абонент. В настройках каждого узла можно указать диапазон ip актуальный для данной точки подключения. В учетке абонента появится кнопка | * Статический - привязывается к учетной записи оператором. | ||
* Динамический - привязывается к учетной записи в момент подключения. Освобождается через некоторое время после отключения. При повторном подключении может быть выдан иной ip чем в предыдущий раз. | |||
<br> | |||
<h2>Выдача ip в зависимости от разных условий</h2> | |||
<br> | |||
* на основе [[Модуль Place ip|географического положения]] | |||
* на основе значения определенного поля в учетке абонента | |||
* в зависимости от того, '''[[Выдача ip в зависимости от того, к какому NAS подключен абонент|к какому NAS подключен абонент]]'''. | |||
* '''[[Привязка ip к login|в зависимости от логина]]''' | |||
<br><br> | |||
<h2>Статический ip</h2> | |||
* В зависимости от географического положения. Необходимо установить модули <b>place ip</b> и <b>географических карт</b>. На карте создаются узлы, а в учетке абонента соответствующее поле указывает к какому узлу подключен абонент. В настройках каждого узла можно указать диапазон ip актуальный для данной точки подключения. В учетке абонента появится кнопка «+ip по топологии», при активации которой произойдет выдача свободного ip из указанного диапазона | |||
* В зависимости от значения одного из полей учетной записи абонента. Необходимо создать допполе: | * В зависимости от значения одного из полей учетной записи абонента. Необходимо создать допполе: | ||
<pre> | <pre> | ||
имя: неважно (например, | имя: неважно (например, «район») | ||
имя в бд: _ip_tag | имя в бд: _ip_tag | ||
тип: выпадающий список | тип: выпадающий список | ||
Рядок 13: | Рядок 27: | ||
Поставить галку в каких группах будет это поле. | Поставить галку в каких группах будет это поле. | ||
В разделе | В разделе «ip пул» для разных сетей поставить свои теги, например, для пула 10.0.0.2-10.0.0.254 поставим тег «Оболонь», а для 10.0.1.2-10.0.1.254 - «Троещина». | ||
Открываем учетку абонента. Кликаем по полю «район» (по новому полю, которое мы создали выше). Выпадающий список пуст. Напишем слово «Оболонь» в поле ввода и нажмем на кнопку «+» - этим мы добавим район в выпадающий список. В дальнейшем нет необходимости вручную набирать и добавлять этот район - он будет предложен автоматически в выпадающем списке. После сохранения данных абонента нажмем на кнопку «Добавить ip». При этом после выбора пула 10.0.0.0/8 админка предложит выбрать несколько ip из пула 10.0.0.2-10.0.0.254 (как мы указали ранее). Если же в поле «район» выбрать «Троещина», то будет предложен вариант из пула 10.0.1.2-10.0.1.254 | |||
<h2>Динамический ip. Выдача ip по значению допполя</h2> | |||
Необходимо создать допполе _ip_tag точно так же как описано выше. После этого, в mysql необходимо изменить процедуру получения ip: | |||
<pre> | |||
DROP FUNCTION IF EXISTS `get_ip`; | |||
DELIMITER $$ | |||
CREATE FUNCTION `get_ip` ( user_id INTEGER UNSIGNED ) | |||
RETURNS VARCHAR(15) NO SQL | |||
BEGIN | |||
DECLARE user_ip VARCHAR(15); | |||
DECLARE real_ip VARCHAR(15) DEFAULT 0; | |||
DECLARE tag VARCHAR(64) CHARACTER SET utf8; | |||
DECLARE row_cnt INTEGER; | |||
DECLARE ip_id INTEGER; | |||
DECLARE tries INTEGER DEFAULT 30; | |||
DECLARE id_min INTEGER; | |||
DECLARE id_max INTEGER; | |||
SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool | |||
WHERE uid = user_id AND type='static' LIMIT 1; | |||
IF( user_ip IS NOT NULL ) THEN RETURN user_ip; END IF; | |||
SELECT _ip_tag INTO tag FROM data0 WHERE uid=user_id; | |||
SELECT 1 INTO real_ip FROM users_services WHERE uid = user_id AND tags LIKE '%,realip,%'; | |||
SELECT id, INET_NTOA(ip) INTO ip_id, user_ip FROM ip_pool | |||
WHERE uid = user_id AND type = 'dynamic' AND realip = IF(real_ip>0,1,0) | |||
AND tags LIKE CONCAT('%,', tag, ',%') | |||
LIMIT 1; | |||
IF( ip_id IS NOT NULL) THEN | |||
UPDATE ip_pool SET `release` = UNIX_TIMESTAMP() + 3600 | |||
WHERE id = ip_id AND uid = user_id; | |||
SELECT ROW_COUNT() INTO row_cnt; | |||
IF( row_cnt > 0 ) THEN RETURN user_ip; END IF; | |||
END IF; | |||
SELECT MAX(id), MIN(id) INTO id_max, id_min | |||
FROM ip_pool | |||
WHERE type = 'dynamic' AND realip = IF(real_ip>0,1,0) | |||
AND tags LIKE CONCAT('%,', tag, ',%'); | |||
sel_ip: WHILE tries > 0 DO | |||
SELECT id, INET_NTOA(ip) INTO ip_id, user_ip | |||
FROM ip_pool | |||
WHERE uid = 0 | |||
AND id >= (CEIL(RAND() * (id_max - id_min)) + id_min) | |||
AND id <= id_max | |||
LIMIT 1; | |||
IF( user_ip IS NOT NULL) THEN | |||
UPDATE ip_pool SET uid = user_id, `release` = UNIX_TIMESTAMP() + 3600 | |||
WHERE id = ip_id AND uid = 0; | |||
SELECT ROW_COUNT() INTO row_cnt; | |||
IF( row_cnt > 0 ) THEN RETURN user_ip; END IF; | |||
SET tries = tries - 5; | |||
END IF; | |||
SET tries = tries - 1; | |||
END WHILE; | |||
END$$ | |||
DELIMITER ; | |||
</pre> | |||
Проверка: | |||
<pre> | |||
SELECT get_ip(371); | |||
</pre> | |||
где 371 - id абонента. Не забывайте, что в пуле должны быть свободные <b>динамические</b> ip с заданным тегом |
Поточна версія на 13:44, 26 листопада 2019
Типы ip
- Статический - привязывается к учетной записи оператором.
- Динамический - привязывается к учетной записи в момент подключения. Освобождается через некоторое время после отключения. При повторном подключении может быть выдан иной ip чем в предыдущий раз.
Выдача ip в зависимости от разных условий
- на основе географического положения
- на основе значения определенного поля в учетке абонента
- в зависимости от того, к какому NAS подключен абонент.
- в зависимости от логина
Статический ip
- В зависимости от географического положения. Необходимо установить модули place ip и географических карт. На карте создаются узлы, а в учетке абонента соответствующее поле указывает к какому узлу подключен абонент. В настройках каждого узла можно указать диапазон ip актуальный для данной точки подключения. В учетке абонента появится кнопка «+ip по топологии», при активации которой произойдет выдача свободного ip из указанного диапазона
- В зависимости от значения одного из полей учетной записи абонента. Необходимо создать допполе:
имя: неважно (например, «район») имя в бд: _ip_tag тип: выпадающий список тип объекта: ip_tags (можно иное в латинице)
Поставить галку в каких группах будет это поле.
В разделе «ip пул» для разных сетей поставить свои теги, например, для пула 10.0.0.2-10.0.0.254 поставим тег «Оболонь», а для 10.0.1.2-10.0.1.254 - «Троещина».
Открываем учетку абонента. Кликаем по полю «район» (по новому полю, которое мы создали выше). Выпадающий список пуст. Напишем слово «Оболонь» в поле ввода и нажмем на кнопку «+» - этим мы добавим район в выпадающий список. В дальнейшем нет необходимости вручную набирать и добавлять этот район - он будет предложен автоматически в выпадающем списке. После сохранения данных абонента нажмем на кнопку «Добавить ip». При этом после выбора пула 10.0.0.0/8 админка предложит выбрать несколько ip из пула 10.0.0.2-10.0.0.254 (как мы указали ранее). Если же в поле «район» выбрать «Троещина», то будет предложен вариант из пула 10.0.1.2-10.0.1.254
Динамический ip. Выдача ip по значению допполя
Необходимо создать допполе _ip_tag точно так же как описано выше. После этого, в mysql необходимо изменить процедуру получения ip:
DROP FUNCTION IF EXISTS `get_ip`; DELIMITER $$ CREATE FUNCTION `get_ip` ( user_id INTEGER UNSIGNED ) RETURNS VARCHAR(15) NO SQL BEGIN DECLARE user_ip VARCHAR(15); DECLARE real_ip VARCHAR(15) DEFAULT 0; DECLARE tag VARCHAR(64) CHARACTER SET utf8; DECLARE row_cnt INTEGER; DECLARE ip_id INTEGER; DECLARE tries INTEGER DEFAULT 30; DECLARE id_min INTEGER; DECLARE id_max INTEGER; SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool WHERE uid = user_id AND type='static' LIMIT 1; IF( user_ip IS NOT NULL ) THEN RETURN user_ip; END IF; SELECT _ip_tag INTO tag FROM data0 WHERE uid=user_id; SELECT 1 INTO real_ip FROM users_services WHERE uid = user_id AND tags LIKE '%,realip,%'; SELECT id, INET_NTOA(ip) INTO ip_id, user_ip FROM ip_pool WHERE uid = user_id AND type = 'dynamic' AND realip = IF(real_ip>0,1,0) AND tags LIKE CONCAT('%,', tag, ',%') LIMIT 1; IF( ip_id IS NOT NULL) THEN UPDATE ip_pool SET `release` = UNIX_TIMESTAMP() + 3600 WHERE id = ip_id AND uid = user_id; SELECT ROW_COUNT() INTO row_cnt; IF( row_cnt > 0 ) THEN RETURN user_ip; END IF; END IF; SELECT MAX(id), MIN(id) INTO id_max, id_min FROM ip_pool WHERE type = 'dynamic' AND realip = IF(real_ip>0,1,0) AND tags LIKE CONCAT('%,', tag, ',%'); sel_ip: WHILE tries > 0 DO SELECT id, INET_NTOA(ip) INTO ip_id, user_ip FROM ip_pool WHERE uid = 0 AND id >= (CEIL(RAND() * (id_max - id_min)) + id_min) AND id <= id_max LIMIT 1; IF( user_ip IS NOT NULL) THEN UPDATE ip_pool SET uid = user_id, `release` = UNIX_TIMESTAMP() + 3600 WHERE id = ip_id AND uid = 0; SELECT ROW_COUNT() INTO row_cnt; IF( row_cnt > 0 ) THEN RETURN user_ip; END IF; SET tries = tries - 5; END IF; SET tries = tries - 1; END WHILE; END$$ DELIMITER ;
Проверка:
SELECT get_ip(371);
где 371 - id абонента. Не забывайте, что в пуле должны быть свободные динамические ip с заданным тегом