From 4b632313e2213a984f56fb865767cd6ec9d0a347 Mon Sep 17 00:00:00 2001 From: bol-van Date: Fri, 9 May 2025 20:57:14 +0300 Subject: [PATCH] nfqws: improve --synack-split --- docs/readme.md | 2 +- nfq/desync.c | 43 ++++++++++++++++++++++++++++++------------- nfq/nfqws.c | 8 +++++--- nfq/params.h | 2 +- 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/docs/readme.md b/docs/readme.md index d7b2133c..6a767c0a 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -180,7 +180,7 @@ dvtws, собираемый из тех же исходников (см. [док --wsize=[:] ; менять tcp window size на указанный размер в SYN,ACK. если не задан scale_factor, то он не меняется (устарело !) --wssize=[:] ; менять tcp window size на указанный размер в исходящих пакетах. scale_factor по умолчанию 0. (см. conntrack !) --wssize-cutoff=[n|d|s]N ; изменять server window size в исходящих пакетах (n), пакетах данных (d), относительных sequence (s) по номеру меньше N ---synack-split=[syn|ack] ; syn (по умолчанию) отсылает SYN,ACK tcp сегмент как раздельные SYN и ACK сегменты, ack шлет сначала ACK, потом SYN" +--synack-split=[syn|synack|acksyn] ; выполнить tcp split handshake. вместо SYN,ACK отсылать только SYN, SYN+ACK или ACK+SYN --orig-ttl= ; модифицировать TTL оригинального пакета --orig-ttl6= ; модифицировать ipv6 hop limit оригинальных пакетов. если не указано, используется значение --orig-ttl --orig-autottl=[[:[-]]] ; режим auto ttl для ipv4 и ipv6. по умолчанию: +5:3-64. delta=0 отключает функцию diff --git a/nfq/desync.c b/nfq/desync.c index 0aeda66d..78d45491 100644 --- a/nfq/desync.c +++ b/nfq/desync.c @@ -1280,32 +1280,49 @@ static uint8_t dpi_desync_tcp_packet_play(bool replay, size_t reasm_offset, uint } } - if (dp->synack_split && tcp_synack_segment(dis->tcp)) + if (dp->synack_split!=SS_NONE && tcp_synack_segment(dis->tcp)) { dis->tcp->th_flags &= ~TH_ACK; tcp_fix_checksum(dis->tcp,dis->transport_len, dis->ip, dis->ip6); - pkt1_len = sizeof(pkt1); - if (!prepare_tcp_segment((struct sockaddr *)&src, (struct sockaddr *)&dst, TH_ACK, false, 0, dis->tcp->th_seq, dis->tcp->th_ack, dis->tcp->th_win, SCALE_NONE, timestamps, - DF,ttl_orig,IP4_TOS(dis->ip),IP4_IP_ID_FIX(dis->ip),IP6_FLOW(dis->ip6), - FOOL_NONE,0,0,NULL, 0, pkt1, &pkt1_len)) + char ss[2],i,ct; + if (dp->synack_split==SS_SYN) { - DLOG_ERR("cannot prepare split SYNACK ACK part\n"); - goto send_orig; + ct=1; + ss[0] = 'S'; } - - t_synack_split ss[2] = {dp->synack_split, dp->synack_split==SS_ACK ? SS_SYN : SS_ACK}; - int i; - for (int i=0;i<2;i++) + else + { + ct=2; + if (dp->synack_split==SS_SYNACK) + { + ss[0] = 'S'; + ss[1] = 'A'; + } + else + { + ss[0] = 'A'; + ss[1] = 'S'; + } + pkt1_len = sizeof(pkt1); + if (!prepare_tcp_segment((struct sockaddr *)&src, (struct sockaddr *)&dst, TH_ACK, false, 0, dis->tcp->th_seq, dis->tcp->th_ack, dis->tcp->th_win, SCALE_NONE, timestamps, + DF,ttl_orig,IP4_TOS(dis->ip),IP4_IP_ID_FIX(dis->ip),IP6_FLOW(dis->ip6), + FOOL_NONE,0,0,NULL, 0, pkt1, &pkt1_len)) + { + DLOG_ERR("cannot prepare split SYNACK ACK part\n"); + goto send_orig; + } + } + for (int i=0;idesync_repeats,(struct sockaddr *)&dst, desync_fwmark, ifout , dis->data_pkt, dis->len_pkt)) goto send_orig; break; - case SS_ACK: + case 'A': DLOG("sending split SYNACK : ACK\n"); if (!rawsend_rep(dp->desync_repeats,(struct sockaddr *)&dst, desync_fwmark, ifout , pkt1, pkt1_len)) goto send_orig; diff --git a/nfq/nfqws.c b/nfq/nfqws.c index 1541ed6c..d0fd0d2c 100644 --- a/nfq/nfqws.c +++ b/nfq/nfqws.c @@ -1516,7 +1516,7 @@ static void exithelp(void) " --wsize=[:]\t\t; set window size. 0 = do not modify. OBSOLETE !\n" " --wssize=[:]\t; set window size for server. 0 = do not modify. default scale_factor = 0.\n" " --wssize-cutoff=[n|d|s]N\t\t\t; apply server wsize only to packet numbers (n, default), data packet numbers (d), relative sequence (s) less than N\n" - " --synack-split=[syn|ack]\t\t\t; syn (default) sends SYN,ACK tcp segment as separate SYN and ACK segments. ack sends ACK then SYN.\n" + " --synack-split=[syn|synack|acksyn]\t\t; perform TCP split handshake : send SYN only, SYN+ACK or ACK+SYN\n" " --orig-ttl=\t\t\t\t; set TTL for original packets\n" " --orig-ttl6=\t\t\t\t; set ipv6 hop limit for original packets. by default ttl value is used\n" " --orig-autottl=[[:[-]]]\t; auto ttl mode for both ipv4 and ipv6. default: +%d:%u-%u\n" @@ -2106,8 +2106,10 @@ int main(int argc, char **argv) dp->synack_split = SS_SYN; if (optarg) { - if (!strcmp(optarg,"ack")) - dp->synack_split = SS_ACK; + if (!strcmp(optarg,"synack")) + dp->synack_split = SS_SYNACK; + else if (!strcmp(optarg,"acksyn")) + dp->synack_split = SS_ACKSYN; else if (strcmp(optarg,"syn")) { DLOG_ERR("invalid synack-split value\n"); diff --git a/nfq/params.h b/nfq/params.h index 98685ea3..793de403 100644 --- a/nfq/params.h +++ b/nfq/params.h @@ -75,7 +75,7 @@ struct fake_tls_mod uint32_t mod; }; -typedef enum {SS_NONE=0,SS_ACK,SS_SYN} t_synack_split; +typedef enum {SS_NONE=0,SS_SYN,SS_SYNACK,SS_ACKSYN} t_synack_split; struct desync_profile {