Реализация на отдельных двух машинах с протестированным взаимодействием по проверке сообщений

This commit is contained in:
mi
2026-08-19 18:24:00 +03:00
parent bbef7a30c9
commit c7a80e7256
103 changed files with 3457 additions and 3725 deletions
@@ -0,0 +1,133 @@
Да, скрипт операционно идемпотентен: повторный запуск с тем же `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@<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:
```powershell
ssh -i "$env:USERPROFILE\.ssh\han_vm2_admin" admin@<VM2_PUBLIC_IP>
```
### 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="<YOUR_PUBLIC_IP>/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@<VM2_PUBLIC_IP>
```
Адрес и порт после `-L` должны точно совпадать с `PermitOpen`.
Во втором терминале:
```powershell
Test-NetConnection 127.0.0.1 -Port 16433
```
Для PostgreSQL с проверкой TLS-имени:
```sh
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:
```sh
sudo rm -f /root/bootstrap/tunnel.pub
```
Рабочий ключ уже будет установлен в `/etc/ssh/authorized_keys/tunnel`.