Some checks failed
Published content check / validate (push) Failing after 3s
Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
138 lines
10 KiB
Markdown
138 lines
10 KiB
Markdown
---
|
||
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).
|