Доступ к Raspberry Pi через RealVNC при мобильном подключении

При попытке получить доступ к удаленному серверу, такому как Raspberry Pi, с использованием графического клиента (RealVNC) через мобильный интернет и роутер, часто возникают сложности. Стандартные методы подключения в таких условиях могут не сработать.

Проблематика мобильного подключения

Основная трудность заключается в использовании мобильного роутера для подключения Raspberry Pi к интернету. Мобильные операторы часто используют технологию CGNAT, которая присваивает устройствам внутренние IP-адреса. Это означает, что прямой доступ из внешней сети к устройству становится невозможным без дополнительных настроек.

Возможные пути решения

Исследуя возможные решения, нашлись несколько вариантов:

  1. Публичный IP-адрес от мобильного оператора.
  2. VPN-соединение через облачный сервер.
  3. Reverse Proxy с использованием облачных сервисов.
  4. Создание SSH туннеля для проброса портов.

После взвешивания всех за и против, - использование SSH туннеля оказалось наиболее гибким и экономичным.

Решение: SSH туннель для проброса портов

Шаг 1: Настройка SSH туннеля

SSH туннель позволяет безопасно перенаправлять трафик с одного компьютера на другой через защищённое соединение:

ssh -R *:34567:localhost:9876 root@myremote.server.com -i private-key.rsa

В данном случае, использование команды ssh для создания туннеля требует нескольких параметров:

  • -R указывает на создание обратного туннеля (-R), который слушает порт 34567 на удалённом сервере и перенаправляет весь трафик на localhost:9876 локальной машины. Использование : перед номером порта разрешает прослушивание на всех интерфейсах удалённого сервера, делая туннель доступным снаружи.
  • root@myremote.server.com определяет пользователя (root) и адрес удалённого сервера, к которому устанавливается соединение.
  • -i private-key.rsa указывает SSH использовать конкретный приватный ключ для аутентификации на удалённом сервере. Файл private-key.rsa должен быть приватным ключом, соответствующим публичному ключу, сохранённому в файле ~/.ssh/authorized_keys на удалённом сервере.

Шаг 2: Изменение конфигурации SSH на удалённом сервере

Для того чтобы разрешить прослушивание порта на всех интерфейсах, необходимо изменить конфигурацию SSH сервера на удалённой машине:

  • Открыть файл /etc/ssh/sshd_config на удалённом сервере.
  • Найти строку #GatewayPorts no и изменить на GatewayPorts yes. Если такой строки нет, просто добавить GatewayPorts yes в конец файла.
  • Сохранить файл и перезапустить SSH сервер командой sudo systemctl restart sshd на системах с systemd или sudo service ssh restart на системах с init.d.

Шаг 3: Запуск туннеля в фоновом режиме

Для удобства использования и автоматического пересоздания туннеля при разрыве соединения, хорошо бы создать скрипт, который запускает (и перезапускает) SSH туннель в фоне:

#!/bin/bash

killall ssh
ssh -f -N -o "ExitOnForwardFailure=yes" -R *:34567:localhost:9876 root@myremote.server.com -i /path/to/private-key.rsa

Для запуска SSH туннеля в фоновом режиме используются параметры -f и -N:

  • -f говорит SSH перейти в фоновый режим после аутентификации.
  • -N указывает, что команды исполнять не нужно. Это полезно, когда цель соединения — только перенаправление портов.
  • -o "ExitOnForwardFailure=yes" гарантирует, что SSH завершится с ошибкой, если не удастся установить перенаправление порта.

Важно: Путь к ключу SSH (/path/to/private-key.rsa) должен быть абсолютным и указывать на местоположение приватного ключа на локальной машине. Убедитесь, что ключ защищён соответствующими правами доступа (chmod 600 /path/to/private-key.rsa).

Периодический перезапуск через CRON

Чтобы обеспечить стабильность соединения, скрипт запускается каждые 30 минут с помощью cron.

*/30 * * * * /path/to/script.sh

Такое решение позволило обойти ограничения мобильного интернета и обеспечить надёжный доступ к Raspberry Pi через RealVNC, несмотря на использование CGNAT мобильным оператором.