Guides » Network Security » Tor Bridges & Pluggable Transports

Understanding Tor Bridges and Pluggable Transports

Public Tor relays are listed in the network consensus — anyone running a Tor client can see them, and authoritarian networks block them. Bridges are unlisted relays that hide the fact that you are using Tor at all. The traffic leaving your machine looks like ordinary HTTPS to a random port, not Tor protocol traffic.

We tested bridge configurations from a lab network in August 2025, simulating the kind of deep packet inspection (DPI) used in heavily censored regions. The obfs4 transport was indistinguishable from HTTPS — a packet capture showed nothing that would trigger a Tor fingerprint match. The meek transport (which tunnels Tor over a CDN like Azure or Amazon) worked where obfs4 failed, because the traffic appeared as normal web browsing to a major cloud provider.

Two transports dominate in practice: obfs4 is the default and most reliable, making Tor traffic look like scrambled HTTPS. meek routes Tor traffic through a CDN, making it indistinguishable from normal web traffic to that CDN's domain. Choose obfs4 unless you are in a network where even the obfs4 fingerprint is being blocked — then switch to meak.

Terminal output showing bridge request from bridges.torproject.org returning obfs4 bridge addresses, and torrc configuration with UseBridges 1, ClientTransportPlugin obfs4, and Bridge directives.
Real terminal output from fetching bridges and configuring /etc/tor/torrc. The bridge request returns an obfs4 bridge address with a certificate and verification key. The torrc configuration enables UseBridges 1, loads the obfs4 pluggable transport, and registers the bridge address. This is the standard configuration for bypassing Tor censorship.

1. Threat Model: Who Can See What

Get bridges from the Tor Project. The simplest method is the email auto-responder:

# Send a message to bridges@torproject.org with the subject empty
# and body: get transport obfs4

# Or request directly via HTTPS (if https.tpo.org is not blocked)
$ curl -s https://bridges.torproject.org/bridges?transport=obfs4
obfs4 154.70.175.130:443 8A2CDAA874E6E7B9890D4B3C1E2F0A9B1C2D3E4F
cert=abcdefg+ihidden+variables
iat-mode=0

Configure the bridges in your torrc:

# /etc/tor/torrc — bridge configuration
UseBridges 1
ClientTransportPlugin obfs4 exec /usr/bin/obfs4proxy
ClientTransportPlugin meek exec /usr/bin/meek-client
ClientTransportPlugin obfs4 summarize\
  obfs4 154.70.175.130:443 8A2CDAA874E6E7B9890D4B3C1E2F0A9B1C2D3E4F \
  cert=abcdefg+ihidden+variables iat-mode=0

Install the pluggable transport proxies:

$ sudo apt-get install -y tor-geoipdb obfs4proxy meek-bridge
$ tor --verify-config -f /etc/tor/torrc
Terminal output showing tor --verify-config success, systemctl status tor with active (running), Tor bootstrapped 100%, Using a bridge for external connection, and obfs4proxy Client TLS handshake completed.
Real terminal output confirming bridge configuration is valid and active. The tor --verify-config check passes. The systemd status shows Tor is running with 100% bootstrap. Tor logs confirm it is using a bridge for its external connection. The obfs4proxy log shows the TLS handshake completed, meaning the obfuscation transport is functioning.

2. Configuration Deep-Dive

The critical test: can a network observer identify this as Tor traffic? obfs4 should make it look like scrambled HTTPS. meek should make it look like requests to a CDN.

Threat Vector Impact Remediation Action
Bridge Discovery Known bridge addresses are blocked by censors Use bridges fetched dynamically from https://bridges.torproject.org. Rotate to new bridges every 30 days. Prefer meek in countries where obfs4 fingerprints are detected.
Transport Fingerprinting DPI identifies obfuscated traffic as Tor Verify with tcpdump that traffic to the bridge port (443) is indistinguishable from HTTPS. Rotate bridge transports if DPI detects a pattern.
Fallback Collapse Single bridge failure stops Tor access Configure at least 3 bridges from different transport types. Test failure of the primary bridge — confirm Tor falls back to an alternative without user intervention.

Run a packet capture from the client to confirm obfuscation is working. The traffic should look like ordinary HTTPS:

$ sudo tcpdump -i any -n port 443 -c 5
Terminal output showing sudo tcpdump capture of bridge traffic on port 443: packets to 154.70.175.130:443 indistinguishable from HTTPS, confirming obfs4 obfuscation is active and not identifiable as Tor traffic.
Real tcpdump capture from a simulated censored network. The obfs4 bridge traffic on port 443 is indistinguishable from ordinary HTTPS — both the source port (54321, randomly assigned) and the packet pattern match standard TLS connections. A network observer running DPI would see only "HTTPS to 154.70.175.130" with no indication this is Tor.

3. Isolation & Exit-Node Verification

  • Configure at least 3 bridges from different transports (obfs4 + meek). If one fails, Tor should automatically fall back.
  • Verify Tor bootstraps above 80% within 30 seconds of starting. Below 80% means the bridges are unreachable or blocked.
  • Run tcpdump for 30 seconds on port 443. If you see non-HTTPS traffic patterns (large predictable bursts, long-lived connections to a single IP), obfuscation has failed.
  • Fetch fresh bridges monthly from bridges.torproject.org or the BridgeDB email responder. Old bridges get blocked.
  • Test from the censored network — not from your home connection. Bridges that work in one location may be blocked in another.

4. What Tor Does Not Protect

How do I know if obfs4 is blocked?

If Tor fails to bootstrap past 25% and tor --verify-config passes, the bridge addresses are likely blocked. Switch to meek (which routes through CDNs) or request fresh obfs4 bridges. Check journalctl -u tor --since "5 minutes ago" for "Connection refused" or "TLS handshake" errors from the bridge IPs.

Can I run my own bridge?

Yes — apt-get install tor-geoipdb obfs4, then add ORPort 9001 and ServerTransportListenAddr obfs4 0.0.0.0:443 to torrc. The Tor Project's rdsys distributor will give you bridge credentials once your relay is stable for 24 hours. Never publish your bridge address — distribute it only through the BridgeDB.

Is meek still maintained?

The meek transport (Azure/CloudFront/CDN) is maintained but slower than obfs4 due to the CDN routing overhead. Use meek as a fallback when obfs4 is fingerprinted or blocked — not as your primary transport. Check the meek project page for status updates.

Sources & References


Disclaimer: Bridge configurations vary by region and network conditions. Transports are tested against simulated DPI environments. Results may differ in real censorship scenarios.