| Title: Port of the Week: Presenting Syncthing | |
| Author: Solène | |
| Date: 04 October 2023 | |
| Tags: syncthing privacy security networking | |
| Description: In this article, I will share about the very good | |
| synchronization software Syncthing and present its features | |
| # Introduction | |
| Today's "port of the week" article is featuring Syncthing, a file | |
| synchronization software. | |
| Syncthing official project website | |
| Related blog posts: | |
| Blog post about the complementary Relay server | |
| Blog post about the complementary discovery server | |
| # Quick intro | |
| As stated earlier, Syncthing is a network daemon that synchronize files | |
| between computers/phones. Each Syncthing instance must know the other | |
| instance ID to trust them and find them over the network. The transfer | |
| are encrypted and efficient, the storage itself can be encrypted. | |
| Some Syncthing vocabulary: | |
| * a folder: a local directory that is shared with a remote device, | |
| * a remote device: a remote computer running Syncthing, each of them | |
| have a unique ID and a user-defined name, you can choose which shared | |
| folders you want to synchronize with them | |
| * an item: this word appears when syncing two remotes, an item can be | |
| either a directory or a file that isn't synchronized yet | |
| * a discovery server: a server which helps remotes finding known | |
| remotes over the Internet, or in the worst case scenario, relays data | |
| from a remote to another if they can't communicate directly | |
| # Interesting features | |
| I gathered a list of interesting features that you may find interesting | |
| in Syncthing. | |
| ## Security: authentication and encryption | |
| When you need to add a new remote, you need to add the remote's ID on a | |
| Syncthing and trust that one on the remote one. The ID is a human | |
| representation of the Syncthing instance certificate fingerprint. When | |
| you exchange ID, you are basically asked to review each certificate and | |
| allow each instance to trust the other. | |
| All network transfers occurring between two Syncthing are encrypted | |
| using TLS, as the remote certificate can be checked, the incoming data | |
| integrity can be verified and authenticated. | |
| Syncthing official documentation about security principles in the software | |
| ## Relaying | |
| I guess this is Syncthing killer feature. Connecting two remotes is | |
| very easy and file transfer between them can bypass firewalls and NATs. | |
| This works because the Syncthing offers a default discovery server | |
| which has two purposes: | |
| * if the two servers could potentially communicate to each other but | |
| are behind NATs, it does what we call "hole punching" to establish a | |
| connection between the two remotes and allow them to transfer directly | |
| from one to the other | |
| * if the two servers can't communicate to each other, the discovery | |
| server acts as a relay for the data | |
| The file transfer is still encrypted, but having a third party server | |
| involved may rise privacy issues, and security risks if a vulnerability | |
| can be exploited. | |
| My next blog post will show how to self-host your own Syncthing relay, | |
| for better privacy and even more complicated setups! | |
| Note that the discovery server or the relaying can be disabled! You | |
| could also build a mesh VPN and run Syncthing on each node without | |
| using any relay or discovery server. | |
| ## Built-in file versioning | |
| This may be my preferred feature in Syncthing! | |
| On a given Syncthing instance, you can enable per shared folder a | |
| retention policy, aka file versioning in the interface. | |
| Basically, if a file is modified / removed in the share by a remote, | |
| the local instance can keep a hidden copy for a while. | |
| There are different versioning modes, from a simple "trash bin" style | |
| keeping the files for n days, or more elaborated policies like you | |
| could have in backup tools. | |
| Syncthing official documentation about file versioning | |
| ## Partial share synchronization | |
| For each share, it's possible to write an exclusion filter, this allows | |
| you to either discard sync changes for some pattern (like excluding vim | |
| swap files) or entire directories if you don't want to retrieve all the | |
| shared folder. | |
| The filter works in both way, if you accept a remote, you could write a | |
| filter before starting the synchronization and remove some huge | |
| directories you may not want locally. But this could also allow | |
| preventing a directory to be sent to the remotes, like a temporary | |
| directory for instance. | |
| This is a topic I covered with a very specific use case, only sync a | |
| single file in a directory. | |
| Earlier blog post: Configure Syncthing to sync a single file | |
| ## Encrypted remotes | |
| A pretty cool feature I found recently was the support for encrypted | |
| shared folders per remote. I'm using syncthing to keep my KeepassXC | |
| databases synchronized between my computers. | |
| As I don't always have at least two of my computers turned ON at the | |
| same time, they can't always synchronize directly with each other, so I | |
| use a remote dedicated server as a buffer to hold the files, Syncthing | |
| encryption is activated for this remote, both my computers can exchange | |
| data with it, but on the server itself you can't get my KeepassXC | |
| databases. | |
| This is also pretty cool as it doesn't leave any readable data on the | |
| storage drive if you use 3rd party systems. | |
| Taking the opportunity here, KeepassXC has a cool feature that allows | |
| you to add a binary file as a key in addition to a password / FIDO key. | |
| If this binary file isn't part of the synchronized directory, even | |
| someone who could access your KeepassXC database and steal your | |
| password shouldn't be able to use it. | |
| ## Data chunk based | |
| When Syncthing scans a directory, it will hash all the file into chunks | |
| and synchronize all these chunks to other remotes, this is basically | |
| how BitTorrent work too. | |
| This may sound boring, but basically, this allows Syncthing to move or | |
| rename files on a remote instead of transferring the data again when | |
| you rename / move files in a local shared directory. Indeed, only the | |
| changed paths list is sent, and the chunks used in the files, as the | |
| files already exist on the remote, the data chunks don't have to be | |
| retrieved. | |
| Note that this doesn't work for encrypted remotes as the chunks contain | |
| some path information, once encrypted, the same file with different | |
| paths will look as two different encrypted chunks. | |
| ## Bandwidth control | |
| Syncthing GUI allows you to define inbound or outbound bandwidth | |
| limitation, either globally or per remote. If like me, you have a slow | |
| ADSL line with slow upload, you may want to limit the bandwidth used to | |
| send data to set the non-local remotes. | |
| ## Support for all attributes synchronization | |
| This may sound more niche, but it's important for some users: Syncthing | |
| can synchronize file permissions, ownership or even extended | |
| attributes. This is not enabled by default as Syncthing requires | |
| elevated privileges (typically running as root) to make it work. | |
| ## Runs everywhere | |
| Syncthing is a Go program, it's a small binary with no dependencies, | |
| it's quite portable and runs on Linux, all the BSD, Android, Windows, | |
| macOS etc... There is nothing worse than a synchronization utility | |
| that can't be installed on a specific computer... | |
| # Conclusion | |
| I really love this software, especially since I figured the file | |
| versioning and the encrypted remotes, now I don't fear conflicts or | |
| lost files anymore when syncing my files between computers. | |
| My computers also use a local discovery server that allows my Qubes OS | |
| to be kept in sync together over the LAN. | |
| # Note for SystemD users | |
| When you install Syncthing on your system, you can enable the service | |
| as your user, this will make Syncthing start properly when you log in | |
| with your user: | |
| ``` | |
| systemctl enable --user syncthing.service | |
| ``` | |
| # Note for OpenBSD users | |
| Syncthing has to listen for each file change, you will need to increase | |
| the maximum opened files limit for your user, and maybe the limit in | |
| the kernel using the according sysctl. | |
| You can find more detailed information about using Syncthing on OpenBSD | |
| in the file `/usr/local/share/doc/pkg-readmes/syncthing`. |