Что вы получите после настройки

Вы настроите безопасный туннель от 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 PiEC2 (открыт для 0.0.0.0/0)
22SSH-сервер на Raspberry PiRaspberry Pi (доступен только через туннель)

Шаг 1. Создание EC2 инстанса

1.1 Запуск инстанса в AWS Console

  1. Откройте AWS Console и перейдите в раздел EC2
  2. Нажмите Launch Instance
  3. Задайте имя: rpi-tunnel-server
  4. Выберите образ: Ubuntu Server 22.04 LTS (HVM), SSD Volume Type
  5. Тип инстанса: t2.micro (подходит для Free Tier)
  6. Key pair: создайте новую пару ключей rpi-tunnel-key

Важно: сохраните приватный ключ

Файл rpi-tunnel-key.pem скачается автоматически. Без него вы не сможете подключиться к EC2. Сохраните его в безопасном месте.

1.2 Настройка Security Group

Создайте Security Group со следующими правилами:

ТипПортИсточникНазначение
SSH22My IPВаш прямой доступ к серверу
Custom TCP22220.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 атак
  • Регулярно обновляйте систему на обоих серверах

Итоговая схема подключения

1.

Ваш компьютер (любое место в мире) подключается к EC2 по SSH с ключом rpi-tunnel-key.pem

2.

EC2 сервер (100.64.0.0) принимает подключение и перенаправляет трафик на порт 2222

3.

Через 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
Нужна помощь с настройкой удалённого доступа?
Помогаю настроить безопасные SSH-туннели, автоматизировать развёртывание инфраструктуры и организовать удалённый доступ к IoT-устройствам. Расскажите о задаче — предложу оптимальное решение.