netfilter: conntrack: add new sysctl to disable RST check
This patch adds a new sysctl tcp_ignore_invalid_rst to disable marking out of segments RSTs as INVALID. Signed-off-by: Ali Abdallah <aabdallah@suse.de> Acked-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
c4edc3ccbc
commit
1da4cd82dd
|
@ -110,6 +110,12 @@ nf_conntrack_tcp_be_liberal - BOOLEAN
|
||||||
Be conservative in what you do, be liberal in what you accept from others.
|
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.
|
If it's non-zero, we mark only out of window RST segments as INVALID.
|
||||||
|
|
||||||
|
nf_conntrack_tcp_ignore_invalid_rst - BOOLEAN
|
||||||
|
- 0 - disabled (default)
|
||||||
|
- 1 - enabled
|
||||||
|
|
||||||
|
If it's 1, we don't mark out of window RST segments as INVALID.
|
||||||
|
|
||||||
nf_conntrack_tcp_loose - BOOLEAN
|
nf_conntrack_tcp_loose - BOOLEAN
|
||||||
- 0 - disabled
|
- 0 - disabled
|
||||||
- not 0 - enabled (default)
|
- not 0 - enabled (default)
|
||||||
|
|
|
@ -27,6 +27,7 @@ struct nf_tcp_net {
|
||||||
u8 tcp_loose;
|
u8 tcp_loose;
|
||||||
u8 tcp_be_liberal;
|
u8 tcp_be_liberal;
|
||||||
u8 tcp_max_retrans;
|
u8 tcp_max_retrans;
|
||||||
|
u8 tcp_ignore_invalid_rst;
|
||||||
#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
|
#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
|
||||||
unsigned int offload_timeout;
|
unsigned int offload_timeout;
|
||||||
unsigned int offload_pickup;
|
unsigned int offload_pickup;
|
||||||
|
|
|
@ -1068,7 +1068,8 @@ int nf_conntrack_tcp_packet(struct nf_conn *ct,
|
||||||
if (seq == 0 && !nf_conntrack_tcp_established(ct))
|
if (seq == 0 && !nf_conntrack_tcp_established(ct))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (before(seq, ct->proto.tcp.seen[!dir].td_maxack)) {
|
if (before(seq, ct->proto.tcp.seen[!dir].td_maxack) &&
|
||||||
|
!tn->tcp_ignore_invalid_rst) {
|
||||||
/* Invalid RST */
|
/* Invalid RST */
|
||||||
spin_unlock_bh(&ct->lock);
|
spin_unlock_bh(&ct->lock);
|
||||||
nf_ct_l4proto_log_invalid(skb, ct, state, "invalid rst");
|
nf_ct_l4proto_log_invalid(skb, ct, state, "invalid rst");
|
||||||
|
@ -1466,6 +1467,9 @@ void nf_conntrack_tcp_init_net(struct net *net)
|
||||||
*/
|
*/
|
||||||
tn->tcp_be_liberal = 0;
|
tn->tcp_be_liberal = 0;
|
||||||
|
|
||||||
|
/* If it's non-zero, we turn off RST sequence number check */
|
||||||
|
tn->tcp_ignore_invalid_rst = 0;
|
||||||
|
|
||||||
/* Max number of the retransmitted packets without receiving an (acceptable)
|
/* Max number of the retransmitted packets without receiving an (acceptable)
|
||||||
* ACK from the destination. If this number is reached, a shorter timer
|
* ACK from the destination. If this number is reached, a shorter timer
|
||||||
* will be started.
|
* will be started.
|
||||||
|
|
|
@ -579,6 +579,7 @@ enum nf_ct_sysctl_index {
|
||||||
#endif
|
#endif
|
||||||
NF_SYSCTL_CT_PROTO_TCP_LOOSE,
|
NF_SYSCTL_CT_PROTO_TCP_LOOSE,
|
||||||
NF_SYSCTL_CT_PROTO_TCP_LIBERAL,
|
NF_SYSCTL_CT_PROTO_TCP_LIBERAL,
|
||||||
|
NF_SYSCTL_CT_PROTO_TCP_IGNORE_INVALID_RST,
|
||||||
NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS,
|
NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS,
|
||||||
NF_SYSCTL_CT_PROTO_TIMEOUT_UDP,
|
NF_SYSCTL_CT_PROTO_TIMEOUT_UDP,
|
||||||
NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_STREAM,
|
NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_STREAM,
|
||||||
|
@ -798,6 +799,14 @@ static struct ctl_table nf_ct_sysctl_table[] = {
|
||||||
.extra1 = SYSCTL_ZERO,
|
.extra1 = SYSCTL_ZERO,
|
||||||
.extra2 = SYSCTL_ONE,
|
.extra2 = SYSCTL_ONE,
|
||||||
},
|
},
|
||||||
|
[NF_SYSCTL_CT_PROTO_TCP_IGNORE_INVALID_RST] = {
|
||||||
|
.procname = "nf_conntrack_tcp_ignore_invalid_rst",
|
||||||
|
.maxlen = sizeof(u8),
|
||||||
|
.mode = 0644,
|
||||||
|
.proc_handler = proc_dou8vec_minmax,
|
||||||
|
.extra1 = SYSCTL_ZERO,
|
||||||
|
.extra2 = SYSCTL_ONE,
|
||||||
|
},
|
||||||
[NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS] = {
|
[NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS] = {
|
||||||
.procname = "nf_conntrack_tcp_max_retrans",
|
.procname = "nf_conntrack_tcp_max_retrans",
|
||||||
.maxlen = sizeof(u8),
|
.maxlen = sizeof(u8),
|
||||||
|
@ -1004,6 +1013,7 @@ static void nf_conntrack_standalone_init_tcp_sysctl(struct net *net,
|
||||||
XASSIGN(LOOSE, &tn->tcp_loose);
|
XASSIGN(LOOSE, &tn->tcp_loose);
|
||||||
XASSIGN(LIBERAL, &tn->tcp_be_liberal);
|
XASSIGN(LIBERAL, &tn->tcp_be_liberal);
|
||||||
XASSIGN(MAX_RETRANS, &tn->tcp_max_retrans);
|
XASSIGN(MAX_RETRANS, &tn->tcp_max_retrans);
|
||||||
|
XASSIGN(IGNORE_INVALID_RST, &tn->tcp_ignore_invalid_rst);
|
||||||
#undef XASSIGN
|
#undef XASSIGN
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
|
#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
|
||||||
|
|
Loading…
Reference in New Issue