Реализация на отдельных двух машинах с протестированным взаимодействием по проверке сообщений
This commit is contained in:
@@ -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`.
|
||||
Reference in New Issue
Block a user