При попытке получить доступ к удаленному серверу, такому как Raspberry Pi, с использованием графического клиента (RealVNC) через мобильный интернет и роутер, часто возникают сложности. Стандартные методы подключения в таких условиях могут не сработать.
Проблематика мобильного подключения
Основная трудность заключается в использовании мобильного роутера для подключения Raspberry Pi к интернету. Мобильные операторы часто используют технологию CGNAT, которая присваивает устройствам внутренние IP-адреса. Это означает, что прямой доступ из внешней сети к устройству становится невозможным без дополнительных настроек.
Возможные пути решения
Исследуя возможные решения, нашлись несколько вариантов:
- Публичный IP-адрес от мобильного оператора.
- VPN-соединение через облачный сервер.
- Reverse Proxy с использованием облачных сервисов.
- Создание 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 мобильным оператором.