Ip абонента: відмінності між версіями

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку
Немає опису редагування
Немає опису редагування
 
(Не показано 20 проміжних версій цього користувача)
Рядок 1: Рядок 1:
Абоненту можно выдать определенный ip в зависимости от разных условий
<h2>Типы ip</h2>
<h1>Статический ip</h1>
<br>
* В зависимости от географического положения. Необходимо установить модули <b>place ip</b> и <b>географических карт</b>. На карте создаются узлы, а в учетке абонента соответствующее поле указывает к какому узлу подключен абонент. В настройках каждого узла можно указать диапазон ip актуальный для данной точки подключения. В учетке абонента появится кнопка "+ip по топологии", при активации которой произойдет выдача свободного 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.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,%';


Если клиенту в поле проставить поле ip тег = r1 - будут предлагаться ip только из пула с этим тегом.
    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>


Открываем учетку абонента. Кликаем по полю "район" (по новому полю, которое мы создали выше). Выпадающий список пуст. Напишем слово "Оболонь" в поле ввода и нажмем на кнопку "+" - эти мы добавим район в выпадающий список. В дальнейшем нет необходимости вручную набирать и добавлять этот район - он будет предложен автоматически в выпадающем списке. После сохранения данных абонента нажмем на кнопку "Добавить ip".  При этом после выбора пула  10.0.0.0/8 админка предложит выбрать несколько ip из пула 10.0.0.2-10.0.0.254 (как мы указали ранее). Если же в поле "район" выбрать "Троещина", то будет предложен вариант из пула 10.0.1.2-10.0.1.254
где 371 - id абонента. Не забывайте, что в пуле должны быть свободные <b>динамические</b> ip с заданным тегом

Поточна версія на 13:44, 26 листопада 2019

Типы ip


  • Статический - привязывается к учетной записи оператором.
  • Динамический - привязывается к учетной записи в момент подключения. Освобождается через некоторое время после отключения. При повторном подключении может быть выдан иной ip чем в предыдущий раз.


Выдача ip в зависимости от разных условий




Статический 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 с заданным тегом