Вы можете настроить проверку IP-адресов перед тем, как платформа выделит их виртуальным машинам (ВМ). Если IP-адрес не пройдёт проверку, VMmanager не будет назначать его ВМ. Например, можно запретить выдачу IP-адресов, назначенных каким-либо устройствам в сети.
Чтобы включить проверку IP-адресов:
- Создайте скрипт для проверки.
- Настройте запуск скрипта из платформы.
Требования к скрипту
В качестве входного параметра скрипт должен принимать JSON-массив с IP-адресами для проверки:
[{"name":"192.168.0.1"}, {"name": "192.168.0.2"}, {"name": "192.168.0.3"}]
Если все IP-адреса прошли проверку, скрипт должен возвращать пустой ответ или ответ вида:
{"bad_ips": []}
Если какие-то IP-адреса не прошли проверку, скрипт должен выдать ответ вида:
{"bad_ips": [{"name": "192.168.0.2"}, {"name": "192.168.0.3"}]}
- Cкрипт будет запускаться из docker-контейнера ipmgr, поэтому в скрипте можно использовать только команды, доступные в этом контейнере.
- Файл скрипта не должен находиться в docker-контейнере VMmanager, так как после обновления контейнера файл будет удалён.
- Скрипт должен выполняться не более одной минуты. В противном случае тайм-аут на выделение IP-адреса будет превышен, и платформа не сможет выдать IP-адрес.
Настройка запуска скрипта
- Подключитесь к серверу с VMmanager по SSH.
-
Добавьте команду запуска скрипта в базу данных 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.
MySQLdocker exec -it mysql bash -c 'mysql -p$MYSQL_ROOT_PASSWORD isp'
PostgreSQLdocker 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.
-
Создайте на сервере с 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)
-
Запустите веб-сервис:
python3 /root/checkip.py start
Обратите внимание!Для остановки веб-сервиса вы можете использовать команду:
python3 /root/checkip.py stop
Для перезапуска веб-сервиса вы можете использовать команду:
python3 /root/checkip.py restart
-
Добавьте команду запуска скрипта в базу данных VMmanager:
MySQLdocker exec -it mysql bash -c 'mysql -p$MYSQL_ROOT_PASSWORD isp'
PostgreSQLdocker 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");
Пояснения к команде