Если вы запускаете что-то с публичным IP, вашу машину уже сканируют. Боты, брутфорс, стук по портам. Стандартная реакция — начать закручивать файрвол на работающей VM. Но именно так люди теряют доступ к собственным серверам.
Есть подход лучше. Называется «Private First». Суть в том, чтобы VM вообще не имела публичного адреса с момента создания. Нет адреса — нет поверхности атаки. А доступ к машине и выход в интернет настраиваются отдельными, контролируемыми каналами.
Что понадобится
VM без внешнего IP (например,
e2-medium, Ubuntu 24.04 LTS), Cloud NAT с Cloud Router, Identity-Aware Proxy (IAP) для SSH и Tailscale для доступа к веб-интерфейсу. Всё это укладывается в бесплатный кредит GCP на $300.Cloud NAT — выход в интернет без входа
VM без публичного IP не может сама ходить в интернет. Ни
apt update, ни docker pull работать не будут. Cloud NAT решает это. Он даёт машине исходящий трафик через Cloud Router, но входящих соединений извне не пропускает. VM видит интернет, интернет не видит VM.
IAP — SSH без открытого порта
Вместо того чтобы открывать порт 22 для всего мира, вы открываете его только для диапазона
35.235.240.0/20. Это адреса IAP-туннеля Google. Каждая SSH-сессия проходит аутентификацию через Google Identity ещё до того, как первый пакет долетит до VM.
Подключение выглядит так:
gcloud compute ssh --tunnel-through-iap <instance-name>
Если вы отрежете этот диапазон в файрволе, потеряете доступ к машине. Это главная ошибка, которую стоит запомнить.
Tailscale — доступ к веб-интерфейсу
Допустим, на VM крутится n8n, Metabase или любой другой сервис с веб-панелью. Выставлять её в интернет не нужно. Ставите Tailscale на VM и на свой ноутбук. Получаете приватную mesh-сеть поверх WireGuard. Дашборд доступен по адресу вроде
http://<tailscale-ip>:5678 с любого вашего устройства. Без SSL-сертификатов, без reverse proxy, без публичного DNS.Два нюанса с Docker
Если вы запускаете n8n в Docker, учтите два момента.
Контейнер может падать при старте из-за прав на директорию
~/.n8n. Внутренний пользователь n8n ожидает владельца 1000:1000. Фиксится одной командой:sudo chown -R 1000:1000 ~/.n8n
По умолчанию n8n выставляет
N8N_SECURE_COOKIE=true и принимает сессионные куки только по HTTPS. Через Tailscale вы ходите по HTTP на приватный IP, поэтому логин будет молча ломаться. Выставьте N8N_SECURE_COOKIE=false в переменных окружения Docker. На приватной VPN-сети это безопасно.📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#арсенал_инженера