Skip to content

Commit a5db11a

Browse files
committed
Add reverse proxy configuration support for remote IP address validation
1 parent 91ee3be commit a5db11a

File tree

18 files changed

+460
-2
lines changed

18 files changed

+460
-2
lines changed

custom/conf/app.example.ini

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,12 @@ 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 seperated by comma of trusted proxy servers. Use `*` to trust all.
555+
REVERSE_PROXY_TRUSTED_PROXIES = 127.0.0.1
556+
; List of network addresses seperated by comma of trusted proxy servers. Example `10.0.0.0/24`.
557+
REVERSE_PROXY_TRUSTED_NETWORKS =
552558
; The minimum password length for new Users
553559
MIN_PASSWORD_LENGTH = 6
554560
; Set to true to allow users to import local server paths

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,10 @@ 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.1**: List of IP addresses separated by comma of trusted proxy servers. Use `*` to trust all.
396+
- `REVERSE_PROXY_TRUSTED_NETWORKS`: **<empty>**: List of network addresses separated by comma of trusted proxy servers. Example `10.0.0.0/24`.
393397
- `DISABLE_GIT_HOOKS`: **true**: Set to `false` to enable users with git hook privilege to create custom git hooks.
394398
WARNING: Custom git hooks can be used to perform arbitrary code execution on the host operating system.
395399
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.0
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.0 h1:8XEjIzBFi/sSrtg7RUVBd6ydNhnqzp24oVL41VCVw8Q=
198+
github.com/chi-middleware/proxy v1.1.0/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.0 h1:nbGWQBpO+D+cJuRxNgSDFnFY9QWz3QM/CeZxU7VAH20=

modules/setting/setting.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ var (
169169
CookieRememberName string
170170
ReverseProxyAuthUser string
171171
ReverseProxyAuthEmail string
172+
ReverseProxyLimit int
173+
ReverseProxyTrustedIPAddr []string
174+
ReverseProxyTrustedNet []string
172175
MinPasswordLength int
173176
ImportLocalPaths bool
174177
DisableGitHooks bool
@@ -819,8 +822,17 @@ func NewContext() {
819822
LogInRememberDays = sec.Key("LOGIN_REMEMBER_DAYS").MustInt(7)
820823
CookieUserName = sec.Key("COOKIE_USERNAME").MustString("gitea_awesome")
821824
CookieRememberName = sec.Key("COOKIE_REMEMBER_NAME").MustString("gitea_incredible")
825+
822826
ReverseProxyAuthUser = sec.Key("REVERSE_PROXY_AUTHENTICATION_USER").MustString("X-WEBAUTH-USER")
823827
ReverseProxyAuthEmail = sec.Key("REVERSE_PROXY_AUTHENTICATION_EMAIL").MustString("X-WEBAUTH-EMAIL")
828+
829+
ReverseProxyLimit = sec.Key("REVERSE_PROXY_LIMIT").MustInt(1)
830+
ReverseProxyTrustedIPAddr = sec.Key("REVERSE_PROXY_TRUSTED_PROXIES").Strings(",")
831+
if len(ReverseProxyTrustedIPAddr) == 0 {
832+
ReverseProxyTrustedIPAddr = []string{"127.0.0.1"}
833+
}
834+
ReverseProxyTrustedNet = sec.Key("REVERSE_PROXY_TRUSTED_NETWORKS").Strings(",")
835+
824836
MinPasswordLength = sec.Key("MIN_PASSWORD_LENGTH").MustInt(6)
825837
ImportLocalPaths = sec.Key("IMPORT_LOCAL_PATHS").MustBool(false)
826838
DisableGitHooks = sec.Key("DISABLE_GIT_HOOKS").MustBool(true)

routers/routes/web.go

Lines changed: 18 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,29 @@ 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 _, ip := range setting.ReverseProxyTrustedIPAddr {
76+
opt.AddTrustedProxy(ip)
77+
}
78+
for _, n := range setting.ReverseProxyTrustedNet {
79+
opt.AddTrustedNetwork(n)
80+
}
81+
handlers = append(handlers, proxy.ForwardedHeaders(opt))
82+
}
83+
84+
handlers = append(handlers, middleware.StripSlashes)
85+
7186
if !setting.DisableRouterLog && setting.RouterLogLevel != log.NONE {
7287
if log.GetLogger("router").GetLevel() <= setting.RouterLogLevel {
7388
handlers = append(handlers, LoggerHandler(setting.RouterLogLevel))
7489
}
7590
}
91+
7692
handlers = append(handlers, func(next http.Handler) http.Handler {
7793
return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
7894
// 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)