Удалённый доступ к Raspberry Pi через Reverse SSH туннель
Что вы получите после настройки
Вы настроите безопасный туннель от Raspberry Pi к облачному серверу AWS EC2 и получите постоянный доступ к своему устройству из любой точки мира. Решение работает даже за жёстким NAT и не требует настройки роутера.
Обход NAT без рисков
Работает за любым роутером без проброса портов. Raspberry Pi сам инициирует соединение — никаких открытых портов в вашей домашней сети.
Стабильное подключение
Автоматическое переподключение при обрывах. Systemd-сервис мониторит туннель и восстанавливает его через 10 секунд после разрыва.
Защита ключами
ED25519-ключи для всех соединений. Отдельный непривилегированный пользователь tunnel на EC2 для изоляции туннеля.
Удобные методы доступа
Три способа подключения: двухступенчатый, прямой через ProxyCommand и упрощённый через SSH config.
Концепция Reverse SSH
Обычный SSH требует, чтобы сервер (Raspberry Pi) был доступен извне. Но домашние роутеры блокируют входящие соединения, и проброс портов создаёт уязвимости.
Reverse SSH переворачивает логику: Raspberry Pi сам подключается к публичному серверу EC2 и создаёт туннель. Сервер пробрасывает порт 2222 на локальный порт 22 устройства. Вы подключаетесь к серверу, а оттуда — через туннель к Raspberry Pi.
Ключевой принцип
Raspberry Pi устанавливает исходящее соединение (которое проходит через NAT) и держит его открытым. EC2 слушает на порту 2222 и перенаправляет трафик обратно через туннель.
Архитектура решения
Ваш компьютер
В любой точке мира
EC2 Мост
100.64.0.0:2222
Raspberry Pi
За домашним роутером
Компоненты системы
AWS EC2 Instance
Публичный сервер-посредник в облаке. Всегда доступен по статическому IP-адресу.
- IP: 100.64.0.0
- OS: Ubuntu Server 22.04 LTS
- Type: t2.micro (Free Tier)
Raspberry Pi 5
Ваше домашнее устройство, которое инициирует и поддерживает туннель.
- Пользователь: a528fe2
- Адрес в локальной сети: raspberrypi.local
- SSH-порт: 22 (стандартный)
SSH Tunnel
Зашифрованный канал между Raspberry Pi и EC2, управляемый systemd-сервисом.
- Порт на EC2: 2222 (перенаправляется на RPI:22)
- Тип: Remote Port Forwarding (-R флаг)
- Автозапуск: systemd unit reverse-tunnel.service
Требования и подготовка
Чек-лист перед началом
- Аккаунт AWS с доступом к EC2 и возможностью создания Security Groups
- Raspberry Pi с установленной ОС (Raspberry Pi OS, Ubuntu) и SSH-доступом в локальной сети
- Базовые знания SSH, терминала Linux/macOS (или WSL на Windows)
- Редактор vim или nano для правки конфигов
Справочник по используемым портам
| Порт | Назначение | Где открыт |
|---|---|---|
22 | Стандартный SSH-порт для прямого подключения | EC2 (ограничен Security Group) |
2222 | Туннельный порт для доступа к Raspberry Pi | EC2 (открыт для 0.0.0.0/0) |
22 | SSH-сервер на Raspberry Pi | Raspberry Pi (доступен только через туннель) |
Шаг 1. Создание EC2 инстанса
1.1 Запуск инстанса в AWS Console
- Откройте AWS Console и перейдите в раздел EC2
- Нажмите Launch Instance
- Задайте имя:
rpi-tunnel-server - Выберите образ: Ubuntu Server 22.04 LTS (HVM), SSD Volume Type
- Тип инстанса: t2.micro (подходит для Free Tier)
- Key pair: создайте новую пару ключей
rpi-tunnel-key
Важно: сохраните приватный ключ
Файл rpi-tunnel-key.pem скачается автоматически. Без него вы не сможете подключиться к EC2. Сохраните его в безопасном месте.
1.2 Настройка Security Group
Создайте Security Group со следующими правилами:
| Тип | Порт | Источник | Назначение |
|---|---|---|---|
| SSH | 22 | My IP | Ваш прямой доступ к серверу |
| Custom TCP | 2222 | 0.0.0.0/0 | Доступ к туннелю отовсюду |
1.3 Сохранение ключа на локальной машине
На вашем компьютере (Linux/macOS или WSL):
1# Переместите ключ в директорию SSH
2mv ~/Downloads/rpi-tunnel-key.pem ~/.ssh/
3
4# Установите правильные права доступа (обязательно!)
5chmod 400 ~/.ssh/rpi-tunnel-key.pemСправка: chmod 400
Права 400 означают: только владелец может читать файл. SSH требует строгих прав для приватных ключей — иначе откажется их использовать.
1.4 Первое подключение к EC2
После запуска инстанса AWS присвоит ему публичный IP. В нашем примере это 100.64.0.0:
1ssh -i ~/.ssh/rpi-tunnel-key.pem ubuntu@100.64.0.0При первом подключении SSH спросит подтверждение fingerprint — введите yes.
Шаг 2. Настройка SSH-сервера на EC2
2.1 Обновление системы
После подключения к EC2 обновите пакеты:
1sudo apt update && sudo apt upgrade -y2.2 Настройка sshd_config
Откройте конфигурацию SSH-сервера:
1sudo vim /etc/ssh/sshd_configНайдите и измените следующие параметры:
1# Разрешает пробрасывать порты на внешние интерфейсы
2GatewayPorts yes
3
4# Отправляет keep-alive пакеты каждые 60 секунд
5ClientAliveInterval 60
6
7# Разрывает соединение после 3 неотвеченных пакетов
8ClientAliveCountMax 3Справка: GatewayPorts
По умолчанию SSH-сервер принимает проброшенные порты только на localhost. Параметр GatewayPorts yes позволяет привязать порт 2222 ко всем интерфейсам, что необходимо для внешнего доступа.
Сохраните файл: нажмите Esc, затем введите :wq и Enter.
Перезапустите SSH-сервер:
1sudo systemctl restart ssh2.3 Создание пользователя для туннеля
Создайте отдельного непривилегированного пользователя для управления туннелем:
1sudo adduser tunnelВведите пароль (например, TunnelPass2025!). Остальные поля можно пропустить, нажимая Enter.
Зачем отдельный пользователь?
Принцип наименьших привилегий: пользователь tunnel будет использоваться только для туннеля и не имеет доступа к системным ресурсам. Это повышает безопасность.
2.4 Подготовка authorized_keys для tunnel
Переключитесь на пользователя tunnel:
1sudo su - tunnelСоздайте директорию для SSH-ключей с правильными правами:
1mkdir .ssh
2chmod 700 .ssh
3touch .ssh/authorized_keys
4chmod 600 .ssh/authorized_keysСправка: права доступа для SSH
700на.ssh— только владелец может читать, писать и входить600наauthorized_keys— только владелец может читать и писать- SSH строго проверяет права и откажется работать при неправильной настройке
Пока не закрывайте терминал — вы вернётесь сюда после создания ключа на Raspberry Pi.
Шаг 3. Настройка Raspberry Pi
3.1 Подключение к Raspberry Pi
Подключитесь к Raspberry Pi локально или по SSH в вашей домашней сети:
1ssh a528fe2@raspberrypi.localПароль: 0fa65eb3e31c
Справка: .local адреса
raspberrypi.local работает через mDNS (Multicast DNS). Если не резолвится, используйте IP-адрес из вашей локальной сети (например, 192.168.1.100).
3.2 Генерация SSH-ключа для туннеля
На Raspberry Pi создайте новую пару ключей ED25519:
1ssh-keygen -t ed25519 -f ~/.ssh/id_tunnelКогда спросит passphrase, просто нажмите Enter (без пароля для автоматического подключения).
Справка: ED25519 vs RSA
ED25519 — современный криптографический алгоритм, более быстрый и безопасный чем RSA. Ключи короче (256 бит против 2048-4096 бит RSA), но обеспечивают сопоставимую или лучшую безопасность.
3.3 Копирование публичного ключа
Выведите публичный ключ:
1cat ~/.ssh/id_tunnel.pubСкопируйте весь вывод (начинается с ssh-ed25519 AAAA...).
3.4 Добавление ключа в authorized_keys на EC2
Вернитесь в терминал EC2, где вы зашли под пользователем tunnel:
1vim .ssh/authorized_keysНажмите i для режима вставки, вставьте скопированный публичный ключ, затем нажмите Esc, введите :wq и Enter.
Выйдите из пользователя tunnel:
1exit3.5 Проверка подключения по ключу
Вернитесь на Raspberry Pi и проверьте подключение к EC2 с новым ключом:
1ssh -i ~/.ssh/id_tunnel tunnel@100.64.0.0Если спросит "Are you sure?", введите yes. Подключение должно пройти без запроса пароля.
Успешная авторизация по ключу
Если вы зашли без пароля — отлично! Авторизация по ключу настроена. Выйдите командой exit.
Шаг 4. Создание постоянного туннеля
4.1 Ручной запуск туннеля для теста
На Raspberry Pi запустите туннель в фоновом режиме:
1ssh -i ~/.ssh/id_tunnel -fN -R 2222:localhost:22 tunnel@100.64.0.0Расшифровка флагов SSH
-i ~/.ssh/id_tunnel— использовать конкретный приватный ключ-f— перейти в фоновый режим после успешного подключения-N— не выполнять команды на удалённом сервере (только туннель)-R 2222:localhost:22— Remote Port Forwarding: пробросить порт 22 локального хоста на порт 2222 удалённого сервера
4.2 Проверка активности туннеля
Подключитесь к EC2:
1ssh -i ~/.ssh/rpi-tunnel-key.pem ubuntu@100.64.0.0Проверьте, что порт 2222 слушается:
1sudo ss -tulpn | grep 2222Вы должны увидеть строку с портом 2222 в состоянии LISTEN. Теперь попробуйте подключиться к Raspberry Pi через туннель:
1ssh -p 2222 a528fe2@localhostВведите пароль Raspberry Pi: 0fa65eb3e31c
Туннель работает!
Если вы вошли на Raspberry Pi — поздравляем! Туннель функционирует корректно. Выйдите дважды (exit с RPI, exit с EC2).
4.3 Автоматический запуск через systemd
На Raspberry Pi создайте systemd unit для автозапуска туннеля при загрузке:
1sudo vim /etc/systemd/system/reverse-tunnel.serviceВставьте следующую конфигурацию (нажмите i, вставьте, затем Esc → :wq):
1[Unit]
2Description=Reverse SSH Tunnel to EC2
3After=network-online.target
4Wants=network-online.target
5
6 [Service]
7Type=simple
8User=a528fe2
9ExecStart=/usr/bin/ssh -i /home/a528fe2/.ssh/id_tunnel -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=no -N -R 2222:localhost:22 tunnel@100.64.0.0
10Restart=always
11RestartSec=10
12
13 [Install]
14WantedBy=multi-user.targetСправка: параметры systemd unit
After=network-online.target— запускать после полной инициализации сетиType=simple— процесс остаётся на переднем планеRestart=always— автоматически перезапускать при паденииRestartSec=10— ждать 10 секунд перед перезапускомServerAliveInterval=60— отправлять keepalive каждые 60 секундExitOnForwardFailure=yes— завершаться при ошибке проброса порта
Активируйте и запустите сервис:
1sudo systemctl daemon-reload
2sudo systemctl enable reverse-tunnel.service
3sudo systemctl start reverse-tunnel.serviceПроверьте статус:
1sudo systemctl status reverse-tunnel.serviceВы должны увидеть active (running). Если есть ошибки, просмотрите логи:
1sudo journalctl -u reverse-tunnel.service -n 50Шаг 5. Способы подключения к Raspberry Pi
Способ 1: Двухступенчатое подключение
Сначала подключитесь к EC2, затем к Raspberry Pi:
1# Шаг 1: подключение к EC2
2ssh -i ~/.ssh/rpi-tunnel-key.pem ubuntu@100.64.0.0
3
4# Шаг 2: с EC2 подключение к RPI через туннель
5ssh -p 2222 a528fe2@localhost
6# Пароль: 0fa65eb3e31cКогда использовать
Подходит для отладки и понимания процесса. Позволяет проверить состояние туннеля на EC2 перед подключением к RPI.
Способ 2: Прямое подключение одной командой
Подключитесь к Raspberry Pi напрямую через EC2:
1ssh -i ~/.ssh/rpi-tunnel-key.pem ubuntu@100.64.0.0 -t "ssh -p 2222 a528fe2@localhost"Справка: флаг -t
Флаг -t принудительно выделяет псевдотерминал. Необходим для интерактивных сессий, когда вы запускаете команду на удалённом сервере, которая требует терминал (например, вложенный SSH).
Способ 3: Упрощённое подключение через SSH config (рекомендуется)
Настройте SSH config для удобного доступа. На вашем компьютере:
1vim ~/.ssh/configДобавьте следующие секции (нажмите i, вставьте, Esc → :wq):
1Host ec2-tunnel
2HostName 100.64.0.0
3User ubuntu
4IdentityFile ~/.ssh/rpi-tunnel-key.pem
5
6Host rpi
7HostName localhost
8Port 2222
9User a528fe2
10ProxyCommand ssh -i ~/.ssh/rpi-tunnel-key.pem -W localhost:2222 ubuntu@100.64.0.0Справка: ProxyCommand
ProxyCommand указывает SSH, как добраться до целевого хоста. Флаг -W создаёт туннель для перенаправления трафика. SSH сначала подключается к EC2, затем через него пробрасывает соединение к localhost:2222.
Установите правильные права на config:
1chmod 600 ~/.ssh/configТеперь подключайтесь простой командой:
1ssh rpiВведите пароль Raspberry Pi (0fa65eb3e31c), и вы на устройстве!
Следующий шаг: авторизация по ключу
После настройки авторизации по ключу (Шаг 6) пароль не потребуется — команда ssh rpi будет подключать мгновенно без запроса пароля.
Шаг 6. Настройка авторизации по ключу на Raspberry Pi
Чтобы не вводить пароль при каждом подключении, настройте SSH-ключ для доступа к Raspberry Pi.
6.1 Генерация ключа на локальной машине
На вашем компьютере:
1ssh-keygen -t ed25519 -f ~/.ssh/id_rpiНе задавайте passphrase (нажмите Enter) для автоматического входа.
6.2 Копирование публичного ключа
Выведите публичный ключ:
1cat ~/.ssh/id_rpi.pubСкопируйте вывод (начинается с ssh-ed25519).
6.3 Добавление ключа в authorized_keys на RPI
Подключитесь к Raspberry Pi:
1ssh -i ~/.ssh/rpi-tunnel-key.pem ubuntu@100.64.0.0 -t "ssh -p 2222 a528fe2@localhost"Введите пароль RPI (0fa65eb3e31c). На Raspberry Pi выполните:
1mkdir -p ~/.ssh
2chmod 700 ~/.ssh
3echo "ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ" >> ~/.ssh/authorized_keys
4chmod 600 ~/.ssh/authorized_keys
5exitЗамените ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ на скопированный текст из id_rpi.pub.
6.4 Обновление SSH config
Откройте ~/.ssh/config и добавьте строку IdentityFile в секцию Host rpi:
1Host rpi
2HostName localhost
3Port 2222
4User a528fe2
5IdentityFile ~/.ssh/id_rpi
6ProxyCommand ssh -i ~/.ssh/rpi-tunnel-key.pem -W localhost:2222 ubuntu@100.64.0.0Теперь подключайтесь без пароля:
1ssh rpiГотово! Бесшовный доступ настроен
Теперь команда ssh rpi мгновенно подключает вас к Raspberry Pi из любой точки мира без паролей и дополнительных шагов.
Диагностика и мониторинг
Проверка статуса на Raspberry Pi
Проверьте состояние systemd-сервиса туннеля:
1sudo systemctl status reverse-tunnel.serviceПроверьте, что SSH-процесс туннеля запущен:
1ps aux | grep "ssh.*tunnel@100.64.0.0"Проверка порта на EC2
Подключитесь к EC2 и проверьте прослушивание порта 2222:
1sudo ss -tulpn | grep 2222Вы должны увидеть строку с LISTEN и sshd.
Перезапуск туннеля
Если туннель завис или работает нестабильно:
1sudo systemctl restart reverse-tunnel.serviceПросмотр логов в реальном времени
Следите за логами сервиса:
1sudo journalctl -u reverse-tunnel.service -fНажмите Ctrl+C для выхода из режима просмотра.
Полезные команды для мониторинга
systemctl is-active reverse-tunnel.serviceБыстрая проверка: возвращает active или inactive
journalctl -u reverse-tunnel.service --since todayВсе логи за сегодня
systemctl list-timersЕсли настроили периодические проверки через systemd timer
FAQ и решение проблем
Connection refused при подключении через туннель
Причина: Туннель не запущен или упал на Raspberry Pi.
Решение: На RPI проверьте sudo systemctl status reverse-tunnel.service. Если inactive или failed, перезапустите: sudo systemctl restart reverse-tunnel.service
Permission denied (publickey) при подключении
Причина: Неправильный ключ, права доступа или ключ не добавлен в authorized_keys.
Решение:
- Проверьте права на ключи:
chmod 400 ~/.ssh/id_tunnel - Убедитесь, что публичный ключ добавлен в
~/.ssh/authorized_keysна целевом хосте - Проверьте права на
~/.ssh(700) и~/.ssh/authorized_keys(600)
Туннель периодически падает и не восстанавливается
Причина: Нестабильное интернет-соединение или неправильные параметры SSH.
Решение: Убедитесь, что в systemd unit указаны параметры ServerAliveInterval=60 и Restart=always. Увеличьте RestartSec до 30 секунд при плохом соединении.
Порт 2222 недоступен извне
Причина: Security Group на EC2 не разрешает входящие соединения на порт 2222.
Решение: В AWS Console проверьте Security Group инстанса. Должно быть правило: Type: Custom TCP, Port: 2222, Source: 0.0.0.0/0.
Как изменить порт туннеля?
Если порт 2222 занят или нужен другой, измените его в двух местах:
- В systemd unit на RPI: замените
-R 2222:localhost:22на-R НОВЫЙ_ПОРТ:localhost:22 - В Security Group EC2: добавьте правило для нового порта
- В SSH config на вашем компьютере: измените
Port 2222на новое значение
Безопасно ли открывать порт 2222 для всех?
Относительно безопасно, так как доступ защищён SSH-ключами и паролем Raspberry Pi. Для повышения безопасности:
- Отключите парольную аутентификацию на RPI (только ключи)
- Ограничьте доступ к порту 2222 через Security Group вашим IP-адресом или диапазоном
- Используйте fail2ban на EC2 для блокировки brute-force атак
- Регулярно обновляйте систему на обоих серверах
Итоговая схема подключения
Ваш компьютер (любое место в мире) подключается к EC2 по SSH с ключом rpi-tunnel-key.pem
EC2 сервер (100.64.0.0) принимает подключение и перенаправляет трафик на порт 2222
Через SSH-туннель трафик идёт к Raspberry Pi (пользователь a528fe2) за домашним роутером
Учётные данные для быстрого доступа:
- EC2 доступ: ubuntu @ 100.64.0.0, ключ ~/.ssh/rpi-tunnel-key.pem
- EC2 туннель: tunnel @ 100.64.0.0, пароль TunnelPass2025!
- RPI доступ: a528fe2 @ raspberrypi.local, пароль 0fa65eb3e31c
- Быстрое подключение: ssh rpi