🌐saned – Scanner im Netzwerk teilen

Hängt der Scanner an einem anderen Rechner, reicht das net-Backend jeden SANE-Aufruf über TCP an den Dienst saned weiter. Der ruft auf seiner Seite die ganz normalen Backends auf – für das Frontend sieht der entfernte Scanner aus wie ein lokaler.

🧭Der Weg eines Aufrufs

  Laptop (Client)                                        scanner.example.org (Server)
 ┌──────────────────────┐                               ┌──────────────────────────────┐
 │ simple-scan          │                               │ systemd: saned.socket :6566  │
 │   │ sane_open(       │                               │   └► saned@.service (saned)  │
 │   │ "net:scanner.    │   TCP 6566  Steuerung (RPC)   │        │ sane_open("pixma:…")│
 │   │  example.org:    │ ────────────────────────────► │        ▼                     │
 │   ▼  pixma:…")       │                               │      libsane (dll)           │
 │ libsane (dll)        │   TCP 10000-10100  Bilddaten  │        ▼                     │
 │   └► net-Backend     │ ◄════════════════════════════ │      pixma-Backend ── USB ──►🖨️
 │      net.conf        │                               │      saned.conf (Zugriff)    │
 └──────────────────────┘                               └──────────────────────────────┘
💡 Zwei Verbindungen
Steuerung über 6566/tcp (Dienstname sane-port). Nach SANE_NET_START nennt der Server einen zweiten Port für die Bilddaten – festlegbar mit data_portrange.
⚠️ Keine Verschlüsselung
saned überträgt Bilder und Passwörter ungeschützt. Die Manpage empfiehlt, im offenen Netz einen sicheren Tunnel (z. B. SSH/VPN) zu nutzen, und saned nie als root laufen zu lassen.
✅ Endlosschleife vermeiden
Standardmäßig benutzt saned selbst keine Netzwerk-Scanner (Option -n erlaubt es) – sonst könnte er sich über das net-Backend selbst fragen.

🛡️Wer darf scannen? (saned.conf)

saned vergleicht die Adresse des Clients mit der Zugriffsliste: Hostnamen, IP-Adressen oder Netze in CIDR-Schreibweise. localhost ist immer erlaubt.

Eine Zeile mit nur + erlaubt jeden Host – laut saned(8) ein Sicherheitsrisiko.

✅ Zugriff erlaubt
Regel: 192.0.2.0/24

⚙️Einrichten

🖥️ Server (am Scanner)

# Debian/Ubuntu
sudo apt install sane-utils

# Zugriff erlauben
echo '192.0.2.0/24' | sudo tee -a /etc/sane.d/saned.conf

# lokal testen – der Scanner muss hier funktionieren
scanimage -L

# Dienst über systemd-Socket aktivieren
sudo systemctl enable --now saned.socket
ss -ltn 'sport = :6566'

💻 Client

# net muss in /etc/sane.d/dll.conf aktiv sein
grep -n '^net' /etc/sane.d/dll.conf

# Server eintragen
echo 'scanner.example.org' | sudo tee -a /etc/sane.d/net.conf
# optional: connect_timeout = 5

# oder nur für diese Sitzung
export SANE_NET_HOSTS=scanner.example.org
scanimage -L
device `net:scanner.example.org:pixma:12345678_ABCDEF' is a …

🔬Das Protokoll auf dem Draht

Das SANE-Netzwerkprotokoll ist ein einfaches RPC-Protokoll: Der Client schickt einen RPC-Code und die Argumente, der Server antwortet. Alle Zahlen sind 4-Byte-Words in Netzwerk-Byte-Reihenfolge (big-endian).
Schritt 1 / 10 · Tasten ← →
Client (net)sanedSANE_NET_INIT (0)Antwort INITSANE_NET_OPEN (2)Antwort OPENSANE_NET_START (7)Antwort STARTDatensätze · Port 10042SANE_NET_CANCEL (8)SANE_NET_CLOSE (3)SANE_NET_EXIT (10)
Steuerverbindung :6566

SANE_NET_INIT (0)

00 00 00 00 01 00 00 03 00 00 00 05 61 6e 6e 61 00
17 Bytes · alle Words big-endian

RPC-Code 0, dann Versionscode des Clients – im Build-Feld steht die Protokollversion (hier 3) – und der Benutzername.

Vereinfacht: zwischen OPEN und START holt der Client außerdem die Optionsdeskriptoren (4), setzt Optionen (5) und fragt die Parameter ab (6). Benutzername und Werte sind Beispiele.

RPC-CodeNameZweck
0SANE_NET_INITVerbindung aufbauen, Versionscode + Benutzername austauschen
1SANE_NET_GET_DEVICESGeräteliste des Servers abfragen
2SANE_NET_OPENentferntes Gerät öffnen (ggf. mit Autorisierung)
3SANE_NET_CLOSEGerät schließen
4SANE_NET_GET_OPTION_DESCRIPTORSalle Optionsdeskriptoren auf einmal holen
5SANE_NET_CONTROL_OPTIONOption lesen, setzen oder auf automatisch stellen
6SANE_NET_GET_PARAMETERSBildparameter abfragen
7SANE_NET_STARTScan starten – Antwort enthält den Port der Datenverbindung
8SANE_NET_CANCELlaufenden Scan abbrechen
9SANE_NET_AUTHORIZEBenutzer/Passwort für eine Ressource senden
10SANE_NET_EXITSitzung beenden, Verbindung schließen