Files

3.8 KiB

Да, скрипт операционно идемпотентен: повторный запуск с тем же TUNNEL_USER приводит конфигурацию к тому же состоянию. Он повторно проверит настройки и выполнит reload SSH, поэтому не является строго no-op.

Нельзя менять TUNNEL_USER при повторном запуске: старый пользователь и его ключ автоматически не удаляются.

Инструкция запуска

1. Создать ключ на рабочем компьютере

PowerShell:

ssh-keygen -t ed25519 `
  -f "$env:USERPROFILE\.ssh\han_vm2_tunnel" `
  -C "han-vm2-db-tunnel"

Не перезаписывайте существующий ключ без запланированной ротации.

2. Передать ключ и скрипт на VM2

scp -i "$env:USERPROFILE\.ssh\han_vm2_admin" `
  "$env:USERPROFILE\.ssh\han_vm2_tunnel.pub" `
  admin@<VM2_PUBLIC_IP>:/tmp/han_vm2_tunnel.pub

scp -i "$env:USERPROFILE\.ssh\han_vm2_admin" `
  ".\setup-tunnel-user.sh" `
  admin@<VM2_PUBLIC_IP>:/tmp/setup-tunnel-user.sh

Подключиться к VM2:

ssh -i "$env:USERPROFILE\.ssh\han_vm2_admin" admin@<VM2_PUBLIC_IP>

3. Установить временные файлы

На VM2:

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 рабочей сети:

sudo env \
  TUNNEL_AUTHORIZED_KEY_FILE=/root/bootstrap/tunnel.pub \
  TUNNEL_SOURCE_CIDRS="<YOUR_PUBLIC_IP>/32" \
  PG_HOST="192.168.0.210" \
  PG_PORT="6433" \
  bash /root/setup-tunnel-user.sh

Несколько разрешённых сетей:

TUNNEL_SOURCE_CIDRS="203.0.113.10/32,198.51.100.0/24"

Дополнительный endpoint:

EXTRA_PERMIT_OPEN="192.168.0.210:5433"

5. Осознанно разрешить любой источник

Только если доступ уже ограничен cloud SG/firewall:

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:

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@<VM2_PUBLIC_IP>

Адрес и порт после -L должны точно совпадать с PermitOpen.

Во втором терминале:

Test-NetConnection 127.0.0.1 -Port 16433

Для PostgreSQL с проверкой TLS-имени:

psql "host=<DB_CERTIFICATE_NAME> hostaddr=127.0.0.1 port=16433 dbname=<DB> user=<USER> sslmode=verify-full sslrootcert=<PATH_TO_CA>"

7. Очистить bootstrap-файлы

После успешной проверки на VM2:

sudo rm -f /root/bootstrap/tunnel.pub

Рабочий ключ уже будет установлен в /etc/ssh/authorized_keys/tunnel.