Ответ
Для безопасного доступа к сервисам в локальной сети извне я использую несколько подходов, в зависимости от требований к безопасности и доступности сети.
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) на другой, чтобы снизить шум от автоматических сканеров.