vault backup: 2025-05-13 16:11:25
This commit is contained in:
228
WORK & PROJECTS/Mol/Серверы/PROXY_PASS/Angie config.md
Normal file
228
WORK & PROJECTS/Mol/Серверы/PROXY_PASS/Angie config.md
Normal file
@@ -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://<proxy-ip>/` чтобы эмулировать хост.
|
||||
- Все изменения применяются без перезапуска благодаря `/control`.
|
||||
- Логи помогут отладить ACL: `access_log` и `error_log`.
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Вывод
|
||||
|
||||
Ты можешь легко реализовать **гибкую систему контроля доступа по группам** в **Angie**, если:
|
||||
|
||||
- Хранишь группы как файлы с IP-диапазонами.
|
||||
- Подключаешь их через `include` в нужные домены.
|
||||
- Генерируешь конфиги автоматически.
|
||||
- Используешь `/control` API для динамического обновления.
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Нужны примеры кода?
|
||||
|
||||
Если ты хочешь, могу показать:
|
||||
|
||||
- Пример Python-скрипта, который создаёт группу и домен.
|
||||
- Пример шаблона конфига с Jinja2.
|
||||
- Пример работы с `/control`.
|
||||
|
||||
Напиши, и я подготовлю!
|
||||
Reference in New Issue
Block a user