Abstract: ========= Dit document beschrijft hoe een basis TCP/IP configuratie er uit ziet en waarom. Het beschrijft hoe je deze configuratie kunt instellen met de meest voorkomende Linux tools of kunt laten doen met DHCP. Verder zal een bespreking komen van de meest voorkomende configuratie bestanden zoals die door de meest voorkomende distro's in gebruik zijn. Inleiding: ========== Een veel voorkomend probleem op forums is dat beginnende Linux gebruikers onvoldoende kennis hebben om hun netwerk op te zetten of te kunnen controleren. Een tijdje al leeft bij mij de wens om een keer de basis princiepes hoe een TCP/IP netwerk in elkaar steekt te beschrijven. Dit document is een poging daar toe. In dit document wordt uitgegaan van een PC die via een LAN aangesloten is op het Internet. De diverse instellingen zullen besproken worden zodra ze van belang zijn voor het onderwerk. Interfaces: =========== Eigenlijk horen interfaces niet bij een bespreking van TCP/IP. Een interface is een stuk hardware (soms een stuk virtuele hardware) die de communicatie met de buitenwereld (het netwerk) voor zijn rekening neemt. Een belangrijk deel van de TCP/IP configuratie is echter het configureren van van de interface(s), een bespreking van de interfaces lijkt me dan ook op zijn plaats. De meest voorkomende interface die je tegenkomt is waarschijnlijk wel de ethernet NIC (Network Interface Card) dit zijn insteek kaarten voor de PC waarin een UTP of BNC stekker gestokken kan worden. Een UTP stekker is een modulaire stekker waar 8 aders, tegenwoordig komt deze veruit het meeste voor. Een BNC stekker is een coax stekker, deze zie je tegenwoordig nog maar zelden. Voor specifieke hardware moet support in de kernel aanwezig zijn. Dit kan in de kernel zelf zijn maar over het algemeen zal de support toegevoegt worden als module. Veel Linux distributies ontnemen je de zorg voor dit probleem, ze gebruiken programma's als HotPlug om dynamisch de juiste kernel modules te laden voor de aanwezige hardware. Nietemin is het toch wel een leuk om een keertje te kijken naar deze hardware support. Ik ga er dan even van uit dat je over een PCI NIC beschikt (ISA hardware wordt steeds zeldzamer). Om nu te zien welke PCI hardware in jou PC aanwezig is kun je de opdracht `lspci` gebruiken: pkn@sysop-2:~$ /sbin/lspci 00:01.0 PCI bridge: Intel Corp. 82845 845 (Brookdale) Chipset AGP Bridge (rev 03) 00:1e.0 PCI bridge: Intel Corp. 82801BA/CA/DB/EB/ER Hub interface to PCI Bridge (rev 12) 00:1f.0 ISA bridge: Intel Corp. 82801BA ISA Bridge (LPC) (rev 12) 00:1f.1 IDE interface: Intel Corp. 82801BA IDE U100 (rev 12) 00:1f.2 USB Controller: Intel Corp. 82801BA/BAM USB (Hub #1) (rev 12) 00:1f.3 SMBus: Intel Corp. 82801BA/BAM SMBus (rev 12) 00:1f.4 USB Controller: Intel Corp. 82801BA/BAM USB (Hub #2) (rev 12) 00:1f.5 Multimedia audio controller: Intel Corp. 82801BA/BAM AC'97 Audio (rev 12) 01:00.0 VGA compatible controller: ATI Technologies Inc Rage 128 PF/PRO AGP 4x TMDS 02:09.0 Ethernet controller: 3Com Corporation 3c905C-TX/TX-M [Tornado] (rev 78) 02:0a.0 Communication controller: Analog Devices SM56 PCI modem Je kunt ook de opdracht `cat /proc/pci` geven, maar de output van `lspci` is meestal ruim voldoende. Wat je in de bovenstaande output op moet vallen is de ehternet controller. In mijn geval een 3C905C. Afgezien van het SM56 modem is dit de enige interface die ik in mijn werkstation heb. Voor de 3C905C moet dan ook support in de kernel aanwezig zijn of een module zijn geladen. Met de opdracht `lsmod` kan je zien welke modules er geladen zijn: pkn@sysop-2:~$ lsmod Module Size Used by Not tainted usb-storage 66176 0 snd-pcm-oss 37736 0 snd-mixer-oss 12504 0 [snd-pcm-oss] nfsd 67376 8 uhci 24444 0 (unused) usbcore 59308 1 [usb-storage uhci] snd-intel8x0 18924 0 snd-ac97-codec 49500 0 [snd-intel8x0] gameport 1420 0 [snd-intel8x0] snd-pcm 56072 0 [snd-pcm-oss snd-intel8x0] snd-timer 13604 0 [snd-pcm] snd-page-alloc 6328 0 [snd-intel8x0 snd-pcm] snd-mpu401-uart 3200 0 [snd-intel8x0] snd-rawmidi 12740 0 [snd-mpu401-uart] snd-seq-device 3888 0 [snd-rawmidi] snd 30852 0 [snd-pcm-oss snd-mixer-oss snd-intel8x0 snd-ac97-codec snd-pcm snd-timer snd-mpu401-uart snd-rawmidi snd-seq-device] soundcore 3396 4 [snd] ide-scsi 9328 0 3c59x 25648 1 En jawel... de allerlaatste module is voor de 3C509C. Deze modules kan je terug vinden in de directorie '/lib.modules/[kernel_versie]/kernel/drivers/net'. In mijn geval had ik hem met de hand kunnen laden middels de opdracht `/sbin/modprobe 3c59x`. Maar in de meeste gevallen zullen je distro makers er voor gezorgt hebben dat deze automatisch geladen wordt. Met het commando `lspci` kun je dus zien welke hardware aanwezig is, met de opdracht `lsmod` kun je zien of er support is voor die hardware. Eventueel voeg je die support toe met de opdracht `modprobe`. Mocht het nu zo zijn dat je dermate excentrieke hardware hebt dat de module niet standaard geladen wordt, dan moet je uitzoeken hoe je jouw distro zo ver krijgt dat deze module wel automatsch geladen wordt. In mijn geval zou ik het bestand '/etc/rc.d/rc.modules' aanpassen, maar dat is Slackware specifiek. Na het zorgen voor support voor de hardware is het zaak om de hardware te configureren. Het eigenlijke TCP/IP verhaal begint dan ook nu pas. Een netwerk: ============ Een IP nummer is iets als 192.168.0.15. dit is een unieke aanduiding in een netwerk. Om te bepalen wat het bereik van dat netwerk is dient de netmask... iets als 255.255.255.0. Zou je deze 2 getallen binair uitschrijven dan maskeren de 1en in de netmask het netwerk nummer in het IP adres. M.a.w: In dit voorbeeld is het laagste IP 192.168.0.0 en het maximale IP nummer in het netwerk is 192.168.0.255. Dit zijn gelijk bijzondere nummers: 192.168.0.0 Wordt vlgs afspraak gebruikt om het netwerk aan te duiden. 192.168.0.255 Is vlgs afspraak het broadcast adres waar alle interfaces (nr 1 t/m 254) naar zullen luisteren. Voor interfaces heb je dus de nummer 192.168.0.1 t/m 192.168.0.254 beschikbaar. Echter: vlgs afspraak (niet bindend) is het eerste nummer (192.168.0.1) van een reeks de gateway (daarover later meer). Een interface krijgt dus een IP nummer, zijn adres en Een netwerkmask om te bepalen tot welke familie hij behoort Vanaf dat moment kan een interface communiceren met een andere interface in hetzelfde netwerk (bv 192.168.0.16). Hij vraagt in dat geval, met behulp van het broadcast adres waar alle interfaces in het netwerk naar luisteren: "Vertel mij wie er IP nummer 192.168.0.16 heeft". Tot zover heeft het niets met Linux te maken..... dat komt nu pas. In Linux wordt het IP adres meestal dmv het programma "ifconfig" ingesteld. Dit kan je doen met de opdracht: `ifconfig eth0 192.168.0.15 netmask 255.255.255.0` eth0 is de naam van de interface die je configureert. Nu kan je dus communiceren met alle computers die in hetzelfde netwerk zitten. Echter een computer met een IP nummer als 10.0.0.15 kan je niet bereiken. Een internet: ============= Zou je het proberen dan krijg je de foutmelding "No route to host" In de foutmelding zit de oplossing: Je moet een route aangeven naar de buitenkant van je netwerk. Nu komt dan ook die gateway om de hoek kijken.... de gateway is een machine die op tenminste 2 netwerken is aangesloten. Dat kan met netwerkkaarten, maar het kan ook heel goed een ADSL, ISDN of analoog modem zijn. Wat je moet doen is je netwerk software duidelijk maken waar hij die gateway kan vinden. Dit kan je doen door een route op te geven..... in dit geval een default route die gebruikt wordt als de andere routes niet gebruikt kunnen worden. `route add default gw 192.168.0.1 metric 1` Na deze opdracht zal jouw computer elke opdracht die niet binnen het eigen netwerk ligt doorsturen naar de gateway: 192.168.0.1 De gateway machine moet dit verkeer vervolgens forwarden naar de juiste machines..... vaak weer via andere gateways.. Ook hier weer is alleen de manier hoe je route instelt Linux specifiek.... de rest is gewoon TCP/IP. Op dit moment heb je een internet (kleine i). Je kunt communiceren met computers buiten je eigen netwerk. Het Internet: ============= Je zou zelfs kunnen browsen, email en meer van dat moois. Maar om het echt af te maken moet je nu nog 1 ding vertellen aan de netwerk software: Wie kan een FQNs (fully qualified name) (zoals www.computertotaal.nl) voor mij vertalen naar IP adressen..... want de netwerk software begrijpt geen moer van FQNs. Hiervoor zijn DNS servers.... die vertalen namen naar IP nummers. Die hoef je niet zelf te hebben (kan wel, is zelfs handig), je kan die van je provider gebruiken. Echter dan moet de netwerk software weten waar hij die DNS server kan vinden. Dit zet je op een Linux systeem van oudsher in /etc/resolv.conf.... gewoon een regeltje tekst. namerserver 47.11.12.54 (fiktief nummer) Vanaf dat moment kan je browsen op het Internet (met een grote I) en kan je systemen aanspreken met namen. Automatiseren: ============== Dit alles kan je op veel manieren instellen. Je kunt het met de hand doen.... zoals ik net voorgedaan heb. Je kunt dit door scripts laten doen.... zoals nagenoeg alle distro's dit (allemaal op hun eigen manier) doen. In dat geval staan de instellingen in een of ander configuratie bestandje. Of je kunt het automatisch laten instellen door een DHCP (dynamic host configuration protocol) server. Deze laatste methode wordt vaak gebruikt providers.... die hebben voor hun klanten een DHCP server staan die IP nummer (en al die andere instellingen) uitdeelt aan PC's van klanten die erom vragen. Maar je moet er wel om vragen! Dit kan weer met de hand: `dhcpcd eth0` Het dhcp client programma vraagt nu een lease aan bij de DHCP server en zal als hij die lease krijgt de instellingen maken voor je. Maar meestal kan je dit weer aangeven in een configuratie bestand waardoor een script deze aanvraag voor je doet. Wil DHCP werken dan moet je pc op een netwerk segment aangesloten zijn waar hij via broadcast een DHCP server kan bereiken. De meeste (goede) gateways houden DHCP verkeer tegen.... in je eigen netwerk moet je dus voor een eigen DHCP server zorgen. BTW Die scripts doen niets magisch.... ze voeren gewoon dezelfde opdrachten uit als ik hierboven met opties uit een configuratie bestandje. Nogmaals.... slechts de opdrachten zijn Linux specifiek..... de rest geld voor alle computers die met TCP/IP werken. Anders zou het Internet niet kunnen bestaan. // vim:set tw=70: