Problem
A few weeks ago, a new method of blocking (especially on mobile networks) was introduced in Russia by the censor.
It works as follows. So, if:
- The client connects to the server via TCP using HTTPS and TLS 1.3 (for example, VLESS/Reality actually mimics HTTPS with TLS 1.3);
- The IP address of the server is “suspicious” (it is located outside ⚠️ (i.e. not in Russia), is part of the subnet AS which is owned by foreign data centers like Hetzner, Digital Ocean, etc.);
- Within one TCP connection (not within one HTTP request/response - this is important) the data size received from the server to the client is more than ≈15-20KB (the value varies depending on the provider) — the MAIN thing.
This connection is "frozen" (i.e. TCP packets from the server within this connection stop arriving after the specified limit on the size of transmitted data has been reached). It is curious to note that, as a rule, the censor (under the pretence of a response from the server) does not send, for example, an RST packet - instead, it simply “freezes” the TCP connection (from the client's point of view), and thus the client simply waits for an error on the timeout of waiting for a response from the server and everything stops working.
IMPORTANT: It doesn't matter whether it's "legitimate" HTTPS traffic or whether someone is mimicking it. They don't pay attention to that now.
Do I have these limitations?
You can check your “home” ISP with the RU :: TCP 16-20 checker from this repository. Works right from your browser, VPN should be disabled during the check.
Notes
The good news is that if you fragment the responses from the server into several ≈15-20KB data bundles (if it is large enough) in different TCP connections, everything will work fine. It is important not to confuse this with fragmentation of TCP packets within one connection or splitting of transmitted data into several HTTP requests/responses (in one connection) - this is different and it won't help.
Yes, it will work noticeably slower than a single connection (especially if we're going to upload/download a large file). For example, it would take ~2560 TCP connections to download a 50MB file - that's a lot and quite suspicious.
upd1: TLS 1.2 is also blocked (sometimes there is a different data size limit per TCP connection).
upd2: At the moment it seems that only SSH/sFTP + and sometimes RDP (both on any ports) work within TCP without limitations. Including random data transfer over TCP (without TLS, etc., in raw form) is also limited. It's possible that there are other things within TCP that would work without limitations, I'm not exactly sure about that.
upd3.: Censor has a whitelist (based on SNI in the TLS handshake and possibly an HTTP Host header if plain HTTP is used), for more details, including some subset of that list, see here. For example, this can be used as SNI/dest in xray/vless+reality (with xtls-rprx-vision) and it will work.
upd4.: ❗️Censor has also started to apply a whitelist based on the CIDR (IP subnets) of the destination servers. In this case, circumvention is extremely difficult (as a rule, an intermediate node with an IP from the whitelist is required).
upd5.: In fact, the censor typically freezes the connection after 25 packets have been sent in either direction (incoming/outgoing). This applies to both tcp and udp. On average, this equates to approximately 16 KB of payload.
Related links
Problem
A few weeks ago, a new method of blocking (especially on mobile networks) was introduced in Russia by the censor.
It works as follows. So, if:
This connection is "frozen" (i.e. TCP packets from the server within this connection stop arriving after the specified limit on the size of transmitted data has been reached). It is curious to note that, as a rule, the censor (under the pretence of a response from the server) does not send, for example, an RST packet - instead, it simply “freezes” the TCP connection (from the client's point of view), and thus the client simply waits for an error on the timeout of waiting for a response from the server and everything stops working.
IMPORTANT: It doesn't matter whether it's "legitimate" HTTPS traffic or whether someone is mimicking it. They don't pay attention to that now.
Do I have these limitations?
You can check your “home” ISP with the RU :: TCP 16-20 checker from this repository. Works right from your browser, VPN should be disabled during the check.
Notes
The good news is that if you fragment the responses from the server into several ≈15-20KB data bundles (if it is large enough) in different TCP connections, everything will work fine. It is important not to confuse this with fragmentation of TCP packets within one connection or splitting of transmitted data into several HTTP requests/responses (in one connection) - this is different and it won't help.
Yes, it will work noticeably slower than a single connection (especially if we're going to upload/download a large file). For example, it would take ~2560 TCP connections to download a 50MB file - that's a lot and quite suspicious.
upd1: TLS 1.2 is also blocked (sometimes there is a different data size limit per TCP connection).
upd2: At the moment it seems that only SSH/sFTP + and sometimes RDP (both on any ports) work within TCP without limitations. Including random data transfer over TCP (without TLS, etc., in raw form) is also limited. It's possible that there are other things within TCP that would work without limitations, I'm not exactly sure about that.
upd3.: Censor has a whitelist (based on SNI in the TLS handshake and possibly an HTTP
Hostheader if plain HTTP is used), for more details, including some subset of that list, see here. For example, this can be used as SNI/dest in xray/vless+reality (with xtls-rprx-vision) and it will work.upd4.: ❗️Censor has also started to apply a whitelist based on the CIDR (IP subnets) of the destination servers. In this case, circumvention is extremely difficult (as a rule, an intermediate node with an IP from the whitelist is required).
upd5.: In fact, the censor typically freezes the connection after 25 packets have been sent in either direction (incoming/outgoing). This applies to both tcp and udp. On average, this equates to approximately 16 KB of payload.
Related links