add filter_private_ips option to discard private IPs.

Might be used when tracker is behind reverse proxy and one of provided
addresses in `real_ip_header` is private/local address.

Additional changes:

* check if provided address is not multicast/broadcast
* configure `http.Server.ReadHeaderTimeout` with `http.ReadTimeout` to mitigate Slowloris
* update dependencies
* minor docs fixes
This commit is contained in:
Lawrence, Rendall
2022-07-23 15:30:12 +03:00
parent 3e36ad7cbf
commit 96653c45a3
13 changed files with 125 additions and 63 deletions
+4 -5
View File
@@ -110,7 +110,7 @@ func ParseAnnounce(r *http.Request, opts ParseOptions) (*bittorrent.AnnounceRequ
// Parse the IP address where the client is listening.
request.RequestAddresses = requestedIPs(r, qp, opts)
if err = bittorrent.SanitizeAnnounce(request, opts.MaxNumWant, opts.DefaultNumWant); err != nil {
if err = bittorrent.SanitizeAnnounce(request, opts.MaxNumWant, opts.DefaultNumWant, opts.FilterPrivateIPs); err != nil {
request = nil
}
@@ -135,7 +135,7 @@ func ParseScrape(r *http.Request, opts ParseOptions) (*bittorrent.ScrapeRequest,
RequestAddresses: requestedIPs(r, qp, opts),
}
err = bittorrent.SanitizeScrape(request, opts.MaxScrapeInfoHashes)
err = bittorrent.SanitizeScrape(request, opts.MaxScrapeInfoHashes, opts.FilterPrivateIPs)
return request, err
}
@@ -169,9 +169,8 @@ func requestedIPs(r *http.Request, p bittorrent.Params, opts ParseOptions) (addr
}
func parseRequestAddress(s string, provided bool) (ra bittorrent.RequestAddress) {
a, e := netip.ParseAddr(s)
if e == nil {
ra.Addr, ra.Provided = a, provided
if addr, err := netip.ParseAddr(s); err == nil {
ra.Addr, ra.Provided = addr, provided
}
return
}