Перейти к содержанию

Смена портов

Пользователи в Китае иногда сообщают, что их интернет-провайдеры блокируют или ограничивают постоянные UDP-соединения. Однако эти ограничения часто применяются только к конкретному используемому порту. Смена портов может использоваться как обходной путь для этой ситуации.

Клиент

Клиент Hysteria поддерживает специальный формат адреса с несколькими портами:

example.com:1234,5678,9012 # (1)!
example.com:20000-50000 # (2)!
example.com:1234,5000-6000,7044,8000-9000 # (3)!
  1. Несколько отдельных портов.
  2. Диапазон портов.
  3. Комбинация обоих вариантов.

Количество портов не ограничено.

Клиент случайным образом выберет один из указанных портов для начального соединения и будет периодически переключаться на другой порт. Опция для управления интервалом находится в секции transport:

transport:
  udp:
    hopInterval: 30s # (1)!
  1. 30s — значение по умолчанию. Минимально допустимое — 5s.
transport:
  udp:
    minHopInterval: 15s # (1)!
    maxHopInterval: 45s # (2)!
  1. Минимальный интервал смены портов. Не менее 5s.
  2. Максимальный интервал смены портов.

Каждая смена порта будет использовать случайный интервал между minHopInterval и maxHopInterval. Это делает паттерн смены менее предсказуемым и труднее для обнаружения.

ПРИМЕЧАНИЕ: Можно использовать hopInterval для фиксированного интервала или minHopInterval/maxHopInterval для случайного интервала. Одновременно использовать оба варианта нельзя.

При условии, что сервер доступен на всех указанных портах, процесс смены прозрачен для верхних уровней и не должен вызывать потерю данных или разрыв соединения.

Сервер

Встроенный диапазон портов (Linux)

На Linux сервер Hysteria имеет встроенную поддержку прослушивания диапазона портов. Просто укажите диапазон портов в поле listen:

listen: :20000-50000

Сервер будет слушать на первом порту диапазона и автоматически настроит правила файрвола (nftables или iptables) для перенаправления трафика с остальных портов на первый. Правила автоматически удаляются при остановке сервера.

ПРИМЕЧАНИЕ: Требуется наличие nft (nftables) или iptables/ip6tables. Серверу могут потребоваться соответствующие привилегии (например, root или CAP_NET_ADMIN) для изменения правил файрвола.

Ручная настройка

Обычно не требуется, но вы можете вручную использовать DNAT в iptables или nftables для перенаправления портов:

# IPv4
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 443
# IPv6
ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 443
define INGRESS_INTERFACE="eth0"
define PORT_RANGE=20000-50000
define HYSTERIA_SERVER_PORT=443

table inet hysteria_porthopping {
  chain prerouting {
    type nat hook prerouting priority dstnat; policy accept;
    iifname $INGRESS_INTERFACE udp dport $PORT_RANGE counter redirect to :$HYSTERIA_SERVER_PORT
  }
}

В этом примере сервер слушает на порту 443, но клиент может подключаться к любому порту в диапазоне 20000-50000.