Snowflake Operator Documentation

Hello :waving_hand:

I’ve decided to obtain a dedicated server to help contribute and it’s working great! I’ve noticed the server standalone gets significantly more connections. :tada:

I really think the available flags should be listed on:
https://community.torproject.org/relay/setup/snowflake/standalone/docker/

Or even better yet, a link to a cheat sheet for the available flags and common commands for operators. I was not able to find anything of the sorts. What I did find was this list of commands and some developers talking about things like -outbound-address:
https://pkg.go.dev/github.com/tgragnato/snowflake/proxy#section-readme

To be completely honest, I know they are working (19-60 connections each per hour) but not 100% they are configured properly just because it seems like there is a massive lack of central documentation. Several posts on this forum did help though!

Maybe it’s just me and my Google dorking is lacking :man_shrugging:

2 Likes

Hi!

I agree, Snowflake’s documentation is not super well-structured. But not to say that it’s horrible.

If you are getting clients, everything is almost certainly working, and you don’t need to worry.

Note that this is simply because the standalone proxy wants to get more clients (smaller poll interval). There is not a linear dependence between the amount of clients or traffic your proxy gets and how useful it is.

1 Like

I agree about the docs. They are a bit lean. It can get discouraging for a first time guy.

When I did mine I used:
Tor Project | Standalone Snowflake proxy Compile Snowflake proxy from the source

For a brand new user who wants to do this Snowflake Proxy Server thing, here are my observations.

In step 1 they say:
If you are running Ubuntu or Debian, you can install Go by executing sudo apt install golang. DON’T. On Ubuntu you will get an old version.
There is a line saying: You will need Go 1.21 or newer to run the Snowflake proxy and a link “installation instructions”. Use that instead.

step 5. Make sure the proxy is started after a reboot of the system

I added " sleep 180 && " before nohup because I found that the network may not be totally ready when this occurs and the proxy does not start.

In step 1 of the GO installation instructions it says:
Remove any previous Go installation blah blah blah and they give you the following command to copy and paste: DON’T.
$ rm -rf /usr/local/go && tar -C /usr/local -xzf go1.25.0.linux-amd64.tar.gz

Because you are new, there is no GO version so the first command “rm” won’t work and thus the tar won’t execute. Only use the tar command. The rest is good.

2 Likes

Don’t understand this. 16 clients is better or more useful than 1 on the browser version. Maybe I read this wrong.

Yeah, it’s largely a skill issue, hope to see more get involved. It is surprising there isn’t a dedicated wiki (that I found). I’m guessing it’s probably because just the easy browser plugin is what is pushed the most?

And per the poll interval comment, I’m not sure what it is for the browser plugins but on docker you can use the flag -poll-interval 2s (default is 5s). I’m thinking the other posters point may be it’s more dependent on network demand and server capacity than anything else?

It’s not. You’re just forcing the clients to connect to your proxy instead of someone else’s.

In the context of this thread or any about Snowflake proxy, maybe you are reading it wrong. We were referring to adding (or encouraging) more proxy connections and that 32 is better than 16 and 16 is better than 1 (as an extension). Of course if your resources can handle it. In any case this is what I was saying.

I’m sure we are not saying there are too many connections available and that adding 16 more is not useful because I’m only forcing someone to use mine instead of some other… maybe there are too many. I have no idea.

Off-topic about “is more connections good”

It’s not that there is “too many” proxies. There is just “enough” (unless there is a disruption). When a client requests a proxy, a proxy is (almost) always available. It’s only a matter of which proxy to pick.

I almost wish I had not read that. Makes me wonder why I got into this and why I persist. I had read that unrestricted proxies were few compared to the restricted version and in demand. For anyone else reading this thread it must not be too encouraging to set one up.

1 Like

I suspect, demand is only going to grow. The recent spikes in Snowflake metrics show exactly why every proxy matters. Every proxy absorbs traffic surges, adds redundancy, and directly increases the chances that someone under censorship can reach the open internet.

Although, I do believe it should be easier to setup with clear documentation. Might be something I try to dig into more, feels difficult contributing not being a developer, so I’m trying to contribute where possible.

1 Like

Sorry :sweat_smile:
I didn’t mean it in a way “don’t set up a proxy”. I only meant “don’t try to take clients from other proxies”.
Of course the more proxies there are the better. The Snowflake’s strength is in numbers.

Thanks for sharing the Snowflake Operator documentation it’s really helpful to see the details around deployment, configuration, and security considerations. One thing I’m curious about: are there any recommended practices for handling NAT traversal or scaling node pools dynamically? That could add a lot of value for people running Snowflake in variable network conditions or under load.

1 Like

Not exactly sure what that is asking but… When I started this, an operator suggested 2.5 ports per connection allowed. I did not like muliplying by half so I used 3. I allow only 9 connections but forwarded 36 ports which allows me to up my connections to 12 if I want.

By dynamic I presume “on the fly”. I saw none of this. If I now want to allow 10 connections I need to restart the proxy thus kicking everyone off. It would be nice if I could change the startup parameters “on the fly” like -capacity 10

More observations:
If you want to try the -metric option, a Maxmind database is needed and you need an account with a valid email. They do 2FA every time you log in with that email so a throw away may not be ideal. You need GeoLite2-Country.mmdb then need to convert this into 2 CSV files using the Python script mmdb-convert.py and nowhere is it stated where this is. It’s here: GitHub - nmathewson/mmdb-convert: simple pure-python tool to parse mmdb files and convert them to the old format Tor uses

Those 2 files live in /usr/share/tor/ and it is not stated anywhere… kinda not really. It’s in broker.go but you really have to fish to get this.
/usr/share/tor/geoip
/usr/share/tor/geoip6

Let me make a correction to the last post. You DO NOT need to use Maxmind.

If you have any version of Tor Browser then you can use the ones supplied with it and check the dates in it to keep it up to date. The current ones are dated June 25, 2025.

OR as I found out, you can simply download any version of the Tor-Expert-Bundle which has the same date.

I mentioned Maxmind because I already use it for something else.

1 Like