HTTPS API

VyOS предоставляет встроенный HTTPS/HTTP сервер для веб-интерфейса и REST/GraphQL API. Это позволяет автоматизировать управление роутером и интегрировать его с внешними системами.

Обзор

Ключевые компоненты

HTTPS Server:

  • Nginx-based веб-сервер
  • TLS/SSL шифрование
  • Поддержка самоподписанных и настоящих сертификатов
  • Virtual hosts (vhost)

API Endpoints:

  • REST API: HTTP/JSON API для конфигурации и операций (VyOS 1.5+)
  • GraphQL API: Гибкий query-based API (VyOS 1.5+)
  • Legacy API: Совместимость с VyOS 1.4

Методы аутентификации:

  • API keys (рекомендуется)
  • Token-based authentication

VyOS 1.4 vs 1.5

VyOS 1.4 (Sagitta):

set service https api keys id <name> key '<api-key>'

VyOS 1.5 (Circinus):

set service https api keys id <name> key '<api-key>'
set service https api rest          # Включить REST API
set service https api graphql       # Включить GraphQL API (опционально)

В VyOS 1.5 REST и GraphQL endpoints раздельные.

Базовая конфигурация

Минимальная настройка HTTPS

# Базовый HTTPS сервер
set service https listen-address 0.0.0.0
set service https port 443

# Самоподписанный сертификат (для тестирования)
# VyOS автоматически генерирует при первом запуске

commit
save

Включение REST API (VyOS 1.5)

# HTTPS сервер
set service https listen-address 0.0.0.0
set service https port 443

# REST API
set service https api rest
set service https api keys id admin key 'MySecureAPIKey123!'

commit
save

Включение REST API (VyOS 1.4)

set service https listen-address 0.0.0.0
set service https port 443

# API (в 1.4 нет разделения rest/graphql)
set service https api keys id admin key 'MySecureAPIKey123!'

commit
save

Проверка работы

# Проверка статуса сервиса
show service https

# Проверка процесса
ps aux | grep nginx

# Проверка портов
netstat -tlnp | grep 443

# Тест REST API
curl -k https://localhost/retrieve \
  -H "Content-Type: application/json" \
  -d '{"op": "showConfig", "path": ["system", "host-name"]}' \
  -H "key: MySecureAPIKey123!"

Конфигурация сертификатов

Самоподписанный сертификат

VyOS автоматически создает самоподписанный сертификат при первом запуске HTTPS.

Генерация нового:

# Создать новый самоподписанный сертификат
generate pki certificate self-signed install vyos-https \
  common-name "vyos.company.local" \
  country "US" \
  state "California" \
  locality "San Francisco" \
  organization "Company Inc" \
  days 3650

# Применить к HTTPS
set service https certificates certificate vyos-https

commit
save

Сертификат от CA

Использование сертификата от доверенного CA (Let’s Encrypt, корпоративный CA).

Подготовка сертификатов

Вам понадобятся:

  • Certificate (server.crt): Серверный сертификат
  • Private Key (server.key): Приватный ключ
  • CA Certificate (ca.crt): Сертификат CA (опционально)

Импорт сертификатов

# Скопируйте файлы на роутер
scp server.crt vyos@router:/tmp/
scp server.key vyos@router:/tmp/
scp ca.crt vyos@router:/tmp/

# На роутере
configure

# Импорт CA
generate pki ca import ca-production file /tmp/ca.crt

# Импорт серверного сертификата и ключа
generate pki certificate import vyos-https-prod \
  certificate-file /tmp/server.crt \
  private-key-file /tmp/server.key

# Применить к HTTPS
set service https certificates certificate vyos-https-prod

commit
save

# Удалить временные файлы
rm /tmp/server.crt /tmp/server.key /tmp/ca.crt

Let’s Encrypt с Certbot

Автоматическое получение и обновление сертификатов Let’s Encrypt.

# Установка Certbot (в shell, не в configure)
sudo apt-get update
sudo apt-get install certbot

# Получение сертификата (standalone mode)
# HTTPS сервис должен быть временно остановлен
sudo systemctl stop nginx
sudo certbot certonly --standalone -d vyos.example.com

# Импорт в VyOS
configure
generate pki certificate import letsencrypt-vyos \
  certificate-file /etc/letsencrypt/live/vyos.example.com/fullchain.pem \
  private-key-file /etc/letsencrypt/live/vyos.example.com/privkey.pem

set service https certificates certificate letsencrypt-vyos
commit
save

# Перезапуск HTTPS
restart service https

Автоматическое обновление

Создайте скрипт /config/scripts/renew-cert.sh:

#!/bin/bash
# Остановить nginx
systemctl stop nginx

# Обновить сертификат
certbot renew --quiet

# Проверить обновление
if [ $? -eq 0 ]; then
  # Импорт нового сертификата
  /usr/libexec/vyos/conf_mode/pki.py import-cert \
    letsencrypt-vyos \
    /etc/letsencrypt/live/vyos.example.com/fullchain.pem \
    /etc/letsencrypt/live/vyos.example.com/privkey.pem

  # Перезапуск nginx
  systemctl restart nginx
else
  # Запустить nginx даже при ошибке
  systemctl start nginx
fi

Настройка cron:

# Добавить в crontab (проверка каждый день в 3:00)
set system task-scheduler task renew-cert executable path '/config/scripts/renew-cert.sh'
set system task-scheduler task renew-cert interval 1d
set system task-scheduler task renew-cert start-time '03:00:00'

commit

REST API

Структура API

REST API использует POST запросы на endpoint /configure, /retrieve, /show, etc.

Базовый URL: https://<router-ip>/

Endpoints:

  • /retrieve - Получение конфигурации (showConfig)
  • /configure - Изменение конфигурации (set, delete, comment)
  • /show - Операционные команды (show)
  • /generate - Генерация ключей, сертификатов
  • /reset - Сброс операций
  • /image - Управление образами системы
  • /config-file - Сохранение/загрузка конфигурации
  • /reboot, /poweroff - Управление питанием

Аутентификация

# Header
key: MySecureAPIKey123!

# Или в URL (не рекомендуется)
?key=MySecureAPIKey123!

Примеры REST API запросов

Получение конфигурации (retrieve)

# Hostname
curl -k https://192.168.1.1/retrieve \
  -H "Content-Type: application/json" \
  -H "key: MySecureAPIKey123!" \
  -d '{
    "op": "showConfig",
    "path": ["system", "host-name"]
  }'

# Все интерфейсы
curl -k https://192.168.1.1/retrieve \
  -H "Content-Type: application/json" \
  -H "key: MySecureAPIKey123!" \
  -d '{
    "op": "showConfig",
    "path": ["interfaces"]
  }'

# Вся конфигурация
curl -k https://192.168.1.1/retrieve \
  -H "Content-Type: application/json" \
  -H "key: MySecureAPIKey123!" \
  -d '{
    "op": "showConfig",
    "path": []
  }'

Ответ:

{
  "success": true,
  "data": {
    "host-name": "vyos-router"
  }
}

Изменение конфигурации (configure)

Set операция:

# Установить hostname
curl -k https://192.168.1.1/configure \
  -H "Content-Type: application/json" \
  -H "key: MySecureAPIKey123!" \
  -d '{
    "op": "set",
    "path": ["system", "host-name", "vyos-gw"]
  }'

# Установить IP адрес на интерфейсе
curl -k https://192.168.1.1/configure \
  -H "Content-Type: application/json" \
  -H "key: MySecureAPIKey123!" \
  -d '{
    "op": "set",
    "path": ["interfaces", "ethernet", "eth1", "address", "192.168.10.1/24"]
  }'

Delete операция:

curl -k https://192.168.1.1/configure \
  -H "Content-Type: application/json" \
  -H "key: MySecureAPIKey123!" \
  -d '{
    "op": "delete",
    "path": ["interfaces", "ethernet", "eth1", "address", "192.168.10.1/24"]
  }'

Comment операция:

curl -k https://192.168.1.1/configure \
  -H "Content-Type: application/json" \
  -H "key: MySecureAPIKey123!" \
  -d '{
    "op": "comment",
    "path": ["interfaces", "ethernet", "eth1"],
    "value": "Management interface"
  }'

Batch операции

Множественные изменения за один запрос:

curl -k https://192.168.1.1/configure \
  -H "Content-Type: application/json" \
  -H "key: MySecureAPIKey123!" \
  -d '{
    "op": "set",
    "path": ["interfaces", "ethernet", "eth2"],
    "commands": [
      {"op": "set", "path": ["address", "10.0.0.1/24"]},
      {"op": "set", "path": ["description", "LAN"]},
      {"op": "set", "path": ["mtu", "1500"]}
    ]
  }'

Show команды

# Show interfaces
curl -k https://192.168.1.1/show \
  -H "Content-Type: application/json" \
  -H "key: MySecureAPIKey123!" \
  -d '{
    "op": "show",
    "path": ["interfaces"]
  }'

# Show version
curl -k https://192.168.1.1/show \
  -H "Content-Type: application/json" \
  -H "key: MySecureAPIKey123!" \
  -d '{
    "op": "show",
    "path": ["version"]
  }'

Generate операции

# Generate WireGuard key
curl -k https://192.168.1.1/generate \
  -H "Content-Type: application/json" \
  -H "key: MySecureAPIKey123!" \
  -d '{
    "op": "generate",
    "path": ["wireguard", "default-keypair"]
  }'

Config-file операции

# Save конфигурация
curl -k https://192.168.1.1/config-file \
  -H "Content-Type: application/json" \
  -H "key: MySecureAPIKey123!" \
  -d '{
    "op": "save"
  }'

# Load конфигурация
curl -k https://192.168.1.1/config-file \
  -H "Content-Type: application/json" \
  -H "key: MySecureAPIKey123!" \
  -d '{
    "op": "load",
    "file": "/config/backup.config"
  }'

Управление питанием

# Reboot
curl -k https://192.168.1.1/reboot \
  -H "Content-Type: application/json" \
  -H "key: MySecureAPIKey123!" \
  -d '{
    "op": "reboot",
    "path": ["now"]
  }'

# Poweroff
curl -k https://192.168.1.1/poweroff \
  -H "Content-Type: application/json" \
  -H "key: MySecureAPIKey123!" \
  -d '{
    "op": "poweroff",
    "path": ["now"]
  }'

Python примеры

import requests
import json

# Disable SSL warnings для самоподписанных сертификатов
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

class VyOSAPI:
    def __init__(self, host, api_key):
        self.base_url = f"https://{host}"
        self.headers = {
            "Content-Type": "application/json",
            "key": api_key
        }

    def show_config(self, path):
        """Получить конфигурацию"""
        data = {
            "op": "showConfig",
            "path": path
        }
        response = requests.post(
            f"{self.base_url}/retrieve",
            headers=self.headers,
            json=data,
            verify=False
        )
        return response.json()

    def set_config(self, path, value=None):
        """Установить конфигурацию"""
        data = {
            "op": "set",
            "path": path
        }
        if value:
            data["value"] = value

        response = requests.post(
            f"{self.base_url}/configure",
            headers=self.headers,
            json=data,
            verify=False
        )
        return response.json()

    def delete_config(self, path):
        """Удалить конфигурацию"""
        data = {
            "op": "delete",
            "path": path
        }
        response = requests.post(
            f"{self.base_url}/configure",
            headers=self.headers,
            json=data,
            verify=False
        )
        return response.json()

    def save(self):
        """Сохранить конфигурацию"""
        data = {"op": "save"}
        response = requests.post(
            f"{self.base_url}/config-file",
            headers=self.headers,
            json=data,
            verify=False
        )
        return response.json()

    def show(self, path):
        """Операционная команда show"""
        data = {
            "op": "show",
            "path": path
        }
        response = requests.post(
            f"{self.base_url}/show",
            headers=self.headers,
            json=data,
            verify=False
        )
        return response.json()

# Использование
api = VyOSAPI("192.168.1.1", "MySecureAPIKey123!")

# Получить hostname
result = api.show_config(["system", "host-name"])
print(f"Hostname: {result['data']}")

# Установить новый hostname
api.set_config(["system", "host-name", "new-hostname"])
api.save()

# Show interfaces
interfaces = api.show(["interfaces"])
print(json.dumps(interfaces, indent=2))

GraphQL API (VyOS 1.5+)

GraphQL API обеспечивает более гибкий query-based интерфейс.

Включение GraphQL

set service https api graphql
set service https api keys id graphql-user key 'GraphQLKey123!'

commit
save

GraphQL Endpoint

URL: https://<router-ip>/graphql

Примеры GraphQL запросов

Получение конфигурации

curl -k https://192.168.1.1/graphql \
  -H "Content-Type: application/json" \
  -H "key: GraphQLKey123!" \
  -d '{
    "query": "{ systemStatus { hostname version uptime } }"
  }'

Изменение конфигурации

curl -k https://192.168.1.1/graphql \
  -H "Content-Type: application/json" \
  -H "key: GraphQLKey123!" \
  -d '{
    "query": "mutation { configSet(path: \"system host-name\", value: \"vyos-gw\") { success errors } }"
  }'

GraphQL документация доступна через GraphiQL интерфейс: https://<router-ip>/graphql (в браузере)

Продвинутая конфигурация

Множественные API ключи

# Admin полный доступ
set service https api keys id admin key 'AdminKey123!'

# Read-only пользователь (только через firewall ограничение)
set service https api keys id readonly key 'ReadOnlyKey456!'

# Monitoring система
set service https api keys id monitoring key 'MonitorKey789!'

commit

Примечание: VyOS API не имеет встроенного RBAC. Используйте разные ключи и контролируйте доступ через firewall.

Ограничение доступа к API

# Разрешить API только с определенных IP
set firewall ipv4 input filter rule 100 action accept
set firewall ipv4 input filter rule 100 destination port 443
set firewall ipv4 input filter rule 100 protocol tcp
set firewall ipv4 input filter rule 100 source address 192.168.1.0/24
set firewall ipv4 input filter rule 100 description 'Allow HTTPS API from management network'

# Заблокировать остальных
set firewall ipv4 input filter rule 109 action drop
set firewall ipv4 input filter rule 109 destination port 443
set firewall ipv4 input filter rule 109 protocol tcp

commit

Listen на определенных интерфейсах

# Только на management интерфейсе
set service https listen-address 192.168.1.1

# На нескольких интерфейсах
set service https listen-address 192.168.1.1
set service https listen-address 10.0.0.1

commit

Изменение порта

# Нестандартный порт
set service https port 8443

commit

Virtual hosts

# Vhost для разных доменов
set service https virtual-host api.example.com listen-address 0.0.0.0
set service https virtual-host api.example.com listen-port 443
set service https virtual-host api.example.com server-name api.example.com

# Отдельный сертификат для vhost
set service https virtual-host api.example.com certificates certificate api-cert

commit

CORS настройки

Для веб-приложений, обращающихся к API:

set service https api cors allow-origin '*'

# Или конкретные домены
set service https api cors allow-origin 'https://admin.example.com'

commit

Безопасность

Рекомендации по безопасности

  1. Сильные API ключи:
# Генерация случайного ключа
openssl rand -base64 32
# Пример: xK8pL9mN2qR5sT7vW0yZ3aB6cD9eF1gH2iJ4kL7mN0pQ=

set service https api keys id admin key 'xK8pL9mN2qR5sT7vW0yZ3aB6cD9eF1gH2iJ4kL7mN0pQ='
  1. Настоящие TLS сертификаты:

    • Используйте Let’s Encrypt или корпоративный CA
    • Не используйте самоподписанные в production
  2. Ограничение доступа:

# Firewall rules
set firewall ipv4 input filter rule 100 source address 192.168.1.0/24

# Listen только на management интерфейсе
set service https listen-address 192.168.1.1
  1. Rate limiting:
set firewall ipv4 input filter rule 100 recent count 10
set firewall ipv4 input filter rule 100 recent time minute 1
  1. TLS версия:
# Минимальная версия TLS 1.2
set service https tls-version '1.2'
  1. Отключите HTTP (только HTTPS):

    • VyOS по умолчанию использует только HTTPS
  2. Ротация API ключей:

    • Регулярно меняйте API ключи
    • Используйте разные ключи для разных приложений
  3. Логирование API запросов:

# Nginx логи
show log https

# Access log
cat /var/log/nginx/access.log

Аудит доступа

# Просмотр Nginx access логов
show log https access

# Поиск неудачных запросов
cat /var/log/nginx/access.log | grep '401\|403'

# Активные соединения
netstat -tn | grep :443

Интеграция с внешними системами

Ansible

---
- name: Configure VyOS via API
  hosts: localhost
  gather_facts: no
  vars:
    vyos_host: "192.168.1.1"
    vyos_api_key: "MySecureAPIKey123!"

  tasks:
    - name: Set hostname
      uri:
        url: "https://{{ vyos_host }}/configure"
        method: POST
        headers:
          key: "{{ vyos_api_key }}"
          Content-Type: "application/json"
        body_format: json
        body:
          op: "set"
          path: ["system", "host-name", "vyos-ansible"]
        validate_certs: no
      register: result

    - name: Save configuration
      uri:
        url: "https://{{ vyos_host }}/config-file"
        method: POST
        headers:
          key: "{{ vyos_api_key }}"
          Content-Type: "application/json"
        body_format: json
        body:
          op: "save"
        validate_certs: no

Terraform

terraform {
  required_providers {
    vyos = {
      source = "example/vyos"
      version = "1.0.0"
    }
  }
}

provider "vyos" {
  endpoint = "https://192.168.1.1"
  api_key  = "MySecureAPIKey123!"
}

resource "vyos_interface" "eth2" {
  name        = "eth2"
  address     = "10.0.0.1/24"
  description = "LAN managed by Terraform"
}

Monitoring (Prometheus)

# Экспортер метрик VyOS для Prometheus
from prometheus_client import start_http_server, Gauge
import requests
import time

# Метрики
interface_status = Gauge('vyos_interface_status', 'Interface status', ['interface'])
interface_rx_bytes = Gauge('vyos_interface_rx_bytes', 'RX bytes', ['interface'])
interface_tx_bytes = Gauge('vyos_interface_tx_bytes', 'TX bytes', ['interface'])

class VyOSExporter:
    def __init__(self, vyos_host, api_key):
        self.api = VyOSAPI(vyos_host, api_key)

    def collect(self):
        # Получить статистику интерфейсов
        result = self.api.show(["interfaces"])

        for iface, data in result['data'].items():
            interface_status.labels(interface=iface).set(1 if data['state'] == 'up' else 0)
            interface_rx_bytes.labels(interface=iface).set(data['stats']['rx_bytes'])
            interface_tx_bytes.labels(interface=iface).set(data['stats']['tx_bytes'])

if __name__ == '__main__':
    exporter = VyOSExporter("192.168.1.1", "MySecureAPIKey123!")
    start_http_server(9100)

    while True:
        exporter.collect()
        time.sleep(15)

Webhook для событий

# Event handler для отправки webhook
set system event-handler route-change name 'route-webhook'
set system event-handler route-change script '/config/scripts/route-webhook.sh'
set system event-handler route-change pattern 'route added|route deleted'

commit

/config/scripts/route-webhook.sh:

#!/bin/bash
EVENT="$1"
curl -X POST https://monitoring.example.com/webhook \
  -H "Content-Type: application/json" \
  -d "{\"event\": \"$EVENT\", \"router\": \"vyos-gw\", \"timestamp\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"}"

Troubleshooting

HTTPS не запускается

Проблема: Сервис HTTPS не стартует.

Диагностика:

# Проверить статус
show service https

# Nginx статус
systemctl status nginx

# Логи
show log https
cat /var/log/nginx/error.log

# Проверить конфигурацию nginx
nginx -t

Возможные причины:

  1. Порт 443 занят другим процессом
  2. Проблемы с сертификатом
  3. Синтаксическая ошибка в конфигурации

Решение:

# Проверить что занимает порт
netstat -tlnp | grep :443

# Перезапустить сервис
restart service https

API возвращает 401 Unauthorized

Проблема: API запросы не проходят аутентификацию.

Причины:

  1. Неправильный API key
  2. API key не настроен
  3. Неправильный header

Решение:

# Проверить API keys
show service https api keys

# Убедиться что key передается в header
curl -k https://192.168.1.1/retrieve \
  -H "key: MySecureAPIKey123!" \
  -v

API возвращает 404

Проблема: Endpoint не найден.

VyOS 1.5 специфика:

  • В VyOS 1.5 нужно явно включить REST API:
set service https api rest
commit

Медленные ответы API

Проблема: API запросы долго выполняются.

Диагностика:

# CPU load
show system cpu

# Memory
show system memory

# Process list
top

Решение:

  • Уменьшите частоту запросов
  • Используйте batch операции
  • Кэшируйте результаты на клиенте

Проблемы с SSL сертификатом

Проблема: “SSL certificate problem: self signed certificate”.

Решение:

# В curl: использовать -k
curl -k https://...

# В Python: verify=False
requests.post(url, verify=False)

# Или импортировать CA сертификат в систему

Мониторинг и метрики

Nginx статистика

# Active connections
cat /var/run/nginx/nginx-status

# Access log анализ
cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn

# Requests per minute
cat /var/log/nginx/access.log | awk '{print $4}' | cut -d: -f1-3 | uniq -c

API использование

# Количество API запросов
grep "POST /configure" /var/log/nginx/access.log | wc -l

# Top API users (по IP)
grep "POST /" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn

# Ошибки API
grep "HTTP/1.1\" [45]" /var/log/nginx/access.log

Примеры использования

Пример 1: Автоматизация настройки DHCP

import requests
import json

class DHCPManager:
    def __init__(self, router, api_key):
        self.router = router
        self.api_key = api_key
        self.base_url = f"https://{router}"
        self.headers = {
            "Content-Type": "application/json",
            "key": api_key
        }

    def add_dhcp_static_mapping(self, network, name, mac, ip):
        """Добавить статический DHCP mapping"""
        path = [
            "service", "dhcp-server",
            "shared-network-name", network,
            "subnet", self.get_subnet(network),
            "static-mapping", name,
            "mac-address", mac
        ]

        # Set MAC
        self.api_call("/configure", {"op": "set", "path": path})

        # Set IP
        path[-1] = "ip-address"
        path.append(ip)
        self.api_call("/configure", {"op": "set", "path": path})

        # Save
        self.api_call("/config-file", {"op": "save"})

    def api_call(self, endpoint, data):
        response = requests.post(
            f"{self.base_url}{endpoint}",
            headers=self.headers,
            json=data,
            verify=False
        )
        return response.json()

    def get_subnet(self, network):
        # Получить subnet для network
        result = self.api_call("/retrieve", {
            "op": "showConfig",
            "path": ["service", "dhcp-server", "shared-network-name", network]
        })
        return list(result['data']['subnet'].keys())[0]

# Использование
dhcp = DHCPManager("192.168.1.1", "MySecureAPIKey123!")
dhcp.add_dhcp_static_mapping("LAN", "server1", "00:50:56:11:22:33", "192.168.1.10")

Пример 2: Backup конфигурации

#!/bin/bash
# backup-vyos.sh - Автоматический backup конфигурации

ROUTER="192.168.1.1"
API_KEY="MySecureAPIKey123!"
BACKUP_DIR="/backup/vyos"
DATE=$(date +%Y%m%d-%H%M%S)

# Получить конфигурацию
curl -k https://${ROUTER}/retrieve \
  -H "Content-Type: application/json" \
  -H "key: ${API_KEY}" \
  -d '{"op": "showConfig", "path": []}' \
  > ${BACKUP_DIR}/config-${DATE}.json

# Получить текстовую конфигурацию
curl -k https://${ROUTER}/retrieve \
  -H "Content-Type: application/json" \
  -H "key: ${API_KEY}" \
  -d '{"op": "show", "path": ["configuration"]}' \
  > ${BACKUP_DIR}/config-${DATE}.txt

# Удалить старые backup (>30 дней)
find ${BACKUP_DIR} -type f -mtime +30 -delete

echo "Backup completed: ${BACKUP_DIR}/config-${DATE}.json"

Пример 3: Health check monitoring

#!/usr/bin/env python3
# vyos-health-check.py

import requests
import sys
import json
from datetime import datetime

class VyOSHealthCheck:
    def __init__(self, router, api_key):
        self.api = VyOSAPI(router, api_key)
        self.status = {"healthy": True, "issues": []}

    def check_interfaces(self):
        """Проверить статус интерфейсов"""
        result = self.api.show(["interfaces"])

        for iface, data in result['data'].items():
            if data['admin_state'] == 'up' and data['state'] != 'up':
                self.status["healthy"] = False
                self.status["issues"].append(f"Interface {iface} is down")

    def check_bgp(self):
        """Проверить BGP neighbors"""
        result = self.api.show(["bgp", "summary"])

        for neighbor in result['data']['neighbors']:
            if neighbor['state'] != 'Established':
                self.status["healthy"] = False
                self.status["issues"].append(f"BGP neighbor {neighbor['ip']} not established")

    def check_vpn(self):
        """Проверить VPN туннели"""
        result = self.api.show(["vpn", "ipsec", "sa"])

        for tunnel in result['data']['tunnels']:
            if tunnel['state'] != 'up':
                self.status["healthy"] = False
                self.status["issues"].append(f"VPN tunnel {tunnel['name']} is down")

    def run(self):
        """Запустить все проверки"""
        self.check_interfaces()
        self.check_bgp()
        self.check_vpn()

        # Вывод результата
        print(json.dumps({
            "timestamp": datetime.utcnow().isoformat(),
            "healthy": self.status["healthy"],
            "issues": self.status["issues"]
        }, indent=2))

        # Exit code
        sys.exit(0 if self.status["healthy"] else 1)

if __name__ == '__main__':
    checker = VyOSHealthCheck("192.168.1.1", "MySecureAPIKey123!")
    checker.run()

Лучшие практики

  1. Используйте HTTPS - никогда не используйте HTTP в production
  2. Сильные API ключи - минимум 32 символа, случайные
  3. Настоящие сертификаты - Let’s Encrypt или корпоративный CA
  4. Ограничьте доступ - firewall rules для API endpoints
  5. Разные ключи - используйте разные API ключи для разных приложений
  6. Rate limiting - защита от brute-force
  7. Логирование - включите подробное логирование API запросов
  8. Мониторинг - отслеживайте API использование
  9. Версионирование - документируйте версию API в коде
  10. Error handling - обрабатывайте ошибки API корректно
  11. Timeout - устанавливайте разумные timeout для API запросов
  12. Retry logic - реализуйте retry для transient ошибок
  13. Backup - автоматизируйте backup конфигурации через API
  14. Testing - тестируйте API интеграцию в staging среде
  15. Documentation - документируйте все API интеграции

Заключение

HTTPS/REST API в VyOS предоставляет мощный инструмент для автоматизации и интеграции. Правильная настройка безопасности (сертификаты, API ключи, firewall) критична для защиты инфраструктуры.

Основные use cases:

  • Автоматизация конфигурации через Ansible/Terraform
  • Мониторинг состояния роутера
  • Интеграция с внешними системами
  • Self-service порталы для управления сетью
  • CI/CD для network infrastructure as code

VyOS API обеспечивает полный доступ к конфигурации и операционным командам, делая VyOS идеальным выбором для современных автоматизированных сетевых инфраструктур.