В эпоху блокировок, санкций актуальным становятся пробросы туннелей до определенных сервисов. Расскажу на примере SSH-туннеля для доступа к OpenAI API из России.
Т.е. ваш сервер размещен в стране, где доступ к api.openai.com ограничен, но хотите использовать OpenAI API. Для этого нужно пробросить трафик через внешний сервер с помощью SSH-туннеля. Это позволяет обойти блокировку и отправлять запросы на OpenAI, как будто вы находитесь за границей.
В этой статье пошагово разберём, как это сделать.
Как это работает
Суть идеи:
- У вас есть локальный сервер в России (назовём его
ru_server
). - Есть зарубежный VPS с доступом к
api.openai.com
(назовём егоVPS_ABROAD
). - Мы создаём туннель, по которому весь трафик с
ru_server
наapi.openai.com:443
проксируется черезVPS_ABROAD
. - Локальные запросы к
127.0.0.1:8080
наru_server
становятся эквивалентом подключения кapi.openai.com:443
с зарубежного сервера.
Ручной запуск SSH-туннеля
Запуск туннеля на ru_server выполняется командой:
1 2 |
ssh -v -N -L 127.0.0.1:8080:api.openai.com:443 \ openaitunnel@VPS_ABROAD_IP_ADDRESS |
Расшифровка:
-v
— вывод отладочной информации (не обязательно)-N
— не выполнять команды, только туннелирование-L 127.0.0.1:8080:api.openai.com:443
— проброс локального порта 8080 наapi.openai.com:443
Важно: должен быть настроен доступ по SSH-ключу к openaitunnel@VPS_ABROAD_IP_ADDRESS.
Как видите, вся операция выполняется буквально одной командой. Но нам нужно еще настроить авторизацию по ssh, которая в примере выполняется через учетную запись пользователя openaitunnel.
Создадим пользователя и настроим его на прием авторизации по ssh token.
Настройка VPS_ABROAD
Создание отдельного SSH-пользователя:
1 |
sudo adduser openaitunnel |
Теперь для авторизации (чтобы не вводить и не светить пароль) мы добавим один из публичных ключей пользователя root с ru_server в
1 |
/home/openaitunnel/.ssh/authorized_keys |
на vps_abroad.
Скорее всего, ключ нужно будет создать. Выполним на ru_server для пользователя root:
1 |
ssh-keygen -t ed25519 -C "ru-server" |
У вас появятся ключи:
- приватный ключ: /root
/.ssh/id_ed25519
- публичный ключ:
/root/.ssh/id_ed25519.pub
Теперь публичный ключ добавим в authorized_keys юзера openaitunnel на vps_abroad
. Это можно сделать вручную, но на самом деле есть специальная утилита ssh-copy-id, которая делает это за нас.
Выполняем на ru_server:
1 2 |
ssh-copy-id -i /root/.ssh/id_ed25519.pub \ openaitunnel@VPS_ABROAD_IP_ADDRESS |
После этих манипуляция, команда установки туннеля не только будет работать, но и перестанет запрашивать пароль для openaitunnel.
Тестирование работы туннеля
Для работы туннеля нужно, чтобы vps_abroad имел доступ к OpenAI. Давайте используем запрос API, выдающий список моделей для теста.
1 2 3 |
curl https://api.openai.com/v1/models \ -H "Authorization: Bearer sk-..." \ -H "Content-Type: application/json" |
Проверив, что сервер действительно имеет доступ к OpenAI, можно тестировать ru_server (через туннель). Туннель можно открыть в одной сессии, а тест выполнять в другой, чтобы не закрывать туннель.
1 2 3 4 5 |
curl https://api.openai.com/v1/models \ --resolve api.openai.com:443:127.0.0.1 \ --connect-to api.openai.com:443:127.0.0.1:8080 \ -H "Authorization: Bearer sk-..." \ -H "Content-Type: application/json" |
Если всё настроено верно — вы получите список моделей от OpenAI.
Создание демона с помощью autossh
Чтобы туннель не приходилось запускать вручную, используем autossh и создадим systemd-сервис.
Установка autossh
1 |
sudo apt install autossh |
Файл сервиса /etc/systemd/system/openai-tunnel.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[Unit] Description=OpenAI SSH Tunnel After=network.target [Service] ExecStart=/usr/bin/autossh -M 0 -N \ -o "ServerAliveInterval=60" \ -o "ServerAliveCountMax=3" \ -L 127.0.0.1:8080:api.openai.com:443 \ openaitunnel@VPS_ABROAD_AI_ADDRESS Restart=always User=root [Install] WantedBy=multi-user.target |
Активация сервиса
1 2 3 4 |
sudo systemctl daemon-reload sudo systemctl enable openai-tunnel sudo systemctl start openai-tunnel sudo systemctl status openai-tunnel |
Проверьте статус: если активен — всё готово.
Теперь ваш ru_server может обращаться к OpenAI API как будто он находится за границей, и это работает в фоне автоматически после каждой перезагрузки. Отличное решение для хостинга в РФ при работе с зарубежными API.