VMmanager

Как настроить проверку IP-адреса перед выдачей?

Вы можете настроить проверку IP-адресов перед тем, как платформа выделит их виртуальным машинам (ВМ). Если IP-адрес не пройдёт проверку, VMmanager не будет назначать его ВМ. Например, можно запретить выдачу IP-адресов, назначенных каким-либо устройствам в сети.

Чтобы включить проверку IP-адресов:

  1. Создайте скрипт для проверки.
  2. Настройте запуск скрипта из платформы.

Требования к скрипту

В качестве входного параметра скрипт должен принимать JSON-массив с IP-адресами для проверки:

Пример входного параметра
[{"name":"192.168.0.1"}, {"name": "192.168.0.2"}, {"name": "192.168.0.3"}]
Пояснения

Если все IP-адреса прошли проверку, скрипт должен возвращать пустой ответ или ответ вида:

{"bad_ips": []}

Если какие-то IP-адреса не прошли проверку, скрипт должен выдать ответ вида:

Пример ответа в JSON
{"bad_ips": [{"name": "192.168.0.2"}, {"name": "192.168.0.3"}]}
Пояснения
Обратите внимание!
  1. Cкрипт будет запускаться из docker-контейнера ipmgr, поэтому в скрипте можно использовать только команды, доступные в этом контейнере.
  2. Файл скрипта не должен находиться в docker-контейнере VMmanager, так как после обновления контейнера файл будет удалён.
  3. Скрипт должен выполняться не более одной минуты. В противном случае тайм-аут на выделение IP-адреса будет превышен, и платформа не сможет выдать IP-адрес.

Настройка запуска скрипта

  1. Подключитесь к серверу с VMmanager по SSH.
  2. Добавьте команду запуска скрипта в базу данных VMmanager:

    В связи с поэтапным переходом платформы на использование СУБД PostgreSQL, разные экземпляры VMmanager могут использовать разные СУБД:

    • VMmanager Hosting — MySQL;
    • VMmanager Infrastructure:
      • для новых установок на ОС Astra Linux, начиная с версии VMmanager 2023.06.1 — PostgreSQL;
      • в остальных случаях — MySQL.

    Чтобы определить тип СУБД, выполните на сервере с платформой команду: 

    docker ps --filter name=pgsql
    Пример ответа
    CONTAINER ID   IMAGE         COMMAND                  CREATED      STATUS      PORTS      NAMES
    3213c5dc94d0   postgres:12   "docker-entrypoint.s…"   5 days ago   Up 4 days   5432/tcp   pgsql

    Если вывод команды содержит информацию о контейнере, платформа использует PostgreSQL, если ответ пустой — MySQL.

    MySQL
    docker exec -it mysql bash -c 'mysql -p$MYSQL_ROOT_PASSWORD isp'
    PostgreSQL
    docker exec -it pgsql bash -c "psql -d isp"
    INSERT INTO ip_settings (name, value) VALUES ("ip_check_script", "<script_running>");
    Пояснения к команде

Пример скрипта

В примере рассматривается создание веб-сервиса на языке Python с использованием фреймворка aiohttp. Веб-сервис запускается на сервере с VMmanager и использует порт 5000/TCP. VMmanager отправляет запрос в этот сервис с помощью утилиты curl.

  1. Создайте на сервере с VMmanager файл /root/checkip.py следующего содержания:

    #!/usr/bin/python3.6
    
    import json
    import os
    import sys
    import logging
    import asyncio
    
    from aiohttp import web
    
    log = logging.getLogger(__name__)
    
    def get_error(ip, err):
        log.error(f'{err}')
        return web.json_response(data={'bad_ips':[ip]}, status=200)
    
    
    async def ckeckip(req):
        if "application/json" in req.headers["Content-Type"]:
            body = await req.json()
        else:
            return web.json_response(status=400)
    
    
        ips = []
        for ip in body:
            ip = ip['name']
    
            #IPv6-stub
            if ":" in ip:
                log.info(f'Skipping IPv6 {ip}')
                continue
    
            if "/" in ip and '/32' not in ip:
                log.info(f'Skipping {ip}')
                continue
    
            log.info(f'Checking {ip}')
    		if ip in ['192.168.0.2', '192.168.0.3']:   // вставьте сюда список запрещённых IP-адресов или код для проверки IP-адреса
                ips.append(ip)
                log.error('FAIL')
    
        return web.json_response(data={'bad_ips':ips}, status=200)
    
    
    app = web.Application()
    app.add_routes([web.post('/checkip', ckeckip)])
    
    async def shutdown(this_app):
        asyncio.create_task(stop())
    
    async def stop():
        await app.shutdown()
        await app.cleanup()
    
    if __name__ == '__main__':
        os.chdir(os.path.dirname(os.path.abspath(__file__)))
        if len(sys.argv) == 2:
            if 'start' == sys.argv[1]:
                web.run_app(app, host='0.0.0.0', port=5000)
            elif 'stop' == sys.argv[1]:
                app.on_shutdown.append(shutdown)
            elif 'restart' == sys.argv[1]:
                app.on_shutdown.append(shutdown)
                app.on_startup(web.run_app(app))
            else:
                print ("Unknown command")
                sys.exit(2)
            sys.exit(0)
        else:
            print ("usage: %s start|stop|restart" % sys.argv[0])
            sys.exit(2)
  2. Запустите веб-сервис:

    python3 /root/checkip.py start
    Обратите внимание!

    Для остановки веб-сервиса вы можете использовать команду:

    python3 /root/checkip.py stop

    Для перезапуска веб-сервиса вы можете использовать команду:

    python3 /root/checkip.py restart
  3. Добавьте команду запуска скрипта в базу данных VMmanager:

    MySQL
    docker exec -it mysql bash -c 'mysql -p$MYSQL_ROOT_PASSWORD isp'
    PostgreSQL
    docker exec -it pgsql bash -c "psql -d isp"
    INSERT INTO ip_settings (name, value) VALUES ("ip_check_script", "/usr/bin/curl -X POST -k 192.168.2.1:5000/checkip -H "Content-Type: application/json" -d");
    Пояснения к команде