tinc und OSX 10.10 Yosemite

Jul 25, 2014 00:00 · 720 words · 4 minute read

Gestern wurde die public Beta von OSX 10.10 “Yosemite” öffentlich verteilt. Ich habe sie gleich über mein System gebügelt nachdem ich noch ein letztes Backup von meinem Mavericks per Carbon Copy Cloner auf mein NAS gemacht habe.

Nach der Installation, welche relativ ruppig über die Bühne ging (ewiges warten am Ende - ein Blick ins Log zeigte, dass der Installer einige Probleme mit meiner Homebrew-Installation zu klären hatte), gingen einige Programme nicht mehr. Klar, bei ner neuen Beta läuft eben nicht alles ganz Reibungslos.

Neben 1Password , Carbon Copy Cloner und Little Snitch (welche mit aktuellen Betas gut lauffähig sind) ist auch mein tinc-daemon nicht mehr gestartet.

Der Grund dafür war, dass der Yosemite Installer alle TUN/TAP devices in /dev/ gelöscht hatte und somit tinc nicht mehr auf seine tap-devices zugreifen konnte. Ich versuchte erst, per homebrew tuntap einfach neu zu installieren:

brew uninstall tuntap
brew install tuntap

Was aber ganz und gar nicht funktionierte, da homebrew unter der 10.10 Beta noch nicht unterstützt wird und einige Formulas gar nicht oder nur fehlerhaft Kompilieren.

Als Alternative kann man das normale TUN/TAP Package von Sourceforge nehmen und installieren. Vorher sollte man aber das alter TUN/TAP von homebrew vollständig deinstallieren. Also:

brew uninstall tuntap
sudo rm -rf /Library/Extenstions/tun.kext/
sudo rm -rf /Library/Extenstions/tap.kext/
sudo rm -rf /Library/StartupItems/tun/
sudo rm -rf /Library/StartupItems/tap/

Dann das fertige .pkg von hier laden und installieren.

Nach der Installation sollte tinc sich automatisch verbinden, falls du meinem Tutorial gefolgt bist (tinc als daemon in launchctl).

Update (04.09.14) (Problemlösung/Workaround - Deprecated, scroll down!)

Nach einigem rumprobieren habe ich herausgefunden, dass das Kextloading nach Ausschalten der Kext-Signing-Überprüfung mit dem Befehl sudo nvram boot-args="kext-dev-mode=1" funktioniert.
Danach konnte ich mit dem Befehl sudo kextload /Library/Extensions/tap.kext die Extension manuell laden und mein Tinc schnurrte wieder wie ein Kätzchen ohne dazutun.

Jedoch muss die Kernel Extension von TUN/TAP jedes mal nach einem reboot per Hand neu geladen werden, da die StartupItems aus /Library/StartupItems/ ignoriert werden (welche TUN/TAP früher zum laden der Kernel Extensions beim booten benutzt hat).
Grund dafür ist, dass das Programm SystemStarter in Yosemite abgeschafft wurde. (Kann man hier nachlesen)

Ich habe eine -unsaubere- aber funktionierende Lösung gefunden um die Kernel-Extensions beim booten zu laden. Ich erstelle einfach ein .plist-file um den Befehl beim booten mit auszuführen.

Daher hier mein Workaround:

Als erstes schalten wir das Kext-Signing aus (ACHTUNG: Dieser Befehl schaltet global das Singing der Kernel Extensions aus und ist ein mögliches Sicherheitsrisiko! Use at your own risk!).

Also Terminal auf und reinhacken:

sudo nvram boot-args="kext-dev-mode=1"

Danach erstellen wir das plist-file und öffnen es. Dieses muss nach /Library/LaunchDaemons/, damit es auch vor dem login schon behandelt wird:

sudo touch /Library/LaunchDaemons/com.tuntap.loadTapKext.plist
sudo nano /Library/LaunchDaemons/com.tuntap.loadTapKext.plist

Dann fügen wir folgenden Inhalt ein:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>com.tuntap.loadTapKext</string>
	<key>ProgramArguments</key>
	<array>
		<string>kextload</string>
		<string>/Library/Extensions/tap.kext</string>
	</array>
	<key>QueueDirectories</key>
	<array/>
	<key>RunAtLoad</key>
	<true/>
	<key>WatchPaths</key>
	<array/>
</dict>
</plist>

Dann noch CRTL+O und CRTL+X zum speichern und verlassen von nano drücken.

Reboot. Fertig.

Falls Ihr die tun-devices braucht, einfach analog mit der tun.kext in /Library/Extensions/ verfahren.

Update (16.12.14)

So, wie es aussieht, wurde TUN/TAP geupdated. Es ist jetzt auch ohne deaktivieren des Kext-Signings lauffähig.

Eine neuere Version ist auch unter Homebrew via Cask verfügbar.

Wir können also den Developer-Mode wieder ausschalten…

sudo nvram boot-args="kext-dev-mode=0"

…und die plist-files löschen (sofern diese vorhanden sind).

sudo rm /Library/LaunchDaemons/com.tuntap.loadTapKext.plist

Hier die Terminal Commands zur Installation von der aktuellen TUN/TAP Version:

brew update
brew remove tuntap
brew install caskroom/cask/brew-cask
brew cask install tuntap

Reboot.

Hier ein Output aus dem ChangeLog von November 2014:


--- a/tuntap/Changelog
+++ b/tuntap/Changelog
@@ -1,3 +1,17 @@
+
+November 4, 2014:
+ o Generate a LINK_ON event on MAC address changes. This works around a problem
+   with the DHCP client implementation using a stale MAC address after updating
+   the network interface's address.
+ o Update compilation to only produce 64 bit binaries, which is appropriate for
+   Mavericks and onwards.
+ o Modernize package generation to use pkgbuild and productbuild.
+ o Replace the startup items with launchd jobs.
+ o Code signatures for the kernel extensions as well as the installer, the
+   signed extensions now work on Mavericks and Yosemite.
+ o Add extra synchronization in tap.kext to avoid a kernel crash triggered by
+   quickly re-attaching an interface.
+ o Fix MTU enforcement calculation when writing to the character device.