proxy
October 11

Доступ к зарубежным LLM с российских IP-адресов

При размещении систем автоматизации, таких как n8n или аналогичные платформы, на российских серверах для соблюдения требований 152-ФЗ о защите персональных данных, возникает техническая сложность с доступом к зарубежным языковым моделям (OpenAI, Anthropic, Google и другим). Эти сервисы в рамках соблюдения санкционного режима ограничивают подключения с российских IP-адресов.

Техническое решение через прокси-сервер

Эффективным способом обхода данного ограничения является настройка прокси-сервера в нейтральной юрисдикции. Для этого потребуется арендовать дополнительный VPS с локацией в стране, не участвующей в санкционных ограничениях - например, в Казахстане. Стоимость такого решения относительно невысока: VPS у провайдера Бегет с казахстанской локацией обойдётся в 22 рубля в сутки (около 660 рублей в месяц).

В данном руководстве подробно рассматривается процесс развёртывания прокси-сервера и конфигурации клиентской части. Вы научитесь настраивать автоматическое перенаправление всех запросов к зарубежным LLM через промежуточный сервер, что обеспечит стабильный доступ к AI-сервисам при сохранении данных на территории РФ в соответствии с законодательными требованиями.

Настройка прокси-сервера

Прокси-сервер будем реализовывать на базе Nginx Stream Module с SSL passthrough функциональностью. Это позволяет проксировать SSL/TLS трафик без его терминации, сохраняя end-to-end шифрование между клиентом и целевыми API. Nginx будем устанавливать в докере.

1. Подключаемся к серверу по SSH

ssh root@ip_адрес_сервера

2. Проверяем доступ к LLM

Перед дальнейшими действиями нам надо убедиться, что с этого сервера есть доступ к зарубежным LLM. Проверим на примере с OpenAI:

curl -i https://api.openai.com/v1/models -H "Authorization: Bearer YOUR_OPENAI_KEY"

где YOUR_OPENAI_KEY - это ваш ключ OpenAI, полученный на https://platform.openai.com/

В результате вы должны получить список моделей OpenAI. Если этого не произошло и вы получили 403 ошибку типа: {"error":{"code":"unsupported_country_region_territory","message":"Country, region, or territory not supported","param":null,"type":"request_forbidden"}}, то с этого сервера нельзя подключиться к зарубежным LLM и следуют выбрать другой сервер в другой локации.

3. Устанавливаем docker

Установку можно произвести по инструкции на сайте докера или выполнив действия ниже:

# Обновляем систему
apt update && apt install -y curl ca-certificates

# Добавляем GPG ключ Docker
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

# Добавляем репозиторий Docker
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

# Устанавливаем Docker
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

4. Создаем конфигурацию nginx

# Создаем директорию для конфигурации
mkdir -p /root/llm-proxy && cd /root/llm-proxy

# Создаем конфигурационный файл
cat > nginx.conf << 'EOF'
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
  worker_connections 1024;
}

stream {
  # Определяем upstream серверы
  upstream openai_api {
    server api.openai.com:443;
  }

  upstream anthropic_api {
    server api.anthropic.com:443;
  }

  upstream cohere_api {
    server api.cohere.com:443;
  }

  # Карта для выбора upstream по SNI hostname
  map $ssl_preread_server_name $upstream {
    api.openai.com openai_api;
    api.anthropic.com anthropic_api;
    api.cohere.com cohere_api;
    default openai_api;
  }

  # Прокси сервер
  server {
    listen 443;
    ssl_preread on;
    proxy_pass $upstream;
    proxy_connect_timeout 60s;
    proxy_timeout 600s;
  }
}
EOF

5. Запускаем docker контейнер с proxy

docker run -d \
	--name llm-proxy \
	-p 443:443 \
	-v /root/llm-proxy/nginx.conf:/etc/nginx/nginx.conf:ro \
	--restart always \
	nginx:latest

6. Проверяем работу контейнера

# Проверяем логи
docker logs llm-proxy

# Проверяем, что контейнер запущен
docker ps | grep llm-proxy

Настройка клиента для работы через прокси-сервер

Для корректной работы необходимо настроить перенаправление всех запросов к зарубежным LLM через ваш прокси-сервер. Ключевая идея решения - переопределить DNS-резолвинг для доменов AI-сервисов, чтобы они указывали на IP-адрес вашего прокси вместо реальных адресов.

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

Вместо стандартного DNS-разрешения мы жёстко привязываем определённые доменные имена (api.openai.com, api.anthropic.com и другие) к IP-адресу прокси-сервера. Все запросы к этим доменам автоматически направляются через промежуточный сервер, который уже имеет доступ к зарубежным LLM.

Варианты реализации

Вариант 1: Приложение запущено непосредственно на хосте

Если ваше клиентское приложение работает напрямую в операционной системе сервера, достаточно добавить соответствующие записи в системный файл /etc/hosts:

YOUR_PROXY_IP api.openai.com
YOUR_PROXY_IP api.anthropic.com
YOUR_PROXY_IP api.cohere.com

Вариант 2: Приложение в Docker-контейнере

При использовании Docker необходимо задействовать параметр extra_hosts в файле docker-compose.yml. Этот параметр добавляет пользовательские записи в /etc/hosts внутри изолированной среды контейнера, что позволяет перенаправлять запросы независимо от настроек хост-системы.

Практический пример для n8n на хостинге Beget

Ниже представлена пошаговая инструкция настройки для популярной платформы автоматизации n8n, развёрнутой на серверах Бегет:

1. Подключаемся к серверу n8n по SSH

ssh root@ip_адрес_сервера_n8n

2. Переходим в папку с n8n

cd /opt/beget/n8n/

3. Останавливаем контейнер с n8n

docker compose down n8n

4. Добавляем параметр extra_hosts в docker-compose.yml

Находим секцию x-shared: &shared и внутри нее после volumes добавляем новый параметр extra_hosts, вот так:

# Запускаем редактор nano
nano docker-compose.yml

# Добавляем extra_hosts
x-shared: &shared
  restart: always
  image: docker.n8n.io/n8nio/n8n:latest
  env_file: .env
  links:
    - postgres
    - redis
  volumes:
    - n8n_storage:/home/node/.n8n
    - ./healthcheck.js:/healthcheck.js
    - ./my_user_folder/pro_files:/home/node/my_user_folder/pro_files
  extra_hosts:
    - "api.openai.com:YOUR_PROXY_IP"
    - "api.anthropic.com:YOUR_PROXY_IP"
    - "api.cohere.com:YOUR_PROXY_IP"
  depends_on:
    redis:
      condition: service_healthy
    postgres:
      condition: service_healthy

где YOUR_PROXY_IP - это IP-адрес вашего прокси сервера

5. Запускаем контейнер с n8n

docker compose up -d n8n

6. Проверяем логи

docker compose logs n8n

Готово! Вы успешно настроили доступ к зарубежным AI-сервисам, сохранив при этом соответствие российскому законодательству. Успешной автоматизации!