diff --git a/etc/emqx.conf b/etc/emqx.conf index 341056344..f98a3fd0a 100644 --- a/etc/emqx.conf +++ b/etc/emqx.conf @@ -1399,18 +1399,6 @@ listener.ws.external.access.1 = allow all ## Value: on | off listener.ws.external.verify_protocol_header = on -## Use X-Forwarded-For header for real source IP if the EMQ X cluster is -## deployed behind NGINX or HAProxy. -## -## Value: String -## listener.ws.external.proxy_address_header = X-Forwarded-For - -## Use X-Forwarded-Port header for real source port if the EMQ X cluster is -## deployed behind NGINX or HAProxy. -## -## Value: String -## listener.ws.external.proxy_port_header = X-Forwarded-Port - ## Enable the Proxy Protocol V1/2 if the EMQ cluster is deployed behind ## HAProxy or Nginx. ## diff --git a/priv/emqx.schema b/priv/emqx.schema index 024e14815..76ab4f4ee 100644 --- a/priv/emqx.schema +++ b/priv/emqx.schema @@ -1310,16 +1310,6 @@ end}. {datatype, flag} ]}. -{mapping, "listener.ws.$name.proxy_address_header", "emqx.listeners", [ - {datatype, string}, - hidden -]}. - -{mapping, "listener.ws.$name.proxy_port_header", "emqx.listeners", [ - {datatype, string}, - hidden -]}. - {mapping, "listener.ws.$name.proxy_protocol", "emqx.listeners", [ {datatype, flag} ]}. @@ -1467,16 +1457,6 @@ end}. {datatype, string} ]}. -{mapping, "listener.wss.$name.proxy_address_header", "emqx.listeners", [ - {datatype, string}, - hidden -]}. - -{mapping, "listener.wss.$name.proxy_port_header", "emqx.listeners", [ - {datatype, string}, - hidden -]}. - {mapping, "listener.wss.$name.proxy_protocol", "emqx.listeners", [ {datatype, flag} ]}. @@ -1681,11 +1661,9 @@ end}. {proxy_protocol_timeout, cuttlefish:conf_get(Prefix ++ ".proxy_protocol_timeout", Conf, undefined)}, {verify_protocol_header, cuttlefish:conf_get(Prefix ++ ".verify_protocol_header", Conf, undefined)}, {peer_cert_as_username, cuttlefish:conf_get(Prefix ++ ".peer_cert_as_username", Conf, undefined)}, - {proxy_port_header, cuttlefish:conf_get(Prefix ++ ".proxy_port_header", Conf, undefined)}, {compress, cuttlefish:conf_get(Prefix ++ ".compress", Conf, undefined)}, {idle_timeout, cuttlefish:conf_get(Prefix ++ ".idle_timeout", Conf, undefined)}, - {max_frame_size, cuttlefish:conf_get(Prefix ++ ".max_frame_size", Conf, undefined)}, - {proxy_address_header, cuttlefish:conf_get(Prefix ++ ".proxy_address_header", Conf, undefined)} | AccOpts(Prefix)]) + {max_frame_size, cuttlefish:conf_get(Prefix ++ ".max_frame_size", Conf, undefined)} | AccOpts(Prefix)]) end, DeflateOpts = fun(Prefix) -> Filter([{level, cuttlefish:conf_get(Prefix ++ ".deflate_opts.level", Conf, undefined)}, diff --git a/src/emqx_ws_connection.erl b/src/emqx_ws_connection.erl index 97fb5e623..c9e1ae5f7 100644 --- a/src/emqx_ws_connection.erl +++ b/src/emqx_ws_connection.erl @@ -191,7 +191,13 @@ init(Req, Opts) -> end. websocket_init([Req, Opts]) -> - Peername = cowboy_req:peer(Req), + Peername = case proplists:get_bool(proxy_protocol, Opts) + andalso maps:get(proxy_header, Req) of + #{src_address := SrcAddr, src_port := SrcPort} -> + {SrcAddr, SrcPort}; + _ -> + cowboy_req:peer(Req) + end, Sockname = cowboy_req:sock(Req), Peercert = cowboy_req:cert(Req), WsCookie = try cowboy_req:parse_cookies(Req)