Как обеспечить доступ извне в локальную сеть по SSH?

«Как обеспечить доступ извне в локальную сеть по SSH?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для безопасного доступа к сервисам в локальной сети извне я использую несколько подходов, в зависимости от требований к безопасности и доступности сети.

1. Проброс портов (Port Forwarding) на маршрутизаторе: Это базовый метод, если у вас есть публичный IP-адрес и доступ к настройкам роутера.

  • Назначаю целевому серверу в локальной сети статический IP (например, через DHCP-резервацию).
  • На роутере настраиваю правило проброса внешнего порта (например, 2222) на внутренний адрес сервера и порт 22.
  • Подключаюсь извне: ssh user@your-public-ip -p 2222.

2. Обратный SSH-туннель (Reverse SSH Tunnel): Идеально, если локальная сеть находится за строгим NAT или фаерволом, но есть доступ к внешнему серверу (например, в облаке).

  • С локальной машины устанавливаю постоянное соединение, пробрасывая её порт на внешний сервер:
    ssh -N -R 2222:localhost:22 user@external-server.com
  • Теперь подключение к порту 2222 на external-server.com будет перенаправлено на SSH-демон моей локальной машины.
  • На практике для надёжности использую autossh или systemd-сервис для поддержания туннеля.

3. Использование облачных туннелей (например, Cloudflare Tunnel): Современный метод, не требующий открытия входящих портов на роутере и упрощающий доступ.

  • Устанавливаю cloudflared на локальную машину и аутентифицирую его.
  • Создаю туннель, который безопасно проксирует трафик:
    cloudflared tunnel --url ssh://localhost:22 --hostname ssh.yourdomain.com
  • Подключаюсь из любой точки: ssh user@ssh.yourdomain.com.

Критически важные меры безопасности для любого метода:

  • Отказ от паролей: Использую исключительно аутентификацию по SSH-ключам (ssh-keygen).
  • Защита от перебора: Настраиваю fail2ban для автоматической блокировки IP-адресов после нескольких неудачных попыток.
  • Нестандартный порт: Меняю стандартный порт SSH (22) на другой, чтобы снизить шум от автоматических сканеров.