<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="uk">
	<id>https:///index.php?action=history&amp;feed=atom&amp;title=Ip_%D0%B0%D0%B1%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D0%B0</id>
	<title>Ip абонента - Історія редагувань</title>
	<link rel="self" type="application/atom+xml" href="https:///index.php?action=history&amp;feed=atom&amp;title=Ip_%D0%B0%D0%B1%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D0%B0"/>
	<link rel="alternate" type="text/html" href=""/>
	<updated>2026-05-05T12:27:28Z</updated>
	<subtitle>Історія редагувань цієї сторінки в вікі</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id></id>
		<title>Sv в 13:44, 26 листопада 2019</title>
		<link rel="alternate" type="text/html" href=""/>
		<updated>2019-11-26T13:44:29Z</updated>

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