Bypassing Censorship in the Age of DPI: A Stealth Tunnel with Hysteria 2

A QUIC-based, TLS-encrypted tunnel engineered to evade DPI and firewalls.

This content is for educational purposes only. Use of these tools must comply with local laws.

Around the globe, we see governments increasingly leveraging Deep Packet Inspection, traffic shaping, and protocol fingerprinting to identify and block encrypted tunnels such as VPNs. This digital clampdown rarely makes international headlines unless it’s extreme, but the trend is clear and growing. :)

Many traditional VPN protocols, including OpenVPN and WireGuard can be easily detected and throttled, or outright blocked. These technologies offer excellent performance and security, but they have recognizable signatures on the wire.

Over the years, I've written extensively about WireGuard. It's fast, reliable, and minimal, but it's fundamentally easy to detect due to its fixed UDP signature and lack of built-in obfuscation.

That’s where Hysteria 2 steps in.


What is Hysteria 2?

Hysteria 2 is a next-generation proxy tunnel designed to defeat censorship and DPI systems by mimicking regular HTTPS traffic. Built on top of UDP and QUIC (HTTP/3), Hysteria 2 provides encrypted, high-performance connections that are indistinguishable from legitimate web browsing to most filtering mechanisms.

Hysteria 2 is not just a replacement for VPNs like WireGuard, it's a stealth tunnel. It's built to look like normal web traffic while behaving like a VPN or proxy. It can be used to:

  • Bypass national firewalls
  • Evade ISP-level throttling or surveillance
  • Tunnel around restrictive corporate firewalls
  • Maintain privacy in hostile network environments

It accomplishes all this by combining:

  • HTTP/3 (QUIC) transport
  • TLS with valid certificates and Server Name Indication (SNI)
  • Obfuscation using Salamander, a traffic pattern masker
  • Masquerading using domain fronting or reverse proxy techniques

Proxy or VPN?

Technically, Hysteria 2 is a proxy tunnel, not a VPN in the traditional sense. It doesn’t modify your system’s network interface using TUN/TAP drivers like OpenVPN or WireGuard.

Instead, it creates SOCKS5 and HTTP proxy endpoints, which you can use on a per-app basis, or wrap using tools like tun2socks, Clash, or V2Ray to achieve full system routing.

Depending on your setup, you can:

  • Route individual apps through the tunnel (browsers, email clients, torrent clients)
  • Route your entire device through it (using Clash, tun2socks, Shadowrocket, etc.)
  • Expose it network-wide as a proxy gateway for other devices

What Hysteria 2 Is Not

Hysteria 2 does not use kernel-level VPN tunnels unless paired with external tools and does not support legacy TCP tunneling (by design — QUIC is UDP-based). Instead, it encrypts all traffic using TLS with genuine certificates (Let's Encrypt or self-signed), obfuscates traffic signatures using Salamander and looks like QUIC-powered HTTPS traffic to observers and DPI engines.


🛠️ Server Requirements

Before you begin:

  • You need a VPS (Ubuntu/Debian) in the country you are tunnelling to
  • A domain name pointing to the VPS via A-record (e.g. via Cloudflare). This will be used for:
    • TLS certificate issuance via ACME (Let's Encrypt)
    • SNI-based masquerading
    • Optional domain fronting or CDN-based deception
  • Docker + Docker Compose installed

Server Installation (VPS)

Step 1: Install Docker

apt update && apt install -y docker docker-compose

Step 2: Create a directory

mkdir ~/hysteria && cd ~/hysteria

Step 3: Create hysteria.yaml

listen: :443

acme:
  domains:
    - yourdomain.com // replace this with your domain
  email: [email protected] // replace this with your email
  certDir: /acme

masquerade:
  type: proxy
  proxy:
    url: https://yourdomain.com // replace this with your domain
    rewriteHost: true
  listenHTTP: :80
  listenHTTPS: :443
  forceHTTPS: true

auth:
  type: password
  password: strongpassword // replace this with a strong password

obfs:
  type: salamander
  salamander:
    password: strongpasswordagain // replace this with a strong password

bandwidth:
  up: 100 mbps
  down: 100 mbps

Step 4: Create docker-compose.yml

version: "3.9"
services:
  hysteria:
    image: tobyxdd/hysteria
    container_name: hysteria
    restart: always
    network_mode: "host"
    volumes:
      - acme:/acme
      - ./hysteria.yaml:/etc/hysteria.yaml
    command: ["server", "-c", "/etc/hysteria.yaml"]

volumes:
  acme:

Step 5: Start the container

docker compose up -d
docker logs -f hysteria

Look for:

  • Certificate maintenance started
  • HTTP and HTTPS masquerade servers listening

Linux Desktop: Client Setup

Step 1: Download Client

wget https://github.com/apernet/hysteria/releases/latest/download/hysteria-linux-amd64
chmod +x hysteria-linux-amd64
mv hysteria-linux-amd64 /usr/local/bin/hysteria

Step 2: Create ~/.config/hysteria/client.yaml

server: yourdomain.com:443 // replace with your domain
auth: strongpassword // replace this with the strong password from your config

obfs:
  type: salamander
  salamander:
    password: strongpassword2 // replace this with the strong password from your config

tls:
  sni: yourdomain.com // replace with your domain
  insecure: false

bandwidth:
  up: 100 mbps
  down: 100 mbps

socks5:
  listen: 127.0.0.1:1080

http:
  listen: 127.0.0.1:8080

Step 3: Run the client

hysteria client -c ~/.config/hysteria/client.yaml

🌐 Proxying Your Browser

Firefox

  • Go to about:preferences
  • Network Settings → Manual proxy
  • SOCKS5: 127.0.0.1, Port: 1080
  • Enable: SOCKS v5 and "Proxy DNS when using SOCKS v5"

Chromium (via SwitchyOmega)

  • Add new proxy profile
  • Type: SOCKS5
  • Host: 127.0.0.1, Port: 1080

Mobile Support

Android (Clash or SagerNet)

  • Import client.yaml
  • Enable system-wide VPN mode

iOS (Shadowrocket or Stash)

  • Protocol: Hysteria2
  • Server: yourdomain.com (replace it with your domain)
  • Port, password, obfs same as desktop

System-Wide Tunneling (Linux)

Option 1: proxychains

sudo apt install proxychains4
nano /etc/proxychains.conf

Set:

socks5 127.0.0.1 1080

Run apps with:

proxychains firefox

Option 2: tun2socks

Use tun2socks with a virtual TUN interface for true full-device routing.


Gateway Mode (Local Docker Proxy)

Want to proxy your entire network via Hysteria? You can deploy the client as a docker container, so it is always running locally. Then, you only need to connect to your local gateway from other devices, rather than having to run the tunnel on every client.

Here’s how:

1. Client Config (client.yaml)

server: yourdomain.com:443 // replace with your domain
auth: strongpassword // replace this with the strong password from your config

obfs:
  type: salamander
  salamander:
    password: strongpassword2 // replace this with the strong password from your config

tls:
  sni: yourdomain.com // replace with your domain
  insecure: false

bandwidth:
  up: 100 mbps
  down: 100 mbps

socks5:
  listen: 127.0.0.1:1080

http:
  listen: 127.0.0.1:8080


2. Docker Compose for Client

version: '3.9'
services:
  hysteria-client:
    image: tobyxdd/hysteria
    container_name: hysteria-client
    restart: always
    command: ["client", "-c", "/etc/hysteria/client.yaml"]
    volumes:
      - ./client.yaml:/etc/hysteria/client.yaml
    network_mode: host

3. Route Devices

  • Proxy browsers, apps or entire devices to host-ip:1080 (SOCKS5)
  • For advanced setups: combine with iptables, dnsmasq, or HAProxy

ACL: App Control & Filtering

Use ACLs to:

  • Block domains
  • Force direct access to others

Example:

reject(tiktok.com)
outbound(netflix.com, direct)

In your server YAML:

acl:
  file: /etc/acl.txt

Concusion

Hysteria 2 is a countermeasure against a world increasingly hostile to open, uncensored internet access. In a time where circumvention tech must evolve or die, stealth proxies represent a new standard.

You now have the tools to deploy a censorship-resistant tunnel that can support both personal freedom and privacy and run quietly in the background like any other web connection.