-- Leo's gemini proxy

-- Connecting to perso.pw:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini;

Run your own Syncthing discovery server on OpenBSD


Author: Solène

Date: 18 October 2023

Tags: syncthing openbsd privacy security networking


Comment on Mastodon


Introduction


In a previous article, I covered the software Syncthing and mentioned a specific feature named "discovery server".


The discovery server is used to allow clients to connect each other through NATs to help connect each other, this is NOT a relay server (which is a different service) that serves as a proxy between clients.


A motivation to run your own discovery server(s) would be for security, privacy or performance reasons.


security: using global servers with the software synchronizing your data can be dangerous if a remote exploit is found in the protocol, running your own server will reduce the risks

privacy: the global servers know a lot about your client if you sync online: time of activity, IP address, number of remote nodes, the ID of everyone involved etc...

my specific use case where I have two Qubes OS computer with multiple syncthing inside, they can't see each other as they are in separate networks, and I don't want the data to go through my slow ADSL to sync locally...


Let's see how to install your own Syncthing discovery daemon on OpenBSD.


Syncthing discovery daemon documentation


Related blog posts


Presenting Syncthing features

Blog post about the complementary Relay server


Setup


On OpenBSD, the binary we need is provided by syncthing package.


# pkg_add syncthing

The relay service is done by the binary `stdiscosrv`, you need to create a service file to enable it at boot. We can use the syncthing service file as a template for the new one. In OpenBSD-current and from OpenBSD 7.5 the rc file will be installed with the package.


# sed '/^daemon=/ s/syncthing/stdiscosrv/ ; /flags/ s/".*"/""/' /etc/rc.d/syncthing > /etc/rc.d/syncthing_discovery
# chmod a+x /etc/rc.d/syncthing_discovery

You created a service named `syncthing_discovery`, it's time to enable and start it.


# rcctl enable syncthing_discovery

You need to retrieve the line "Server device IS is XXXX-XXXX......" from the output, keep the ID (which is the XXXX-XXXX-XXXX-XXXX part) because we will need to reuse it later. We will start the service in debug mode to display the binary output in the terminal.


# rcctl -d start syncthing_discovery

Make sure your firewall is correctly configured to let pass incoming connections on port TCP/8443 used by the discovery daemon.


Client configuration


On the client Web GUI, click on "Actions" and "Settings" to open the settings panel.


In the "Connections tab", you need to change the value of "Global Discovery servers" from "Default" to `https://IP:8443/?id=ID` where IP is the IP address where the discovery daemon is running, and ID is the value retrieved at the previous step when running the daemon.


Depending on your use case, you may want to have the global discovery server plus yours, it's possible to use multiple servers, in which case you would use the value `default,https://IP:8443/?id=ID`.


Conclusion


If you change the default discovery server by your own, make sure all the peers can reach it, otherwise your syncthing clients may not be able to connect to each other.


Going further


By default, the discovery daemon will generate self-signed certificate, you could use a Let's Encrypt certificate if you prefer.


There are some other options like prometheus export for getting metrics or changing the connection port, you will find all the extra options in the documentation / man page.

-- Response ended

-- Page fetched on Mon May 6 10:21:11 2024