Skip to content

Commit 044cd4d

Browse files
Add reverse proxy configuration support for remote IP address (#14959)
* Add reverse proxy configuration support for remote IP address validation * Trust all IP addresses in containerized environments by default * Use single option to specify networks and proxy IP addresses. By default trust all loopback IPs Co-authored-by: techknowlogick <[email protected]>
1 parent 6e423d5 commit 044cd4d

File tree

20 files changed

+464
-2
lines changed

20 files changed

+464
-2
lines changed

custom/conf/app.example.ini

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,10 @@ COOKIE_REMEMBER_NAME = gitea_incredible
549549
; Reverse proxy authentication header name of user name
550550
REVERSE_PROXY_AUTHENTICATION_USER = X-WEBAUTH-USER
551551
REVERSE_PROXY_AUTHENTICATION_EMAIL = X-WEBAUTH-EMAIL
552+
; Interpret X-Forwarded-For header or the X-Real-IP header and set this as the remote IP for the request
553+
REVERSE_PROXY_LIMIT = 1
554+
; List of IP addresses and networks seperated by comma of trusted proxy servers. Use `*` to trust all.
555+
REVERSE_PROXY_TRUSTED_PROXIES = 127.0.0.0/8,::1/128
552556
; The minimum password length for new Users
553557
MIN_PASSWORD_LENGTH = 6
554558
; Set to true to allow users to import local server paths

docker/root/etc/templates/app.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ ROOT_PATH = /data/gitea/log
5353
[security]
5454
INSTALL_LOCK = $INSTALL_LOCK
5555
SECRET_KEY = $SECRET_KEY
56+
REVERSE_PROXY_LIMIT = 1
57+
REVERSE_PROXY_TRUSTED_PROXIES = *
5658

5759
[service]
5860
DISABLE_REGISTRATION = $DISABLE_REGISTRATION

docker/rootless/etc/templates/app.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ ROOT_PATH = $GITEA_WORK_DIR/data/log
4949
[security]
5050
INSTALL_LOCK = $INSTALL_LOCK
5151
SECRET_KEY = $SECRET_KEY
52+
REVERSE_PROXY_LIMIT = 1
53+
REVERSE_PROXY_TRUSTED_PROXIES = *
5254

5355
[service]
5456
DISABLE_REGISTRATION = $DISABLE_REGISTRATION

docs/content/doc/advanced/config-cheat-sheet.en-us.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,9 @@ relation to port exhaustion.
390390
authentication.
391391
- `REVERSE_PROXY_AUTHENTICATION_EMAIL`: **X-WEBAUTH-EMAIL**: Header name for reverse proxy
392392
authentication provided email.
393+
- `REVERSE_PROXY_LIMIT`: **1**: Interpret X-Forwarded-For header or the X-Real-IP header and set this as the remote IP for the request.
394+
Number of trusted proxy count. Set to zero to not use these headers.
395+
- `REVERSE_PROXY_TRUSTED_PROXIES`: **127.0.0.0/8,::1/128**: List of IP addresses and networks separated by comma of trusted proxy servers. Use `*` to trust all.
393396
- `DISABLE_GIT_HOOKS`: **true**: Set to `false` to enable users with git hook privilege to create custom git hooks.
394397
WARNING: Custom git hooks can be used to perform arbitrary code execution on the host operating system.
395398
This enables the users to access and modify this config file and the Gitea database and interrupt the Gitea service.

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ require (
2222
github.com/boombuler/barcode v1.0.1 // indirect
2323
github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b // indirect
2424
github.com/caddyserver/certmagic v0.12.0
25+
github.com/chi-middleware/proxy v1.1.1
2526
github.com/couchbase/go-couchbase v0.0.0-20210224140812-5740cd35f448 // indirect
2627
github.com/couchbase/gomemcached v0.1.2 // indirect
2728
github.com/couchbase/goutils v0.0.0-20210118111533-e33d3ffb5401 // indirect

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
194194
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
195195
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
196196
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
197+
github.com/chi-middleware/proxy v1.1.1 h1:4HaXUp8o2+bhHr1OhVy+VjN0+L7/07JDcn6v7YrTjrQ=
198+
github.com/chi-middleware/proxy v1.1.1/go.mod h1:jQwMEJct2tz9VmtCELxvnXoMfa+SOdikvbVJVHv/M+0=
197199
github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU=
198200
github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE=
199201
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
@@ -318,6 +320,8 @@ github.com/go-asn1-ber/asn1-ber v1.5.3/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkPro
318320
github.com/go-chi/chi v1.5.1/go.mod h1:REp24E+25iKvxgeTfHmdUoL5x15kBiDBlnIl5bCwe2k=
319321
github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs=
320322
github.com/go-chi/chi v1.5.4/go.mod h1:uaf8YgoFazUOkPBG7fxPftUylNumIev9awIWOENIuEg=
323+
github.com/go-chi/chi/v5 v5.0.1 h1:ALxjCrTf1aflOlkhMnCUP86MubbWFrzB3gkRPReLpTo=
324+
github.com/go-chi/chi/v5 v5.0.1/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
321325
github.com/go-chi/cors v1.1.1 h1:eHuqxsIw89iXcWnWUN8R72JMibABJTN/4IOYI5WERvw=
322326
github.com/go-chi/cors v1.1.1/go.mod h1:K2Yje0VW/SJzxiyMYu6iPQYa7hMjQX2i/F491VChg1I=
323327
github.com/go-enry/go-enry/v2 v2.6.1 h1:ckFkMVj2NeHpaQDFDiSjanVjNy2IiuMNivhXDB4c5Q0=

modules/setting/setting.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ var (
169169
CookieRememberName string
170170
ReverseProxyAuthUser string
171171
ReverseProxyAuthEmail string
172+
ReverseProxyLimit int
173+
ReverseProxyTrustedProxies []string
172174
MinPasswordLength int
173175
ImportLocalPaths bool
174176
DisableGitHooks bool
@@ -819,8 +821,16 @@ func NewContext() {
819821
LogInRememberDays = sec.Key("LOGIN_REMEMBER_DAYS").MustInt(7)
820822
CookieUserName = sec.Key("COOKIE_USERNAME").MustString("gitea_awesome")
821823
CookieRememberName = sec.Key("COOKIE_REMEMBER_NAME").MustString("gitea_incredible")
824+
822825
ReverseProxyAuthUser = sec.Key("REVERSE_PROXY_AUTHENTICATION_USER").MustString("X-WEBAUTH-USER")
823826
ReverseProxyAuthEmail = sec.Key("REVERSE_PROXY_AUTHENTICATION_EMAIL").MustString("X-WEBAUTH-EMAIL")
827+
828+
ReverseProxyLimit = sec.Key("REVERSE_PROXY_LIMIT").MustInt(1)
829+
ReverseProxyTrustedProxies = sec.Key("REVERSE_PROXY_TRUSTED_PROXIES").Strings(",")
830+
if len(ReverseProxyTrustedProxies) == 0 {
831+
ReverseProxyTrustedProxies = []string{"127.0.0.0/8", "::1/128"}
832+
}
833+
824834
MinPasswordLength = sec.Key("MIN_PASSWORD_LENGTH").MustInt(6)
825835
ImportLocalPaths = sec.Key("IMPORT_LOCAL_PATHS").MustBool(false)
826836
DisableGitHooks = sec.Key("DISABLE_GIT_HOOKS").MustBool(true)

routers/routes/web.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import (
4646
"gitea.com/go-chi/captcha"
4747
"gitea.com/go-chi/session"
4848
"github.com/NYTimes/gziphandler"
49+
"github.com/chi-middleware/proxy"
4950
"github.com/go-chi/chi/middleware"
5051
"github.com/go-chi/cors"
5152
"github.com/prometheus/client_golang/prometheus"
@@ -65,14 +66,30 @@ func commonMiddlewares() []func(http.Handler) http.Handler {
6566
next.ServeHTTP(context.NewResponse(resp), req)
6667
})
6768
},
68-
middleware.RealIP,
69-
middleware.StripSlashes,
7069
}
70+
71+
if setting.ReverseProxyLimit > 0 {
72+
opt := proxy.NewForwardedHeadersOptions().
73+
WithForwardLimit(setting.ReverseProxyLimit).
74+
ClearTrustedProxies()
75+
for _, n := range setting.ReverseProxyTrustedProxies {
76+
if !strings.Contains(n, "/") {
77+
opt.AddTrustedProxy(n)
78+
} else {
79+
opt.AddTrustedNetwork(n)
80+
}
81+
}
82+
handlers = append(handlers, proxy.ForwardedHeaders(opt))
83+
}
84+
85+
handlers = append(handlers, middleware.StripSlashes)
86+
7187
if !setting.DisableRouterLog && setting.RouterLogLevel != log.NONE {
7288
if log.GetLogger("router").GetLevel() <= setting.RouterLogLevel {
7389
handlers = append(handlers, LoggerHandler(setting.RouterLogLevel))
7490
}
7591
}
92+
7693
handlers = append(handlers, func(next http.Handler) http.Handler {
7794
return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
7895
// Why we need this? The Recovery() will try to render a beautiful

vendor/github.com/chi-middleware/proxy/.drone.yml

Lines changed: 42 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/chi-middleware/proxy/.gitignore

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/chi-middleware/proxy/.golangci.yml

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/chi-middleware/proxy/.revive.toml

Lines changed: 25 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/chi-middleware/proxy/LICENSE

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/chi-middleware/proxy/Makefile

Lines changed: 59 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/chi-middleware/proxy/README.md

Lines changed: 46 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/chi-middleware/proxy/go.mod

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/chi-middleware/proxy/go.sum

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)