π§© Π’ΠΈΠΏ payload ΠΈ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ²
Π ΡΡΠΌ Π·Π°ΠΌΠ΅ΡΠΊΠ°
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Β«ΡΠΈΠΏ payloadΒ» Π² Zapret 2, ΡΠ΅ΠΌ ΠΎΠ½ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΠΏΠΎΡΠΎΠΊΠ°, ΠΊΠ°ΠΊ
nfqws2ΡΠ°ΡΠΏΠΎΠ·Π½Π°ΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ ΠΏΠΎ ΡΠΈΠ³Π½Π°ΡΡΡΠ°ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠΈΠΏΡ Π±ΡΠ²Π°ΡΡ ΠΈ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΈΠ»ΡΡΡ--payload. Π’Π°ΠΊΠΆΠ΅ β ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΡΠ²ΠΎΠΉ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° Π½Π° Lua. Π€ΠΈΠ»ΡΡΡ--payloadβ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ ΠΏΡΠΎΡΠΈΠ»Ρ ΡΡΠ΄ΠΎΠΌ Ρ--filter-*; Π³Π΄Π΅ ΠΏΠΎΠ»Ρl7payload/l7protoΠ»Π΅ΠΆΠ°Ρ Π² Π΄Π°Π½Π½ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ° β ΡΠΌ. ΡΡΡΡΠΊΡΡΡΠ° desync ΠΈ Π΄ΠΈΡΡΠ΅ΠΊΡΠ°.
TL;DR
- Π’ΠΈΠΏ payload (
l7payload) β ΡΡΠΎ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π½Π½ΠΎΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°:tls_client_hello,http_req,quic_initialΠΈ Ρ. Π΄. ΠΡΡΡΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ βempty, Π½Π΅ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π½Π½ΡΠΉ βunknown. - ΠΡΠΎΡΠΎΠΊΠΎΠ» ΠΏΠΎΡΠΎΠΊΠ° (
l7proto) β ΡΡΠ»ΡΠΊ Π½Π° Π²ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅; ΡΡΠ°Π²ΠΈΡΡΡ ΠΏΠΎ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠΌΡ ΠΏΠ΅ΠΉΠ»ΠΎΠ°Π΄Ρ ΠΈ Π΄Π΅ΡΠΆΠΈΡΡΡ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ°, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π΄Π°Π»ΡΡΠ΅ ΠΈΠ΄ΡΡunknown-ΠΏΠ°ΠΊΠ΅ΡΡ. - Π€ΠΈΠ»ΡΡΡ
--payloadΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ, ΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ°ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ--lua-desync. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡknown(Π²ΡΡ, ΠΊΡΠΎΠΌΠ΅emptyΠΈunknown). - Π‘ΠΏΠ΅ΡΠ·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΈΠ»ΡΡΡΠ°:
allβ Π»ΡΠ±ΠΎΠΉ ΠΏΠ΅ΠΉΠ»ΠΎΠ°Π΄,knownβ Π½Π΅emptyΠΈ Π½Π΅unknown. ΠΡΠ΅ΡΠΈΠΊΡ~β ΠΈΠ½Π²Π΅ΡΡΠΈΡ. - Π Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ ΡΠΈΠ³Π½Π°ΡΡΡΠ½ΠΎΠ΅ ΠΈ ΠΆΠΈΠ²ΡΡ Π² C-ΡΠ΄ΡΠ΅. Π‘Π²ΠΎΠΉ ΡΠΈΠΏ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π½Π°ΡΠΈΡΡ Lua-Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠΎΠΌ (
detect_payload_str), Π½ΠΎ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΠΏ Π½Π΅ Π²ΠΈΠ΄Π΅Π½ C-ΡΠΈΠ»ΡΡΡΡ--payloadβ ΡΠΎΠ»ΡΠΊΠΎ payload-ΡΠΈΠ»ΡΡΡΠ°ΠΌ ΡΠ°ΠΌΠΈΡ desync-ΡΡΠ½ΠΊΡΠΈΠΉ.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΡΠΈΠΏ payload (ΠΈ ΡΠ΅ΠΌ ΠΎΠ½ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΠΏΠΎΡΠΎΠΊΠ°)
ΠΡΠΎ Π΄Π²Π° ΡΠ°Π·Π½ΡΡ ΠΏΠΎΠ½ΡΡΠΈΡ, ΠΈ ΠΈΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΏΡΡΠ°ΡΡ.
Π’ΠΈΠΏ payload (Π² Π΄Π°Π½Π½ΡΡ
ΠΏΠ°ΠΊΠ΅ΡΠ° β ΠΏΠΎΠ»Π΅ desync.l7payload) β ΡΡΠΎ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π½Π½ΡΠΉ ΡΠΈΠΏ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² TLS-ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ tls_client_hello, ΠΎΡΠ²Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° β tls_server_hello, Π° Π΄Π°Π»ΡΡΠ΅ ΠΈΠ΄ΡΡ ΡΠΆΠ΅ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΡΠΏΠΎΠ·Π½Π°ΡΡ Π½Π΅Π»ΡΠ·Ρ, β ΠΈΡ
ΡΠΈΠΏ unknown.
ΠΡΠΎΡΠΎΠΊΠΎΠ» ΠΏΠΎΡΠΎΠΊΠ° (ΠΏΠΎΠ»Π΅ desync.l7proto, Π° Π² ΡΠΈΠ»ΡΡΡΠ°Ρ
ΠΏΡΠΎΡΠΈΠ»Ρ β --filter-l7) β ΡΡΠΎ ΡΡΠ»ΡΠΊ Π½Π° Π²ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ. ΠΠ½ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΠΎΡΠΎΠΊΠ΅ Π²ΡΡΡΠ΅ΡΠΈΠ»ΡΡ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΉ ΠΏΠ΅ΠΉΠ»ΠΎΠ°Π΄, ΠΈ ΠΎΡΡΠ°ΡΡΡΡ Ρ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° Π΅Π³ΠΎ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ β Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ ΠΈΠΌΠ΅ΡΡ ΡΠΈΠΏ unknown.
ΠΡΠΎΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ
ΠΡΠΎΡΠΎΠΊΠΎΠ» ΠΏΠΎΡΠΎΠΊΠ° β ΠΊΠ°ΠΊ ΡΠ°Π±Π»ΠΈΡΠΊΠ° Π½Π° Π΄Π²Π΅ΡΠΈ Π²ΡΠ΅Π³ΠΎ Β«ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠ°Β»: ΠΏΠΎΠ²Π΅ΡΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· (Β«ΡΡΠΎ TLSΒ») ΠΈ Π½Π΅ ΠΌΠ΅Π½ΡΠ΅ΠΌ. Π’ΠΈΠΏ payload β ΠΊΠ°ΠΊ ΡΡΠ»ΡΠΊ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ΅ Π²Π½ΡΡΡΠΈ ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠ°: Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ
tls_client_hello, Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡunknown. ΠΠ΄Π½ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ (tls) β ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ payload.
ΠΠ²Π° ΠΎΡΠΎΠ±ΡΡ ΡΠΈΠΏΠ° payload Π΅ΡΡΡ Π²ΡΠ΅Π³Π΄Π°:
emptyβ ΠΏΠ°ΠΊΠ΅Ρ Π±Π΅Π· ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Β«ΠΏΡΡΡΠΎΠΉΒ» ACK).unknownβ Π΄Π°Π½Π½ΡΠ΅ Π΅ΡΡΡ, Π½ΠΎ ΠΈΡ ΡΠΈΠΏ Π½Π΅ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π½ (Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π° ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ, Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΉ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»).
ΠΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅, Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ»Ρ l7payload ΠΈ l7proto Π»Π΅ΠΆΠ°Ρ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠ°, β Π² ΡΡΡΡΠΊΡΡΡΠ° desync ΠΈ Π΄ΠΈΡΡΠ΅ΠΊΡΠ°.
ΠΠ°ΠΊ nfqws2 ΡΠ°ΡΠΏΠΎΠ·Π½Π°ΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ
Π Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ ΡΠΈΠ³Π½Π°ΡΡΡΠ½ΠΎΠ΅: C-ΡΠ΄ΡΠΎ nfqws2 ΡΠΌΠΎΡΡΠΈΡ Π½Π° Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠ½ΡΠ΅ Π±Π°ΠΉΡΡ Π² Π½Π°ΡΠ°Π»Π΅ ΠΏΠ΅ΠΉΠ»ΠΎΠ°Π΄Π° (ΠΈΠ»ΠΈ Π³ΡΡΠΏΠΏΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²) ΠΈ ΠΏΠΎ Π½ΠΈΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠΈΠΏ. ΠΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Π½Π° Π±ΡΡΡΡΠΎΠΉ ΡΡΠΎΡΠΎΠ½Π΅ C-ΠΊΠΎΠ΄Π° Π΅ΡΡ Π΄ΠΎ Π²ΡΠ·ΠΎΠ²Π° Lua (ΡΠΌ. ΡΡ
Π΅ΠΌΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΠ°ΡΠΈΠΊΠ°).
Π ΡΠΈΠ»ΡΡΡΠ°Ρ ΠΏΠΎ ΡΠΈΠΏΡ payload ΠΈ ΠΏΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ ΠΏΠΎΡΠΎΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ½Ρ Π΄Π²Π° ΡΠΏΠ΅ΡΠ·Π½Π°ΡΠ΅Π½ΠΈΡ:
allβ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ Π»ΡΠ±ΡΠΌ ΠΏΠ΅ΠΉΠ»ΠΎΠ°Π΄ΠΎΠΌ (Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅emptyΠΈunknown);knownβ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ ΡΠΎ Π²ΡΠ΅ΠΌ, ΡΡΠΎ Π½Π΅emptyΠΈ Π½Π΅unknown(ΡΠΎ Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΡΠ΅Π°Π»ΡΠ½ΠΎ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π½Π½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ).
Π’Π°Π±Π»ΠΈΡΠ° ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π΅ΠΌΡΡ ΡΠΈΠΏΠΎΠ²
ΠΠΈΠΆΠ΅ β ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ ΠΏΠΎΡΠΎΠΊΠ° nfqws2 ΡΠΌΠ΅Π΅Ρ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°ΡΡ, Π½Π° ΠΊΠ°ΠΊΠΎΠΌ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ΅ (L4) ΠΎΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΡΠΈΠΏΡ payload Π²Π½ΡΡΡΠΈ Π½ΠΈΡ
Π±ΡΠ²Π°ΡΡ.
| ΠΡΠΎΡΠΎΠΊΠΎΠ» ΠΏΠΎΡΠΎΠΊΠ° | L4 | Π’ΠΈΠΏΡ payload Π²Π½ΡΡΡΠΈ |
|---|---|---|
http | TCP | http_req, http_reply |
tls | TCP | tls_client_hello, tls_server_hello |
xmpp | TCP | xmpp_stream, xmpp_starttls, xmpp_proceed, xmpp_features |
mtproto | TCP | mtproto_initial |
bt | TCP | bt_handshake |
quic | UDP | quic_initial |
wireguard | UDP | wireguard_initiation, wireguard_response, wireguard_cookie, wireguard_keepalive |
dht | UDP | dht |
utp_bt | UDP | utp_bt_handshake |
discord | UDP | discord_ip_discovery |
stun | UDP | stun |
dns | UDP | dns_query, dns_response |
dtls | UDP | dtls_client_hello, dtls_server_hello |
| (Π»ΡΠ±ΠΎΠΉ) | ICMP | ipv4, ipv6, icmp |
ΠΡΠΎΠ±ΡΠ΅ ΡΠΈΠΏΡ
ipv4/ipv6/icmpΠΡΠΎ ΡΠΈΠΏΡ payload Π΄Π»Ρ ICMP-ΠΏΠ°ΠΊΠ΅ΡΠΎΠ².
ipv4ΠΈipv6Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° ICMP Π½Π΅ΡΡΡ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»ΡΠ½Π½ΡΠΉ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ICMP Β«destination unreachableΒ» Ρ ΠΊΡΡΠΊΠΎΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ). ΠΠΎ Π²ΡΠ΅Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ»ΡΡΠ°ΡΡ ICMP ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠΈΠΏ payloadicmp. ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΏΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ICMP β ΡΡΡΡΠΊΡΡΡΠ° desync ΠΈ Π΄ΠΈΡΡΠ΅ΠΊΡΠ°.
Π€ΠΈΠ»ΡΡΡ --payload
--payload β ΠΏΠΎΠ»Π΅ ΠΏΡΠΎΡΠΈΠ»Ρ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ, ΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ°ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ --lua-desync-ΠΈΠ½ΡΡΠ°Π½ΡΡ. ΠΠΎΠΊΠ° --payload Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½, ΠΎΠ½ Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Π½Π° Π²ΡΠ΅ ΠΈΠ΄ΡΡΠΈΠ΅ Π·Π° Π½ΠΈΠΌ ΠΈΠ½ΡΡΠ°Π½ΡΡ (ΠΊΠ°ΠΊ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ Π²Π½ΡΡΡΠΈΠΏΡΠΎΡΠΈΠ»ΡΠ½ΡΠ΅ ΡΠΈΠ»ΡΡΡΡ, ΡΠΌ. ΡΡ
Π΅ΠΌΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΠ°ΡΠΈΠΊΠ°).
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ
# ΠΠ΄ΠΈΠ½ ΡΠΈΠΏ
--payload=tls_client_hello
# ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΏΠΎΠ² ΡΠ΅ΡΠ΅Π· Π·Π°ΠΏΡΡΡΡ
--payload=http_req,http_reply
# ΠΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠ΅ ΡΠΈΠΏΡ (Π½Π΅ empty ΠΈ Π½Π΅ unknown) β ΡΡΠΎ ΠΆΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
--payload=known
# ΠΠΎΠΎΠ±ΡΠ΅ Π²ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ, Π²ΠΊΠ»ΡΡΠ°Ρ empty ΠΈ unknown
--payload=all
# ΠΠ½Π²Π΅ΡΡΠΈΡ: Π²ΡΡ, ΠΠ ΠΠΠ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ
--payload=~emptyΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ β known
ΠΡΠ»ΠΈ --payload Π½Π΅ ΡΠΊΠ°Π·Π°Π½, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ known. ΠΠΎΡ ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄ ΡΠΈΠ»ΡΡΡΠ° (lua/zapret-lib.lua):
function payload_match_filter(l7payload, l7payload_filter, def)
local argpl = l7payload_filter or def or "known"
local neg = string.sub(argpl,1,1)=="~"
local pl = neg and string.sub(argpl,2) or argpl
return neg ~= (in_list(pl, "all") or in_list(pl, l7payload) or in_list(pl, "known") and l7payload~="unknown" and l7payload~="empty")
endΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ (known) ΡΠΈΠ»ΡΡΡ:
- β
ΠΏΡΠΎΠΏΡΡΠΊΠ°Π΅Ρ Π»ΡΠ±ΠΎΠΉ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π½Π½ΡΠΉ payload (
tls_client_hello,mtproto_initial,http_req, β¦); - β Π½Π΅ ΠΏΡΠΎΠΏΡΡΠΊΠ°Π΅Ρ
unknown; - β Π½Π΅ ΠΏΡΠΎΠΏΡΡΠΊΠ°Π΅Ρ
empty.
ΠΠ½Π²Π΅ΡΡΠΈΡ ΡΠ΅ΡΠ΅Π· ~ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Β«Π²ΡΡ, ΠΊΡΠΎΠΌΠ΅Β»: --payload=~empty β Π»ΡΠ±ΠΎΠΉ Π½Π΅ΠΏΡΡΡΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ, --payload=~unknown β Π²ΡΡ, ΠΊΡΠΎΠΌΠ΅ Π½Π΅ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π½Π½ΠΎΠ³ΠΎ.
--payload(C-ΡΡΠΎΠ²Π΅Π½Ρ) vs payload-ΡΠΈΠ»ΡΡΡ ΠΈΠ½ΡΡΠ°Π½ΡΠ° (Lua)
--payloadΠ½Π° ΡΡΠΎΠ²Π½Π΅ ΠΏΡΠΎΡΠΈΠ»Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ Π±ΡΡΡΡΡΠΌ C-ΠΊΠΎΠ΄ΠΎΠΌ. Π£ ΠΌΠ½ΠΎΠ³ΠΈΡ desync-ΡΡΠ½ΠΊΡΠΈΠΉ Π΅ΡΡΡ ΡΠ²ΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρpayload=β ΡΡΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΈΠ»ΡΡΡ ΡΠΆΠ΅ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ Lua. ΠΡΠ°ΠΊΡΠΈΠΊΠ°: Π΄Π΅ΡΠΆΠΈΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠΈΠ»ΡΡΡ Π½Π°--payloadΠΏΡΠΎΡΠΈΠ»Ρ (Π±ΡΡΡΡΠ΅Π΅), Π°payload=ΠΈΠ½ΡΡΠ°Π½ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π΄Π»Ρ ΡΠΎΠ½ΠΊΠΎΠΉ Π΄ΠΎΠ½Π°ΡΡΡΠΎΠΉΠΊΠΈ. Π Π°Π·Π½ΠΈΡΠ° ΡΡΠ°Π½Π΅Ρ Π²Π°ΠΆΠ½ΠΎΠΉ Π½ΠΈΠΆΠ΅, Π² ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΏΡΠΎ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΡ.
Π‘Π²ΠΎΠΉ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° Π½Π° Lua (detect_payload_str)
ΠΠ½ΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° Π½Π΅Ρ Π² ΡΠΏΠΈΡΠΊΠ΅ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π΅ΠΌΡΡ
, Π½ΠΎ Ρ Π΅Π³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Π΅ΡΡΡ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠ½Π°Ρ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ°. Π’ΠΎΠ³Π΄Π° ΡΠΈΠΏ payload ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π½Π°ΡΠΈΡΡ ΡΠ°ΠΌΠΎΠΌΡ β ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΌ Lua-Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠΎΠΌ. Π ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ΅ Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅Ρ-ΡΡΠ½ΠΊΡΠΈΡ detect_payload_str:
function detect_payload_str(ctx, desync)
-- arg: pattern β ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ° Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° Π² desync.dis.payload
-- arg: payload β ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ desync.l7payload, Π΅ΡΠ»ΠΈ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ° Π½Π°ΠΉΠ΄Π΅Π½Π°
-- arg: undetected β ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ, Π΅ΡΠ»ΠΈ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ° ΠΠ Π½Π°ΠΉΠ΄Π΅Π½Π° (Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ)
endΠΠΎΠ³ΠΈΠΊΠ° ΠΏΡΠΎΡΡΠ°Ρ: ΡΡΠ½ΠΊΡΠΈΡ ΠΈΡΠ΅Ρ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΡ pattern Π² ΠΏΠ΅ΠΉΠ»ΠΎΠ°Π΄Π΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° (desync.dis.payload); Π΅ΡΠ»ΠΈ Π½Π°Ρ
ΠΎΠ΄ΠΈΡ β ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅Ρ desync.l7payload = desync.arg.payload; ΠΈΠ½Π°ΡΠ΅, Π΅ΡΠ»ΠΈ Π·Π°Π΄Π°Π½ undetected, ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅Ρ desync.l7payload = desync.arg.undetected.
ΠΠ°ΡΡΠΎΠΌΠ½ΡΠΉ ΡΠΈΠΏ Π½Π΅ Π²ΠΈΠ΄Π΅Π½ C-ΠΊΠΎΠ΄Ρ ΠΈ ΡΠΈΠ»ΡΡΡΡ
--payloadΠ’Π°ΠΊΠΈΠ΅ Lua-Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΡ Π½Π΅ ΠΈΠΌΠ΅ΡΡ ΡΠΈΠ»Ρ Π΄Π»Ρ C-ΠΊΠΎΠ΄Π°: ΡΠ΄ΡΠΎ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ ΠΎ Π²Π°ΡΠ΅ΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π΅ ΠΈ Π²Π°ΡΠ΅ΠΌ ΡΠΈΠΏΠ΅ payload. ΠΠΎΡΡΠΎΠΌΡ Π²Π°ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π΅Π»ΡΠ·Ρ ΡΠΊΠ°Π·Π°ΡΡ Π²
--payload(ΡΡΠΎ C-ΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ ΡΠΈΠ»ΡΡΡ). ΠΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² payload-ΡΠΈΠ»ΡΡΡΠ°Ρ (payload=) ΠΌΠ½ΠΎΠ³ΠΈΡ desync-ΡΡΠ½ΠΊΡΠΈΠΉ β ΠΎΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΆΠ΅ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ Lua, ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π²Π°Ρ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡ ΠΎΡΡΠ°Π±ΠΎΡΠ°Π». Π‘Ρ Π΅ΠΌΠ° ΡΠ°ΠΊΠ°Ρ: ΡΠ½Π°ΡΠ°Π»Π° ΠΈΠ½ΡΡΠ°Π½Ρdetect_payload_strΠΏΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρl7payload, Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΈΠ½ΡΡΠ°Π½Ρ Ρpayload=Π²Π°Ρ_ΡΠΈΠΏΠ½Π° Π½Π΅Π³ΠΎ ΡΠ΅Π°Π³ΠΈΡΡΠ΅Ρ.
ΠΡΠ°ΠΊΡΠΈΠΊΠ°: MTProto (Telegram)
Π₯ΠΎΡΠΎΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, Π³Π΄Π΅ Π²Π°ΠΆΠ½Π° ΡΠ°Π·Π½ΠΈΡΠ° Β«ΠΏΠ°ΠΊΠ΅Ρ vs ΠΏΠΎΡΠΎΠΊΒ». Π ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ MTProto ΡΠ°ΡΠΏΠΎΠ·Π½Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ:
| ΠΠ°ΠΊΠ΅Ρ | l7payload | ΠΡΠΎΠΉΠ΄ΡΡ ΡΠΈΠ»ΡΡΡ known? |
|---|---|---|
| ΠΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ | mtproto_initial | β ΠΠ° |
| ΠΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ | unknown | β ΠΠ΅Ρ |
ΠΡΠΆΠ½ΠΎ Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ payload=unknown? ΠΠ±ΡΡΠ½ΠΎ Π½Π΅Ρ. ΠΠ»Ρ ΠΎΠ±Ρ
ΠΎΠ΄Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Telegram, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ mtproto_initial, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ:
- DPI Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°ΡΠ°Π»ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ (ΡΠΈΠ³Π½Π°ΡΡΡΡ MTProto);
- ΠΏΠΎΡΠ»Π΅ initial Π΄Π°Π½Π½ΡΠ΅ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Ρ β DPI ΠΈΡ Π½Π΅ ΠΏΠ°ΡΡΠΈΡ;
- Π΅ΡΠ»ΠΈ initial ΠΏΡΠΎΡΡΠ» β ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ.
# Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ β ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ initial
nfqws2 --filter-l7=mtproto \
--payload=mtproto_initial \
--lua-desync=fake:blob=0x00000000:repeats=3ΠΡΠ»ΠΈ ΠΆΠ΅ Π½ΡΠΆΠ½Ρ Π²ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ MTProto (initial + ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅), ΡΠΊΠ°ΠΆΠΈΡΠ΅ unknown ΡΠ²Π½ΠΎ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ all:
# Π―Π²Π½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ unknown-ΠΏΠ°ΠΊΠ΅ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌ ΡΠΈΠ»ΡΡΡΠΎΠΌ
nfqws2 --filter-l7=mtproto \
--payload=mtproto_initial --lua-desync=fake:blob=... \
--payload=unknown --lua-desync=send:ip_ttl=3
# ΠΠ»ΠΈ ΡΠ°Π·ΠΎΠΌ Π²ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ
nfqws2 --filter-l7=mtproto \
--payload=all \
--lua-desync=fake:blob=...ΠΠ΅ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·Π±ΠΎΡ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡ Telegram β Π² ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ mtproto.
π Π‘ΠΌ. ΡΠ°ΠΊΠΆΠ΅
- Π€ΠΈΠ»ΡΡΡΡ ΠΏΡΠΎΡΠΈΠ»Ρ β
--filter-l7(ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΠΏΠΎΡΠΎΠΊΠ°) ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΈΠ»ΡΡΡΡ ΡΡΠ΄ΠΎΠΌ Ρ--payload - ΠΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ βlua-desync β ΡΡΠΎ Π·Π° ΠΈΠ½ΡΡΠ°Π½ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ
--payload - Π‘ΡΡΡΠΊΡΡΡΠ° desync β Π³Π΄Π΅ Π»Π΅ΠΆΠ°Ρ ΠΏΠΎΠ»Ρ
l7payload/l7protoΠΈ ΠΊΠ°ΠΊ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΡΠΎΠ±ΡΠ°Π½Π½ΡΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠ°ΠΊΠ΅ΡΠ½ΡΠΉ ΠΏΠ΅ΠΉΠ»ΠΎΠ°Π΄ - Π‘Ρ Π΅ΠΌΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΠ°ΡΠΈΠΊΠ° β Π½Π° ΠΊΠ°ΠΊΠΎΠΉ ΡΡΠ°Π΄ΠΈΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠΈΠΏ payload ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΠΏΠΎΡΠΎΠΊΠ°
- Π Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ MTProto β ΡΠ°Π·Π±ΠΎΡ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Telegram
- Blob-Π΄Π°Π½Π½ΡΠ΅ β Π·Π°Π³ΠΎΡΠΎΠ²ΠΊΠΈ Π΄Π»Ρ
blob=β¦, ΡΠ°ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅ Π²ΠΌΠ΅ΡΡΠ΅ Ρ payload-ΡΠΈΠ»ΡΡΡΠΎΠΌ - π ΠΡΠΈΡΠΈΠ°Π»ΡΠ½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ (docs/manual.md) β ΠΏΠ΅ΡΠ²ΠΎΠΈΡΡΠΎΡΠ½ΠΈΠΊ
π€ ΠΡΠΈ ΡΡΠ°ΡΡΠΈ ΠΎΡΠΊΡΡΡΡ β ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΡΠ°ΡΡ Π½Π° Π½ΠΈΡ ΠΠ
ΠΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΡΡΠ΅Π½ΠΈΡΠΎΠ²Π°ΡΡ ΠΠ Π½Π° Π½Π°ΡΠΈΡ ΡΡΠ°ΡΡΡΡ . ΠΡΡ ΠΎΠ΄Π½ΠΎΠ΅ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΎΠ΄Π½ΠΈΠΌ zip-Π°ΡΡ ΠΈΠ²ΠΎΠΌ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π² Forgejo: ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊ ΡΡΠΎΠΉ Π·Π°ΠΌΠ΅ΡΠΊΠΈ Β· Π²Π΅ΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ.