public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
* Fw: [Bug 111751] New: Kernel send tcp reset when receive icmp redirect
@ 2016-02-03  0:56 Stephen Hemminger
  2016-02-03  2:35 ` Eric Dumazet
  0 siblings, 1 reply; 4+ messages in thread
From: Stephen Hemminger @ 2016-02-03  0:56 UTC (permalink / raw)
  To: netdev



Begin forwarded message:

Date: Tue, 2 Feb 2016 11:42:41 +0000
From: "bugzilla-daemon@bugzilla.kernel.org" <bugzilla-daemon@bugzilla.kernel.org>
To: "shemminger@linux-foundation.org" <shemminger@linux-foundation.org>
Subject: [Bug 111751] New: Kernel send tcp reset when receive icmp redirect


https://urldefense.proofpoint.com/v2/url?u=https-3A__bugzilla.kernel.org_show-5Fbug.cgi-3Fid-3D111751&d=CwICaQ&c=IL_XqQWOjubgfqINi2jTzg&r=q_lvUiVm1uM6QEw9TPH-6jiV__hsrE6xXUAtATPE9x0&m=UNO95AZfSkcQcZYh6NtZCATnWsJA165x3m2P3_Yo4mY&s=8874491L4x2GOXBxBlNCQJaF3d2Jryc776RbYqRVTS8&e= 

            Bug ID: 111751
           Summary: Kernel send tcp reset when receive icmp redirect
           Product: Networking
           Version: 2.5
    Kernel Version: 4.4.0
          Hardware: All
                OS: Linux
              Tree: Mainline
            Status: NEW
          Severity: normal
          Priority: P1
         Component: IPV4
          Assignee: shemminger@linux-foundation.org
          Reporter: pety@rusnet.ru
        Regression: No

Network scheme:

          server1
router----eth0------buggy-linux-box

router ip          - 192.168.113.246/30

server1 ip on eth0 - 192.168.113.245/30, 192.168.113.158/27 (aliases), default
to 192.168.113.246

buggy-linux-box ip - 192.168.113.133/27

When I try telnet (or ssh, for example) to 192.168.113.133 from
192.168.113.115, I receive tcp reset:

13:55:22.341015 IP (tos 0x10, ttl 62, id 54936, offset 0, flags [DF], proto TCP
(6), length 60)
    192.168.113.115.33160 > 192.168.113.133.23: Flags [S], cksum 0x681c
(correct), seq 1552183701, win 5840, options [mss 1460,sackOK,TS val
 1739695885 ecr 0,nop,wscale 9], length 0

13:55:22.341039 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6),
length 60)
    192.168.113.133.23 > 192.168.113.115.33160: Flags [S.], cksum 0x6ac8
(incorrect -> 0x4221), seq 1195050131, ack 1552183702, win 28960, o
ptions [mss 1460,sackOK,TS val 337210292 ecr 1739695885,nop,wscale 7], length 0

13:55:22.341188 IP (tos 0xc0, ttl 64, id 29828, offset 0, flags [none], proto 
ICMP (1), length 88)
    192.168.113.158 > 192.168.113.133: ICMP redirect 192.168.113.115 to host
192.168.113.246, length 68
        IP (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto TCP (6), length
60)
    192.168.113.133.23 > 192.168.113.115.33160: Flags [S.], cksum 0x4221
(correct), seq 1195050131, ack 1552183702, win 28960, options [mss
1460,sackOK,TS val 337210292 ecr 1739695885,nop,wscale 7], length 0

13:55:22.341264 IP (tos 0x10, ttl 62, id 54937, offset 0, flags [DF], proto TCP
(6), length 52)
    192.168.113.115.33160 > 192.168.113.133.23: Flags [.], cksum 0xe201
(correct), seq 1, ack 1, win 12, options [nop,nop,TS val 1739695885
ecr 337210292], length 0

13:55:22.341281 IP (tos 0x10, ttl 64, id 28000, offset 0, flags [DF], proto TCP
(6), length 40)
    192.168.113.133.23 > 192.168.113.115.33160: Flags [R], cksum 0x77d8
(correct), seq 1195050132, win 0, length 0

13:55:22.341284 IP (tos 0x10, ttl 62, id 54938, offset 0, flags [DF], proto TCP
(6), length 76)
    192.168.113.115.33160 > 192.168.113.133.23: Flags [P.], cksum 0x8590
(correct), seq 1:25, ack 1, win 12, options [nop,nop,TS val 1739695
885 ecr 337210292], length 24 [telnet DO SUPPRESS GO AHEAD, WILL TERMINAL TYPE,
WILL NAWS, WILL TSPEED, WILL LFLOW, WILL LINEMODE, WILL NEW-
ENVIRON, DO STATUS]

13:55:22.341289 IP (tos 0x10, ttl 64, id 28001, offset 0, flags [DF], proto TCP
(6), length 40)
    192.168.113.133.23 > 192.168.113.115.33160: Flags [R], cksum 0x77d8
(correct), seq 1195050132, win 0, length 0
^C
7 packets captured
7 packets received by filter
0 packets dropped by kernel

If I turn off sending redirects on server1, or reject incoming ICMP with
iptables (on buggy-box), the problem is gone.

Looks like kernel 4.1.15 without this problem.

-- 
You are receiving this mail because:
You are the assignee for the bug.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Fw: [Bug 111751] New: Kernel send tcp reset when receive icmp redirect
  2016-02-03  0:56 Fw: [Bug 111751] New: Kernel send tcp reset when receive icmp redirect Stephen Hemminger
@ 2016-02-03  2:35 ` Eric Dumazet
  2016-02-03  3:31   ` [PATCH net] tcp: do not drop syn_recv on all icmp reports Eric Dumazet
  0 siblings, 1 reply; 4+ messages in thread
From: Eric Dumazet @ 2016-02-03  2:35 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev

On Wed, 2016-02-03 at 11:56 +1100, Stephen Hemminger wrote:
> 
> Begin forwarded message:
> 
> Date: Tue, 2 Feb 2016 11:42:41 +0000
> From: "bugzilla-daemon@bugzilla.kernel.org" <bugzilla-daemon@bugzilla.kernel.org>
> To: "shemminger@linux-foundation.org" <shemminger@linux-foundation.org>
> Subject: [Bug 111751] New: Kernel send tcp reset when receive icmp redirect
> 
> 
> https://urldefense.proofpoint.com/v2/url?u=https-3A__bugzilla.kernel.org_show-5Fbug.cgi-3Fid-3D111751&d=CwICaQ&c=IL_XqQWOjubgfqINi2jTzg&r=q_lvUiVm1uM6QEw9TPH-6jiV__hsrE6xXUAtATPE9x0&m=UNO95AZfSkcQcZYh6NtZCATnWsJA165x3m2P3_Yo4mY&s=8874491L4x2GOXBxBlNCQJaF3d2Jryc776RbYqRVTS8&e= 
> 
>             Bug ID: 111751
>            Summary: Kernel send tcp reset when receive icmp redirect
>            Product: Networking
>            Version: 2.5
>     Kernel Version: 4.4.0
>           Hardware: All
>                 OS: Linux
>               Tree: Mainline
>             Status: NEW
>           Severity: normal
>           Priority: P1
>          Component: IPV4
>           Assignee: shemminger@linux-foundation.org
>           Reporter: pety@rusnet.ru
>         Regression: No
> 
> Network scheme:
> 
>           server1
> router----eth0------buggy-linux-box
> 
> router ip          - 192.168.113.246/30
> 
> server1 ip on eth0 - 192.168.113.245/30, 192.168.113.158/27 (aliases), default
> to 192.168.113.246
> 
> buggy-linux-box ip - 192.168.113.133/27
> 
> When I try telnet (or ssh, for example) to 192.168.113.133 from
> 192.168.113.115, I receive tcp reset:
> 
> 13:55:22.341015 IP (tos 0x10, ttl 62, id 54936, offset 0, flags [DF], proto TCP
> (6), length 60)
>     192.168.113.115.33160 > 192.168.113.133.23: Flags [S], cksum 0x681c
> (correct), seq 1552183701, win 5840, options [mss 1460,sackOK,TS val
>  1739695885 ecr 0,nop,wscale 9], length 0
> 
> 13:55:22.341039 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6),
> length 60)
>     192.168.113.133.23 > 192.168.113.115.33160: Flags [S.], cksum 0x6ac8
> (incorrect -> 0x4221), seq 1195050131, ack 1552183702, win 28960, o
> ptions [mss 1460,sackOK,TS val 337210292 ecr 1739695885,nop,wscale 7], length 0
> 
> 13:55:22.341188 IP (tos 0xc0, ttl 64, id 29828, offset 0, flags [none], proto 
> ICMP (1), length 88)
>     192.168.113.158 > 192.168.113.133: ICMP redirect 192.168.113.115 to host
> 192.168.113.246, length 68
>         IP (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto TCP (6), length
> 60)
>     192.168.113.133.23 > 192.168.113.115.33160: Flags [S.], cksum 0x4221
> (correct), seq 1195050131, ack 1552183702, win 28960, options [mss
> 1460,sackOK,TS val 337210292 ecr 1739695885,nop,wscale 7], length 0
> 
> 13:55:22.341264 IP (tos 0x10, ttl 62, id 54937, offset 0, flags [DF], proto TCP
> (6), length 52)
>     192.168.113.115.33160 > 192.168.113.133.23: Flags [.], cksum 0xe201
> (correct), seq 1, ack 1, win 12, options [nop,nop,TS val 1739695885
> ecr 337210292], length 0
> 
> 13:55:22.341281 IP (tos 0x10, ttl 64, id 28000, offset 0, flags [DF], proto TCP
> (6), length 40)
>     192.168.113.133.23 > 192.168.113.115.33160: Flags [R], cksum 0x77d8
> (correct), seq 1195050132, win 0, length 0
> 
> 13:55:22.341284 IP (tos 0x10, ttl 62, id 54938, offset 0, flags [DF], proto TCP
> (6), length 76)
>     192.168.113.115.33160 > 192.168.113.133.23: Flags [P.], cksum 0x8590
> (correct), seq 1:25, ack 1, win 12, options [nop,nop,TS val 1739695
> 885 ecr 337210292], length 24 [telnet DO SUPPRESS GO AHEAD, WILL TERMINAL TYPE,
> WILL NAWS, WILL TSPEED, WILL LFLOW, WILL LINEMODE, WILL NEW-
> ENVIRON, DO STATUS]
> 
> 13:55:22.341289 IP (tos 0x10, ttl 64, id 28001, offset 0, flags [DF], proto TCP
> (6), length 40)
>     192.168.113.133.23 > 192.168.113.115.33160: Flags [R], cksum 0x77d8
> (correct), seq 1195050132, win 0, length 0
> ^C
> 7 packets captured
> 7 packets received by filter
> 0 packets dropped by kernel
> 
> If I turn off sending redirects on server1, or reject incoming ICMP with
> iptables (on buggy-box), the problem is gone.
> 
> Looks like kernel 4.1.15 without this problem.
> 

Thanks Stephen for the report. I am cooking a fix.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH net] tcp: do not drop syn_recv on all icmp reports
  2016-02-03  2:35 ` Eric Dumazet
@ 2016-02-03  3:31   ` Eric Dumazet
  2016-02-09  9:17     ` David Miller
  0 siblings, 1 reply; 4+ messages in thread
From: Eric Dumazet @ 2016-02-03  3:31 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, Petr Novopashenniy

From: Eric Dumazet <edumazet@google.com>

Petr Novopashenniy reported that ICMP redirects on SYN_RECV sockets
were leading to RST.

This is of course incorrect.

A specific list of ICMP messages should be able to drop a SYN_RECV.

For instance, a REDIRECT on SYN_RECV shall be ignored, as we do
not hold a dst per SYN_RECV pseudo request.

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=111751
Fixes: 079096f103fa ("tcp/dccp: install syn_recv requests into ehash table")
Reported-by: Petr Novopashenniy <pety@rusnet.ru>
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
A similar patch will be needed for DCCP.
Petr, please test if this patch solves your issue ? Thanks !

 include/net/tcp.h   |    2 +-
 net/ipv4/tcp_ipv4.c |   11 ++++++++---
 net/ipv6/tcp_ipv6.c |    5 +++--
 3 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/include/net/tcp.h b/include/net/tcp.h
index f6f8f032c73e..ae6468f5c9f3 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -447,7 +447,7 @@ const u8 *tcp_parse_md5sig_option(const struct tcphdr *th);
 
 void tcp_v4_send_check(struct sock *sk, struct sk_buff *skb);
 void tcp_v4_mtu_reduced(struct sock *sk);
-void tcp_req_err(struct sock *sk, u32 seq);
+void tcp_req_err(struct sock *sk, u32 seq, bool abort);
 int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb);
 struct sock *tcp_create_openreq_child(const struct sock *sk,
 				      struct request_sock *req,
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index a4d523709ab3..7f6ff037adaf 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -311,7 +311,7 @@ static void do_redirect(struct sk_buff *skb, struct sock *sk)
 
 
 /* handle ICMP messages on TCP_NEW_SYN_RECV request sockets */
-void tcp_req_err(struct sock *sk, u32 seq)
+void tcp_req_err(struct sock *sk, u32 seq, bool abort)
 {
 	struct request_sock *req = inet_reqsk(sk);
 	struct net *net = sock_net(sk);
@@ -323,7 +323,7 @@ void tcp_req_err(struct sock *sk, u32 seq)
 
 	if (seq != tcp_rsk(req)->snt_isn) {
 		NET_INC_STATS_BH(net, LINUX_MIB_OUTOFWINDOWICMPS);
-	} else {
+	} else if (abort) {
 		/*
 		 * Still in SYN_RECV, just remove it silently.
 		 * There is no good way to pass the error to the newly
@@ -383,7 +383,12 @@ void tcp_v4_err(struct sk_buff *icmp_skb, u32 info)
 	}
 	seq = ntohl(th->seq);
 	if (sk->sk_state == TCP_NEW_SYN_RECV)
-		return tcp_req_err(sk, seq);
+		return tcp_req_err(sk, seq,
+				  type == ICMP_PARAMETERPROB ||
+				  type == ICMP_TIME_EXCEEDED ||
+				  (type == ICMP_DEST_UNREACH &&
+				   (code == ICMP_NET_UNREACH ||
+				    code == ICMP_HOST_UNREACH)));
 
 	bh_lock_sock(sk);
 	/* If too many ICMPs get dropped on busy
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 006396e31cb0..01caceccb528 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -327,6 +327,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
 	struct tcp_sock *tp;
 	__u32 seq, snd_una;
 	struct sock *sk;
+	bool fatal;
 	int err;
 
 	sk = __inet6_lookup_established(net, &tcp_hashinfo,
@@ -345,8 +346,9 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
 		return;
 	}
 	seq = ntohl(th->seq);
+	fatal = icmpv6_err_convert(type, code, &err);
 	if (sk->sk_state == TCP_NEW_SYN_RECV)
-		return tcp_req_err(sk, seq);
+		return tcp_req_err(sk, seq, fatal);
 
 	bh_lock_sock(sk);
 	if (sock_owned_by_user(sk) && type != ICMPV6_PKT_TOOBIG)
@@ -400,7 +402,6 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
 		goto out;
 	}
 
-	icmpv6_err_convert(type, code, &err);
 
 	/* Might be for an request_sock */
 	switch (sk->sk_state) {

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH net] tcp: do not drop syn_recv on all icmp reports
  2016-02-03  3:31   ` [PATCH net] tcp: do not drop syn_recv on all icmp reports Eric Dumazet
@ 2016-02-09  9:17     ` David Miller
  0 siblings, 0 replies; 4+ messages in thread
From: David Miller @ 2016-02-09  9:17 UTC (permalink / raw)
  To: eric.dumazet; +Cc: netdev, pety

From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Tue, 02 Feb 2016 19:31:12 -0800

> From: Eric Dumazet <edumazet@google.com>
> 
> Petr Novopashenniy reported that ICMP redirects on SYN_RECV sockets
> were leading to RST.
> 
> This is of course incorrect.
> 
> A specific list of ICMP messages should be able to drop a SYN_RECV.
> 
> For instance, a REDIRECT on SYN_RECV shall be ignored, as we do
> not hold a dst per SYN_RECV pseudo request.
> 
> Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=111751
> Fixes: 079096f103fa ("tcp/dccp: install syn_recv requests into ehash table")
> Reported-by: Petr Novopashenniy <pety@rusnet.ru>
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Applied and queued up for -stable, thanks Eric.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-02-09  9:24 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-02-03  0:56 Fw: [Bug 111751] New: Kernel send tcp reset when receive icmp redirect Stephen Hemminger
2016-02-03  2:35 ` Eric Dumazet
2016-02-03  3:31   ` [PATCH net] tcp: do not drop syn_recv on all icmp reports Eric Dumazet
2016-02-09  9:17     ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox