[squid-users] AWS NLB Proxy Protocol V2
Alex Rousskov
rousskov at measurement-factory.com
Wed Oct 20 02:27:12 UTC 2021
On 10/19/21 4:56 PM, Ty Martin wrote:
> That `--haproxy-protocol` option seems like it should have done the
> trick. Am I just shooting myself in the foot with bad curl commands?
It look like curl --haproxy-protocol does not work the way you want for
HTTPS requests sent through HTTP proxies:
> curl --haproxy-protocol -x http://127.0.0.1:3128/ https://...
>> CONNECT localhost:443 HTTP/1.1
...
> < HTTP/1.1 200 Connection established
>
> * Proxy replied 200 to CONNECT request
> * CONNECT phase completed!
>> PROXY TCP4 127.0.0.1 127.0.0.1 35628 3128
The above PROXY protocol message is sent to the HTTP origin server
inside the CONNECT tunnel instead of being sent to Squid _before_ the
tunnel.
A similar curl command "works" for plain HTTP requests (because, without
CONNECT, it is impossible to distinguish the target of the PROXY
protocol message):
> curl --haproxy-protocol -x http://127.0.0.1:3128/ http://...
> * Connected to 127.0.0.1 (127.0.0.1) port 3128 (#0)
>> PROXY TCP4 127.0.0.1 127.0.0.1 35634 3128
>> GET http://... HTTP/1.1
FWIW, my v5.2-based Squid groks the above correctly, forwarding the
request (if proxy_protocol_access allows it). This indicates that the
basic PROXY protocol support in my Squid works.
Unfortunately, there is no curl --proxy-haproxy-protocol (yet?) so you
will need to find another way to test. Alternatively, you can share
Squid debugging logs and/or packet captures when using your network load
balancer.
Alex.
> On Mon, Oct 18, 2021 at 5:32 PM Alex Rousskov wrote:
>
> On 10/18/21 5:16 PM, Ty Martin wrote:
> > Ah, yep. Adding the following to my config got things working in AWS:
>
> > acl private src 172.0.0.0/8 <http://172.0.0.0/8>
> > proxy_protocol_access allow private
> > http_port 3128 require-proxy-header
>
>
> > I was trying to test it locally without success by running the Docker
> > container and hitting it with a curl along the lines of:
> > `curl --proxy http://<un>:<pw>@localhost:3128 -v --header
> > "X-Forwarded-For: 192.168.0.2" https://www.google.com
> <https://www.google.com>
>
> To test using curl, try curl --haproxy-protocol ...
>
> PROXY protocol (all versions) is not HTTP.
>
> Alex.
>
>
> > --- Resulting Squid logs ---
> > ```
> > squid-proxy_1 | 2021/10/18 19:55:33| PROXY protocol error:
> invalid magic
> > squid-proxy_1 | exception location: Parser.cc(260) Parse from
> conn6
> > local=172.24.0.2:3128 <http://172.24.0.2:3128>
> <http://172.24.0.2:3128 <http://172.24.0.2:3128>>
> remote=172.24.0.1:65426 <http://172.24.0.1:65426>
> > <http://172.24.0.1:65426 <http://172.24.0.1:65426>> FD 12 flags=1
> > squid-proxy_1 | connection: conn6 local=172.24.0.2:3128
> <http://172.24.0.2:3128>
> > <http://172.24.0.2:3128 <http://172.24.0.2:3128>>
> remote=172.24.0.1:65426 <http://172.24.0.1:65426>
> > <http://172.24.0.1:65426 <http://172.24.0.1:65426>> FD 12 flags=1
> > ```
> >
> > --- Resulting client logs ---
> > ```
> > * Proxy CONNECT aborted
> > * CONNECT phase completed!
> > * Closing connection 0
> > curl: (56) Proxy CONNECT aborted
> > ```
> >
> > Any idea offhand what I'm missing from the local testing scenario? I
> > thought adding a "X-Forwarded-For" header via curl would be treated as
> > proxy protocol v1 by Squid, but the "invalid magic" protocol error
> gives
> > me the impression I'm not going about it the right way.
> >
> > On Mon, Oct 18, 2021 at 12:48 PM Alex Rousskov
> > <rousskov at measurement-factory.com
> <mailto:rousskov at measurement-factory.com>
> > <mailto:rousskov at measurement-factory.com
> <mailto:rousskov at measurement-factory.com>>> wrote:
> >
> > On 10/18/21 12:11 PM, Ty Martin wrote:
> >
> > > I am looking to run Squid as a forward proxy with basic auth
> in Docker
> > > on AWS ECS behind a network load balancer. I seem to have things
> > up and
> > > running for the most part; however, I am having difficulty
> in getting
> > > proxy protocol to work so that I get access to client IP
> addresses
> > > beyond that of the private IPs of my NLB. As soon as I
> enable proxy
> > > protocol v2 on the AWS NLB, requests to Squid start failing with
> > errors
> > > similar to the following:
> > >
> > > Squid log: `1634330668.200 5 <nlb-private-ip> NONE_NONE/400
> > 2032 -
> > > error:invalid-request - HIER_NONE/- text/html`
> > > Client log: `X-Squid-Error: ERR_PROTOCOL_UNKNOWN 0`
> >
> > > http_port 3128
> >
> > You must use require-proxy-header http_port option to tell
> Squid to
> > always expect/require PROXY protocol messages on connections
> to that
> > listening port. Otherwise, Squid will expect naked HTTP
> traffic and
> > fail to parse incoming (PROXY protocol) connection bytes.
> >
> > According to proxy_protocol_access documentation, after adding
> > require-proxy-header to http_port, you must also use
> > proxy_protocol_access to tell Squid which TCP connections to
> allow on
> > that port (and, hence, which PROXY protocol messages to
> trust). Denied
> > connections will be closed.
> >
> >
> > HTH,
> >
> > Alex.
> >
>
More information about the squid-users
mailing list