# Proxy - Системный HTTP/HTTPS прокси

> Настройка системного прокси-сервера в VyOS для управления подключениями к интернету, обновлений пакетов и загрузки образов системы

Source: https://opennix.org/docs/vyos/system/vyos-proxy/


## Системный Proxy в VyOS

## Обзор

Системный прокси-сервер в VyOS позволяет настроить централизованную точку доступа для всех исходящих HTTP, HTTPS и FTP соединений, инициируемых системой. Это критически важно в корпоративных средах, где прямой доступ к интернету ограничен политиками безопасности.

### Назначение

Конфигурация прокси-сервера в VyOS используется для:

- **Обновления системы**: Загрузка новых образов VyOS через команду `add system image`
- **Установка пакетов**: Доступ к репозиториям пакетов через прокси
- **Загрузка файлов**: Системные операции, требующие доступа к внешним ресурсам
- **Централизованное управление трафиком**: Единая точка контроля исходящих соединений
- **Соблюдение корпоративных политик**: Обязательное использование корпоративного прокси

### Области применения

Системный прокси применяется в следующих сценариях:

1. **Корпоративные сети**: Обязательное использование корпоративного прокси-сервера
2. **Изолированные сегменты**: DMZ зоны с ограниченным доступом к интернету
3. **Облачные инфраструктуры**: Yandex Cloud, VK Cloud с централизованным управлением трафиком
4. **Аудит и мониторинг**: Контроль всех исходящих соединений
5. **Кэширование**: Оптимизация загрузки часто используемых ресурсов

### Принцип работы

При настройке системного прокси VyOS:

1. Устанавливает переменные окружения: `http_proxy`, `https_proxy`, `ftp_proxy`
2. Применяет настройки ко всем системным процессам
3. Использует прокси для всех HTTP/HTTPS/FTP соединений
4. Поддерживает аутентификацию по RFC 7617 (Basic Authentication)
5. Позволяет исключать определенные хосты из проксирования

## Конфигурация

### Базовая настройка прокси

#### Установка URL прокси-сервера

```bash
set system proxy url <proxy-url>
```

**Параметры:**
- `<proxy-url>`: URL прокси-сервера (с протоколом http:// или https://)

**Пример:**

```bash
configure
set system proxy url http://proxy.example.com
commit
save
```

#### Установка нестандартного порта

По умолчанию используется порт 80 для HTTP прокси. Для изменения порта:

```bash
set system proxy port <port-number>
```

**Параметры:**
- `<port-number>`: Номер порта (1-65535)

**Пример:**

```bash
configure
set system proxy url http://proxy.example.com
set system proxy port 8080
commit
save
```

### Аутентификация на прокси-сервере

VyOS поддерживает базовую HTTP аутентификацию согласно RFC 7617.

#### Настройка имени пользователя

```bash
set system proxy username <username>
```

**Параметры:**
- `<username>`: Имя пользователя для аутентификации

#### Настройка пароля

```bash
set system proxy password <password>
```

**Параметры:**
- `<password>`: Пароль для аутентификации

**Пример полной конфигурации с аутентификацией:**

```bash
configure
set system proxy url http://proxy.corp.local
set system proxy port 3128
set system proxy username admin
set system proxy password SecurePassword123
commit
save
```

### Исключения из проксирования (No-Proxy)

Для некоторых хостов или подсетей может потребоваться прямое подключение без использования прокси.

**Примечание:** На момент VyOS 1.4/1.5, явная команда `no-proxy` отсутствует в стандартной конфигурации, но можно использовать переменные окружения напрямую через скрипты или настроить исключения на уровне прокси-сервера.

## Примеры конфигурации

### Пример 1: Простой прокси без аутентификации

**Сценарий:** Организация использует прокси-сервер proxy.company.ru на стандартном порту 8080.

```bash
configure

# Настройка прокси-сервера
set system proxy url http://proxy.company.ru
set system proxy port 8080

# Применение конфигурации
commit
save
exit
```

**Результат:**

```bash
vyos@router:~$ env | grep -i proxy
http_proxy=http://proxy.company.ru:8080
https_proxy=http://proxy.company.ru:8080
ftp_proxy=http://proxy.company.ru:8080
```

### Пример 2: Yandex Cloud - Корпоративный прокси для обновлений

**Сценарий:** VyOS в Yandex Cloud, доступ к интернету только через корпоративный прокси-сервер с аутентификацией.

```bash
configure

# Основные параметры прокси
set system proxy url http://proxy.yandex-cloud.internal
set system proxy port 3128

# Аутентификация
set system proxy username yc-vyos-router
set system proxy password 'Yc!Pr0xy@2024'

# Применение конфигурации
commit
save
exit
```

**Проверка подключения:**

```bash
# Проверка переменных окружения
vyos@yc-router:~$ env | grep -i proxy

# Тест загрузки через прокси
vyos@yc-router:~$ curl -I https://cloud.yandex.ru
```

**Обновление образа VyOS через прокси:**

```bash
add system image https://downloads.vyos.io/rolling/current/vyos-1.5-rolling-latest.iso
```

### Пример 3: VK Cloud - Прокси с аутентификацией

**Сценарий:** VyOS в VK Cloud (Mail.ru Cloud Solutions), сегментированная сеть с обязательным прокси.

```bash
configure

# Настройка прокси VK Cloud
set system proxy url http://proxy.vkcloud.local
set system proxy port 8888

# Аутентификация пользователя
set system proxy username vk-network-admin
set system proxy password 'VKCloud$ecure2024'

# Применение и сохранение
commit
save
exit
```

**Проверка конфигурации:**

```bash
show system proxy
```

**Ожидаемый вывод:**

```
proxy {
    port 8888
    url http://proxy.vkcloud.local
    username vk-network-admin
    password ****************
}
```

### Пример 4: Многоуровневая инфраструктура

**Сценарий:** DMZ сегмент с доступом через корпоративный прокси, специфичные настройки для различных протоколов.

```bash
configure

# Прокси-сервер DMZ
set system proxy url http://dmz-proxy.corp.local
set system proxy port 8080

# Учетная запись для DMZ роутера
set system proxy username dmz-vyos-01
set system proxy password 'DmZ!R0ut3r#2024'

commit
save
exit
```

**Дополнительная настройка через переменные окружения** (в скриптах):

Создание скрипта `/config/scripts/proxy-exceptions.sh`:

```bash
#!/bin/bash
# Дополнительные настройки прокси

export no_proxy="localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,172.16.0.0/12,.local,.corp.local"
export NO_PROXY="$no_proxy"
```

### Пример 5: HTTPS прокси с SSL

**Сценарий:** Использование HTTPS прокси-сервера с шифрованным соединением.

```bash
configure

# HTTPS прокси
set system proxy url https://secure-proxy.enterprise.com
set system proxy port 8443

# Аутентификация
set system proxy username enterprise-router
set system proxy password 'EnT3rpr!se#SSL'

commit
save
exit
```

**Важно:** При использовании самоподписанных сертификатов на прокси-сервере могут возникнуть проблемы с проверкой SSL. В таких случаях может потребоваться дополнительная настройка доверия к сертификату на уровне системы.

## Проверка конфигурации

### Просмотр текущих настроек прокси

```bash
show system proxy
```

**Пример вывода:**

```
proxy {
    port 8080
    url http://proxy.example.com
    username admin
    password ****************
}
```

### Проверка переменных окружения

```bash
env | grep -i proxy
```

**Ожидаемый вывод:**

```
http_proxy=http://admin:SecurePassword123@proxy.example.com:8080
https_proxy=http://admin:SecurePassword123@proxy.example.com:8080
ftp_proxy=http://admin:SecurePassword123@proxy.example.com:8080
```

### Тестирование подключения через прокси

#### Проверка HTTP соединения

```bash
curl -I http://example.com
```

#### Проверка HTTPS соединения

```bash
curl -I https://www.google.com
```

#### Детальная диагностика с curl

```bash
curl -v -x http://proxy.example.com:8080 https://downloads.vyos.io
```

**Параметры:**
- `-v`: Подробный вывод
- `-x`: Явное указание прокси-сервера

### Проверка работы обновлений

```bash
# Попытка загрузки образа VyOS
add system image https://downloads.vyos.io/rolling/current/vyos-1.5-rolling-latest.iso
```

Если прокси настроен корректно, загрузка начнется через указанный прокси-сервер.

## Операционные команды

### Просмотр конфигурации в режиме конфигурирования

```bash
configure
show system proxy
```

### Просмотр в формате JSON

```bash
show configuration json | jq '.system.proxy'
```

**Пример вывода:**

```json
{
  "port": "8080",
  "url": "http://proxy.example.com",
  "username": "admin"
}
```

### Экспорт конфигурации прокси

```bash
show configuration commands | grep "system proxy"
```

**Вывод:**

```
set system proxy port '8080'
set system proxy url 'http://proxy.example.com'
set system proxy username 'admin'
```

## Переменные окружения

VyOS автоматически создает следующие переменные окружения при настройке прокси:

### http_proxy

Используется для HTTP соединений.

**Формат:**
```
http_proxy=http://[username:password@]proxy-url:port
```

### https_proxy

Используется для HTTPS соединений.

**Формат:**
```
https_proxy=http://[username:password@]proxy-url:port
```

**Примечание:** Даже для HTTPS соединений часто используется протокол `http://` для самого прокси-соединения, если прокси не требует SSL.

### ftp_proxy

Используется для FTP соединений.

**Формат:**
```
ftp_proxy=http://[username:password@]proxy-url:port
```

### no_proxy

Список хостов и подсетей, которые не должны проксироваться.

**Формат:**
```
no_proxy=localhost,127.0.0.1,.local,10.0.0.0/8
```

**Примечание:** В стандартной конфигурации VyOS `no_proxy` нужно настраивать вручную через скрипты.

## Устранение неполадок

### Проблема 1: Прокси не применяется

**Симптомы:**
- Команды обновления не работают
- Переменные окружения не установлены

**Решение:**

```bash
# Проверьте статус конфигурации
show system proxy

# Убедитесь, что конфигурация закоммичена
configure
commit
save

# Перезапустите сессию
exit
```

### Проблема 2: Ошибка аутентификации 407

**Симптомы:**
```
HTTP 407 Proxy Authentication Required
```

**Решение:**

```bash
configure

# Проверьте правильность учетных данных
show system proxy

# Обновите пароль
set system proxy password 'NewPassword'
commit
save
```

### Проблема 3: Таймауты соединения

**Симптомы:**
- Долгое ожидание при попытке соединения
- Timeout errors

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

```bash
# Проверьте доступность прокси-сервера
ping proxy.example.com

# Проверьте порт прокси
telnet proxy.example.com 8080

# Проверьте сетевую связность
traceroute proxy.example.com
```

**Решение:**

```bash
configure

# Убедитесь в правильности URL и порта
set system proxy url http://proxy.example.com
set system proxy port 8080

# Проверьте маршрутизацию до прокси
show ip route

commit
save
```

### Проблема 4: SSL/TLS ошибки с HTTPS прокси

**Симптомы:**
```
SSL certificate problem: self signed certificate
```

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

```bash
# Проверьте сертификат прокси
openssl s_client -connect proxy.example.com:8443

# Проверьте переменные окружения
env | grep -i proxy
```

**Временное решение для тестирования:**

```bash
# Отключение проверки SSL (только для тестирования!)
curl -k https://example.com
```

**Постоянное решение:**

Добавьте сертификат прокси в доверенные:

```bash
configure

# Установите сертификат CA
set pki ca proxy-ca certificate '<base64-encoded-cert>'

commit
save
```

### Проблема 5: Некоторые сервисы не используют прокси

**Симптомы:**
- Системные команды работают через прокси
- Пользовательские скрипты игнорируют прокси

**Решение:**

Убедитесь, что скрипты наследуют переменные окружения:

```bash
#!/bin/vbash
source /etc/profile.d/vyatta-environment.sh

# Явное указание прокси
export http_proxy="http://proxy.example.com:8080"
export https_proxy="http://proxy.example.com:8080"

# Ваш код
```

### Проблема 6: Прокси блокирует внутренние ресурсы

**Симптомы:**
- Не работает доступ к внутренним серверам
- Внутренние DNS запросы идут через прокси

**Решение:**

Настройте исключения через `no_proxy`:

Создайте скрипт `/config/scripts/post-config.d/proxy-no-proxy.sh`:

```bash
#!/bin/bash

# Исключения из прокси
export no_proxy="localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,172.16.0.0/12,.local,.internal"
export NO_PROXY="$no_proxy"

# Сохранить в профиль
cat > /etc/profile.d/no-proxy.sh << EOF
export no_proxy="$no_proxy"
export NO_PROXY="$no_proxy"
EOF
```

Сделайте скрипт исполняемым:

```bash
chmod +x /config/scripts/post-config.d/proxy-no-proxy.sh
```

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

### 1. Безопасность учетных данных

**Не рекомендуется:**
```bash
set system proxy password 'password123'
```

**Рекомендуется:**
- Используйте сложные пароли
- Регулярно меняйте учетные данные
- Используйте отдельные учетные записи для каждого роутера
- Ограничьте права прокси-аккаунтов

```bash
set system proxy username vyos-router-01
set system proxy password 'C0mpl3x!P@ssw0rd#2024'
```

### 2. Документирование конфигурации

Добавляйте комментарии к конфигурации:

```bash
configure
set system proxy url http://proxy.corp.local
set system proxy port 3128

# Сохраните информацию в описании системы
set system host-name vyos-with-proxy
set system domain-name corp.local

commit comment "Configured corporate proxy for system updates"
save
```

### 3. Мониторинг и логирование

Создайте скрипт мониторинга `/config/scripts/check-proxy.sh`:

```bash
#!/bin/bash

LOGFILE="/var/log/vyos/proxy-check.log"
PROXY_HOST="proxy.corp.local"
PROXY_PORT="8080"

# Функция логирования
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> $LOGFILE
}

# Проверка доступности прокси
if timeout 5 bash -c "cat < /dev/null > /dev/tcp/$PROXY_HOST/$PROXY_PORT" 2>/dev/null; then
    log "SUCCESS: Proxy $PROXY_HOST:$PROXY_PORT is reachable"
    exit 0
else
    log "ERROR: Proxy $PROXY_HOST:$PROXY_PORT is unreachable"
    exit 1
fi
```

Сделайте скрипт исполняемым:

```bash
chmod +x /config/scripts/check-proxy.sh
```

Настройте периодическую проверку через task scheduler:

```bash
configure
set system task-scheduler task check-proxy interval 5m
set system task-scheduler task check-proxy executable path /config/scripts/check-proxy.sh
commit
save
```

### 4. Резервный прокси-сервер

Для критичных систем подготовьте альтернативную конфигурацию:

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

```bash
#!/bin/vbash
source /opt/vyatta/etc/functions/script-template

PRIMARY_PROXY="proxy-primary.corp.local:8080"
SECONDARY_PROXY="proxy-backup.corp.local:8080"

# Проверка primary прокси
if timeout 3 curl -s -o /dev/null -x http://$PRIMARY_PROXY http://connectivity-check.vyos.io; then
    echo "Primary proxy is working"
    configure
    set system proxy url http://proxy-primary.corp.local
    set system proxy port 8080
    commit
    exit 0
else
    echo "Primary proxy failed, switching to backup"
    configure
    set system proxy url http://proxy-backup.corp.local
    set system proxy port 8080
    commit
    save
fi
```

### 5. Тестирование после изменений

После любых изменений конфигурации прокси:

```bash
# 1. Проверьте конфигурацию
show system proxy

# 2. Проверьте переменные окружения
env | grep -i proxy

# 3. Тестовое HTTP соединение
curl -I http://connectivity-check.vyos.io

# 4. Тестовое HTTPS соединение
curl -I https://www.google.com

# 5. Попробуйте загрузить небольшой файл
curl -o /tmp/test.txt http://ipv4.download.thinkbroadband.com/5MB.zip
```

### 6. Регулярное обслуживание

Создайте чек-лист регулярного обслуживания:

**Еженедельно:**
- Проверка логов прокси `/var/log/vyos/proxy-check.log`
- Тестирование доступности прокси-сервера

**Ежемесячно:**
- Обновление паролей (при политике ротации)
- Проверка версий VyOS и доступность обновлений

**Ежеквартально:**
- Аудит конфигурации прокси
- Тестирование процедуры failover
- Обновление документации

### 7. Исключения для внутренних ресурсов

Всегда настраивайте исключения для:

```bash
# Локальные адреса
localhost, 127.0.0.1, ::1

# RFC 1918 приватные сети
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16

# Link-local
169.254.0.0/16

# Внутренние домены
.local, .internal, .corp, .lan

# Cloud metadata сервисы
169.254.169.254 (AWS, Yandex Cloud, VK Cloud)
```

### 8. Интеграция с системами мониторинга

Экспортируйте метрики для Prometheus/Grafana:

Создайте `/config/scripts/proxy-metrics.sh`:

```bash
#!/bin/bash

METRICS_FILE="/var/lib/node_exporter/textfile_collector/proxy_status.prom"
PROXY_HOST="proxy.corp.local"
PROXY_PORT="8080"

# Проверка доступности
if timeout 3 bash -c "cat < /dev/null > /dev/tcp/$PROXY_HOST/$PROXY_PORT" 2>/dev/null; then
    STATUS=1
else
    STATUS=0
fi

# Запись метрик
cat > $METRICS_FILE << EOF
# HELP vyos_proxy_status Proxy server availability (1 = up, 0 = down)
# TYPE vyos_proxy_status gauge
vyos_proxy_status{host="$PROXY_HOST",port="$PROXY_PORT"} $STATUS
EOF
```

## Взаимодействие с другими компонентами

### Обновление образов системы

При настроенном прокси команда `add system image` автоматически использует прокси:

```bash
add system image https://downloads.vyos.io/rolling/current/vyos-1.5-rolling-latest.iso
```

### Установка пакетов через apt

Если требуется установка дополнительных пакетов:

```bash
# Переменные прокси наследуются
sudo apt update
sudo apt install <package-name>
```

### Container (Podman) конфигурация

Для контейнеров может потребоваться отдельная настройка прокси:

```bash
configure

# Пример конфигурации контейнера с прокси
set container name myapp environment HTTP_PROXY value 'http://proxy.example.com:8080'
set container name myapp environment HTTPS_PROXY value 'http://proxy.example.com:8080'
set container name myapp environment NO_PROXY value 'localhost,127.0.0.1,.local'

commit
save
```

### VPN и прокси

При использовании VPN туннелей, убедитесь что трафик к прокси-серверу не идет через VPN:

```bash
configure

# Добавьте маршрут к прокси-серверу через основной gateway
set protocols static route <proxy-network>/24 next-hop <gateway-ip>

commit
save
```

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

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

1. **Шифрование паролей**: Пароли в конфигурации хранятся в зашифрованном виде
2. **Изоляция учетных записей**: Используйте отдельные учетные записи для разных роутеров
3. **Ограничение прав**: Прокси-аккаунты должны иметь минимальные необходимые права
4. **Аудит**: Логируйте все соединения через прокси на уровне прокси-сервера
5. **Мониторинг**: Отслеживайте аномальную активность

### Защита учетных данных

```bash
# После настройки прокси с паролем
configure
commit
save

# Пароль будет зашифрован в конфигурации
show system proxy
```

**Вывод:**
```
proxy {
    password ****************
    port 8080
    url http://proxy.example.com
    username admin
}
```

### Логирование доступа

На стороне прокси-сервера настройте детальное логирование для аудита:

**Squid пример:**
```
access_log /var/log/squid/access.log squid
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords
auth_param basic realm VyOS Proxy Authentication
```

## Удаление конфигурации прокси

Для полного удаления настроек прокси:

```bash
configure

# Удалить всю конфигурацию прокси
delete system proxy

commit
save
exit
```

**Проверка:**

```bash
env | grep -i proxy
```

Вывод должен быть пустым после удаления конфигурации.

## Совместимость версий

### VyOS 1.4 (Sagitta LTS)

Полностью поддерживается:
- Базовая конфигурация прокси
- Аутентификация
- Переменные окружения

### VyOS 1.5 (Circinus/Current)

Полностью поддерживается:
- Все функции из 1.4
- Улучшенная обработка HTTPS прокси
- Лучшая интеграция с контейнерами

**Примечание:** Синтаксис конфигурации идентичен между версиями.

## Ссылки и ресурсы

### Официальная документация

- [VyOS System Proxy Documentation](https://docs.vyos.io/en/latest/configuration/system/proxy.html)
- [VyOS System Configuration Guide](https://docs.vyos.io/en/latest/configuration/system/index.html)

### RFC стандарты

- [RFC 7617 - HTTP Basic Authentication](https://tools.ietf.org/html/rfc7617)
- [RFC 3986 - URI Generic Syntax](https://tools.ietf.org/html/rfc3986)

### Связанные разделы документации

- [System Login](/docs/vyos/system/vyos-login/) - Управление пользователями и аутентификация
- [System Syslog](/docs/vyos/system/vyos-syslog/) - Логирование системных событий
- [Task Scheduler](/docs/vyos/system/vyos-task-scheduler/) - Автоматизация задач

## Заключение

Системный прокси в VyOS - критически важный компонент для работы в корпоративных и облачных средах с ограниченным доступом к интернету. Правильная настройка прокси обеспечивает:

- Возможность обновления системы
- Соблюдение корпоративных политик безопасности
- Централизованное управление исходящим трафиком
- Аудит и мониторинг сетевой активности

Следуйте рекомендациям по безопасности и лучшим практикам для обеспечения надежной и безопасной работы вашей сетевой инфраструктуры на базе VyOS.

