156 lines
4.7 KiB
Markdown
156 lines
4.7 KiB
Markdown
# 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.
|