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.