todo/Hysteria/tproxy.md
loop-uh 08b4491545
Some checks failed
Published content check / validate (push) Failing after 3s
Завершить переезд базы знаний на Forgejo
Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
2026-08-07 08:27:28 +03:00

138 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
date: 2026-07-11
tags:
- hysteria
- tproxy
- прозрачный-прокси
- linux
- iptables
aliases:
- Hysteria TPROXY
- Hysteria прозрачный прокси
- Hysteria透明代理
link: https://v2.hysteria.network/docs/advanced/TPROXY/
---
# 🦎 Hysteria 2 — прозрачный прокси (TPROXY)
> [!info] О чём заметка
> Как настроить прозрачный проксирование (TPROXY) на клиенте Hysteria 2 под Linux: завернуть весь TCP/UDP-трафик устройства или локальной сети через Hysteria без настройки прокси в каждом приложении. Только Linux. Базовый клиентский конфиг — в [[Hysteria/config-client|отдельной заметке]]. Обзор протокола — [[Hysteria/00-overview|тут]].
## TL;DR
- **TPROXY** — механизм ядра Linux для прозрачного перехвата TCP и UDP: приложения даже не знают, что идут через прокси, настраивать их не нужно.
- В отличие от [[Hysteria/config-client|TUN-режима]], TPROXY не создаёт виртуальный интерфейс, а работает через правила фаервола (iptables/nftables) и policy routing. Это классический способ поднять прозрачный прокси на роутере/шлюзе.
- В клиентском конфиге добавляются `tcpTProxy`/`udpTProxy` с портом (в примерах — `2500`). Но само по себе это не работает — **обязательны** правила policy routing и iptables/nftables.
- Чтобы проксировать трафик самого устройства (а не только проходящий через него), запускайте клиент **от отдельного пользователя** и исключайте его трафик по uid — иначе получите петлю.
## TPROXY против TUN — что выбрать
Обе технологии делают одно: заворачивают весь трафик через Hysteria без настройки прокси в приложениях. Разница в механике:
- **[[Hysteria/config-client|TUN]]** — кроссплатформенный (Windows/Linux/macOS), создаёт виртуальный сетевой интерфейс, Hysteria сама поднимает адреса и маршруты. Проще в настройке, подходит для клиентского устройства.
- **TPROXY** — только Linux, работает через фаервол и таблицы маршрутизации, ничего виртуального не создаёт. Традиционный выбор для **шлюза/роутера**, который проксирует трафик всей локальной сети. Тоньше настраивается, но требует ручных правил iptables/nftables.
Если нужен прозрачный прокси на одном устройстве — часто проще TUN. Если строите шлюз для всей сети на Linux — TPROXY.
## Шаг 1. Отдельный пользователь (чтобы не было петли)
> [!warning] Этот шаг обязателен, если проксируете трафик самого устройства
> Когда через прокси идёт в том числе собственный трафик машины, где крутится клиент, надо отделить трафик самого Hysteria-клиента (он идёт до вашего сервера) от проксируемого трафика. Иначе пакеты Hysteria до сервера снова попадут в перехват — получится петля. Способ — запускать клиент под выделенным пользователем и исключать его по uid в правилах фаервола. Если проксируете только трафик, проходящий через устройство (например, роутер для других хостов), этот шаг можно пропустить.
Создайте системного пользователя:
```bash
useradd --system hysteria
```
Выдайте бинарнику нужные capabilities (повторять после каждого ручного обновления клиента):
```bash
setcap CAP_NET_ADMIN,CAP_NET_BIND_SERVICE+ep /path/to/hysteria
```
Запускайте клиент под этим пользователем — вручную `sudo -u hysteria /path/to/hysteria -c config.yaml`, либо в systemd-юните добавьте `User=hysteria` в секцию `[Service]`.
## Шаг 2. Конфиг клиента
В [[Hysteria/config-client|клиентский config.yaml]] добавьте TPROXY-инбаунды (порт `2500` — пример, можно любой):
```yaml
tcpTProxy:
listen: :2500
udpTProxy:
listen: :2500
```
Не указывайте IP перед `:` — тогда слушается и IPv4, и IPv6. Если UDP проксировать не нужно, оставьте только `tcpTProxy`.
## Шаг 3. Policy routing (обязательно)
> [!danger] Без этого шага TPROXY не работает
> Одних строк в конфиге недостаточно. Правила маршрутизации и фаервола — **не опциональны**. Кроме того, все команды из шагов 3 и 4 сбрасываются при перезагрузке — их нужно либо выполнять при каждом старте системы, либо сделать постоянными (через systemd-юнит, `/etc/network` hooks, скрипты дистрибутива и т.п.).
Тут `0x1` — метка (fwmark), `100` — id таблицы маршрутизации (можно выбрать другие):
```bash
# IPv4
ip rule add fwmark 0x1 lookup 100
ip route add local default dev lo table 100
# IPv6
ip -6 rule add fwmark 0x1 lookup 100
ip -6 route add local default dev lo table 100
```
## Шаг 4. iptables или nftables (обязательно)
Правила перенаправляют трафик на TPROXY-порт, обходя приватные адреса и уже обработанный трафик. Ниже — вариант nftables (компактнее); полные примеры iptables для IPv4 и IPv6 — в [официальной документации TPROXY](https://v2.hysteria.network/docs/advanced/TPROXY/).
```nginx
define TPROXY_MARK=0x1
define HYSTERIA_USER=hysteria
define HYSTERIA_TPROXY_PORT=2500
define TPROXY_L4PROTO={ tcp, udp }
define BYPASS_IPV4={
0.0.0.0/8, 10.0.0.0/8, 127.0.0.0/8, 169.254.0.0/16,
172.16.0.0/12, 192.168.0.0/16, 224.0.0.0/3
}
define BYPASS_IPV6={ ::/128 }
table inet hysteria_tproxy {
chain prerouting {
type filter hook prerouting priority mangle; policy accept;
# Пропустить трафик, уже обработанный TProxy
meta l4proto $TPROXY_L4PROTO socket transparent 1 counter mark set $TPROXY_MARK
socket transparent 0 socket wildcard 0 counter return
# Обойти приватные и специальные адреса
ip daddr $BYPASS_IPV4 counter return
ip6 daddr $BYPASS_IPV6 counter return
ip6 daddr != 2000::/3 counter return
# Перенаправить трафик на TProxy-порт
meta l4proto $TPROXY_L4PROTO counter tproxy to :$HYSTERIA_TPROXY_PORT meta mark set $TPROXY_MARK accept
}
}
```
Это правила для трафика, **проходящего через** устройство. Чтобы проксировать ещё и трафик самого устройства, добавляется отдельная таблица с хуком `output`, где по `meta skuid $HYSTERIA_USER ... return` исключается трафик самого клиента (тот самый анти-петля механизм из шага 1). Полный набор — в официальной документации.
> [!note] Если не нужен UDP
> Чтобы не проксировать UDP, замените набор протоколов на только TCP: `define TPROXY_L4PROTO=tcp` (в iptables — уберите строки с `-p udp`). Для IPv6 в правилах намеренно проксируются только публичные адреса (`2000::/3`), локальные обходятся.
## 📚 См. также
- [[Hysteria/config-client|Конфиг клиента]] — базовые режимы, включая кроссплатформенный TUN как более простую альтернативу.
- [[Hysteria/acl-outbounds|ACL и маршрутизация]] — серверная маршрутизация: что делать с трафиком уже после того, как он дошёл до сервера.
- [[Hysteria/00-overview|Hysteria 2 — обзор]] — общая картина.
- 🔗 [Setting up TPROXY — официальная документация](https://v2.hysteria.network/docs/advanced/TPROXY/)
---
> [!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ
> При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: [исходник этой заметки](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main/Hysteria/tproxy.md) · [весь репозиторий](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main).