● Maronix keeps you moving freely. Learn why
← Protocols
Protocols & Privacy Technology Reference Advanced

What Is Hysteria2?

Hysteria2 is a QUIC-based proxy built for lossy links. What its congestion control, HTTP/3 masquerade and obfuscation buy, and where each one stops.

Hysteria logo, written with a stylized H letter design formed by two lightning bolts

Definition#

Hysteria2 is a proxy protocol that runs over QUIC, the UDP-based transport defined in RFC 9000, with the unreliable datagram extension from RFC 9221. It forwards TCP and UDP between a client and a server, and its own specification describes the job in one line: a TCP and UDP proxy built for speed, security and censorship resistance.

The “2” matters. Hysteria 2.0.0 was a near-complete rewrite of the original Hysteria, with a new wire protocol, and a Hysteria 1 client cannot talk to a Hysteria 2 server. On the client side the binary can expose a SOCKS5 or HTTP proxy, redirect TCP, or run a TUN interface, which is how it ends up behaving like a VPN in everyday use. The protocol underneath is a proxy, not a layer-3 tunnel.

What problem it solves#

Two problems, and they pull in the same direction: packet loss and censorship.

Loss first. TCP treats packet loss as a sign of congestion and slows down, which is the wrong response on a last-mile link where loss comes from a noisy radio path rather than from a full queue. QUIC runs over UDP and lets the sender choose its own congestion control. Hysteria2 uses that room to offer Brutal, a controller that holds a declared rate instead of backing off when packets drop. The docs are direct about the trade: Brutal is “particularly effective at seizing bandwidth in congested, best-effort delivery networks, hence its name,” and it only works if the rate you declare is close to what the path can carry.

QUIC also removes one TCP failure mode. A lost packet stalls only the stream it belongs to, not every connection sharing the same TCP socket. That helps when one HTTP/2 or HTTP/3 session carries several requests.

Censorship is the second problem, and it is the reason for the HTTP/3 front door. Hysteria2 was designed so that a server without the password looks like an ordinary HTTP/3 web server, and so that an active prober gets a plausible web response rather than a proxy error. Everything else in the censorship story, from masquerade content to port hopping, is built around that first decision.

How it works, at the depth that matters#

  • Transport: TCP connections become QUIC bidirectional streams. UDP packets become QUIC datagrams; packets larger than a datagram are split into fragments with the same packet ID, and the receiver discards the whole packet if any fragment is lost. That last detail explains why Hysteria2 does not speed up UDP traffic such as HTTP/3: it can carry the packets, but it cannot replace the congestion control of the application at either end. The project’s own HTTP/3 page says so plainly and suggests disabling HTTP/3 in the browser or blocking UDP 443 when the tunnel is in use.
  • Handshake: the client sends a POST /auth request over HTTP/3 with a Hysteria-Auth header, a receive-rate hint, and random padding. A successful login gets status 233 HyOK; anything else means failure. A server that does not recognise the request is supposed to behave like a normal web server or forward it upstream. After the 233, the same QUIC connection switches to the Hysteria proxy protocol. The disguise covers the handshake and the probe, not the traffic that follows.
  • Masquerade: because a stranger can reach the server, it has to have something to show. masquerade can serve a directory (file), reverse-proxy another site (proxy), or return a fixed string (string). If the section is missing, every HTTP request gets a 404. The docs also offer optional HTTP/HTTPS listeners on ports 80 and 443 so the host answers ordinary TCP requests too, while noting there is no evidence that firewalls are using the absence of those listeners to detect Hysteria servers. That note is worth keeping: the feature is for going further than the threat model requires.
  • Congestion control: Brutal is used when a bandwidth value is present; otherwise the client falls back to BBR (the default) or Reno. The handshake carries the client’s receive rate, and the server can answer with its own or with auto. A server owner can set ignoreClientBandwidth to disregard client hints and keep the non-Brutal controller, which is the fairer choice on a shared box. Setting Brutal above what the link can carry produces the opposite of the intended result: a slow, unstable connection and wasted data.
  • Obfuscation: two layers exist. Salamander XORs every QUIC packet with a BLAKE2b-256 hash of a password and a random salt, which removes the QUIC shape entirely. Gecko wraps Salamander and splits long-header handshake packets into 2 to 8 randomly sized, randomly padded fragments, so the handshake no longer has the packet-size signature of QUIC. Gecko is marked experimental. Both need the same password on both ends, and both make the server incompatible with standard QUIC: once enabled, it is no longer a valid HTTP/3 server. Obfuscation vs encryption separates the two properties.
  • Client-side camouflage: recent releases add two smaller measures. The client fragments its TLS ClientHello, which can get past filters that look for a complete SNI in one packet, and it can parrot Chrome’s QUIC fingerprint, enabled by default since 2.11.0. ECH is supported as well, which hides the SNI from a middlebox that cannot decrypt it.
  • Port hopping and fake TCP: a client can be given a list or range of ports and will switch between them on an interval, with optional random timing; the server can listen on a Linux port range and redirect the rest with nftables or iptables. This targets a specific behaviour: a block or throttle that follows one UDP port. It does nothing when the network drops UDP as a class, which the port-hopping page states directly. Mimic, a separate eBPF tool, rewrites UDP packets with a fake TCP header so the flow looks like TCP on the wire. It is Linux only, needs root on both ends, must be enabled identically on both sides, breaks existing clients when switched on, and cannot be combined with port hopping.

What it explicitly does not do#

  • Survive a blanket UDP block. Port hopping is per-port by design. Mimic changes the appearance but still sends UDP underneath, and it carries the Linux and root requirements with it.
  • Work behind a CDN. The HTTP/3 masquerade lasts until authentication. After that, the connection is a custom protocol no CDN speaks, and CDNs terminate QUIC with their own stack anyway, which would remove the Brutal advantage.
  • Borrow someone else’s identity. A Hysteria2 server authenticates with its own certificate, obtained through ACME or supplied as a file. With a self-signed certificate the client either trusts the CA or runs insecure with pinSHA256. There is no equivalent of REALITY borrowing a popular site’s handshake.
  • Hide the flow. The server address, the volume, the duration and the timing remain visible to anyone watching the path. Masquerade answers a prober; it does not make a long, busy UDP flow inconspicuous.
  • Be a fair neighbour by default. Brutal holds a rate and compensates for loss. On a congested access link that can take capacity from other traffic, which is why the server has an option to ignore client bandwidth.
  • Act as a layer-3 VPN on its own. The protocol is a proxy. TUN mode is a client feature that makes it usable as one.

How a censor sees it#

Start with what is visible before any password is sent. The flow is UDP, usually to port 443, carrying QUIC. QUIC encrypts its payload, but an on-path device can parse the Initial packet and, unless ECH is in use, read the SNI. That is not theoretical. Russia’s TSPU moved to SNI-dependent QUIC filtering between May 2022 and July 2023, according to a 2026 FOCI measurement study. China’s GFW began blocking QUIC connections to specific domains in April 2024 by decrypting Initial packets at scale, according to a USENIX Security 2025 study. Iran blocks UDP broadly, which the IRBlock measurement documents.

That evidence sets the boundary for every Hysteria2 feature. The HTTP/3 masquerade defeats a prober that connects without credentials and a classifier that expects something other than HTTP/3. It does not defeat an SNI blocklist, because the handshake still carries your domain, and it does not defeat a rule that drops UDP to a given address. Deep packet inspection is the general name for the reading that makes those rules possible. Obfuscation moves the traffic out of the QUIC category, at the cost of no longer looking like HTTP/3 to anyone. Gecko also changes the handshake’s packet sizes. ClientHello fragmentation targets filters that expect the SNI in a single packet, Chrome parroting targets fingerprinting, and ECH targets the SNI, with the usual caveat that a censor can block ECH or fall back to other signals. Port hopping answers per-port filtering; Mimic answers a network that allows TCP and restricts UDP, and trades away port hopping to do it.

The pattern is the one that applies to any single protocol: each measure answers a named filter, and a censor who changes the filter is not answered by the same measure. What Makes a VPN Resistant to Censorship? sets out the wider stack.

When it fits#

Good fit: the path is lossy or has high round-trip time, especially mobile or long-haul; the network allows UDP but treats TCP tunnels badly; you can state a realistic bandwidth figure; you control the server and can run Linux with root if Mimic is needed.

Poor fit: UDP is blocked or throttled as a class; you need a CDN in front; you cannot manage a domain and certificate; you want to borrow a popular site’s identity rather than present your own; you share a congested link and cannot afford to be unfair to other traffic.

Where Maronix fits#

Maronix will offer Hysteria2 as a second option alongside VLESS + REALITY. The reason is the trade this article describes: QUIC handles packet loss and high round-trip time well, and Hysteria2’s HTTP/3 masquerade and obfuscation answer a different set of filters than REALITY’s borrowed TLS identity. It is not a replacement. Where a network drops UDP as a class, VLESS + REALITY stays the better fit, and What Is Maronix? covers the rest of the stack.

Common misconceptions#

“Hysteria2 is invisible because it looks like HTTP/3.” The HTTP/3 shape covers the handshake and an unauthenticated probe. The SNI, the address, the volume and the timing are still there, and an SNI blocklist does not need to see inside the tunnel.

“Brutal makes any connection faster.” Brutal holds the rate you give it. Set above what the path can carry, it produces loss, retransmissions and a worse connection than BBR would have given you.

“Port hopping gets around a UDP block.” It gets around a block that follows one port. When UDP is dropped wholesale, every port in the range is dropped with it.

Sources

  1. Hysteria 2 Protocol Specification Hysteria Project
  2. Hysteria 2 Full Server Config Hysteria Project
  3. Hysteria 2 Port Hopping Hysteria Project
  4. Hysteria 2 Mimic (Fake TCP) Hysteria Project
  5. Hysteria 2: About HTTP/3 Hysteria Project
  6. Hysteria 2: Can I use a CDN? Hysteria Project
  7. Hysteria 2 Changelog Hysteria Project
  8. Hysteria 2: Hysteria 2 vs 1 Hysteria Project
  9. RFC 9000: QUIC: A UDP-Based Multiplexed and Secure Transport IETF
  10. RFC 9114: HTTP/3 IETF
  11. RFC 9221: An Unreliable Datagram Extension to QUIC IETF
  12. On Russia's Early Introduction of QUIC SNI Censorship (FOCI 2026) FOCI / PETS
  13. Exposing and Circumventing SNI-based QUIC Censorship of the Great Firewall of China (USENIX Security 2025) USENIX
  14. IRBlock: A Large-Scale Measurement Study of the Great Firewall of Iran (USENIX Security 2025) USENIX

Last reviewed October 30, 2026. Corrections and additions are welcome.