Netzwerk-Segmentierung und mDNS (Bonjour & AirPrint)
Das flache Netzwerk-Strukturen keine besonders gute Idee sind, sollte inzwischen allen Netzwerk-Admins bekannt sein. Es ist gängige Praxis in Firmen-Netzwerken Multifunktionsgeräte und Drucker in eigene Netzwerksegmente zu verschieben und für den Benutzer nur noch über den Printserver erreichbar zu machen. Das Problem dabei: Durch das wegsegmentieren der Drucker in ein eigenes Subnetz funktioniert AirPrint nicht mehr. Die Drucker werden auf Mobilen Endgeräten wie iPhones und iPads nicht mehr gefunden, auch wenn man zwischen dem Client- und dem Drucker-Netz ein Routing einrichtet und alle Ports vom Client- ins Druckernetz öffnet.
Ursache für das Problem ist, dass AirPrint die Drucker mit mDNS (im Apple Jargon Bonjour genannt) findet. Multicast DNS (so nennt sich mDNS voll ausgeschrieben) ist, wie der Name es schon sagt, ein Multicast Protokoll. Im Prinzip teilen bei einer Multicast-Abfrage alle kompatiblen Geräte mit welche Dienste unter welchem Port angeboten werden. Da Multicast-Abfragen standardmässig nicht geroutet werden, landet die Abfrage aus dem Client-Netz trotz Routing nie im Drucker-Netz.
Die Lösung für dieses Problem sind mDNS Reflektoren (mDNS reflector). Einige Firewalls (z.B. UniFi USGs) haben dies bereits integriert und standardmässig aktiviert. Bei anderen (z.B. OpenWrt) kann die Funktion nachinstalliert oder konfiguriert werden.
Einige Firewall-Hersteller (z.B. Sophos XG) unterstützen keine mDNS Reflektoren. Hier muss man sich mit einer kleinen Linux VM mit jeweils einem Netzwerk-Interface im Client-Netz als auch im Drucker-Netz behelfen. Als mDNS Reflector hat sich Avahi bewährt. Nachfolgend eine kurze Anleitung für die Installation eines Avahi mDNS Reflektors auf einer Ubuntu Server VM.
Installations-Anleitung
Schritt 1: Ubuntu Server installieren
Ubuntu Server installieren. Ich empfehle openSSH mit zu installieren dies vereinfach die Administration. Sofern DHCP sowohl im Druckernetz als auch im Client-Netz verfügbar ist, kann der Server problemlos in den Standard-Einstellungen installiert werden. Ansonsten müssen die Interfaces konfiguriert werden.
Schritt 2: Avahi installieren
Avahi und einige unterstützende Pakete installieren.
$ sudo apt-get install avahi-daemon avahi-utils
Schritt 3: Avahi konfigurieren
Standardmässig ist avahi ein mDNS Server und advertised eigene Dienste. Die Funktion mDNS Reflector ist standardmässig deaktiviert und in der Konfiguration auskommentiert. Die Konfiguration kann mit einem beliebigen Editor (hier nano) bearbeitet werden.
$ sudo nano /etc/avahi/avahi-daemon.conf
Folgende Bereiche müssen angepasst werden:
[server]
...
use-ipv4=yes
use-ipv6=yes
...
[reflector]
#enable-reflector=no
#reflect-ipv=no
in
[server]
...
use-ipv4=yes
use-ipv6=no
...
[reflector]
enable-reflector=yes
#reflect-ipv=no
In vielen Anleitungen findet man die Einschränkung der Netzwerk-Interfaces über den parameter «allow-interfaces=…» Dies ist jedoch nicht notwendig wenn der Server nur als mDNS Reflector tätig ist.
Schritt 4: mDNS Port öffnen
mDNS verwendet den UDP-Port 5353. Dieser muss auf der Ubuntu Firewall noch geöffnet werden:
$ sudo ufw allow 5353/udp
Schritt 5: IPv6 deaktivieren
In reinen IPv4 Netzen empfiehlt es sich die IPv6-Funktion von Ubuntu permanent aus zu schalten. Bei Ubuntu-Server macht man dies über das Zusätzliche «ipv6.disable=1» Flag in der Grub-Konfiguration. Hierzu mit einem Editor wie nano die Grub-Konfiguration bearbeiten:
$ sudo nano /etc/default/grub
Die Zeile
GRUB_CMDLINE_LINUX_DEFAULT=""
ändern zu
GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1"
und dann die Grub-Konfiguration aktualisieren mittels
$ sudo update-grub
Schritt 6: Neustart des Servers
Nach dem Neustart des Servers ist sowohl IPv6 deaktiviert als auch die neue Konfiguration von avahi aktiv. Alternativ kann man den Dienst auch über folgenden Befehl neu starten:
$ sudo service avahi-daemon restart
Diagnose
Ein geniales Diagnose-Tool für Windows-Clients ist der Bonjour Browser von Hobbyist Software es stellt die gefundenen Bonjour Services übersichtlich dar. Zudem eignet sich der Browser auch zum finden der zu öffnenden Ports (z.B. TCP 631 für das Internet Printing Protocol / IPP)
Die Board-Diagnose von avahi funktioniert ebenfalls relativ gut.
$ avahi-browse -a
Was ist sonst noch zu tun?
Da avahi bloss als mDNS Reflector fungiert brauchen die Clients, welche AirPrint nutzen möchten, grunsätzlich eine Route in das Zielnetz der Drucker. Die gesammte Segmentierung wird jedoch relativ witzlos, wenn man dann auf der Firewall wieder alle Ports in das Druckernetz öffnet. Deshalb macht es durchaus Sinn mit einem Bonjour Crawler nach den publizierten Ports zu suchen und diese zu öffnen. Soweit ich das inzwischen zusammentragen konnte müssen folgende Ports geöffnet werden:
Protokoll | Port | Dienst | ? |
TCP | 9100 | Printer PDL Data Stream | |
TCP | 631 | IPP (Internet Printing Protocol) | |
TCP | 515 | LPD (Line Printer Daemon) | ? |
TCP | 80 | HTTP (Teilweise auch für Scanner) | |
TCP | 8080 | HTTP-ALT (Teilweise auch für Scanner) | |
TCP | 443 | HTTPS (Teilweise auch für Scanner) | |
TCP | 40080 | HTTP/Scan (bei manchen Toshiba Druckern) | |
TCP | 40443 | HTTPS/Scan (bei manchen Toshiba Druckern) |
Gut möglich, dass LPD nicht benötigt wird. Das Protokoll wird zwar von allen Druckern per mDNS advertised, ich bin jedoch nicht sicher ob dieser für AirPrint oder für den Druck von macOS aus genutzt wird.
Quellen:
- https://askubuntu.com/questions/332551/configure-an-avahi-reflector-to-broadcast-the-address-for-only-certain-airplay-t
- https://www.packetmischief.ca/2012/09/20/airplay-vlans-and-an-open-source-solution/
- https://nerdblog.steinkopf.net/2019/11/mdns-avahi-namensauflosung-ohne-dns-und-ohne-server/