diff --git a/changelog/unreleased/issue-3667 b/changelog/unreleased/issue-3667
new file mode 100644
index 000000000..bd2613dad
--- /dev/null
+++ b/changelog/unreleased/issue-3667
@@ -0,0 +1,8 @@
+Bugfix: restic mount now reports symlinks sizes
+
+Symlinks used to have size zero in restic mountpoints, confusing some
+third-party tools. They now have a size equal to the byte length of their
+target path, as required by POSIX.
+
+https://github.com/restic/restic/issues/3667
+https://github.com/restic/restic/pull/3668
diff --git a/internal/fuse/link.go b/internal/fuse/link.go
index 23752f781..6953ecfb3 100644
--- a/internal/fuse/link.go
+++ b/internal/fuse/link.go
@@ -1,3 +1,4 @@
+//go:build darwin || freebsd || linux
 // +build darwin freebsd linux
 
 package fuse
@@ -40,6 +41,8 @@ func (l *link) Attr(ctx context.Context, a *fuse.Attr) error {
 	a.Mtime = l.node.ModTime
 
 	a.Nlink = uint32(l.node.Links)
+	a.Size = uint64(len(l.node.LinkTarget))
+	a.Blocks = 1 + a.Size/blockSize
 
 	return nil
 }
diff --git a/internal/fuse/snapshots_dir.go b/internal/fuse/snapshots_dir.go
index 34484b597..4371f6568 100644
--- a/internal/fuse/snapshots_dir.go
+++ b/internal/fuse/snapshots_dir.go
@@ -440,6 +440,8 @@ func (l *snapshotLink) Readlink(ctx context.Context, req *fuse.ReadlinkRequest)
 func (l *snapshotLink) Attr(ctx context.Context, a *fuse.Attr) error {
 	a.Inode = l.inode
 	a.Mode = os.ModeSymlink | 0777
+	a.Size = uint64(len(l.target))
+	a.Blocks = 1 + a.Size/blockSize
 	a.Uid = l.root.uid
 	a.Gid = l.root.gid
 	a.Atime = l.snapshot.Time