Internet Sharing v OS X Lion a Lion Server

Protože se naše domácnost rozšířila o další Macy a jedním z nich je Mac Mini, rozhodl jsem se pro experiment. Nainstalovat na miniho Lion Server a použít všechny služby, které nabízí, ve prospěch domácnosti. Mediacentrum, iTunes, iPhoto, AirPlay, HTTP/WebDAV server, VPN, to celé v iCloudu, atd…

Jednou (první) službou, kterou chci na minim rozchodit, je sdílení internetu. Doposud jsem používal samostatný router s NAT, ale proč nepoužít miniho, když stejně poběží nonstop a teoreticky nabízí dokonalejší konfiguraci. Navíc domácí připojení od Netboxu konečně nabízí IPv6 (sice zatím jen SIT tunelem) a IGMP IPTV bez settopboxu, které můj router nepodporuje.

V základním Lionu je nastavení sdílení Internetu primitivní záležitost. Na záložce Sdílení Internetu v Předvolbách systému je možné:

  • vypnout a zapnout službu sdílení Internetu
  • nastavit WAN interface
  • nastavit LAN interface(y) a v případě Wi-Fi (Airportu) nastavit SSID vytvořené sítě, kanál a typ šifrování (pouze WEP)

Trochu málo i oproti mému bývalému routeru. Mapování portů? DMZ? DHCP rezervace? Nic takového.

V serverovém Lionu tato volba sdílení Internetu zůstává (oproti Snow Leopard Serveru, kde není) a navíc je možné (stejně jako v Snow Leopard Serveru) pomocí Server Admin Tools nakonfigurovat routing, firewall, NAT, DHCP a DNS už docela detailně, případně využít Gateway Setup Assistent. Jenže v Lionu to tak úplně nefunguje.

InternetSharing v základním Snow Leopardu byl “wrapper” k ipfw, natd a bootp. InternetSharing v Lionu funguje jinak. V základním Lionu je místo ipfw použit pf, takže InternetSharing už nepoužívá natd a divert pravidlo v ipfw, ale přidá si několik záchytných bodů (anchors) do pf. Tím pádem už nefunguje editace apple.com.natd.plist, která fungovala ve SnowLeopardu, a všechny adresy jsou napevno zadrátované v binárce InternetSharing. Server Admin Tools ale pf ještě nepoužívají a zůstávají u ipfw. InternetSharing navíc při startu “bezohledně” přepisuje konfiguraci bootpd, takže se většinou po použití Gateway Setup Assistentu stane, že InternetSharing přestane přidělovat adresy na LAN a naopak. Apple o tom ví a místo opravy zatím vydal tuto KB: Unable to connect to the Internet after running NAT Gateway Setup Assistant.

Vystačil bych si možná i jen s InternetSharingem, nebýt toho, že jakmile ho spustím, přestane jít IPTV. Některé pravidlo, které InternetSharing do pf zavede, prostě zahazuje IGMP pakety nutné pro IPTV. To, jaká pravidla InternetSharing zavádí, se ale nedá nikde ovlivnit.

Bohužel, InternetSharing má oproti ruční konfiguraci přes Server Admin Tools i jednu velkou výhodu – dokáže přepnout Airport (Wi-Fi) interface do AP módu. V principu jsou to dvě samostatné věci – AP mód může fungovat i bez sdílení internetu a sdílení internetu může fungovat i na Wi-Fi v módu ad-hoc nebo klient. Přesto jsem nenašel žádnou jinou utilitu nebo nastavení, která by dokázala zapnout AP mode samostatně.

V CoreWLAN frameworku, který je od Snow Leoparda 10.6 už částečně dokumentovaný, jsou i nedokumentovaná volání supportsHostAP, enableHostAP, disableHostAP a především startHostAPModeWithSSID:securityType:channel:password:error:. Nepodařilo se mi ale ani pomocí nich HostAP mode rozchodit. supportsHostAP vrací jako BOOL hodnotu -128 (očekával bych 0 nebo 1), startHostAPMode: skončí na EXC_BAD_ACCESS v obj_msgSend. V každém případě InternetSharing právě tyto metody používá.

Abych to shrnul:

  • Po čisté instalaci Liona funguje sdílení Internetu v té primitivní podobě dobře.
  • Po instalaci Serveru funguje sdílení Internetu stále dobře, ale jen do doby, než poprvé spustíte Gateway Setup Assistent.
  • Poté přestane být možné spustit službu NAT (v konzoli je nicneříkající chyba “servermgrd: servermgr_nat: nat config:Error:Could not create Mobile Internet Sharing config”).
  • Sdílení Internetu jde sice stále zapnout, ale začne se mezi sebou prát bootpd (DHCP) vestavěné v InternetSharingu a bootpd spuštěné ze Server Admin Tools (nebo možná jen jejich konfigurace, kterou obě služby zapisují do stejného souboru bootpd.plist).
  • Zběsilým klikáním na spuštění a zastavení služby DHCP (mezitím se mění obsah záložky Subnets), lze InternetSharing opět přimět k přidělování adres, ale pravděpodobně jen za předpokladu, že si nejprve sami nakonfigurujete síťová rozhraní přes Předvolby Systému – Síť, a to tak, jak to InternetSharing očekává, ale z nějakého důvodu už sám nedělá (tedy 10.0.2.x pro Wi-Fi či 192.168.2.x, 192.168.3.x, atd., pro ostatní rozhraní).
  • Co jsem nezkusil, je čistá instalace Lion Serveru a kompletní ruční konfigurace síťových rozhraní a služeb NAT (tj. frontend k ipfw + natd), Firewall (ipfw), DNS (named) a DHCP (bootp), bez jediného zapnutí InternetSharingu a Gateway Setup Assistentu. Ale chce se někomu kvůli takové hlouposti reinstalovat server?

Je to bohužel velký zmatek a nic jiného, než čekat, že to Apple zazáplatuje, asi nezbývá. Doufám, že další kapitoly s IPv6, Open Directory s mobilními účty a dalšími vychytávkami budou lepší. Doufám, ale nevěřím. 🙂

Zajímavé soubory:

  • /usr/libexec/InternetSharing
  • /etc/bootpd.plist
  • /etc/nat/*
  • /etc/pf.conf
  • /etc/pf*/
  • /System/Library/LaunchDaemons/com.apple.InternetSharing.plist
  • /Library/Preferences/SystemConfiguration/com.apple.nat.plist
  • /System/Library/Frameworks/CoreWLAN.framework/CoreWLAN

Zmiňovaný kousek kódu pro přepnutí Airportu (Wi-Fi) do AP módu:


NSError* error;
CWInterface* wlanIface = [CWInterface interface];

SEL someSel = sel_registerName("startHostAPModeWithSSID:securityType:channel:password:error:");
id result = objc_msgSend(wlanIface, someSel, [@"test" dataUsingEncoding:NSUTF8StringEncoding], kCWIBSSModeSecurityWEP40, 1, @"1234567890", &error);

NSLog(@"%@", [error description]);

Leave a Reply

Your email address will not be published. Required fields are marked *