# Proxy VM — VLESS Reality шлюз

Ubuntu VM в Proxmox для обхода РКН:
- **HTTP прокси** на порту `8888` — для Telegram бота в Home Assistant
- **SOCKS5** на порту `1080` — универсальный прокси
- **Прозрачный прокси (tproxy)** — для телевизора без каких-либо настроек на нём

Протокол: VLESS + Reality (практически не определяется DPI).

---

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

### 1. Подготовить VM

Минимальные требования:
- Ubuntu 22.04 LTS (или 24.04)
- 1 vCPU, 512 MB RAM, 4 GB диск
- Статический IP `192.168.2.200` (или настроить через DHCP-резервирование)

### 2. Скопировать файлы на VM

```bash
scp -r tasks/ha/proxy-vm/ user@192.168.2.200:~/proxy-vm/
ssh user@192.168.2.200
cd ~/proxy-vm
```

### 3. Заполнить параметры

```bash
cp params.env.example params.env
nano params.env   # заполни все значения
```

Обязательные параметры:
```env
VLESS_SERVER_IP=<IP сервера>
VLESS_UUID=<UUID>
VLESS_PUBLIC_KEY=<публичный ключ Reality>
VLESS_SHORT_ID=<short ID>
VLESS_SNI=www.microsoft.com
TV_SUBNET=192.168.3.0/24
```

### 4. Установить Xray

```bash
sudo bash install.sh
```

Скрипт:
- Установит Xray (последняя версия с GitHub)
- Сгенерирует `/etc/xray/config.json` с твоими параметрами
- Включит IP forwarding
- Создаст и запустит systemd сервис `xray`

### 5. Настроить прозрачный прокси для TV

```bash
sudo bash transparent-proxy.sh
```

Скрипт:
- Настроит iptables tproxy для TV подсети
- Сохранит правила через iptables-persistent
- Создаст systemd сервис для восстановления маршрутов при ребуте

### 6. Настроить Keenetic

Читай [`KEENETIC.md`](KEENETIC.md) — создать отдельный SSID `TV_VPN` с шлюзом `192.168.2.200`.

### 7. Настроить Home Assistant

Добавь в `configuration.yaml` содержимое [`ha-telegram-config.yaml`](ha-telegram-config.yaml):

```yaml
telegram_bot:
  - platform: polling
    api_key: "ВАШ_ТОКЕН"
    proxy_url: http://192.168.2.200:8888
    allowed_chat_ids:
      - 126472752
```

Перезапусти HA.

### 8. Проверить

```bash
sudo bash check.sh
```

---

## Структура файлов

```
proxy-vm/
├── TZ.md                    # Техническое задание
├── README.md                # Эта инструкция
├── params.env.example       # Шаблон параметров
├── install.sh               # Установка Xray + systemd
├── transparent-proxy.sh     # Настройка tproxy для TV
├── config.json              # Шаблон Xray конфига (справочник)
├── ha-telegram-config.yaml  # Фрагмент конфига для Home Assistant
├── check.sh                 # Проверка работоспособности
└── KEENETIC.md              # Инструкция для роутера Keenetic
```

---

## Troubleshooting

**Xray не запускается:**
```bash
journalctl -u xray -n 50 --no-pager
```

**Прокси не работает:**
```bash
curl -x http://127.0.0.1:8888 https://api.telegram.org
```

**Tproxy не перехватывает трафик:**
```bash
iptables -t mangle -L TV_TPROXY -nv   # счётчики пакетов
ip rule show                            # правило для fwmark 1
ip route show table 100                 # маршрут local default
```

**Обновить Xray:**
```bash
sudo bash install.sh   # скрипт идемпотентен, установит новую версию
```

---

## Как работает tproxy

```
Телевизор отправляет пакет (например, к youtube.com:443)
    │
    ▼ iptables mangle PREROUTING → TV_TPROXY
Пакет помечается fwmark=1 + tproxy redirect на порт 12345
    │
    ▼ ip rule: fwmark=1 → table 100 → local default via lo
Xray (dokodemo-door tproxy) получает пакет как будто он локальный
    │
    ▼ Xray routing: outbound vless-out
VLESS Reality тоннель → сервер → youtube.com
```

DNS трафик (UDP 53) из TV подсети перенаправляется на `1.1.1.1` через DNAT,
но поскольку `1.1.1.1` не является private IP, он тоже пойдёт через VLESS.
