Да, скрипт операционно идемпотентен: повторный запуск с тем же `TUNNEL_USER` приводит конфигурацию к тому же состоянию. Он повторно проверит настройки и выполнит reload SSH, поэтому не является строго no-op. Нельзя менять `TUNNEL_USER` при повторном запуске: старый пользователь и его ключ автоматически не удаляются. ## Инструкция запуска ### 1. Создать ключ на рабочем компьютере PowerShell: ```powershell ssh-keygen -t ed25519 ` -f "$env:USERPROFILE\.ssh\han_vm2_tunnel" ` -C "han-vm2-db-tunnel" ``` Не перезаписывайте существующий ключ без запланированной ротации. ### 2. Передать ключ и скрипт на VM2 ```powershell scp -i "$env:USERPROFILE\.ssh\han_vm2_admin" ` "$env:USERPROFILE\.ssh\han_vm2_tunnel.pub" ` admin@:/tmp/han_vm2_tunnel.pub scp -i "$env:USERPROFILE\.ssh\han_vm2_admin" ` ".\setup-tunnel-user.sh" ` admin@:/tmp/setup-tunnel-user.sh ``` Подключиться к VM2: ```powershell ssh -i "$env:USERPROFILE\.ssh\han_vm2_admin" admin@ ``` ### 3. Установить временные файлы На VM2: ```sh sudo install -d -o root -g root -m 0700 /root/bootstrap sudo install -o root -g root -m 0600 \ /tmp/han_vm2_tunnel.pub \ /root/bootstrap/tunnel.pub sudo install -o root -g root -m 0700 \ /tmp/setup-tunnel-user.sh \ /root/setup-tunnel-user.sh rm -f /tmp/han_vm2_tunnel.pub /tmp/setup-tunnel-user.sh ``` Текущую admin-сессию не закрывать до окончания проверки. ### 4. Запустить с ограничением по IP Укажите внешний IP рабочей сети: ```sh sudo env \ TUNNEL_AUTHORIZED_KEY_FILE=/root/bootstrap/tunnel.pub \ TUNNEL_SOURCE_CIDRS="/32" \ PG_HOST="192.168.0.210" \ PG_PORT="6433" \ bash /root/setup-tunnel-user.sh ``` Несколько разрешённых сетей: ```sh TUNNEL_SOURCE_CIDRS="203.0.113.10/32,198.51.100.0/24" ``` Дополнительный endpoint: ```sh EXTRA_PERMIT_OPEN="192.168.0.210:5433" ``` ### 5. Осознанно разрешить любой источник Только если доступ уже ограничен cloud SG/firewall: ```sh sudo env \ TUNNEL_AUTHORIZED_KEY_FILE=/root/bootstrap/tunnel.pub \ TUNNEL_ALLOW_ANY_SOURCE=true \ PG_HOST="192.168.0.210" \ PG_PORT="6433" \ bash /root/setup-tunnel-user.sh ``` Одновременно задавать `TUNNEL_SOURCE_CIDRS` и `TUNNEL_ALLOW_ANY_SOURCE=true` нельзя. ### 6. Проверить туннель На рабочем компьютере в отдельном PowerShell: ```powershell ssh ` -i "$env:USERPROFILE\.ssh\han_vm2_tunnel" ` -N ` -o ExitOnForwardFailure=yes ` -o ServerAliveInterval=30 ` -L "127.0.0.1:16433:192.168.0.210:6433" ` tunnel@ ``` Адрес и порт после `-L` должны точно совпадать с `PermitOpen`. Во втором терминале: ```powershell Test-NetConnection 127.0.0.1 -Port 16433 ``` Для PostgreSQL с проверкой TLS-имени: ```sh psql "host= hostaddr=127.0.0.1 port=16433 dbname= user= sslmode=verify-full sslrootcert=" ``` ### 7. Очистить bootstrap-файлы После успешной проверки на VM2: ```sh sudo rm -f /root/bootstrap/tunnel.pub ``` Рабочий ключ уже будет установлен в `/etc/ssh/authorized_keys/tunnel`.