Удалённый доступ к 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 -y
2.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 ssh
2.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:
1exit
3.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