From: Willy Tarreau <w@1wt.eu> To: Lukas Tribus <lists@ltri.eu> Cc: Mohandass Roobesh <Roobesh_Mohandass@mcafee.com>, Florian Westphal <fw@strlen.de>, netdev@vger.kernel.org Subject: Re: : getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, sa, &salen) is in fact sometimes returning the source IP instead the destination IP Date: Sat, 12 Jan 2019 19:33:44 +0100 [thread overview] Message-ID: <20190112183344.GA26847@1wt.eu> (raw) In-Reply-To: <CACC_My-0bsFPqSaNCsF2bZhNSo_3o1F+qfy8utKRO7-2CZZqYg@mail.gmail.com> Hi Lukas, On Sat, Jan 12, 2019 at 07:01:34PM +0100, Lukas Tribus wrote: > > Roobesh, do you use the destination address only for logging or > > anywhere else in the request path ? And could you check if you have > > nf_conntrack_tcp_loose set as Florian suggests ? I really think he > > figured it right. > > It's about what we send with the PROXY protocol to the backend server, > Roobesh reported things like that (src and dst is the same): > > PROXY TCP4 192.220.26.39 192.220.26.39 45066 45066 > PROXY TCP4 192.220.26.39 192.220.26.39 45075 45075 > > So the call would actually happen at the beginning of the TCP connection. That sounds quite shocking to me then. Maybe we're facing such a sequence: 1) first session comes from this port, and client closes first (FIN) 2) haproxy then closes with (FIN) 3) client doesn't respond with the final ACK (e.g. blocked by another firewall in between or the client's own conntrack) 4) the socket on the haproxy side remains in LAST_ACK state and ACKs are periodically resent 5) local conntrack is in TIME_WAIT and expires faster than the largest interval between two such ACKs 6) one of these retransmitted ACKs reopens the connection in reverse direction due to nf_conntrack_tcp_loose. The connection is then seen in ESTABLISHED state and might be kept a bit longer. 8) the connection finally expires in the local TCP stack but not yet in conntrack. 7) later the client reuses the same source port while the connection is still present in the conntrack table. 8) assuming tcp_be_liberal is also set, the packets can pass through conntrack and establish a new connection to haproxy. 9) haproxy calls getsockopt(SO_ORIGINAL_DST) and gets the other end point since the connection was created at step 6 above in the other direction. I could be wrong on certain specific points above but it looks plausible. > Initial report is here: > https://discourse.haproxy.org/t/send-proxy-not-modifying-some-traffic-with-proxy-ip-port-details/3336 Ah cool, I didn't have all this, thank you! > Let's see if disabling nf_conntrack_tcp_loose changes things. Yes this really is the only thing I can think of, and in this case noone is wrong in this chain (neither kernel nor haproxy). We'll need to document it in my opinion. Thanks, Willy
WARNING: multiple messages have this Message-ID (diff)
From: Willy Tarreau <w@1wt.eu> To: Lukas Tribus <lists@ltri.eu> Cc: Mohandass Roobesh <Roobesh_Mohandass@mcafee.com>, Florian Westphal <fw@strlen.de>, netdev@vger.kernel.org Subject: Re: [NETDEV]: getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, sa, &salen) is in fact sometimes returning the source IP instead the destination IP Date: Sat, 12 Jan 2019 19:33:44 +0100 [thread overview] Message-ID: <20190112183344.GA26847@1wt.eu> (raw) Message-ID: <20190112183344.oYeL8bSAhkcUdDSbaniloA2_CrEzOPZ-YAp3WZLFtas@z> (raw) In-Reply-To: <CACC_My-0bsFPqSaNCsF2bZhNSo_3o1F+qfy8utKRO7-2CZZqYg@mail.gmail.com> Hi Lukas, On Sat, Jan 12, 2019 at 07:01:34PM +0100, Lukas Tribus wrote: > > Roobesh, do you use the destination address only for logging or > > anywhere else in the request path ? And could you check if you have > > nf_conntrack_tcp_loose set as Florian suggests ? I really think he > > figured it right. > > It's about what we send with the PROXY protocol to the backend server, > Roobesh reported things like that (src and dst is the same): > > PROXY TCP4 192.220.26.39 192.220.26.39 45066 45066 > PROXY TCP4 192.220.26.39 192.220.26.39 45075 45075 > > So the call would actually happen at the beginning of the TCP connection. That sounds quite shocking to me then. Maybe we're facing such a sequence: 1) first session comes from this port, and client closes first (FIN) 2) haproxy then closes with (FIN) 3) client doesn't respond with the final ACK (e.g. blocked by another firewall in between or the client's own conntrack) 4) the socket on the haproxy side remains in LAST_ACK state and ACKs are periodically resent 5) local conntrack is in TIME_WAIT and expires faster than the largest interval between two such ACKs 6) one of these retransmitted ACKs reopens the connection in reverse direction due to nf_conntrack_tcp_loose. The connection is then seen in ESTABLISHED state and might be kept a bit longer. 8) the connection finally expires in the local TCP stack but not yet in conntrack. 7) later the client reuses the same source port while the connection is still present in the conntrack table. 8) assuming tcp_be_liberal is also set, the packets can pass through conntrack and establish a new connection to haproxy. 9) haproxy calls getsockopt(SO_ORIGINAL_DST) and gets the other end point since the connection was created at step 6 above in the other direction. I could be wrong on certain specific points above but it looks plausible. > Initial report is here: > https://discourse.haproxy.org/t/send-proxy-not-modifying-some-traffic-with-proxy-ip-port-details/3336 Ah cool, I didn't have all this, thank you! > Let's see if disabling nf_conntrack_tcp_loose changes things. Yes this really is the only thing I can think of, and in this case noone is wrong in this chain (neither kernel nor haproxy). We'll need to document it in my opinion. Thanks, Willy
next prev parent reply other threads:[~2019-01-12 18:33 UTC|newest] Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top [not found] <MWHPR16MB1502549F7BAAE102EF1D5DF4EDB50@MWHPR16MB1502.namprd16.prod.outlook.com> [not found] ` <MWHPR16MB150233EF69CFD4562BFA65ABEDB60@MWHPR16MB1502.namprd16.prod.outlook.com> [not found] ` <MWHPR16MB1502DC55542EBA8121631B16EDB20@MWHPR16MB1502.namprd16.prod.outlook.com> 2018-12-31 6:20 ` : getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, sa, &salen) is in fact sometimes returning the source IP instead the destination IP Mohandass, Roobesh 2019-01-07 11:17 ` Florian Westphal 2019-01-07 14:57 ` Mohandass, Roobesh 2019-01-12 14:37 ` Lukas Tribus 2019-01-12 14:37 ` [NETDEV]: " Lukas Tribus 2019-01-12 16:04 ` : " Florian Westphal 2019-01-12 16:04 ` [NETDEV]: " Florian Westphal 2019-01-12 17:26 ` : " Willy Tarreau 2019-01-12 17:26 ` [NETDEV]: " Willy Tarreau 2019-01-12 18:01 ` : " Lukas Tribus 2019-01-12 18:01 ` [NETDEV]: " Lukas Tribus 2019-01-12 18:33 ` Willy Tarreau [this message] 2019-01-12 18:33 ` Willy Tarreau 2019-01-17 5:23 ` Mohandass, Roobesh 2019-01-23 8:07 ` Mohandass, Roobesh 2019-01-23 8:54 ` Willy Tarreau [not found] ` <MWHPR16MB1502A336CCB4EF3F0FCB69ECEDB20@MWHPR16MB1502.namprd16.prod.outlook.com> 2019-01-07 7:58 ` : " Mohandass, Roobesh
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190112183344.GA26847@1wt.eu \ --to=w@1wt.eu \ --cc=Roobesh_Mohandass@mcafee.com \ --cc=fw@strlen.de \ --cc=lists@ltri.eu \ --cc=netdev@vger.kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).