Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion cmd/nginx-ingress/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -1040,7 +1040,7 @@ func processConfigMaps(kubeClient *kubernetes.Clientset, cfgParams *configs.Conf
if err != nil {
nl.Fatalf(l, "Error when getting %v: %v", *nginxConfigMaps, err)
}
cfgParams, _ = configs.ParseConfigMap(cfgParams.Context, cfm, *nginxPlus, *appProtect, *appProtectDos, *enableTLSPassthrough, *enableDirectiveAutoadjust, eventLog)
cfgParams, _ = configs.ParseConfigMap(cfgParams.Context, cfm, *nginxPlus, *appProtect, *appProtectDos, *enableTLSPassthrough, *enableDirectiveAutoadjust, *enableSnippets, eventLog)
if cfgParams.MainServerSSLDHParamFileContent != nil {
fileName, err := nginxManager.CreateDHParam(*cfgParams.MainServerSSLDHParamFileContent)
if err != nil {
Expand Down
2 changes: 2 additions & 0 deletions internal/configs/config_params.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ type ConfigParams struct {
LocationSnippets []string
MainAccessLog string
MainAddHeaders []version2.AddHeader
DisableForwardedHeaders bool
MainErrorLogLevel string
MainHTTPSnippets []string
MainKeepaliveRequests int64
Expand Down Expand Up @@ -283,6 +284,7 @@ func NewDefaultConfigParams(ctx context.Context, isPlus bool) *ConfigParams {
MainKeepaliveRequests: 1000,
VariablesHashBucketSize: 256,
VariablesHashMaxSize: 1024,
DisableForwardedHeaders: false,
LimitReqKey: "${binary_remote_addr}",
LimitReqZoneSize: "10m",
LimitReqLogLevel: "error",
Expand Down
17 changes: 16 additions & 1 deletion internal/configs/configmaps.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ const (
// ParseConfigMap parses ConfigMap into ConfigParams.
//
//nolint:gocyclo
func ParseConfigMap(ctx context.Context, cfgm *v1.ConfigMap, nginxPlus bool, hasAppProtect bool, hasAppProtectDos bool, hasTLSPassthrough bool, enableDirectiveAutoadjust bool, eventLog record.EventRecorder) (*ConfigParams, bool) {
func ParseConfigMap(ctx context.Context, cfgm *v1.ConfigMap, nginxPlus bool, hasAppProtect bool, hasAppProtectDos bool, hasTLSPassthrough bool, enableDirectiveAutoadjust bool, enableSnippets bool, eventLog record.EventRecorder) (*ConfigParams, bool) {
l := nl.LoggerFromContext(ctx)
cfgParams := NewDefaultConfigParams(ctx, nginxPlus)
configOk := true
Expand Down Expand Up @@ -113,6 +113,21 @@ func ParseConfigMap(ctx context.Context, cfgm *v1.ConfigMap, nginxPlus bool, has
}
}

if disableForwardedHeaders, exists, err := GetMapKeyAsBool(cfgm.Data, "disable-forwarded-headers", cfgm); exists {
if !enableSnippets {
errorText := fmt.Sprintf("ConfigMap %s/%s: 'disable-forwarded-headers' requires -enable-snippets, ignoring", cfgm.GetNamespace(), cfgm.GetName())
nl.Error(l, errorText)
eventLog.Event(cfgm, v1.EventTypeWarning, nl.EventReasonInvalidValue, errorText)
configOk = false
} else if err != nil {
nl.Error(l, err)
eventLog.Event(cfgm, v1.EventTypeWarning, nl.EventReasonInvalidValue, err.Error())
configOk = false
} else {
cfgParams.DisableForwardedHeaders = disableForwardedHeaders
}
}

if clientMaxBodySize, exists := cfgm.Data["client-max-body-size"]; exists {
cfgParams.ClientMaxBodySize = clientMaxBodySize
}
Expand Down
113 changes: 88 additions & 25 deletions internal/configs/configmaps_test.go

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions internal/configs/ingress.go
Original file line number Diff line number Diff line change
Expand Up @@ -1069,6 +1069,7 @@ func createLocation(path string, upstream version1.Upstream, cfg *ConfigParams,
ProxyBufferSize: cfg.ProxyBufferSize,
ProxyBusyBuffersSize: cfg.ProxyBusyBuffersSize,
ProxyMaxTempFileSize: cfg.ProxyMaxTempFileSize,
DisableForwardedHeaders: cfg.DisableForwardedHeaders,
ProxySSLName: proxySSLName,
ProxyNextUpstream: cfg.ProxyNextUpstream,
ProxyNextUpstreamTimeout: cfg.ProxyNextUpstreamTimeout,
Expand Down
7 changes: 4 additions & 3 deletions internal/configs/ingress_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2993,9 +2993,10 @@ func createExpectedConfigForCafeIngressWithUseClusterIPNamedPorts() version1.Ing
ProxyReadTimeout: "60s",
ProxySendTimeout: "60s",
ClientMaxBodySize: "1m",
ProxyBuffering: true,
ProxySSLName: "coffee-svc.default.svc",
ProxyPass: "http://default-cafe-ingress-cafe.example.com-coffee-svc-custom-port-name",

ProxyBuffering: true,
ProxySSLName: "coffee-svc.default.svc",
ProxyPass: "http://default-cafe-ingress-cafe.example.com-coffee-svc-custom-port-name",
},
{
Path: "/tea",
Expand Down
47 changes: 47 additions & 0 deletions internal/configs/version1/__snapshots__/template_test.snap
Original file line number Diff line number Diff line change
Expand Up @@ -5428,6 +5428,53 @@ server {

---

[TestExecuteTemplate_ForIngressWithDisableForwardedHeaders - 1]
# configuration for default/cafe-ingress
upstream test {
zone test 256k;
server 127.0.0.1:8181 max_fails=0 fail_timeout=1s max_conns=0;
keepalive 16;
}



server {
listen 443 ssl;listen [::]:443 ssl;
ssl_certificate secret.pem;
ssl_certificate_key secret.pem;

server_tokens off;

server_name test.example.com;
set $resource_type "ingress";
set $resource_name "cafe-ingress";
set $resource_namespace "default";
set $service "-";
if ($scheme = http) {
return 301 https://$host:443$request_uri;
}
location /tea {
set $service "";
# location for minion default/tea-minion
set $resource_name "tea-minion";
set $resource_namespace "default";
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 10s;
proxy_read_timeout 10s;
proxy_send_timeout 10s;
client_max_body_size 2m;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffering off;
proxy_pass http://test;

}

}

---

[TestExecuteTemplate_ForIngressWithEmptyHostForNGINX - 1]
# configuration for default/cafe-ingress
upstream test {
Expand Down
1 change: 1 addition & 0 deletions internal/configs/version1/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,7 @@ type Location struct {
BasicAuth *BasicAuth
ServiceName string
LimitReq *LimitReq
DisableForwardedHeaders bool
CORSEnabled bool

AuthRequestOff bool
Expand Down
4 changes: 4 additions & 0 deletions internal/configs/version1/nginx-plus.ingress.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -424,10 +424,12 @@ server {
grpc_send_timeout {{$location.ProxySendTimeout}};
grpc_set_header Host $host;
grpc_set_header X-Real-IP $remote_addr;
{{- if not $location.DisableForwardedHeaders }}
grpc_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
grpc_set_header X-Forwarded-Host $host;
grpc_set_header X-Forwarded-Port $server_port;
grpc_set_header X-Forwarded-Proto $scheme;
{{- end}}

{{- if $location.ProxyBufferSize}}
grpc_buffer_size {{$location.ProxyBufferSize}};
Expand Down Expand Up @@ -482,10 +484,12 @@ server {
{{- end}}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
{{- if not $location.DisableForwardedHeaders }}
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto {{if $server.RedirectToHTTPS}}https{{else}}$scheme{{end}};
{{- end}}
proxy_buffering {{if $location.ProxyBuffering}}on{{else}}off{{end}};
{{- if $location.ProxyBuffers}}
proxy_buffers {{$location.ProxyBuffers}};
Expand Down
5 changes: 4 additions & 1 deletion internal/configs/version1/nginx.ingress.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -326,11 +326,12 @@ server {
grpc_send_timeout {{$location.ProxySendTimeout}};
grpc_set_header Host $host;
grpc_set_header X-Real-IP $remote_addr;
{{- if not $location.DisableForwardedHeaders }}
grpc_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
grpc_set_header X-Forwarded-Host $host;
grpc_set_header X-Forwarded-Port $server_port;
grpc_set_header X-Forwarded-Proto {{if $server.RedirectToHTTPS}}https{{else}}$scheme{{end}};

{{- end}}
{{- if $location.ProxyBufferSize}}
grpc_buffer_size {{$location.ProxyBufferSize}};
{{- end}}
Expand Down Expand Up @@ -374,10 +375,12 @@ server {
{{- end}}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
{{- if not $location.DisableForwardedHeaders }}
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto {{if $server.RedirectToHTTPS}}https{{else}}$scheme{{end}};
{{- end}}
proxy_buffering {{if $location.ProxyBuffering}}on{{else}}off{{end}};
{{- if $location.ProxyBuffers}}
proxy_buffers {{$location.ProxyBuffers}};
Expand Down
66 changes: 66 additions & 0 deletions internal/configs/version1/template_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4039,6 +4039,34 @@ func TestExecuteTemplate_ForIngressWithAddHeaderInherit(t *testing.T) {
}
}

func TestExecuteTemplate_ForIngressWithDisableForwardedHeaders(t *testing.T) {
t.Parallel()

tmpl := newNGINXIngressTmpl(t)
buf := &bytes.Buffer{}

err := tmpl.Execute(buf, ingressCfgForwardedHeaderEnabled)
t.Log(buf.String())
if err != nil {
t.Fatal(err)
}

notWantDirectives := []string{
"proxy_set_header X-Forwarded-For",
"proxy_set_header X-Forwarded-Host",
"proxy_set_header X-Forwarded-Port",
"proxy_set_header X-Forwarded-Proto",
}

rendered := buf.String()
for _, notWant := range notWantDirectives {
if strings.Contains(rendered, notWant) {
t.Errorf("not want %q in generated config", notWant)
}
}
snaps.MatchSnapshot(t, buf.String())
}

var (
// Ingress Config example without added annotations
ingressCfg = IngressNginxConfig{
Expand Down Expand Up @@ -4425,6 +4453,44 @@ var (
},
}

ingressCfgForwardedHeaderEnabled = IngressNginxConfig{
Servers: []Server{
{
Name: "test.example.com",
ServerTokens: "off",
StatusZone: "test.example.com",
SSL: true,
SSLCertificate: "secret.pem",
SSLCertificateKey: "secret.pem",
SSLPorts: []int{443},
SSLRedirect: true,
HTTPRedirectCode: 301,
Locations: []Location{
{
Path: "/tea",
Upstream: testUpstream,
ProxyConnectTimeout: "10s",
DisableForwardedHeaders: true,
ProxyReadTimeout: "10s",
ProxySendTimeout: "10s",
ClientMaxBodySize: "2m",
MinionIngress: &Ingress{
Name: "tea-minion",
Namespace: "default",
},
ProxyPass: "http://test",
},
},
},
},
Upstreams: []Upstream{testUpstream},
Keepalive: "16",
Ingress: Ingress{
Name: "cafe-ingress",
Namespace: "default",
},
}

// Ingress Config example with ssl-redirect and redirect-to-https enabled with custom http-redirect-code
ingressCfgWithHTTPRedirectCode = IngressNginxConfig{
Servers: []Server{
Expand Down
46 changes: 46 additions & 0 deletions internal/configs/version2/__snapshots__/templates_test.snap
Original file line number Diff line number Diff line change
Expand Up @@ -3101,6 +3101,52 @@ server {

---

[TestExecuteVirtualServerTemplate_RendersTemplateWithDisableForwardedHeadersTrue - 1]


server {
listen 80;
listen [::]:80;


server_name example.com;
status_zone example.com;
set $resource_type "virtualserver";
set $resource_name "";
set $resource_namespace "";
set $service "-";

server_tokens "";




location / {
set $service "";
status_zone "";


set $default_connection_header close;
proxy_connect_timeout ;
proxy_read_timeout ;
proxy_send_timeout ;
client_max_body_size ;

proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $vs_connection_header;
proxy_pass_request_headers off;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://test-upstream;
proxy_next_upstream ;
proxy_next_upstream_timeout ;
proxy_next_upstream_tries 0;
}
}

---

[TestExecuteVirtualServerTemplate_RendersTemplateWithRateLimitJWTClaim - 1]

auth_jwt_claim_set $jwt_default_webapp_group_consumer_group_type consumer_group type;
Expand Down
1 change: 1 addition & 0 deletions internal/configs/version2/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,7 @@ type Location struct {
VSRNamespace string
GRPCPass string
CORSEnabled bool
DisableForwardedHeaders bool
AddHeaderInherit string
ProxySSLVerify bool
ProxySSLVerifyDepth int
Expand Down
3 changes: 2 additions & 1 deletion internal/configs/version2/nginx-plus.virtualserver.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -756,7 +756,7 @@ server {
{{- if not ($custom_headers | hasCIKey "X-Real-IP") }}
{{ $proxyOrGRPC }}_set_header X-Real-IP $remote_addr;
{{- end }}

{{- if not $l.DisableForwardedHeaders }}
{{- if not ($custom_headers | hasCIKey "X-Forwarded-For") }}
{{ $proxyOrGRPC }}_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
{{- end }}
Expand All @@ -772,6 +772,7 @@ server {
{{- if not ($custom_headers | hasCIKey "X-Forwarded-Proto") }}
{{ $proxyOrGRPC }}_set_header X-Forwarded-Proto {{ with $s.TLSRedirect }}{{ .BasedOn }}{{ else }}$scheme{{ end }};
{{- end }}
{{- end }}

{{- range $h := $l.ProxySetHeaders }}
{{ $proxyOrGRPC }}_set_header {{ $h.Name }} {{ printf "%q" $h.Value }};
Expand Down
2 changes: 2 additions & 0 deletions internal/configs/version2/nginx.virtualserver.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -466,6 +466,7 @@ server {
{{ $proxyOrGRPC }}_set_header X-Real-IP $remote_addr;
{{- end }}

{{- if not $l.DisableForwardedHeaders }}
{{- if not ($custom_headers | hasCIKey "X-Forwarded-For") }}
{{ $proxyOrGRPC }}_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
{{- end }}
Expand All @@ -481,6 +482,7 @@ server {
{{- if not ($custom_headers | hasCIKey "X-Forwarded-Proto") }}
{{ $proxyOrGRPC }}_set_header X-Forwarded-Proto {{ with $s.TLSRedirect }}{{ .BasedOn }}{{ else }}$scheme{{ end }};
{{- end }}
{{- end }}

{{- range $h := $l.ProxySetHeaders }}
{{ $proxyOrGRPC }}_set_header {{ $h.Name }} {{ printf "%q" $h.Value }};
Expand Down
Loading
Loading