Skip to content
Merged
Show file tree
Hide file tree
Changes from 41 commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
70893bc
api: Add trusted CIDRs to XFF config
jamesog Jan 10, 2024
37f82b8
http: Utility functions for parsing XFF by CIDR
jamesog Jan 10, 2024
5f390fd
xff: Allow parsing XFF using trusted CIDRs
jamesog Jan 10, 2024
831057e
docs: Note about xff_trusted_cidrs.
jamesog Jan 14, 2024
b32b10d
changelog: Document xff trusted CIDR addition
jamesog Jan 14, 2024
b37899d
Format fixes
jamesog Jan 15, 2024
34e7d33
Fix spell check issues
jamesog Jan 15, 2024
61ade56
api: Remove use of oneof in XffConfig
jamesog Jan 16, 2024
0cf5c6c
xff: Remove unused constructor
jamesog Jan 16, 2024
4c0ff3f
Spelling: quote symbols
jamesog Jan 16, 2024
d9f1a64
Autoformat
jamesog Jan 16, 2024
5842f38
Merge remote-tracking branch 'upstream/main' into xff_trusted_cidrs
jamesog Jan 16, 2024
2c95c9f
api: Remove unused import
jamesog Jan 16, 2024
a016a6c
http: Use last address in XFF when all are trusted
jamesog Jan 23, 2024
eb2f7ff
api: Note about n*m operation with xff_trusted_cidrs
jamesog Jan 24, 2024
1f76584
api: Clarify when recurse may want to be used
jamesog Jan 24, 2024
994d4be
Merge remote-tracking branch 'upstream/main' into xff_trusted_cidrs
jamesog Jan 24, 2024
ebb1391
http: Use clearer variable name
jamesog Feb 11, 2024
d976354
xff: Throw error when setting both options
jamesog Feb 11, 2024
666757e
hcm: Support returning whether to append XFF
jamesog Feb 11, 2024
4193f48
docs: Add examples for xff_trusted_cidrs
jamesog Feb 11, 2024
a587a23
hcm: Only treat as internal when XFF has a single address
jamesog Feb 11, 2024
06eccf5
api: Use bool for explicitly false defaults
jamesog Feb 25, 2024
87bf560
docs: Apply suggestion from Matt
jamesog Feb 25, 2024
2c15af4
hcm: Append XFF in original IP detection, add tests
jamesog Feb 25, 2024
901335a
Merge remote-tracking branch 'upstream/main' into xff_trusted_cidrs
jamesog Feb 25, 2024
6833c32
xff: Fix bool usage after proto change
jamesog Feb 25, 2024
26756eb
test: Fix getXFFExtension usage
jamesog Feb 25, 2024
6671ece
api: Move N*M comment
jamesog Feb 27, 2024
5ed4660
Merge remote-tracking branch 'upstream/main' into xff_trusted_cidrs
jamesog Feb 29, 2024
c69df1c
xff: xff_trusted_cidrs should take precedence
jamesog Jul 13, 2024
eab825a
Merge remote-tracking branch 'upstream/main' into xff_trusted_cidrs
jamesog Jul 13, 2024
9cfe9d6
xff: Unwrap Network::Address::CidrRange
jamesog Jul 13, 2024
774cacc
xff: Remove recurse option, fail on invalid XFF entry
jamesog Aug 5, 2024
5c2cbf2
hcm: Factor out code to append to XFF
jamesog Aug 5, 2024
e4ff49e
xff: Rename append_xff to skip_xff_append
jamesog Aug 5, 2024
e2fdae2
Merge remote-tracking branch 'upstream/main' into xff_trusted_cidrs
jamesog Aug 6, 2024
9a625aa
xff: Use getForwardedForValue
jamesog Aug 8, 2024
0267706
hcm: Test empty XFF header value
jamesog Aug 8, 2024
3dd64cc
xff: Remove internal/loopback constraint
jamesog Aug 8, 2024
a9432b4
Merge remote-tracking branch 'upstream/main' into xff_trusted_cidrs
jamesog Aug 12, 2024
bfaa8b3
hcm: Style fix
jamesog Aug 13, 2024
1055b01
xff: Restrict XFF header to 20 entries
jamesog Aug 13, 2024
7721581
hcm: Address feedback
jamesog Aug 21, 2024
837cd5f
Merge remote-tracking branch 'upstream/main' into xff_trusted_cidrs
jamesog Aug 21, 2024
a80178e
xff: Set skip_xff_append to true by default
jamesog Aug 31, 2024
aec2db5
hcm: Use absl::InlinedVector
jamesog Aug 31, 2024
57baab7
xff: Revert c69df1c556e4d71dee0ad7460261eefb6df5a58d
jamesog Aug 31, 2024
7344aa8
Merge remote-tracking branch 'upstream/main' into xff_trusted_cidrs
jamesog Aug 31, 2024
277fefd
Merge remote-tracking branch 'upstream/main' into xff_trusted_cidrs
jamesog Sep 3, 2024
91903c9
xff: Don't use smart pointer
jamesog Sep 4, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion api/envoy/extensions/http/original_ip_detection/xff/v3/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,8 @@ load("@envoy_api//bazel:api_build_system.bzl", "api_proto_package")
licenses(["notice"]) # Apache 2

api_proto_package(
deps = ["@com_github_cncf_xds//udpa/annotations:pkg"],
deps = [
"//envoy/config/core/v3:pkg",
"@com_github_cncf_xds//udpa/annotations:pkg",
],
)
48 changes: 48 additions & 0 deletions api/envoy/extensions/http/original_ip_detection/xff/v3/xff.proto
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ syntax = "proto3";

package envoy.extensions.http.original_ip_detection.xff.v3;

import "envoy/config/core/v3/address.proto";

import "google/protobuf/wrappers.proto";

import "udpa/annotations/status.proto";

option java_package = "io.envoyproxy.envoy.extensions.http.original_ip_detection.xff.v3";
Expand All @@ -22,5 +26,49 @@ message XffConfig {
// determining the origin client's IP address. The default is zero if this option
// is not specified. See the documentation for
// :ref:`config_http_conn_man_headers_x-forwarded-for` for more information.
//
// Only one of ``xff_num_trusted_hops`` and ``xff_trusted_cidrs`` should be set.
// If ``xff_trusted_cidrs`` is set, this field is ignored.
uint32 xff_num_trusted_hops = 1;

// The `CIDR <https://tools.ietf.org/html/rfc4632>`_ ranges to trust when
// evaluating the remote IP address to determine the original client's IP address.
// This is used instead of
// :ref:`use_remote_address <envoy_v3_api_field_extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.use_remote_address>`.
// When the remote IP address matches a trusted CIDR and the
// :ref:`config_http_conn_man_headers_x-forwarded-for` header was sent, each entry
// in the ``x-forwarded-for`` header is evaluated from right to left and the first
// public non-trusted address is used as the original client address. If all
// addresses in ``x-forwarded-for`` are within the trusted list, the first (leftmost)
// entry is used.
//
// This is typically used when requests are proxied by a
// `CDN <https://en.wikipedia.org/wiki/Content_delivery_network>`_.
//
// Only one of ``xff_num_trusted_hops`` and ``xff_trusted_cidrs`` should be set.
// If set, takes precedence over ``xff_num_trusted_hops``.
XffTrustedCidrs xff_trusted_cidrs = 2;

// If set, Envoy will not append the remote address to the
// :ref:`config_http_conn_man_headers_x-forwarded-for` HTTP header.
//
// .. attention::
//
// For proper proxy behaviour it is not recommended to set this option.
// For backwards compatibility, if this option is unset and
// ``xff_num_trusted_hops`` is set, it defaults to true. When
// ``xff_trusted_cidrs`` is set, it defaults to false.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Different default values only brings confusion. Let's only use a default value with true.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please see the related conversation below: #31831 (comment)

@alyssawilk seemed half inclined to go with this split default, but let me know if you still think we should really keep one default.

true is a bad default, to be honest, but I also don't want to break any existing users of xff_num_trusted_hops.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From API's perspective, explicit and predictable behavior is always better. Different default values is always not recommend for our API.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Got it. I've updated this to default to true.

//
// This only applies when :ref:`use_remote_address
// <envoy_v3_api_field_extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.use_remote_address>`
// is false, otherwise :ref:`skip_xff_append
// <envoy_v3_api_field_extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.skip_xff_append>`
// applies.
google.protobuf.BoolValue skip_xff_append = 3;
}

message XffTrustedCidrs {
// The list of `CIDRs <https://tools.ietf.org/html/rfc4632>`_ from which remote
// connections are considered trusted.
repeated config.core.v3.CidrRange cidrs = 1;
}
4 changes: 4 additions & 0 deletions changelogs/current.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -179,5 +179,9 @@ new_features:
change: |
Added :ref:`delay_deny <envoy_v3_api_msg_extensions.filters.network.rbac.v3.RBAC>` to support deny connection after
the configured duration.
- area: original_ip_detection extension
change: |
The :ref:`xff <envoy_v3_api_msg_extensions.http.original_ip_detection.xff.v3.XffConfig>`
original IP detection method now supports using a list of trusted CIDRs when parsing ``x-forwarded-for``.

deprecated:
42 changes: 42 additions & 0 deletions docs/root/configuration/http/http_conn_man/headers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,18 @@ additional addresses from XFF:
the XFF contains fewer than N addresses, Envoy falls back to using the immediate downstream
connection's source address as trusted client address.)

.. note::

If the trusted client address should be determined from a list of known CIDRs, use the
:ref:`xff <envoy_v3_api_msg_extensions.http.original_ip_detection.xff.v3.XffConfig>` original IP
detection option instead.

* If the remote address is contained by an entry in ``xff_trusted_cidrs``, and the *last*
(rightmost) entry is also contained by an entry in ``xff_trusted_cidrs``, the trusted client
address is *second-last* IP address in XFF.
* If all entries in XFF are contained by an entry in ``xff_trusted_cidrs``, the trusted client
address is the *first* (leftmost) IP address in XFF.

Envoy uses the trusted client address contents to determine whether a request originated
externally or internally. This influences whether the
:ref:`config_http_conn_man_headers_x-envoy-internal` header is set.
Expand Down Expand Up @@ -355,6 +367,36 @@ Example 6: The internal Envoy from Example 5, receiving a request proxied by ano
| X-Envoy-External-Address remains unset
| X-Envoy-Internal is set to "true"

Example 7: Envoy as edge proxy, with one trusted CIDR
Settings:
| use_remote_address = false
| xff_trusted_cidrs = 192.0.2.0/24

Request details:
| Downstream IP address = 192.0.2.5
| XFF = "203.0.113.128, 203.0.113.10, 192.0.2.1"

Result:
| Trusted client address = 192.0.2.1
| X-Envoy-External-Address is set to 192.0.2.1
| XFF is changed to "203.0.113.128, 203.0.113.10, 192.0.2.1, 192.0.2.5"
| X-Envoy-Internal is removed (if it was present in the incoming request)

Example 8: Envoy as edge proxy, with two trusted CIDRs
Settings:
| use_remote_address = false
| xff_trusted_cidrs = 192.0.2.0/24, 198.51.100.0/24

Request details:
| Downstream IP address = 192.0.2.5
| XFF = "203.0.113.128, 203.0.113.10, 198.51.100.1"

Result:
| Trusted client address = 203.0.113.10
| X-Envoy-External-Address is set to 203.0.113.10
| XFF is changed to "203.0.113.128, 203.0.113.10, 198.51.100.1, 192.0.2.5"
| X-Envoy-Internal is removed (if it was present in the incoming request)

A few very important notes about XFF:

1. If ``use_remote_address`` is set to true, Envoy sets the
Expand Down
2 changes: 2 additions & 0 deletions envoy/http/original_ip_detection.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ struct OriginalIPDetectionResult {
// If set, these parameters will be used to signal that detection failed and the request should
// be rejected.
absl::optional<OriginalIPRejectRequestOptions> reject_options;
// Whether to skip appending the detected remote address to ``x-forwarded-for``.
bool skip_xff_append;
};

/**
Expand Down
1 change: 1 addition & 0 deletions source/common/http/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,7 @@ envoy_cc_library(
"//source/common/common:enum_to_int",
"//source/common/common:utility_lib",
"//source/common/grpc:status_lib",
"//source/common/network:cidr_range_lib",
"//source/common/network:utility_lib",
"//source/common/protobuf:utility_lib",
"//source/common/runtime:runtime_features_lib",
Expand Down
20 changes: 14 additions & 6 deletions source/common/http/conn_manager_utility.cc
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,16 @@ ServerConnectionPtr ConnectionManagerUtility::autoCreateCodec(
}
}

void ConnectionManagerUtility::appendXff(RequestHeaderMap& request_headers,
Network::Connection& connection,
ConnectionManagerConfig& config) {
if (Network::Utility::isLoopbackAddress(*connection.connectionInfoProvider().remoteAddress())) {
Utility::appendXff(request_headers, config.localAddress());
} else {
Utility::appendXff(request_headers, *connection.connectionInfoProvider().remoteAddress());
}
}

ConnectionManagerUtility::MutateRequestHeadersResult ConnectionManagerUtility::mutateRequestHeaders(
RequestHeaderMap& request_headers, Network::Connection& connection,
ConnectionManagerConfig& config, const Router::Config& route_config,
Expand Down Expand Up @@ -134,12 +144,7 @@ ConnectionManagerUtility::MutateRequestHeadersResult ConnectionManagerUtility::m
final_remote_address = connection.connectionInfoProvider().remoteAddress();
}
if (!config.skipXffAppend()) {
if (Network::Utility::isLoopbackAddress(
*connection.connectionInfoProvider().remoteAddress())) {
Utility::appendXff(request_headers, config.localAddress());
} else {
Utility::appendXff(request_headers, *connection.connectionInfoProvider().remoteAddress());
}
appendXff(request_headers, connection, config);
}
// If the prior hop is not a trusted proxy, overwrite any
// x-forwarded-proto/x-forwarded-port value it set as untrusted. Alternately if no
Expand Down Expand Up @@ -171,6 +176,9 @@ ConnectionManagerUtility::MutateRequestHeadersResult ConnectionManagerUtility::m
if (result.reject_options.has_value()) {
return {nullptr, result.reject_options};
}
if (!result.skip_xff_append) {
appendXff(request_headers, connection, config);
}

if (result.detected_remote_address) {
final_remote_address = result.detected_remote_address;
Expand Down
2 changes: 2 additions & 0 deletions source/common/http/conn_manager_utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,8 @@ class ConnectionManagerUtility {
ConnectionManagerConfig& config, const Router::Route* route);

private:
static void appendXff(RequestHeaderMap& request_headers, Network::Connection& connection,
ConnectionManagerConfig& config);
static void mutateXfccRequestHeader(RequestHeaderMap& request_headers,
Network::Connection& connection,
ConnectionManagerConfig& config);
Expand Down
48 changes: 48 additions & 0 deletions source/common/http/utility.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "source/common/http/header_map_impl.h"
#include "source/common/http/headers.h"
#include "source/common/http/message_impl.h"
#include "source/common/network/cidr_range.h"
#include "source/common/network/utility.h"
#include "source/common/protobuf/utility.h"
#include "source/common/runtime/runtime_features.h"
Expand Down Expand Up @@ -756,6 +757,53 @@ void Utility::sendLocalReply(const bool& is_reset, const EncodeFunctions& encode
encodeLocalReply(is_reset, std::move(prepared_local_reply));
}

bool Utility::remoteAddressIsTrustedProxy(
const Envoy::Network::Address::InstanceConstSharedPtr& remote,
const std::vector<Network::Address::CidrRange> trusted_cidrs) {
for (const auto& cidr : trusted_cidrs) {
if (cidr.isInRange(*remote.get())) {
return true;
}
}
return false;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

const Envoy::Network::Address::Instance& remote: const reference to shared pointer here make no sense.
absl::Span<const Network::Address::CidrRange>: to avoid copy whole vector. (or vector reference should be used.)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you, these have been updated.


Utility::GetLastAddressFromXffInfo Utility::getLastNonTrustedAddressFromXFF(
const Http::RequestHeaderMap& request_headers,
const std::vector<Network::Address::CidrRange> trusted_cidrs) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ditto. Please use span or vector reference.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated, thanks.

const auto xff_header = request_headers.getForwardedForValue();
static constexpr absl::string_view separator(",");

const auto xff_entries = StringUtil::splitToken(xff_header, separator, false, true);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mmm, belatedly, if this is going to be m*n it'd be good to have a cap on the number of tokens we accept (early return without parsing if there's say more than 20?)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you think it's worth having this configurable (with a default) or having it hard-coded with a comment in the API docs?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we've got other hard-coded limits in this file so I think it's fine to start with a high bound and extend iff anyone asks for it. I can think of no valid use case where hundreds of XFF headers are allowed and I've seen M*N bugs like that melt down in production when someone either screws up or attacks with many-tokened headers.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense, thanks.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added this check with a trace-level log for debugging purposes.

Copy link
Member

@wbpcode wbpcode Aug 21, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which type is used here to store the splitted tokens? Seems auto is not appropriate here. Maybe you should specify a type here. InlineVector<absl::string_view, 8> InlinedVector<absl::string_view, 8> will be recommend.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated. I used std::vector<absl::string_view> as this seemed to be the style elsewhere and I couldn't find any reference of InlineVector.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

absl::InlinedVector provide better performance when we only has limited hops (in most cases?). And sorry for the spelling error.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the explanation. I've updated to use InlinedVector now.

Network::Address::InstanceConstSharedPtr last_valid_addr;

for (auto it = xff_entries.rbegin(); it != xff_entries.rend(); it++) {
auto addr = Network::Utility::parseInternetAddressNoThrow(std::string(*it));
if (addr == nullptr) {
return {nullptr, false};
}
last_valid_addr = addr;

bool remoteAddressIsTrustedProxy = false;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remote_address_is_trusted_proxy

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed, thanks.

for (const auto& cidr : trusted_cidrs) {
if (cidr.isInRange(*addr.get())) {
remoteAddressIsTrustedProxy = true;
break;
}
}

if (remoteAddressIsTrustedProxy) {
continue;
}

// If we reach here we found a non-trusted address
return {addr, xff_entries.size() == 1};
}
// If we reach this point all addresses in XFF were considered trusted, so return
// first IP in XFF (the last in the reverse-evaluated chain).
return {last_valid_addr, xff_entries.size() == 1};
}

Utility::GetLastAddressFromXffInfo
Utility::getLastAddressFromXFF(const Http::RequestHeaderMap& request_headers,
uint32_t num_to_skip) {
Expand Down
21 changes: 21 additions & 0 deletions source/common/http/utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <cstdint>
#include <memory>
#include <string>
#include <vector>

#include "envoy/common/regex.h"
#include "envoy/config/core/v3/http_uri.pb.h"
Expand Down Expand Up @@ -389,6 +390,26 @@ struct GetLastAddressFromXffInfo {
bool allow_trusted_address_checks_;
};

/**
* Checks if the remote address is contained by one of the trusted proxy CIDRs.
* @param remote the remote address
* @param trusted_cidrs the list of CIDRs which are considered trusted proxies
* @return whether the remote address is a trusted proxy
*/
bool remoteAddressIsTrustedProxy(const Envoy::Network::Address::InstanceConstSharedPtr& remote,
const std::vector<Network::Address::CidrRange> trusted_cidrs);

/**
* Retrieves the last address in the x-forwarded-header after removing all trusted proxy addresses.
* @param request_headers supplies the request headers
* @param trusted_cidrs the list of CIDRs which are considered trusted proxies
* @return GetLastAddressFromXffInfo information about the last address in the XFF header.
* @see GetLastAddressFromXffInfo for more information.
*/
GetLastAddressFromXffInfo
getLastNonTrustedAddressFromXFF(const Http::RequestHeaderMap& request_headers,
const std::vector<Network::Address::CidrRange> trusted_cidrs);

/**
* Retrieves the last IPv4/IPv6 address in the x-forwarded-for header.
* @param request_headers supplies the request headers.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,16 @@ Envoy::Http::OriginalIPDetectionResult
CustomHeaderIPDetection::detect(Envoy::Http::OriginalIPDetectionParams& params) {
auto hdr = params.request_headers.get(header_name_);
if (hdr.empty()) {
return {nullptr, false, reject_options_};
return {nullptr, false, reject_options_, false};
}

auto header_value = hdr[0]->value().getStringView();
auto addr = Network::Utility::parseInternetAddressNoThrow(std::string(header_value));
if (addr) {
return {addr, allow_trusted_address_checks_, absl::nullopt};
return {addr, allow_trusted_address_checks_, absl::nullopt, false};
}

return {nullptr, false, reject_options_};
return {nullptr, false, reject_options_, false};
}

} // namespace CustomHeader
Expand Down
4 changes: 4 additions & 0 deletions source/extensions/http/original_ip_detection/xff/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ envoy_cc_library(
deps = [
"//envoy/http:original_ip_detection_interface",
"//source/common/http:utility_lib",
"//source/common/network:cidr_range_lib",
"//source/common/protobuf",
"@envoy_api//envoy/config/core/v3:pkg_cc_proto",
"@envoy_api//envoy/extensions/http/original_ip_detection/xff/v3:pkg_cc_proto",
],
)
Expand All @@ -33,6 +36,7 @@ envoy_cc_extension(
"//envoy/http:original_ip_detection_interface",
"//envoy/registry",
"//source/common/config:utility_lib",
"//source/common/network:cidr_range_lib",
"@envoy_api//envoy/extensions/http/original_ip_detection/xff/v3:pkg_cc_proto",
],
)
Loading