# INTENV VPN Client

Единый скрипт `intenv-vpn` для полной настройки VPN одной командой.

## Быстрый старт

### Linux / macOS

```bash
curl -O https://intenv-vpn-clients.s3.ru-7.storage.selcloud.ru/intenv-vpn
chmod +x intenv-vpn
./intenv-vpn setup
```

### Windows (PowerShell от Администратора)

```powershell
Invoke-WebRequest -Uri https://intenv-vpn-clients.s3.ru-7.storage.selcloud.ru/intenv-vpn.ps1 -OutFile intenv-vpn.ps1
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
.\intenv-vpn.ps1 setup
```

## Что делает `setup`

```
1. Проверяет и устанавливает зависимости
   └── OpenBao CLI, jq, strongswan/NM (Linux) / Keychain (macOS)

2. Создаёт временное парольное VPN-подключение (bootstrap)
   ├── Запрашивает логин/пароль FreeIPA
   └── Подключается к vpn.intenv.ru по EAP-RADIUS

3. Получает сертификат через Keycloak SSO
   ├── Открывает браузер → Keycloak → sso.intenv.ru
   └── OpenBao выдаёт VPN сертификат (14 дней)

4. Настраивает сертификатный VPN
   ├── Создаёт IKEv2 EAP-TLS подключение
   ├── Переключается с парольного на сертификатный VPN
   └── Удаляет временное парольное подключение

5. Настраивает автообновление сертификатов
   ├── Linux: systemd timer (ежедневно)
   ├── macOS: launchd (ежедневно в 09:00)
   └── Windows: Task Scheduler (ежедневно в 09:00)
```

## Команды

| Команда | Описание |
|---------|----------|
| `intenv-vpn setup` | Полная настройка (один раз) |
| `intenv-vpn connect` | Подключиться к VPN |
| `intenv-vpn disconnect` | Отключиться |
| `intenv-vpn renew` | Обновить сертификат вручную |
| `intenv-vpn status` | Статус подключения и сертификата |
| `intenv-vpn uninstall` | Удалить всё |

Windows: `.\intenv-vpn.ps1 <команда>` (например, `.\intenv-vpn.ps1 connect`)

### Опции

| Опция | Описание |
|-------|----------|
| `--quiet` / `-Quiet` | Без вывода (для таймеров) |
| `--force` / `-Force` | Принудительное обновление сертификата |

## Автообновление сертификатов

Сертификат действует 14 дней. Автообновление:
- Проверка ежедневно
- Обновление при остатке < 7 дней
- Использует Vault cert auth (без браузера)
- Если сертификат истёк — fallback на OIDC (нужен браузер)

### Проверка таймера

```bash
# Linux
systemctl --user status intenv-vpn-renew.timer

# macOS
launchctl list | grep intenv
```

```powershell
# Windows
Get-ScheduledTask -TaskName "IntenvVPN-Renew"
```

## Файлы

| Файл | Описание |
|------|----------|
| `client.crt` | Клиентский сертификат |
| `client.key` | Приватный ключ |
| `ca.crt` | CA chain (корневой + промежуточные) |
| `client.p12` / `client.pfx` | PKCS12 бандл |

Расположение:
- Linux/macOS: `~/.config/intenv-vpn/`
- Windows: `%USERPROFILE%\.config\intenv-vpn\`

## Troubleshooting

### Ошибка "OIDC authentication failed"

- Проверьте VPN подключение (должны видеть внутреннюю сеть)
- Проверьте Vault: `bao status`
- Убедитесь что состоите в группе `vpn-users` в FreeIPA

### Сертификат не обновляется автоматически

- Проверьте таймер (см. выше)
- Ручное обновление: `intenv-vpn renew --force`
- Логи: `~/.config/intenv-vpn/renewal.log`

### VPN не подключается

- Проверьте срок сертификата: `intenv-vpn status`
- Проверьте что CA установлен в системе
- Проверьте DNS: `dig vpn.intenv.ru`

### Полный сброс

```bash
intenv-vpn uninstall
intenv-vpn setup
```

## Легаси скрипты

Старые скрипты (`vpn-cert-linux.sh`, `vpn-cert-macos.sh`, `vpn-cert-windows.ps1`) по-прежнему доступны, но рекомендуется перейти на `intenv-vpn`.
