Commit 2a23bc99 authored by bol-van's avatar bol-van
Browse files

nfqws: --synack-split select syn or ack first

parent 8a1d7c7a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -180,7 +180,7 @@ dvtws, собираемый из тех же исходников (см. [док
--wsize=<winsize>[:<scale_factor>]                 ; менять tcp window size на указанный размер в SYN,ACK. если не задан scale_factor, то он не меняется (устарело !)
--wssize=<winsize>[:<scale_factor>]                ; менять tcp window size на указанный размер в исходящих пакетах. scale_factor по умолчанию 0. (см. conntrack !)
--wssize-cutoff=[n|d|s]N                           ; изменять server window size в исходящих пакетах (n), пакетах данных (d), относительных sequence (s) по номеру меньше N
--synack-split=[0|1]                               ; 1 или отсутствие аргумента отсылает SYN,ACK tcp сегмент как раздельные SYN и ACK сегменты (техника для сервера !)
--synack-split=[syn|ack]                           ; syn (по умолчанию) отсылает SYN,ACK tcp сегмент как раздельные SYN и ACK сегменты, ack шлет сначала ACK, потом SYN.\n"
--orig-ttl=<int>                                   ; модифицировать TTL оригинального пакета
--orig-ttl6=<int>                                  ; модифицировать ipv6 hop limit оригинальных пакетов.  если не указано, используется значение --orig-ttl
--orig-autottl=[<delta>[:<min>[-<max>]]]           ; режим auto ttl для ipv4 и ipv6. по умолчанию: +5:3-64. delta=0 отключает функцию
+19 −7
Original line number Diff line number Diff line
@@ -1285,10 +1285,6 @@ static uint8_t dpi_desync_tcp_packet_play(bool replay, size_t reasm_offset, uint
			dis->tcp->th_flags &= ~TH_ACK;
			tcp_fix_checksum(dis->tcp,dis->transport_len, dis->ip, dis->ip6);

			DLOG("sending split SYNACK : SYN\n");
			if (!rawsend_rep(dp->desync_repeats,(struct sockaddr *)&dst, desync_fwmark, ifout , dis->data_pkt, dis->len_pkt))
				goto send_orig;

			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),
@@ -1297,9 +1293,25 @@ static uint8_t dpi_desync_tcp_packet_play(bool replay, size_t reasm_offset, uint
				DLOG_ERR("cannot prepare split SYNACK ACK part\n");
				goto send_orig;
			}

			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++)
			{
				switch(ss[i])
				{
					case SS_SYN:
						DLOG("sending split SYNACK : SYN\n");
						if (!rawsend_rep(dp->desync_repeats,(struct sockaddr *)&dst, desync_fwmark, ifout , dis->data_pkt, dis->len_pkt))
							goto send_orig;
						break;
					case SS_ACK:
						DLOG("sending split SYNACK : ACK\n");
						if (!rawsend_rep(dp->desync_repeats,(struct sockaddr *)&dst, desync_fwmark, ifout , pkt1, pkt1_len))
							goto send_orig;
						break;
				}
			}
			return VERDICT_DROP;
		}

+12 −2
Original line number Diff line number Diff line
@@ -1516,7 +1516,7 @@ static void exithelp(void)
		" --wsize=<window_size>[:<scale_factor>]\t\t; set window size. 0 = do not modify. OBSOLETE !\n"
		" --wssize=<window_size>[:<scale_factor>]\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=[0|1]\t\t\t\t; 1 or no arguments sends SYN,ACK tcp segment as separate SYN and ACK segments\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"
		" --orig-ttl=<int>\t\t\t\t; set TTL for original packets\n"
		" --orig-ttl6=<int>\t\t\t\t; set ipv6 hop limit for original packets. by default ttl value is used\n"
		" --orig-autottl=[<delta>[:<min>[-<max>]]]\t; auto ttl mode for both ipv4 and ipv6. default: +%d:%u-%u\n"
@@ -2103,7 +2103,17 @@ int main(int argc, char **argv)
			}
			break;
		case IDX_SYNACK_SPLIT:
			dp->synack_split = !optarg || atoi(optarg);
			dp->synack_split = SS_SYN;
			if (optarg)
			{
				if (!strcmp(optarg,"ack"))
					dp->synack_split = SS_ACK;
				else if (strcmp(optarg,"syn"))
				{
					DLOG_ERR("invalid synack-split value\n");
					exit_clean(1);
				}
			}
			break;
		case IDX_CTRACK_TIMEOUTS:
			if (sscanf(optarg, "%u:%u:%u:%u", &params.ctrack_t_syn, &params.ctrack_t_est, &params.ctrack_t_fin, &params.ctrack_t_udp)<3)
+3 −1
Original line number Diff line number Diff line
@@ -75,6 +75,8 @@ struct fake_tls_mod
	uint32_t mod;
};

typedef enum {SS_NONE=0,SS_ACK,SS_SYN} t_synack_split;

struct desync_profile
{
	int n;	// number of the profile
@@ -84,7 +86,7 @@ struct desync_profile
	char wssize_cutoff_mode; // n - packets, d - data packets, s - relative sequence
	unsigned int wssize_cutoff;

	bool synack_split;
	t_synack_split synack_split;

	bool hostcase, hostnospace, domcase, methodeol;
	char hostspell[4];