9.1 KiB
Документация API FirewallD
Общее описание
API предоставляет интерфейс для управления межсетевым экраном FirewallD в Linux системах. API построено на основе взаимодействия с FirewallD через D-Bus интерфейс.
Внутренняя архитектура
1. Уровни взаимодействия
[HTTP API] -> [FastAPI Router] -> [FirewallD Service] -> [D-Bus] -> [FirewallD]
2. Компоненты системы
2.1 D-Bus интерфейс
FirewallD предоставляет D-Bus интерфейс org.fedoraproject.FirewallD1 для управления. Наш сервис подключается к системной шине D-Bus и взаимодействует с FirewallD через этот интерфейс.
Основные методы D-Bus:
getZones()- получение списка зонgetDefaultZone()- получение зоны по умолчаниюaddService()- добавление сервисаremoveService()- удаление сервиса и т.д.
2.2 Модели данных
В models/firewalld.py определены Pydantic модели для валидации данных:
FirewallZone
Используется для представления зоны файрвола:
class FirewallZone(BaseModel):
name: str
target: Optional[str] = None
services: List[str] = Field(default_factory=list)
ports: List[str] = Field(default_factory=list)
sources: List[str] = Field(default_factory=list)
interfaces: List[str] = Field(default_factory=list)
Применяется при получении настроек зоны через API.
FirewallService
Модель для конфигурации сервиса:
class FirewallService(BaseModel):
name: str
ports: List[str] = Field(default_factory=list)
protocols: List[str] = Field(default_factory=list)
modules: List[str] = Field(default_factory=list)
Используется при добавлении новых сервисов через API.
FirewallPort
Модель для конфигурации порта с валидацией протокола:
class FirewallPort(BaseModel):
port: int
protocol: Optional[str] = Field(default=None)
timeout: Optional[int] = 0
Применяется в API endpoint POST /api/v1/firewalld/zones/{zone}/ports для валидации входных данных.
FirewallSource
Модель для конфигурации источника с валидацией IP-адреса:
class FirewallSource(BaseModel):
address: str = Field(..., pattern=r'^(?:[0-9]{1,3}\.){3}[0-9]{1,3}(?:/[0-9]{1,2})?$')
zone: Optional[str] = None
Используется в API endpoint POST /api/v1/firewalld/zones/{zone}/sources для валидации IP-адресов.
FirewallRule
Обобщенная модель правила файрвола:
class FirewallRule(BaseModel):
zone: str
source: Optional[FirewallSource] = None
port: Optional[FirewallPort] = None
service: Optional[str] = None
Используется для комплексных операций с правилами.
В API (api/v1/firewalld.py) определены дополнительные модели для запросов:
PortRule
class PortRule(BaseModel):
port: int
protocol: str
timeout: Optional[int] = 0
Используется для валидации входных данных при добавлении портов.
ServiceRule
class ServiceRule(BaseModel):
service: str
timeout: Optional[int] = 0
Используется для валидации входных данных при добавлении сервисов.
SourceRule
class SourceRule(BaseModel):
source: str
Используется для валидации входных данных при добавлении источников.
Все модели используют Pydantic для:
- Валидации входных данных
- Автоматической конвертации типов
- Генерации OpenAPI документации
- Проверки бизнес-правил (например, валидация протокола в FirewallPort)
2.3 Сервисный слой
FirewallService в services/firewalld_service.py обеспечивает:
- Подключение к D-Bus
- Обработку ошибок
- Преобразование данных между API и D-Bus форматами
API Endpoints
Управление зонами
GET /api/v1/firewalld/zones
Получение списка всех доступных зон.
Ответ:
[
"public",
"internal",
"external",
...
]
Внутренняя работа:
- Запрос поступает в FastAPI router
- Router вызывает
FirewallService.get_zones() - Сервис делает вызов
getZones()через D-Bus - Результат преобразуется в JSON и возвращается клиенту
GET /api/v1/firewalld/zones/default
Получение зоны по умолчанию.
Ответ:
{
"name": "public"
}
Внутренняя работа:
- Вызов
FirewallService.get_default_zone() - D-Bus запрос
getDefaultZone() - Преобразование результата
PUT /api/v1/firewalld/zones/default/{zone}
Установка зоны по умолчанию.
Параметры:
zone: имя зоны
Внутренняя работа:
- Валидация имени зоны
- Вызов
FirewallService.set_default_zone() - D-Bus запрос
setDefaultZone()
Управление сервисами
GET /api/v1/firewalld/zones/{zone}/services
Получение списка сервисов в зоне.
Ответ:
{
"services": ["http", "https", "ssh"]
}
Внутренняя работа:
- Проверка существования зоны
- Вызов
FirewallService.get_services() - D-Bus запрос
getServices()
POST /api/v1/firewalld/zones/{zone}/services
Добавление сервиса в зону.
Тело запроса:
{
"service": "http",
"timeout": 0
}
Внутренняя работа:
- Валидация данных через Pydantic модель
- Вызов
FirewallService.add_service() - D-Bus запрос
addService()
DELETE /api/v1/firewalld/zones/{zone}/services/{service}
Удаление сервиса из зоны.
Внутренняя работа:
- Проверка существования сервиса
- Вызов
FirewallService.remove_service() - D-Bus запрос
removeService()
Управление портами
GET /api/v1/firewalld/zones/{zone}/ports
Получение списка портов в зоне.
Ответ:
{
"ports": ["80/tcp", "443/tcp"]
}
POST /api/v1/firewalld/zones/{zone}/ports
Добавление порта в зону.
Тело запроса:
{
"port": 80,
"protocol": "tcp",
"timeout": 0
}
DELETE /api/v1/firewalld/zones/{zone}/ports
Удаление порта из зоны.
Управление источниками
GET /api/v1/firewalld/zones/{zone}/sources
Получение списка источников в зоне.
POST /api/v1/firewalld/zones/{zone}/sources
Добавление источника в зону.
DELETE /api/v1/firewalld/zones/{zone}/sources/{source}
Удаление источника из зоны.
Обработка ошибок
API возвращает следующие коды ошибок:
- 400: Неверный запрос (например, неверный формат данных)
- 404: Ресурс не найден (зона, сервис и т.д.)
- 500: Внутренняя ошибка сервера
При ошибке D-Bus или FirewallD, ошибка логируется и возвращается соответствующий HTTP код.
Возможные улучшения
-
Безопасность:
- Добавить аутентификацию
- Добавить rate limiting
- Логирование действий
-
Функциональность:
- Добавить поддержку rich rules
- Управление ICMP правилами
- Управление forward портами
-
Производительность:
- Кэширование часто запрашиваемых данных
- Batch операции для множественных изменений
-
Надёжность:
- Retry механизм для D-Bus операций
- Более детальная обработка ошибок
- Валидация состояния FirewallD