Commit graph

1524 commits

Author SHA1 Message Date
Renovate Bot
5fb1290fd0 chore(deps): update module github.com/prometheus/client_golang to v1.20.1 2024-08-22 11:10:40 +00:00
Renovate Bot
44a962316c
chore(deps): update module github.com/miekg/dns to v1.1.62 2024-08-22 11:18:02 +01:00
Renovate Bot
450c309653
chore(deps): update module golang.org/x/net to v0.28.0 2024-08-22 11:00:07 +01:00
meskio
240dd3af3c
Merge remote-tracking branch 'gitlab/mr/365' 2024-08-22 11:46:35 +02:00
Renovate Bot
f6320e42f0 chore(deps): update docker.io/library/golang docker tag to v1.23 2024-08-22 05:12:30 +00:00
Renovate Bot
937860b1bb
chore(deps): update module golang.org/x/crypto to v0.26.0 2024-08-22 05:59:24 +01:00
David Fifield
bb2126b7c6
Use %w, not %v, in fmt.Errorf, so errors can be unwrapped.
https://go.dev/blog/go1.13-errors#wrapping-errors-with-w
2024-08-21 17:00:18 -04:00
WofWca
062411143c
docs: fix example server library usage
`Listen` now accepts `numKCPInstances`
2024-08-21 16:23:12 -04:00
WofWca
677146c9d5 add test_bridgeList.txt file
As an example for the `bridge-list-path` parameter
2024-08-21 20:50:59 +04:00
obble
a6d4570c23
Fix log message in CopyLoop 2024-08-21 16:06:41 +01:00
obble
1d6a2580c6 Improving Snowflake Proxy Performance by Adjusting Copy Buffer Size
TL;DR: The current implementation uses a 32K buffer size for a total of 64K of
buffers/connection, but each read/write is less than 2K according to my measurements.

# Background

The Snwoflake proxy uses as particularly hot function `copyLoop`
(proxy/lib/snowflake.go) to proxy data from a Tor relay to a connected client.
This is currently done using the `io.Copy` function to write all incoming data
both ways.

Looking at the `io.Copy` implementation, it internally uses `io.CopyBuffer`,
which in turn defaults to a buffer of size 32K for copying data (I checked and
the current implementation uses 32K every time).

Since `snowflake-proxy` is intended to be run in a very distributed manner, on
as many machines as possible, minimizing the CPU and memory footprint of each
proxied connection would be ideal, as well as maximising throughput for
clients.

# Hypothesis

There might exist a buffer size `X` that is more suitable for usage in `copyLoop` than 32K.

# Testing

## Using tcpdump

Assuming you use `-ephemeral-ports-range 50000:51000` for `snowflake-proxy`,
you can capture the UDP packets being proxied using

```sh
sudo tcpdump  -i <interface> udp portrange 50000-51000
```

which will provide a `length` value for each packet captured. One good start
value for `X` could then be slighly larger than the largest captured packet,
assuming one packet is copied at a time.

Experimentally I found this value to be 1265 bytes, which would make `X = 2K` a
possible starting point.

## Printing actual read

The following snippe was added in `proxy/lib/snowflake.go`:

```go
// Taken straight from standardlib io.copyBuffer
func copyBuffer(dst io.Writer, src io.Reader, buf []byte) (written int64, err error) {
	// If the reader has a WriteTo method, use it to do the copy.
	// Avoids an allocation and a copy.
	if wt, ok := src.(io.WriterTo); ok {
		return wt.WriteTo(dst)
	}
	// Similarly, if the writer has a ReadFrom method, use it to do the copy.
	if rt, ok := dst.(io.ReaderFrom); ok {
		return rt.ReadFrom(src)
	}
	if buf == nil {
		size := 32 * 1024
		if l, ok := src.(*io.LimitedReader); ok && int64(size) > l.N {
			if l.N < 1 {
				size = 1
			} else {
				size = int(l.N)
			}
		}
		buf = make([]byte, size)
	}
	for {
		nr, er := src.Read(buf)
		if nr > 0 {
			log.Printf("Read %d", nr) // THIS IS THE ONLY DIFFERENCE FROM io.CopyBuffer
			nw, ew := dst.Write(buf[0:nr])
			if nw < 0 || nr < nw {
				nw = 0
				if ew == nil {
					ew = errors.New("invalid write result")
				}
			}
			written += int64(nw)
			if ew != nil {
				err = ew
				break
			}
			if nr != nw {
				err = io.ErrShortWrite
				break
			}
		}
		if er != nil {
			if er != io.EOF {
				err = er
			}
			break
		}
	}
	return written, err
}
```

and `copyLoop` was amended to use this instead of `io.Copy`.

The `Read: BYTES` was saved to a file using this command

```sh
./proxy -verbose -ephemeral-ports-range 50000:50010 2>&1 >/dev/null  | awk '/Read: / { print $4 }' | tee read_sizes.txt
```

I got the result:

min: 8
max: 1402
median: 1402
average: 910.305

Suggested buffer size: 2K
Current buffer size: 32768 (32K, experimentally verified)

## Using a Snowflake Proxy in Tor browser and use Wireshark

I also used Wireshark, and concluded that all packets sent was < 2K.

# Conclusion

As per the commit I suggest changing the buffer size to 2K. Some things I have not been able to answer:

1. Does this make a big impact on performance?
1. Are there any unforseen consequences? What happens if a packet is > 2K (I
	 think the Go standard libary just splits the packet, but someone please confirm).
2024-08-21 15:02:15 +00:00
meskio
d25b8306ea
Merge remote-tracking branch 'gitlab/mr/364' 2024-08-21 13:16:02 +02:00
Renovate Bot
5b4caa23e1 chore(deps): update module github.com/aws/aws-sdk-go-v2/service/sqs to v1.34.4 2024-08-21 10:30:24 +00:00
Renovate Bot
b70c060080
chore(deps): update module github.com/aws/aws-sdk-go-v2/credentials to v1.17.28 2024-08-21 11:06:51 +01:00
WofWca
103278d6fa
docs(broker): clarify allowed-relay-pattern
Specify that the broker will reject proxies
whose AcceptedRelayPattern is more restrictive than this,
and not less restrictive.

The parameter was introduced here
https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/merge_requests/87
> The proxy sends its allowed URL pattern to the broker.
> The broker rejects proxies that are too restrictive.
2024-08-20 12:43:31 +01:00
meskio
6d2011ded7
Report a different implementation for client and server 2024-08-07 12:33:37 +02:00
Renovate Bot
92f21539f2 chore(deps): update module github.com/pion/webrtc/v3 to v3.2.50 2024-08-02 03:44:34 +00:00
David Fifield
f25b293fb5 Comment typo. 2024-08-02 03:36:37 +00:00
David Fifield
ee5f815f60 Cosmetic changes from dev-snowflake-udp-rebase-extradata.
https://gitlab.torproject.org/shelikhoo/snowflake/-/tree/dev-snowflake-udp-rebase-extradata
commit 59b76dc68d2ee0383c2acd91cb0f44edc46af939
2024-08-01 22:12:56 +00:00
meskio
a93b4859c7
Merge remote-tracking branch 'gitlab/mr/354' 2024-08-01 17:47:19 +02:00
Renovate Bot
21fef74c52 chore(deps): update module github.com/xtaci/smux to v1.5.27 2024-08-01 14:42:28 +00:00
Renovate Bot
8f93d08d71
chore(deps): update module github.com/refraction-networking/utls to v1.6.7 2024-08-01 15:08:32 +01:00
Renovate Bot
308e1816f2
chore(deps): update module github.com/aws/aws-sdk-go-v2/service/sqs to v1.34.3 2024-08-01 12:29:42 +01:00
meskio
f64f234eeb
New ptuitl/safeprom doesn't have Rounded in the type names
This version fixes the test issue of double registering metrics.

* Closes: #40367
2024-07-11 17:45:57 +02:00
meskio
9e977fe6ca
Report the version of snowflake to the Tor process 2024-07-11 13:39:56 +02:00
Arlo Breault
ffdda1358a
Indicate modified in version string
issue 40365
2024-07-11 11:46:57 +01:00
meskio
e2ba4d3539
Merge remote-tracking branches 'gitlab/mr/342', 'gitlab/mr/344' and 'gitlab/mr/345' 2024-07-08 08:37:04 +02:00
Renovate Bot
c21ed7d90f chore(deps): update module github.com/pion/webrtc/v3 to v3.2.44 2024-07-02 15:11:12 +00:00
Renovate Bot
cf1023303a chore(deps): update module github.com/aws/aws-sdk-go-v2 to v1.30.1 2024-06-29 22:09:27 +00:00
Renovate Bot
4b37dd3a19 chore(deps): update gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/ptutil digest to e8254c0 2024-06-29 22:09:23 +00:00
Renovate Bot
d94783223d
chore(deps): update module github.com/pion/webrtc/v3 to v3.2.43
Signed-off-by: Cecylia Bocovich <cohosh@torproject.org>
2024-06-29 17:35:19 -04:00
Cecylia Bocovich
3c0a006369
Revert "chore(deps): update gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/ptutil digest to e8254c0"
This reverts commit bd04c0f307.
2024-06-29 17:34:28 -04:00
Renovate Bot
bd04c0f307
chore(deps): update gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/ptutil digest to e8254c0
Signed-off-by: Cecylia Bocovich <cohosh@torproject.org>
2024-06-28 13:47:21 -04:00
meskio
5f0c0c965b
Merge remote-tracking branch 'gitlab/mr/341' 2024-06-27 10:17:44 +02:00
Renovate Bot
c221f70b7a chore(deps): update module github.com/aws/aws-sdk-go-v2/credentials to v1.17.22 2024-06-26 19:10:59 +00:00
Renovate Bot
843d9a9c36
chore(deps): update module github.com/pion/transport/v2 to v2.2.5 2024-06-24 12:25:04 +01:00
meskio
455f9d6eda
Merge remote-tracking branch 'gitlab/mr/335' 2024-06-20 09:31:39 +02:00
Renovate Bot
e821930c43 chore(deps): update module github.com/aws/aws-sdk-go-v2/config to v1.27.21 2024-06-19 19:17:18 +00:00
meskio
b8f130e210
Merge remote-tracking branch 'gitlab/mr/332' 2024-06-19 09:47:30 +02:00
Renovate Bot
618b19a0ab chore(deps): update module github.com/aws/aws-sdk-go-v2/config to v1.27.20 2024-06-18 19:16:39 +00:00
Renovate Bot
e73c6f3d71
chore(deps): update module github.com/gorilla/websocket to v1.5.3
Signed-off-by: Cecylia Bocovich <cohosh@torproject.org>
2024-06-17 20:35:22 -04:00
Renovate Bot
b40137f1fe
chore(deps): update gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/ptutil digest to 6a4a471
Signed-off-by: Cecylia Bocovich <cohosh@torproject.org>
2024-06-17 19:18:11 -04:00
Renovate Bot
e5f4e9d455
chore(deps): update module github.com/aws/aws-sdk-go-v2/config to v1.27.19
Signed-off-by: Cecylia Bocovich <cohosh@torproject.org>
2024-06-17 19:15:49 -04:00
meskio
b83ef3f385
Merge remote-tracking branch 'gitlab/mr/327' 2024-06-12 10:47:04 +02:00
Renovate Bot
f5d4aabd7b chore(deps): update module github.com/pion/webrtc/v3 to v3.2.42 2024-06-11 18:16:22 +00:00
meskio
985bf9ee1c
Merge remote-tracking branches 'gitlab/mr/318' and 'gitlab/mr/326' 2024-06-11 08:58:50 +02:00
Renovate Bot
e84bddb296 chore(deps): update module golang.org/x/sys to v0.21.0 2024-06-10 16:10:34 +00:00
Renovate Bot
7306b3a29d chore(deps): update module github.com/aws/aws-sdk-go-v2/service/sqs to v1.32.6 2024-06-10 12:54:10 +00:00
itchyonion
4ed5da7f2f
Simplify proxy NAT checking logic 2024-05-28 12:30:44 -07:00
Renovate Bot
54495ceb4e chore(deps): update module github.com/aws/aws-sdk-go-v2/config to v1.27.13 2024-05-13 11:09:20 +00:00