πŸ‡¬πŸ‡§ [English](Zapret-en) | πŸ‡·πŸ‡Ί [Русский](Zapret-ru) # Zapret **Zapret 2** is a second, packet-level DPI-bypass built into Re:HomeProxy. It un-throttles and unblocks sites **without any VPN subscription** by desyncing the handshake of selected flows directly on the wire. Re:HomeProxy bundles the [bol-van/zapret2](https://github.com/bol-van/zapret2) engine (`nfqws2`) and manages it for you. It complements [ByeDPI](ByeDPI-en): same goal, different layer. See [ByeDPI vs Zapret](#byedpi-vs-zapret) below. --- ## What it is β€” and what it is not Zapret runs the **`nfqws2`** packet processor. The selected traffic is tagged in the firewall and handed to an **NFQUEUE**, where `nfqws2` rewrites the first few packets of each connection (fake packets, splitting, disorder, TCP-MD5/seq tricks, TLS-record manipulation) so your ISP's Deep Packet Inspection can no longer recognise β€” and therefore can no longer throttle or block β€” the traffic. | | | |---|---| | βœ… **Un-throttles DPI-filtered sites** | The common case for YouTube, Discord and similar services slowed or blocked by DPI. | | βœ… **No subscription, no server** | A local packet trick β€” no VPN node, account or remote server. | | βœ… **Works on both cores** | Implemented as a marked direct outbound; works identically on hiddify-core and sing-box-extended. | | βœ… **Handles TCP *and* UDP/QUIC** | Unlike ByeDPI, the NFQUEUE path also desyncs UDP flows (used for Discord voice). | | ❌ **Does not encrypt or hide traffic** | Your ISP still sees *which* sites you visit; Zapret only changes *how* the first packets look. It is **not a VPN**. | | ❌ **Cannot reach fully IP-blocked sites** | If a site is blocked by IP/DNS (not just throttled), only a real proxy/VPN node can reach it. | --- ## How it works Zapret is wired as a routing **target**, not a SOCKS node: 1. The config generator adds a `direct` outbound called **`zapret-out`** stamped with a `routing_mark` (default mark `110`). 2. When a routing rule selects `zapret-out`, the core egresses that flow **directly**, but tagged with the mark. 3. An nft chain (`homeproxy_zapret_queue`) catches the marked packets and sends the first 1–12 packets of each TCP/UDP connection to an **NFQUEUE**. 4. `nfqws2` reads the queue and desyncs the handshake, then lets the connection continue normally. Because it is a marked *direct* outbound (not a tunnel), `zapret-out` falls back to plain `direct-out` automatically when Zapret is disabled, so the generated config always stays valid. Loop-avoidance returns for the Zapret mark and `nfqws2`'s own reinjected (DESYNC_MARK) packets are added to the firewall automatically β€” you don't touch nft. --- ## Enabling Zapret 1. Go to **Services β†’ Re:HomeProxy β†’ Node Settings** and open the **Zapret** tab. 2. If `nfqws2` is not installed yet, use the **Install** button β€” Re:HomeProxy fetches the right [zapret2-openwrt](https://github.com/1andrevich/zapret2-openwrt) package for your architecture. 3. Tick **Enable**, pick a strategy preset (see below), and **Save & Apply**. That's all for the engine. The `--qnum` / `--user` / `--fwmark` / `--lua-init` arguments are added automatically β€” you only edit the desync strategy itself. --- ## Strategies and presets A "strategy" is the set of `nfqws2` options applied to every flow routed to Zapret. There are **no hostlists** β€” the routing rules already decide *what* is sent here, so the strategy only decides *how* to desync it. As with ByeDPI, **there is no universal best strategy** β€” what works depends on your ISP's DPI. The **Strategy preset** picker fills the strategy field for you and is grouped into two sets: | Group | What it is | |-------|------------| | **Recommended** | A small curated set, purpose-named (e.g. *Default (fake + multidisorder)*, *Multisplit*, *Fake only*). Start here. | | **Full-test pool** | The larger technique-named pool used by the full tester. | Presets are shipped read-only in `/etc/homeproxy/zapret_candidates.json` and are based on [bol-van/zapret2](https://github.com/bol-van/zapret2) (nfqws2/blockcheck2) with some adapted from [flowseal/zapret-discord-youtube](https://github.com/flowseal/zapret-discord-youtube) (MIT). You can also leave the preset on *custom* and type your own option string in the **Desync strategy** field. --- ## The strategy tester Because the right strategy is ISP-specific, the Zapret tab includes a **tester** that never touches your live traffic β€” it spins up a **temporary NFQUEUE scoped to four test sites** and checks whether each TLS handshake completes: - **Test current strategy** β€” runs whatever is in the strategy field against **YouTube**, **Telegram**, **Discord** and **Speedtest.net**, showing each site as βœ“ / βœ— with the handshake time, plus an `ok/total` count. - **Full strategy test** β€” sweeps the whole preset pool and reports which candidates pass, so you can apply the best one. Pick a strategy that passes all four sites. If several do, prefer one from the **Recommended** group. --- ## Discord voice (opt-in) Enabling **Zapret voice** routes Discord's voice-server UDP ranges (and call/voice UDP ports) to `zapret-out` **before** the normal proxy/call rules, so Discord voice is desynced via Zapret instead of being proxied. The UDP port ranges come from [flowseal/zapret-discord-youtube](https://github.com/flowseal/zapret-discord-youtube). This option is honoured only when Zapret is enabled. --- ## Routing traffic through Zapret Once enabled, **Zapret** becomes a selectable routing target. The typical setup mirrors ByeDPI: - **Alongside a VPN node (recommended):** in `proxy_banned_ru` mode, open **RU Proxy Rules** and set a *specific list's* target to **Zapret** β€” e.g. route YouTube and Discord through Zapret (no VPN bandwidth used) while everything else uses your VPN. - **Per service:** because Zapret is selected per rule, you can mix it freely with the proxy and ByeDPI across different lists. --- ## ByeDPI vs Zapret Both bypass DPI without a VPN; they operate at different layers, so the right one depends on your ISP. | | **ByeDPI** | **Zapret 2** | |---|---|---| | Layer | Local SOCKS proxy (`ciadpi`) | Kernel NFQUEUE packet mangler (`nfqws2`) | | Appears as | Selectable in routing rules ("ByeDPI") | Selectable in routing rules ("Zapret") | | TCP | βœ… | βœ… | | UDP / QUIC | Carried, but not desynced | βœ… desynced (used for Discord voice) | | DNS | Forced direct, bypassing ByeDPI (routing it through ByeDPI corrupts DoH/DoT) | Not in the DNS path β€” Zapret only touches flows routed to it | | Try when | YouTube throttling, simple per-site offload | ByeDPI doesn't beat your DPI, or you need UDP/voice desync | There's no harm in installing both and using the tester on each β€” keep whichever scores all-green on your network. --- ## Troubleshooting | Symptom | Likely cause / fix | |---------|--------------------| | A site still loads slowly or won't open | The strategy isn't right for your ISP β€” run the **Full strategy test** and apply a passing one. | | Tester shows everything failing | `nfqws2` may not be installed/running β€” check the **Zapret** tab and the [Diagnostics](Troubleshooting-en) page (it reports install / running / queue status). | | Discord voice still drops | Enable **Zapret voice**, then re-test. | | A site is unreachable, not just slow | It may be IP-blocked, not throttled β€” Zapret can't help; route it through a proxy/VPN node. | See also: [ByeDPI](ByeDPI-en) Β· [Core Management](Core-Management-en) Β· [Supported Protocols](Supported-Protocols-en) Β· [Troubleshooting](Troubleshooting-en)