Revert "kernel: remove obsolete netfilter tcp window size check bypass patch"
This reverts commit 75e78bcaab.
			
			
This commit is contained in:
		| @@ -0,0 +1,73 @@ | |||||||
|  | From: Felix Fietkau <nbd@nbd.name> | ||||||
|  | Subject: netfilter: optional tcp window check | ||||||
|  |  | ||||||
|  | Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||||
|  | --- | ||||||
|  |  net/netfilter/nf_conntrack_proto_tcp.c | 13 +++++++++++++ | ||||||
|  |  1 file changed, 13 insertions(+) | ||||||
|  |  | ||||||
|  | --- a/net/netfilter/nf_conntrack_proto_tcp.c | ||||||
|  | +++ b/net/netfilter/nf_conntrack_proto_tcp.c | ||||||
|  | @@ -31,6 +31,9 @@ | ||||||
|  |  #include <net/netfilter/ipv4/nf_conntrack_ipv4.h> | ||||||
|  |  #include <net/netfilter/ipv6/nf_conntrack_ipv6.h> | ||||||
|  |   | ||||||
|  | +/* Do not check the TCP window for incoming packets  */ | ||||||
|  | +static int nf_ct_tcp_no_window_check __read_mostly = 1; | ||||||
|  | + | ||||||
|  |  /* "Be conservative in what you do, | ||||||
|  |      be liberal in what you accept from others." | ||||||
|  |      If it's non-zero, we mark only out of window RST segments as INVALID. */ | ||||||
|  | @@ -476,6 +479,9 @@ static bool tcp_in_window(const struct n | ||||||
|  |  	s32 receiver_offset; | ||||||
|  |  	bool res, in_recv_win; | ||||||
|  |   | ||||||
|  | +	if (nf_ct_tcp_no_window_check) | ||||||
|  | +		return true; | ||||||
|  | + | ||||||
|  |  	/* | ||||||
|  |  	 * Get the required data from the packet. | ||||||
|  |  	 */ | ||||||
|  | @@ -1139,7 +1145,7 @@ int nf_conntrack_tcp_packet(struct nf_co | ||||||
|  |  		 IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED && | ||||||
|  |  		 timeouts[new_state] > timeouts[TCP_CONNTRACK_UNACK]) | ||||||
|  |  		timeout = timeouts[TCP_CONNTRACK_UNACK]; | ||||||
|  | -	else if (ct->proto.tcp.last_win == 0 && | ||||||
|  | +	else if (!nf_ct_tcp_no_window_check && ct->proto.tcp.last_win == 0 && | ||||||
|  |  		 timeouts[new_state] > timeouts[TCP_CONNTRACK_RETRANS]) | ||||||
|  |  		timeout = timeouts[TCP_CONNTRACK_RETRANS]; | ||||||
|  |  	else | ||||||
|  | --- a/net/netfilter/nf_conntrack_standalone.c | ||||||
|  | +++ b/net/netfilter/nf_conntrack_standalone.c | ||||||
|  | @@ -25,6 +25,9 @@ | ||||||
|  |  #include <net/netfilter/nf_conntrack_timestamp.h> | ||||||
|  |  #include <linux/rculist_nulls.h> | ||||||
|  |   | ||||||
|  | +/* Do not check the TCP window for incoming packets  */ | ||||||
|  | +static int nf_ct_tcp_no_window_check __read_mostly = 1; | ||||||
|  | + | ||||||
|  |  static bool enable_hooks __read_mostly; | ||||||
|  |  MODULE_PARM_DESC(enable_hooks, "Always enable conntrack hooks"); | ||||||
|  |  module_param(enable_hooks, bool, 0000); | ||||||
|  | @@ -657,6 +660,7 @@ enum nf_ct_sysctl_index { | ||||||
|  |  	NF_SYSCTL_CT_PROTO_TIMEOUT_GRE_STREAM, | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | +	NF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK, | ||||||
|  |  	__NF_SYSCTL_CT_LAST_SYSCTL, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | @@ -993,6 +997,13 @@ static struct ctl_table nf_ct_sysctl_tab | ||||||
|  |  		.proc_handler   = proc_dointvec_jiffies, | ||||||
|  |  	}, | ||||||
|  |  #endif | ||||||
|  | +	[NF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK] = { | ||||||
|  | +		.procname       = "nf_conntrack_tcp_no_window_check", | ||||||
|  | +		.data           = &nf_ct_tcp_no_window_check, | ||||||
|  | +		.maxlen         = sizeof(unsigned int), | ||||||
|  | +		.mode           = 0644, | ||||||
|  | +		.proc_handler   = proc_dointvec, | ||||||
|  | +	}, | ||||||
|  |  	{} | ||||||
|  |  }; | ||||||
|  |   | ||||||
| @@ -0,0 +1,83 @@ | |||||||
|  | From: Felix Fietkau <nbd@nbd.name> | ||||||
|  | Subject: netfilter: optional tcp window check | ||||||
|  |  | ||||||
|  | Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||||
|  | Signed-off-by: Christian 'Ansuel' Marangi <ansuelsmth@gmail.com> | ||||||
|  | --- | ||||||
|  |  net/netfilter/nf_conntrack_proto_tcp.c | 13 +++++++++++++ | ||||||
|  |  1 file changed, 13 insertions(+) | ||||||
|  |  | ||||||
|  | --- a/net/netfilter/nf_conntrack_proto_tcp.c | ||||||
|  | +++ b/net/netfilter/nf_conntrack_proto_tcp.c | ||||||
|  | @@ -465,6 +465,9 @@ static bool tcp_in_window(struct nf_conn | ||||||
|  |  	s32 receiver_offset; | ||||||
|  |  	bool res, in_recv_win; | ||||||
|  |   | ||||||
|  | +	if (tn->tcp_no_window_check) | ||||||
|  | +		return true; | ||||||
|  | + | ||||||
|  |  	/* | ||||||
|  |  	 * Get the required data from the packet. | ||||||
|  |  	 */ | ||||||
|  | @@ -1191,7 +1194,7 @@ int nf_conntrack_tcp_packet(struct nf_co | ||||||
|  |  		 IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED && | ||||||
|  |  		 timeouts[new_state] > timeouts[TCP_CONNTRACK_UNACK]) | ||||||
|  |  		timeout = timeouts[TCP_CONNTRACK_UNACK]; | ||||||
|  | -	else if (ct->proto.tcp.last_win == 0 && | ||||||
|  | +	else if (!tn->tcp_no_window_check && ct->proto.tcp.last_win == 0 && | ||||||
|  |  		 timeouts[new_state] > timeouts[TCP_CONNTRACK_RETRANS]) | ||||||
|  |  		timeout = timeouts[TCP_CONNTRACK_RETRANS]; | ||||||
|  |  	else | ||||||
|  | @@ -1507,6 +1510,9 @@ void nf_conntrack_tcp_init_net(struct ne | ||||||
|  |  	 */ | ||||||
|  |  	tn->tcp_be_liberal = 0; | ||||||
|  |   | ||||||
|  | +	/* Skip Windows Check */ | ||||||
|  | +	tn->tcp_no_window_check = 0; | ||||||
|  | + | ||||||
|  |  	/* If it's non-zero, we turn off RST sequence number check */ | ||||||
|  |  	tn->tcp_ignore_invalid_rst = 0; | ||||||
|  |   | ||||||
|  | --- a/net/netfilter/nf_conntrack_standalone.c | ||||||
|  | +++ b/net/netfilter/nf_conntrack_standalone.c | ||||||
|  | @@ -633,6 +633,7 @@ enum nf_ct_sysctl_index { | ||||||
|  |  #endif | ||||||
|  |  	NF_SYSCTL_CT_PROTO_TCP_LOOSE, | ||||||
|  |  	NF_SYSCTL_CT_PROTO_TCP_LIBERAL, | ||||||
|  | +	NF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK, | ||||||
|  |  	NF_SYSCTL_CT_PROTO_TCP_IGNORE_INVALID_RST, | ||||||
|  |  	NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS, | ||||||
|  |  	NF_SYSCTL_CT_PROTO_TIMEOUT_UDP, | ||||||
|  | @@ -848,6 +849,14 @@ static struct ctl_table nf_ct_sysctl_tab | ||||||
|  |  		.extra1 	= SYSCTL_ZERO, | ||||||
|  |  		.extra2 	= SYSCTL_ONE, | ||||||
|  |  	}, | ||||||
|  | +	[NF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK] = { | ||||||
|  | +		.procname       = "nf_conntrack_tcp_no_window_check", | ||||||
|  | +		.maxlen         = sizeof(u8), | ||||||
|  | +		.mode           = 0644, | ||||||
|  | +		.proc_handler	= proc_dou8vec_minmax, | ||||||
|  | +		.extra1 	= SYSCTL_ZERO, | ||||||
|  | +		.extra2 	= SYSCTL_ONE, | ||||||
|  | +	}, | ||||||
|  |  	[NF_SYSCTL_CT_PROTO_TCP_IGNORE_INVALID_RST] = { | ||||||
|  |  		.procname	= "nf_conntrack_tcp_ignore_invalid_rst", | ||||||
|  |  		.maxlen		= sizeof(u8), | ||||||
|  | @@ -1058,6 +1067,7 @@ static void nf_conntrack_standalone_init | ||||||
|  |   | ||||||
|  |  	XASSIGN(LOOSE, &tn->tcp_loose); | ||||||
|  |  	XASSIGN(LIBERAL, &tn->tcp_be_liberal); | ||||||
|  | +	XASSIGN(NO_WINDOW_CHECK, &tn->tcp_no_window_check); | ||||||
|  |  	XASSIGN(MAX_RETRANS, &tn->tcp_max_retrans); | ||||||
|  |  	XASSIGN(IGNORE_INVALID_RST, &tn->tcp_ignore_invalid_rst); | ||||||
|  |  #undef XASSIGN | ||||||
|  | --- a/include/net/netns/conntrack.h | ||||||
|  | +++ b/include/net/netns/conntrack.h | ||||||
|  | @@ -26,6 +26,7 @@ struct nf_tcp_net { | ||||||
|  |  	unsigned int timeouts[TCP_CONNTRACK_TIMEOUT_MAX]; | ||||||
|  |  	u8 tcp_loose; | ||||||
|  |  	u8 tcp_be_liberal; | ||||||
|  | +	u8 tcp_no_window_check; | ||||||
|  |  	u8 tcp_max_retrans; | ||||||
|  |  	u8 tcp_ignore_invalid_rst; | ||||||
|  |  #if IS_ENABLED(CONFIG_NF_FLOW_TABLE) | ||||||
		Reference in New Issue
	
	Block a user
	 ACwifidude
					ACwifidude