From 170759c30068e6ab6b6774dd9f5ead2d8ad53ea4 Mon Sep 17 00:00:00 2001 From: sShemet Date: Tue, 13 May 2025 16:11:25 +0500 Subject: [PATCH] vault backup: 2025-05-13 16:11:25 --- .obsidian/workspace.json | 22 +- .../Mol/Серверы/PROXY_PASS/Angie config.md | 228 +++++++++++++++ .../Mol/Серверы/PROXY_PASS/Traefik config.md | 270 ++++++++++++++++++ 3 files changed, 508 insertions(+), 12 deletions(-) create mode 100644 WORK & PROJECTS/Mol/Серверы/PROXY_PASS/Angie config.md create mode 100644 WORK & PROJECTS/Mol/Серверы/PROXY_PASS/Traefik config.md diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 5e9157f..0d1a117 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -11,17 +11,14 @@ "id": "343836aed0394d03", "type": "leaf", "state": { - "type": "canvas", + "type": "markdown", "state": { - "file": "WORK & PROJECTS/Mol/Серверы/Схема инфраструктуры.canvas", - "viewState": { - "x": -1720, - "y": -620, - "zoom": -0.7358730571651942 - } + "file": "WORK & PROJECTS/Mol/Серверы/PROXY_PASS/Traefik config.md", + "mode": "source", + "source": false }, - "icon": "lucide-layout-dashboard", - "title": "Схема инфраструктуры" + "icon": "lucide-file", + "title": "Traefik config" } } ] @@ -174,9 +171,12 @@ }, "active": "343836aed0394d03", "lastOpenFiles": [ + "WORK & PROJECTS/Mol/Серверы/PROXY_PASS/Angie config.md", + "WORK & PROJECTS/Mol/Серверы/PROXY_PASS/Traefik config.md", + "WORK & PROJECTS/Mol/Серверы/Схема инфраструктуры.canvas", + "WORK & PROJECTS/Mol/Серверы/PROXY_PASS", "WORK & PROJECTS/Mol/Серверы/Untitled.canvas", "WORK & PROJECTS/Mol/Серверы/git.moldev.ru.md", - "WORK & PROJECTS/Mol/Серверы/Схема инфраструктуры.canvas", "WORK & PROJECTS/Mol/Планы и диаграммы/Alfa Cloud/Alfa cloud readme.md", "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Структура таблиц. Основа + заказы.canvas", "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Схема образца испытаний и заявки.canvas", @@ -209,13 +209,11 @@ "WORK & PROJECTS/Mol/Документы ООО Моль-софт/Счета оплаты серверов", "SKILLS DOCS/JAPANESE частицы.md", "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы", - "WORK & PROJECTS/Mol/Планы и диаграммы/План СИЛА.md", "PERSONAL PROJECTS/P2EP/cdRead.canvas", "WORK & PROJECTS/Mol/Code Chunks", "PERSONAL PROJECTS/PS1 DOCS", "PERSONAL PROJECTS/P2EP/pseudoCode", "WORK & PROJECTS/Mol/Документы для ТЗ ЛИМС/СМК/КУ_Чек_лист_10_ошибок_УД_скачивание.pdf", - "WORK & PROJECTS/Mol/Документы для ТЗ ЛИМС/СМК", "WORK & PROJECTS/Mol/Планы и диаграммы/Схема связей юрлиц и адресов.canvas", "Структура объектов испытаний.png", "Схема связей юрлиц и адресов.png", diff --git a/WORK & PROJECTS/Mol/Серверы/PROXY_PASS/Angie config.md b/WORK & PROJECTS/Mol/Серверы/PROXY_PASS/Angie config.md new file mode 100644 index 0000000..7c9aca1 --- /dev/null +++ b/WORK & PROJECTS/Mol/Серверы/PROXY_PASS/Angie config.md @@ -0,0 +1,228 @@ + + +--- + +## 🧩 Цель + +- Разделить пользователей на **группы**: + - `public` — публичный доступ ко всем общедоступным сайтам. + - `internal` — сотрудникам доступны внутренние сервисы (git, jira и т.д.). + - `client-X` — клиенты с доступом только к своему поддомену (`client1.site.com`, `client2.site.com`). + +- Каждая группа имеет свои **IP-подсети**. +- Каждый домен/поддомен имеет список разрешённых групп. + +--- + +# ✅ Архитектура решения + +## 1. **Группы как файлы IP-диапазонов** + +Создаём отдельные файлы для каждой группы, где указываем её IP-разрешения: + +``` +/etc/angie/groups/public.conf +/etc/angie/groups/internal.conf +/etc/angie/groups/client1.conf +/etc/angie/groups/client2.conf +... +``` + +### Пример: `/etc/angie/groups/public.conf` +```nginx +allow all; +``` + +> Или точнее: +```nginx +deny all; +``` + +Но если нужна фильтрация, то: + +```nginx +allow 0.0.0.0/0; # все IP +``` + +### Пример: `/etc/angie/groups/internal.conf` +```nginx +allow 192.168.1.0/24; +allow 10.10.0.0/16; +deny all; +``` + +### Пример: `/etc/angie/groups/client1.conf` +```nginx +allow 203.0.113.0/24; +deny all; +``` + +--- + +## 2. **Конфигурации доменов с подключением групп** + +Для каждого домена или поддомена создаётся конфиг, который подключает нужные группы через `include`. + +### Пример: `/etc/angie/conf.d/site1.com.conf` +```nginx +server { + listen 80; + server_name site1.com www.site1.com; + + location / { + # Публичный доступ + сотрудники + include /etc/angie/groups/public.conf; + include /etc/angie/groups/internal.conf; + + proxy_pass http://192.168.10.10:8080; + proxy_set_header Host $host; + } +} +``` + +### Пример: `/etc/angie/conf.d/git.site1.com.conf` +```nginx +server { + listen 80; + server_name git.site1.com; + + location / { + # Только сотрудники + include /etc/angie/groups/internal.conf; + + proxy_pass http://192.168.10.11:3000; + proxy_set_header Host $host; + } +} +``` + +### Пример: `/etc/angie/conf.d/client1.site.com.conf` +```nginx +server { + listen 80; + server_name client1.site.com; + + location / { + # Только клиент 1 + include /etc/angie/groups/client1.conf; + + proxy_pass http://192.168.20.10:8000; + proxy_set_header Host $host; + } +} +``` + +--- + +## 3. **Как управлять динамически?** + +Ты хочешь, чтобы при добавлении нового клиента или сайта всё происходило автоматически. + +### 📦 Шаги: + +1. Получаешь данные о новом клиенте: + ```json + { + "name": "client3", + "domain": "client3.site.com", + "backend": "192.168.20.30:8080", + "allowed_ips": ["198.51.100.0/24"] + } + ``` + +2. Генерируешь файл группы: + ``` + /etc/angie/groups/client3.conf + ``` + + С содержимым: + ```nginx + allow 198.51.100.0/24; + deny all; + ``` + +3. Генерируешь конфиг сервера: + ``` + /etc/angie/conf.d/client3.site.com.conf + ``` + + Содержимое: + ```nginx + server { + listen 80; + server_name client3.site.com; + + location / { + include /etc/angie/groups/client3.conf; + + proxy_pass http://192.168.20.30:8080; + proxy_set_header Host $host; + } + } + ``` + +4. Отправляешь обновлённый конфиг в Angie через `/control`: + ```bash + curl -X POST http://localhost/control/nginx --data-binary @client3.site.com.conf + ``` + +--- + +## 🔄 Автоматизация всего процесса + +Можно написать небольшой **API-сервис**, который: + +- Принимает запросы на создание/обновление/удаление групп и сайтов. +- Генерирует конфиги на основе шаблонов. +- Обновляет конфиг в Angie через `/control`. +- Хранит данные в БД (например, PostgreSQL или Redis). + +Пример структуры такого API: + +| Метод | URL | Описание | +|-------|----------------------------|----------------------------------| +| POST | `/api/group` | Создать группу | +| POST | `/api/domain` | Создать новый домен | +| DELETE| `/api/domain/{domain}` | Удалить домен | +| GET | `/api/status` | Проверить текущие правила | + +--- + +## 🔐 Как работает проверка доступа? + +Когда клиент делает запрос: + +1. Angie проверяет IP по `allow/deny` из файла группы. +2. Если IP не проходит — возвращает `403 Forbidden`. +3. Если проходит — проксирует запрос на бэкенд. + +--- + +## 🧠 Полезные советы + +- Для тестирования используй `curl -H 'Host: domain.com' http:///` чтобы эмулировать хост. +- Все изменения применяются без перезапуска благодаря `/control`. +- Логи помогут отладить ACL: `access_log` и `error_log`. + +--- + +## 🎯 Вывод + +Ты можешь легко реализовать **гибкую систему контроля доступа по группам** в **Angie**, если: + +- Хранишь группы как файлы с IP-диапазонами. +- Подключаешь их через `include` в нужные домены. +- Генерируешь конфиги автоматически. +- Используешь `/control` API для динамического обновления. + +--- + +## 🚀 Нужны примеры кода? + +Если ты хочешь, могу показать: + +- Пример Python-скрипта, который создаёт группу и домен. +- Пример шаблона конфига с Jinja2. +- Пример работы с `/control`. + +Напиши, и я подготовлю! \ No newline at end of file diff --git a/WORK & PROJECTS/Mol/Серверы/PROXY_PASS/Traefik config.md b/WORK & PROJECTS/Mol/Серверы/PROXY_PASS/Traefik config.md new file mode 100644 index 0000000..d54fef8 --- /dev/null +++ b/WORK & PROJECTS/Mol/Серверы/PROXY_PASS/Traefik config.md @@ -0,0 +1,270 @@ +Отличный вопрос! Давай сравним, **как реализовать ту же задачу в Traefik**, и посмотрим, проще ли это будет по сравнению с Angie. + +--- + +# 🎯 Цель (повторение) + +Нужно организовать систему обратного прокси, где: + +- Пользователи разделены на группы: + - `public` — публичный доступ ко всем общедоступным сайтам. + - `internal` — сотрудникам доступны внутренние сервисы (git, jira и т.д.). + - `client-X` — клиенты с доступом только к своему поддомену (`client1.site.com`, `client2.site.com`). + +- Каждая группа имеет свои **IP-подсети**. +- Каждый домен/поддомен имеет список разрешённых групп. +- Конфиги должны обновляться **динамически** без перезапуска. +- Желательно наличие **GUI** и **API управления**. + +--- + +# ✅ Вывод сразу: **Traefik лучше подходит для этой задачи** + +Почему? + +| Функция | Traefik ✅ / ❌ | Angie ✅ / ❌ | +|----------------------------------|----------------------|----------------------| +| ACL по IP | ✅ | ✅ | +| Группы пользователей | ✅ через middleware | ✅ через allow/deny | +| Динамическая конфигурация | ✅ через API или файл | ✅ через `/control` | +| Поддержка GUI | ✅ встроенный dashboard | ❌ (нужно внешнее) | +| Простота автоматизации | ✅ | ⚠️ сложнее | +| Интеграция с Let’s Encrypt | ✅ | ⚠️ нужно допилить | +| Удобство масштабирования | ✅ | ✅ | + +--- + +# 🔧 Как реализовать в Traefik + +## 1. **Базовая структура конфигурации** + +Traefik использует два типа конфигов: + +- `traefik.yml` — статическая часть (порт, провайдеры, логирование и т.п.) +- `dynamic_conf.yml` — динамическая часть (маршруты, middleware, TLS и т.п.) + +Также можно управлять через **REST API**, но начнём с файла. + +--- + +## 2. **Middleware для групп доступа** + +В Traefik есть мощная система **middleware**, которую мы будем использовать для контроля доступа по IP. + +### Пример: определяем middleware для каждой группы + +```yaml +http: + middlewares: + public-access: + ipWhiteList: + sourceRange: + - "0.0.0.0/0" # все IP + + internal-access: + ipWhiteList: + sourceRange: + - "192.168.1.0/24" + - "10.10.0.0/16" + + client1-access: + ipWhiteList: + sourceRange: + - "203.0.113.0/24" +``` + +--- + +## 3. **Роуты с указанием middleware** + +Каждому роуту можно указать, какие middleware применять. + +### Пример: маршрут для site1.com + +```yaml +http: + routers: + site1-router: + rule: "Host(`site1.com`, `www.site1.com`)" + entryPoints: + - web + service: site1-service + middlewares: + - public-access + - internal-access +``` + +### Пример: маршрут для git.site1.com + +```yaml +http: + routers: + git-router: + rule: "Host(`git.site1.com`)" + entryPoints: + - web + service: git-service + middlewares: + - internal-access +``` + +### Пример: маршрут для client1.site.com + +```yaml +http: + routers: + client1-router: + rule: "Host(`client1.site.com`)" + entryPoints: + - web + service: client1-service + middlewares: + - client1-access +``` + +--- + +## 4. **Сервисы (бэкенды)** + +Определяешь бэкенд для каждого сайта: + +```yaml +http: + services: + site1-service: + loadBalancer: + servers: + - url: http://192.168.10.10:8080 + + git-service: + loadBalancer: + servers: + - url: http://192.168.10.11:3000 + + client1-service: + loadBalancer: + servers: + - url: http://192.168.20.10:8000 +``` + +--- + +## 5. **Динамическое обновление конфига** + +Можно использовать: + +### А. **Файл с динамическим конфигом** +Traefik следит за изменениями в файле и применяет их автоматически. + +Пример запуска: +```yaml +providers: + file: + filename: /etc/traefik/dynamic_conf.yml + watch: true +``` + +> При изменении `dynamic_conf.yml` — конфиг применяется без перезагрузки! + +### Б. **REST API** +Если хочешь полностью управлять через API, можешь использовать [Traefik Pilot](https://pilot.traefik.io/) или свой микросервис. + +Пример добавления маршрута через API: +```bash +curl -X POST "http://traefik:8080/api/http/routers" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "client2-router", + "rule": "Host(`client2.site.com`)", + "service": "client2-service", + "entryPoints": ["web"], + "middlewares": ["client2-access"] + }' +``` + +--- + +## 6. **Генерация конфигов** + +Как и в случае с Angie, можно написать небольшой **генератор конфигов**, который: + +- Получает данные о новом клиенте. +- Создаёт middleware с его IP-диапазоном. +- Создаёт новый роут. +- Обновляет `dynamic_conf.yml`. + +Или делает всё через API. + +--- + +## 7. **Dashboard (GUI)** + +Traefik предоставляет встроенный **веб-интерфейс** по адресу `http://localhost:8080`. + +Там ты увидишь: + +- Все маршруты, +- Сервисы, +- Middleware, +- Состояние бэкендов. + +--- + +## 🔄 Автоматизация всего процесса + +Ты можешь создать: + +- **API-сервис**, принимающий запросы на добавление клиентов/групп. +- **Шаблонизатор**, генерирующий YAML или JSON. +- **Систему хранения правил** (например, PostgreSQL или Redis). +- **Синхронизацию с файлом или API Traefik**. + +--- + +## 🔐 Как работает проверка доступа? + +1. Запрос приходит в Traefik. +2. Traefik проверяет IP клиента через middleware `ipWhiteList`. +3. Если IP не в списке — возвращает `403 Forbidden`. +4. Иначе — направляет запрос на нужный бэкенд. + +--- + +## 📦 Пример структуры проекта + +``` +traefik/ +├── traefik.yml # статический конфиг +├── dynamic_conf.yml # динамические маршруты и middleware +└── data/ + └── clients/ # шаблоны или скрипты для клиентов +``` + +--- + +## 🎯 Вывод + +| Задача | Реализация в Traefik | Реализация в Angie | +|----------------------------|------------------------------------------|--------------------------------------------| +| Группы доступа | ✅ middleware `ipWhiteList` | ✅ `allow` + файлы | +| Динамическое обновление | ✅ через файл или API | ✅ через `/control` | +| Управление через API | ✅ полноценное | ⚠️ ограниченное | +| GUI | ✅ встроенный | ❌ | +| Автоматизация | ✅ удобная | ⚠️ требует больше ручной работы | +| Масштабируемость | ✅ | ✅ | +| Простота внедрения | ✅ | ⚠️ требует глубоких знаний Nginx/Angie | + +--- + +## 🚀 Рекомендация + +> Для твоего сценария **Traefik — лучший выбор**. Он: +> +> - Поддерживает готовые механизмы ACL и middleware. +> - Легко автоматизируется через API или файлы. +> - Имеет встроенный GUI. +> - Современная архитектура позволяет легко масштабироваться. +> - Позволяет быстро внедрить систему контроля доступа по группам. + +--- +