Met LISa op stap in het lokale netwerk

Auteur: Alexander Neundorf
Vertaling: Tom Verbreyt
Herziening 0.1
Copyright © 2004 KDE-nl team

Inhoudsoverzicht

1 Wat is LISa?

Met LISa krijg je toegang tot iets als Windows' "network neighbourhood": een overzichtje van het lokale netwerk dus, maar dan zonder de noodzaak van SMB.

LISa ("the LAN Information Server") heeft genoeg aan de TCP/IP-stack en draait als daemon in de achtergrond. Het is volledig onafhankelijk van KDE of Qt, al kan het in KDE mooi geïntegreerd worden. De daemon krijgt de lijst van beschikbare hosts via TCP-poort 7741.

LISa treft die hosts op twee manieren aan:

2 Hoe LISa werkt...

In het configuratiebestand (/etc/lisarc) stel je een lijst op van IP-adressen waarvan LISa moet nagaan of ze beschikbaar zijn of niet. In het meest eenvoudige geval gaat het dus gewoon om je netwerkadres en subnetmask; LISa zou dan voor elke mogelijke host op je netwerk nakijken of er een machine draaide of niet.

Zoals reeds gezegd werd, test LISa de hosts door middel van ICMP-verzoekjes. Om dat soort pakketten te kunnen verzenden en ontvangen, moet het programma een zogenaamde "raw socket" openen. LISa heeft dus root-privileges nodig. Meteen na het opstarten opent het programma de nodige socket en zodra dat gelukt is laat het de root-privileges weer vallen (mocht je er zin in hebben, sla er dan de broncodebestanden main.cpp en strictmain.cpp op na).

Als je LISa instelt om gebruik te maken van nmblookup, dan vindt popen("nmblookup \"*\"") plaats, waarna de resultaten nagekeken kunnen worden.

Geen overmatige belasting van het netwerk

Omdat zowel de ICMP-requests als de broadcasts nogal wat netwerkverkeer kunnen veroorzaken wanneer er meerdere LISa-servers in één netwerk actief zijn, kunnen de servers met elkaar samenwerken. Voor ze beginnen pingen (of nmblookup beginnen te gebruiken), zullen ze een broadcast versturen op poort 7741. Als er antwoord komt, dan krijgen ze een volledige lijst van draaiende hosts toegestuurd op diezelfde poort; er zal dan niet gepingd worden (en geen nmblookup uitgevoerd worden).

Volgt er geen antwoord op de broadcast, dan zal de host die de broadcast uitvoerde beginnen pingen (of een nmblookup uitvoeren). Vervolgens opent die host een socket die klaarstaat voor broadcasts van andere hosts. Die socket zal niet geopend worden als er wel een antwoord ontvangen was. Normaalgezien heeft dus te allen tijde maar één van de servers een geopende socket. Dat is de enige server die ook actief in het rond pingt of nmblookup gebruikt.

Kort en bondig: de servers zijn lui en hanteren het motto «ik verzet pas een poot als niemand anders het werk voor mij kan doen».

Er is nog een andere maatregel om het netwerkverkeer te beperken. Laten we er even van uitgaan dat je LISa zodanig hebt ingesteld, dat het elke 10 minuten de lijst met hosts bijwerkt. Als er nu niemand is die LISa contacteert tijdens die periode, dan zal de server de lijst bijwerken (hetzij eigenhandig, hetzij via een andere server die het werk verricht) en vervolgens de tijdsspanne voor het bijwerken verdubbelen; de eerstvolgende update gebeurt dan pas na 20 minuten.

Dat verdubbelen vindt vier maal plaats, dus als er lange tijd niemand een server met een update-frequentie van 10 minuten raadpleegt, dan groeit de tijdsinterval tot 160 minuten, bijna drie uur dus. Zodra iemand de server contacteert, wordt een oude lijst aangeboden (maximum 160 minuten oud, namelijk). De server zal de tijdsinterval tussen de updates dan resetten (terug naar één keer per 10 minuten) en meteen beginnen bijwerken als de laatste update langer dan 10 minuten geleden was. Als je dus een erg oude lijst krijgt, probeer dan enkele seconden later opnieuw voor een recente versie. Natuurlijk merk je het voordeel van dat principe sneller bij de "passieve" servers dan bij de "actieve"server, omdat die laatste door alle andere servers binnen het netwerk geraadpleegd wordt.

Op die manier kan je LISa op vele computers tegelijkertijd draaien, zonder dat het netwerkverkeer evenredig toeneemt. Bovendien hoef je er geen slaap voor te laten: voor de gebruiker maakt het niet uit of er ergens op het netwerk al een LISa-daemon draait of niet. Als wat hij moet doen is LISa lokaal inschakelen; LISa zal dan zelf wel vaststellen of er elders al een lijst beschikbaar is of niet.

LISa als ioslave

Een erg handige client voor LISa is een ioslave voor KDE, die het de gebruiker mogelijk maakt lan://localhost of lan:/ in te geven in Konqueror. In beide gevallen wordt LISa op het eigen systeem gecontacteerd.

Als er op het netwerk een machine permanent aanstaat en wanneer de gebruiker weet dat die machine LISa aan boord heeft, dan kan hij zijn LISa-client ook zonder omwegen met die specifieke server gebruiken (om bij de ioslave te blijven: dat zou dan lan://die_ene_server/ worden).

Enkele andere mogelijkheden

Als je liever hebt dat LISa niet meedoet met het broadcasten, maar altijd eigenhandig pingt, dan kan ervoor zorgen dat het een ander poortnummer gebruikt, met de optie --port, of korter: -p. Dat is echter meestal geen goed idee (communicatie met andere LISa's op het netwerk is dan alleszins onmogelijk).

Met een SIGHUP laat je LISa het configuratiebestand opnieuw inlezen (killall -HUP lisa). SIGUSR1 zorgt ervoor dat wat informatie over LISa's status naar stdout geslingerd wordt (killall -USR1 lisa).

De gegevens die via voormelde socket aangeboden worden, hebben een eenvoudig formaat, dat bestaat uit decimaal weergegeven IP-adressen, newline's en als laatste lijn 0 succeeded. Op die manier kan je ze makkelijk met een script hanteren. Bijvoorbeeld:

17302538 some_host.whatever.de
18285834 linux.whatever.de
17827082 nameserver.whatever.de
0 succeeded

resLISa

Misschien gelden er op jouw netwerk bepaalde regels en is het je niet toegestaan om andere hosts te pingen. Of misschien wil je om andere redenen geen poort teveel openstellen. In dat geval kan je best de ietwat beperkte versie van LISa gebruiken: resLISa.

Met resLISa kan je geen hele netwerken of adresreeksen pingen. Je kan enkel bepaalde hosts opgeven in het configuratiebestand, met een maximum van 64. Enkel die hosts zullen gepingd worden. Het is voorts ook met resLISa mogelijk om nmblookup in te zetten.

resLISa biedt enkel informatie aan via een Unix domain socket, dus niet over het netwerk. De naam van de socket in kwestie is /tmp/resLisa-<je_login>. resLISa kan dus veilig gebruikt worden door meerdere gebruikers op eenzelfde machine.

Omdat er op die manier geen veiligheidsproblemen zouden mogen zijn, is het geen probleem om resLISa setuid root te installeren. Van die root-privileges doet resLISa sowieso meteen weer afstand (cf. strictmain.cpp), omdat ze enkel nodig zijn voor het creëren van de socket die nodig is voor het verzenden van ICMP-verzoekjes. Bovendien worden er geen broadcasts verzonden of ontvangen.

Ook voor resLISa is er een ioslave, die je kan gebruiken door in Konqueror rlan:/ in plaats van gewoon lan:/ in te geven.

3 LISa instellen

Een voorbeeld

De configuratie van LISa zit in /etc/lisarc. Dat bestand zou er zo uit kunnen zien:

PingAddresses = 192.168.100.0/255.255.255.0;192.168.100.10-192.168.199.19;192.168.200.1;192-192.168-168.100-199.0-9;
PingNames = bb_mail;
AllowedAddresses = 192.168.0.0/255.255.0.0
BroadcastNetwork = 192.168.100.0/255.255.255.0
SearchUsingNmblookup = 1        # probeer het ook met nmblookup
FirstWait = 30                  # 30 honderdsten van een seconde
SecondWait = -1                 # 1 poging volstaat
# SecondWait = 60               # wacht 60 honderdsten van een seconde bij een 2de poging (hier commentaar)
UpdatePeriod = 300              # werk de lijst bij na 300 seconden
DeliverUnnamedHosts = 0         # geef geen hosts weer die geen naam hebben
MaxPingsAtOnce = 256            # verzend tot 256 pings per keer

PingAddresses

Dit is zo'n beetje de belangrijkste lijn. Met PingAddresses bepaal je welke adressen gepingd zullen worden. Je kan meerdere bereiken opgeven, die je van elkaar scheidt met een komma-punt.

Je kan adressen op vier manieren bepalen:

Je mag deze lijn trouwens ook gewoon leeg laten.

PingNames

Vul hier eventuele andere hosts in die je op hun naam wilt pingen. Je scheidt de namen met komma-punten.

Ook deze lijn mag leeg blijven.

AllowedAddresses

Ook dit is een belangrijk lijntje. LISa zal enkel de adressen pingen, de clients opnemen en de broadcasts antwoorden als het betreffende IP-adres onder AllowedAddresses opgesomd staat. Je kan tot 32 netwerken/netwerkmaskers of singuliere adressen opsommen. Scheid ze met een ";" en vermijd spaties tussen de adressen!

Een voorbeeldje: 192.168.0.0/255.255.0.0;192.169.0.0.

Zowele hele netwerken als aparte adressen zijn hier op hun plaats. Maak AllowedAddresses zo strikt mogelijk. Meestal is jouw netwerkadres/netwerkmasker een goede keuze.

BroadcastNetwork

Hier staat één enkel netwerkadres/subnetmask, waarheen broadcasts zullen verzonden worden. Normaalgezien moet dat dus je eigen netwerkadres/subnetmask zijn, bijvoorbeeld 192.168.0.0/255.255.0.0.

SearchUsingNmblookup

Een "1" laat LISa toe om nmblookup "*" uit te voeren en het resultaat na te kijken. nmblookup zorgt voor minder netwerkverkeer, maar je krijgt wel enkel antwoord van hosts die een SMB-dienst aanbieden (dus machines die Samba draaien of Windows-computers).

Als je deze optie inschakelt en ook IP-adressen opgeeft om te pingen, dan wordt eerst de nmblookup uitgevoerd. Pas daarna wordt begonnen met pingen. Alleen de adressen die nmblookup nog niet opgedoken had, worden getrakteerd op een ping, zodat het netwerk ook hier niet nodeloos belast wordt.

FirstWait

Wanneer LISa pingt (een ICMP echo request op pad stuurt), dan gebeurt dat met een heel hoopje pakketjes per keer. Daarna zal LISa wachten gedurende de tijdsperiode (in honderdsten van een seconde) die je hier opgeeft.

Waarden van 5 tot 50 zijn oké. Het maximum is 99 (dat is 0,99 seconden, een hele tijd in deze context). Hou de waarde zo laag mogelijk, zonder dat je vaststelt niet alle hosts aan te treffen die je hoort te vinden.

SecondWait

Na een eerste ping-sessie is het mogelijk dat bepaalde hosts niet gevonden werden. Om de resultaten te verbeteren kan LISa een tweede keer pingen, maar dan enkel naar de adressen waarvan de eerste keer geen antwoord ontvangen werd.

Heb je al goede resultaten na één keer pingen, dan kan je de tweede keer gewoon uitschakelen door SecondWait op "-1" in te stellen. Is dat niet het geval, vul dan een waarde in die ietwat hoger ligt dan FirstWait. De hosts die bij de eerste poging niet gevonden werden, zijn immers waarschijnlijk wat trager of bevinden zich wat verder, dus het lijkt aannemelijk dat ze ook wat meer tijd nodig hebben om een antwoord te sturen.

UpdatePeriod

UpdatePeriod is de tijdsinterval die LISa respecteert bij het bijwerken van de lijst. Na de opgegeven periode (in seconden) voert LISa een nieuwe ping-sessie of een nmblookup uit (of haalt het de lijst met hosts op van een andere LISa-server, zoals hogerop beschreven werd).

Geldige waarden bevinden zich tussen 30 seconden en 1800 seconden (een half uur). Als je een groot netwerk hebt, kies dan voor een voldoende hoge waarde (om het netwerk niet onnodig te belasten). Waarden tussen 300 en 900 seconden lijken aangewezen.

Denk eraan dat deze waarde tot vier maal toe verdubbeld kan worden, wanneer niemand de server raadpleegt. De interval kan dus groeien tot 16 maal de waarde die je hier opgeeft. Zodra iemand contact opneemt met de server, wordt de beginwaarde in ere hersteld.

DeliverUnnamedHosts

Als LISa een antwoord ontving van een bepaald IP-adres, maar geen naam kon bepalen, dan wordt die host enkel mee afgeleverd als deze waarde op "1" ingesteld staat.

Misschien is dit geen bijster nuttige mogelijkheid, maar misschien zijn er bepaalde apparaten in jouw netwerk aanwezig, die geen namen gekregen hebben en dus niet publiek bekend hoeven te zijn. Stel DeliverUnnamedHosts dus in op "0" als je wil dat dat zo blijft. :-)

MaxPingsAtOnce

Zoals reeds gezegd werd verzendt LISa een reeksje pings per keer. Standaard worden er 256 pakketjes per keer verstuurd. Die waarde hoef je normaalgezien niet te wijzigen. Als je hem al te hoog instelt kunnen de buffers die klaarstaan voor de ontvangen antwoorden te klein worden. Als je hem te klein kiest, dan kan het bijwerken van de lijst nogal traag worden.

Nog enkele voorbeelden

voor een klein netwerk met 24-bit netwerkmasker (dus tot 256 machines)
PingAddresses = 192.168.100.0/255.255.255.0
AllowedAddresses = 192.168.100.0/255.255.255.0
BroadcastNetwork = 192.168.100.0/255.255.255.0
SearchUsingNmblookup = 0        # gebruik geen nmblookup
FirstWait = 20                  # 20 honderdsten van een seconde
SecondWait = 30                 # 30 honderdsten van een seconde bij tweede poging
UpdatePeriod = 300              # werk de lijst bij na 300 seconden
DeliverUnnamedHosts = 0         # geef geen hosts zonder naam weer
enkel voor hosts die SMB aanbieden

Je bent enkel geïnteresseerd in hosts die SMB aan boord hebben en er zitten geen routers in je netwerk.

AllowedAddresses = 192.168.100.0/255.255.255.0
BroadcastNetwork = 192.168.100.0/255.255.255.0
SearchUsingNmblookup = 1        # gebruik nmblookup
UpdatePeriod = 300              # werk de lijst bij na 300 seconden
DeliverUnnamedHosts = 0         # geef geen hosts zonder naam weer
om zowel nmblookup als gewone pings te gebruiken

Hetzelfde netwerk, maar nu wordt niet alleen van nmblookup, maar ook van gewone pings gebruik gemaakt.

PingAddresses = 192.168.100.0/255.255.255.0
PingNames = bb_mail
AllowedAddresses = 192.168.0.0/255.255.0.0
BroadcastNetwork = 192.168.100.0/255.255.255.0
SearchUsingNmblookup = 1        # probeer het ook met nmblookup
FirstWait = 30                  # 30 honderdsten van een seconde
SecondWait = -1                 # 1 poging volstaat
UpdatePeriod = 300              # werk de lijst bij na 300 seconden
DeliverUnnamedHosts = 0         # geef geen hosts zonder naam weer
MaxPingsAtOnce = 256            # verzend maximum 256 pings per keer
een configuratiebestand voor resLISa

resLISa gebruikt geen PingAddresses en evenmin BroadcastNetwork.

PingNames = bb_mail;some_host;some_other_host
AllowedAddresses = 192.168.0.0/255.255.0.0
SearchUsingNmblookup = 1      # gebruik nmblookup
FirstWait = 30                # 30 honderdsten van een seconde
SecondWait = -1               # 1 poging volstaat
UpdatePeriod = 300            # werk de lijst bij na 300 seconden
DeliverUnnamedHosts = 1       # geef ook hosts zonder naam weer
MaxPingsAtOnce = 256          # verzend maximum 256 pings per keer

4 LISa en KDE

Een kleine toevoeging van de vertaler: als alles correct verloopt, kan je handig van LISa gebruik maken met Konqueror. Het erg kleine netwerkje van twee computers en een router dat zich hier thuis bevindt, ziet er dan zo uit:

LISa en Konqueror
klik voor ware grootte

Doorklikken naar een bepaalde host toont de services die op die host beschikbaar zijn, in dit geval enkel SSH (de veilige vorm van telnet), in de vorm van fish:

LISa en Konqueror, bis
klik voor ware grootte

Nogmaals klikken brengt een wachtwoord-dialoogje tevoorschijn, waarna je op de vertrouwde manier met Konqueror kan verderwerken: de andere machine is mooi geïntegreerd in je huidige werkomgeving.

LISa gaat standaard op zoek naar zoveel mogelijk diensten op de machines die het in het lokale netwerk aangetroffen heeft. Dat gedrag, alsook de eigenlijke configuratie, kan je comfortabel wijzigen in het configuratiecentrum van KDE:

LISa en KControl
klik voor ware grootte

Intussen is je wel duidelijk geworden wat LISa voor je kan betekenen. Heb je een klein netwerkje, dat je als je broekzak kent en waar weinig van verwacht moet worden, dan is LISa niet meer dan een leukigheidje. Wordt het netwerk wat uitgebreider, neem bijvoorbeeld een kleine kantooromgeving, dan wordt LISa al een pak interessanter, zeker als je in acht neemt dat het erg weinig moeite of voorkennis vergt om LISa aan de praat te krijgen.

5 Licenties en verdiensten

LISa, resLISa en de bijbehorende, origineel Engelstalige documentatie zijn geschreven door Alexander Neundorf (neundorf@kde.org). Deze vertaling is losjes op de officiële documentatie gebaseerd.

Het is toegestaan dit document te kopiëren, te verdelen en/of te wijzigen onder de voorwaarden van de GNU vrije-documentatielicentie, versie 1.1 of een latere versie gepubliceerd door de Free Software Foundation; zonder invariante paragrafen, zonder vooromslagteksten, en zonder achteromslagteksten.

Over deze site | Laatst gewijzigd: 25 april 2004, 21:35 door: Tom Verbreyt