– fordi tiden kræver et MODSPIL

06. Jan 2011

Opsætning af små netværk med Ubuntu Server Edition

 
Overskrifter: Server som gateway til Internettet, DHCP og DNS, opsætning af Internet på den enkelte computer, fælles filsystem med NFS, fælles login og brugerstyring med simpel synkronisering af passwd-filer.

Introduktion

Dette dokument indeholder en kortfattet gennemgang af de programmer og kommandoer, der skal til for at få et simpelt, privat netværk baseret på Ubuntu server og NAT-forwarding til Internettet til at fungere. For en nøjere og mere teknisk gennemgang henviser jeg til Ubuntus serverdokumentation generelt og specielt de links, der anføres sidst i dokumentet.

Vi vil i første omgang gå ud fra en arkitektur, der svarer til en lidt forenklet udgave af dette billede:

  • http://www.truecafe.es/doc/img/wifi2.gif

Vi vil altså primært beskæftige os med et netværk bestående af WAN, Internet-gateway, switch og fast opkoblede arbejdsstationer. Bemærk, at selv om artiklen først og fremmest handler om Ubuntu Server, vil det alt sammen virke i alle udgaver af Ubuntu. Artiklen er baseret på et kursus, jeg afholdt i april 2010, mens jeg arbejdede for Ubuntu-leverandøren O-Biz.

Terminologi

Vi vil i det følgende gå ud fra, at du er ved at sætte et netværk op med én server, der både skal fungere som filserver og Internetgateway, og som er udstyret med Ubuntu Server 9.10.

  • Denne computer vil overalt blive omtalt som "serveren".
  • Andre computere på netværket vil blive omtalt som "klienter" eller "arbejdsstationer".
  • Serveren skal være udstyret med mindst to Ethernet-kort, som vi vil kalde eth0 og eth1.

  • Vi antager, at du vil bruge eth0 til WAN og eth1 til det interne netværk.

  • Vi antager, at øvrige PC'er i netværket kører Ubuntu Desktop. Dette er ikke et krav, men du skal være opmærksom på, at der er kompatible versioner af NFS og NIS, hvis du skal have de ting til at virke.
  • Vi antager, at du ønsker at sætte det interne netværk op som et privat netværk med adresser fra 10.0.0.0/8-blokken. Du kan også bruge en af de andre private blokke, hvis du hellere vil det.

  • Vi antager, at du ikke er logget ind som root, men bruger sudo til at få root-privilegier.

  • Kommandoer og filnavne (for eksempel ls eller /etc/passwd) er angivet med kodeskrift.

Deling af Internet med serveren som gateway

Vi vil i det følgende forklare, hvordan du opnår forbindelse til Internettet for et mindre netværk gennem en Ubuntu-server. Bemærk, at denne fremgangsmåde kun kan anbefales, hvis du alligevel har brug for en server, der skal være tændt hele tiden. En dedikeret router bruger mindre strøm, og routningen tager performance fra serveren. Hjemme hos mig selv bruger den stationære PC, der er sat op som server 70W, mens den trådløse router, vi også har, bruger mindre end 2W. Afhængig af behov og prisen på strøm kan en router forholdsvis hurtigt være tjent ind. (I denne gennemgang antages det, at man også har brug for en fast filserver, og så er det til gengæld en god idé at slå de to formål sammen.)

Deling af Internet i Ubuntu Desktop

Den nemmeste og hurtigste måde at dele en Internetforbindelse er fra Ubuntu 9.10 på desktoppen. Det falder lidt uden for, hvad vi ellers gør her på kurset, men kan være meget nyttigt.

Antag, at du har en maskine med både trådløst og kablet netkort, hvor du er forbundet til Internettet via trådløst netværk og ønsker at dele din forbindelse med resten af selskabet ved at forbinde det kablede netkort til en switch. I Ubuntu 9.10 eller højere skal du bare

  • Højreklikke på netværksikonet i øverste, højre hjørne og vælge "Redigér forbindelser".
  • På fanebladet "Kablet" vælger du forbindelsen "Auto eth0" (hvis dit netkort hedder "eth0") og klikker på "Redigér".

  • Der kommer nu en ny dialog med overskriften "Redigér auto eth0". På fanebladet "IPv4-indstillinger" vælger du metoden "Delt med andre computere".
  • Genstart computeren, og andre computere kan nu gå på nettet via denne computers netkort.

  • Hvis du er forbundet til nettet via et kabel eller et 3G-modem, er det også muligt at bruge det indbyggede trådløse netkort til at skabe et lokalt, trådløst netværk, der kan deles med andre. Hvis du ønsker at gøre dette: Klik på netværksikonet i øverste højre hjørne, vælg "Opret nyt trådløst netværk" og følg anvisningerne på skærmen.

Deling af Internet med Ubuntu server

Vi antager, at serveren er forbundet til internettet med netværkskortet eth0, og at vi ønsker at dele denne forbindelse med de øvrige computere på netværket via eth1.

Netkort og IP-adresse

Vi begynder med at sætte kortet op med den rigtige IP-adresse:

sudo ifconfig eth1 10.0.0.1 

NAT, gateway og "firewall"

IPTables skal sættes op til at lave NAT-oversættelse mellem adresser på det indre og det ydre netværk.

Det gøres med disse kommandoer:

sudo iptables -A FORWARD -i eth0 -o eth1 -s 10.0.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A POSTROUTING -t nat -j MASQUERADE 

De tre kommandoer tillader trafik mellem de to netkort og etablerer NAT-oversættelse/masquerading.

Slå nu IP-forwarding til:

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

Indsæt disse to linjer i /etc/sysctl.conf, hvis de ikke allerede er der i forvejen:

net.ipv4.conf.default.forwarding=1
net.ipv4.conf.all.forwarding=1

Genstart netværket for at få ændringerne til at slå igennem:

sudo /etc/init.d/networking restart

OBS:
  • Dette sætter kun NAT-oversættelsen op i denne session. Man kan indsætte ovenstående kommandoer i et init-script som beskrevet her, og så bliver serveren sat korrekt op som Internet-gateway, hver gang den genstartes.

Opsætning af klienter med statisk IP-adresse

Dette skulle sådan set være nok til at sætte netværket op og få det til at fungere. Hvis du på den baggrund ønsker at tilføje klienter og sende dem på internettet, skal deres forbindelse til nettet konfigureres manuelt.

Du kan teste, at en klient kan forbinde sig til serveren ved at sætte IP-adressen på kommandolinjen:

sudo ifconfig eth0 10.0.0.25
sudo route add default gw 10.0.0.1

Hvis du ønsker at konfigurere klienten permanent med en fast IP-adresse, skal du tilføje disse linjer til filen /etc/network/interfaces og genstarte computeren:

auto eth0
iface eth0 inet static
address 10.0.0.25
netmask 255.255.255.0
network 10.0.0.0
broadcast 10.0.0.255
gateway 10.0.0.1

Adressen "10.0.0.25" skal selvfølgelig kun forstås som et eksempel. Klienterne får også brug for at kende deres DNS-servere, og dette kan du gøre ved at

  • tage backup af filen /etc/resolv.conf

sudo cp /etc/resolv.conf /etc/resolv.conf.backup
  • redigere filen /etc/dhcp3/dhclient.conf og erstatte den linje, der begynder med "prepend domain-name-servers" med denne

prepend domain-name-servers 208.67.222.222,208.67.220.220;

De to IP-adresser, der angives her, er OpenDNS' DNS-servere. Hvis du ønsker at bruge den lokale udbyders DNS-servere, skal du skrive deres IP-adresser i stedet.

  • genstarte netværket ved hjælp af kommandoen

sudo /etc/init.d/networking restart

... eller eventuelt genstarte computeren.

Der bør nu være hul igennem til Internettet.

  • Du kan også konfigurere forbindelsen ved hjælp af netværkshåndteringen i Ubuntu Desktop.

  • Denne metode er normalt for besværlig og anføres dels for fuldstændighedens skyld, dels fordi det i nogle situationer kan være mest praktisk eller sikkert at sætte maskinerne op med statiske, hard-kodede IP-adresser. Jeg vil anbefale, at du ikke sætter klienterne op på den måde, men i stedet sætter serveren op til at køre DHCP som beskrevet i næste afsnit.

Dnsmasq - DHCP og DNS i ét

Opsætningen af klienter i dit netværk er som antydet meget nemmere, hvis du undgår at sætte en statisk IP-adresse op på hver maskine, men i stedet lader serveren tildele dem en IP-adresse automatisk ved hjælp af DHCP. Hvis du har brug for, at maskinerne på dit netværk har faste IP-adresser - for eksempel, fordi du ønsker at sætte dem op med faste hostnavne - kan du reservere en fast adresse til hver enkelt maskine på DHCP-serveren, som beskrevet herunder. På den måde kan netværkets egne computere have faste adresser, mens gæster stadig kan koble sig på ved hjælp af DHCP.

Dnsmasq er en simpel kombineret DHCP- og DNS-server, som er meget velegnet til håndtering af IP-adresser og hostnavne på et mindre netværk, det vil sige med op til ca. tusind tilknyttede maskiner.

Den kan installeres med kommandoen

sudo apt-get install dnsmasq

Du er nu klar til at sætte den op, så den automatisk tildeler en IP-adresse til nye klienter på netværket. Dnsmasq gik automatisk i gang, da den blev installeret, så først er du nødt til at stoppe den:

sudo  /etc/init.d/dnsmasq stop

Redigér filen /etc/dnsmasq.conf og erstat den linje, der begynder med

#interface=

med dette:

interface=eth1

Bemærk den manglende # i begyndelsen af den ændrede linje. Dette betyder, at linjen nu er aktiv og ikke længere blot en kommentar.

Erstat også den linje, der begynder med #dhcp-range= med:

dhcp-range=10.0.0.2,10.0.0.250,72h

Dette angiver, hvilke IP-adresser der kan allokeres ved hjælp af DHCP og hvor længe, klienterne kan beholde dem, inden de skal fornys. Vælg selv andre værdier efter behov.

Start nu DHCP-serveren igen, og serveren er klar til at tildele IP-adresser til nye klienter på netværket:

sudo /etc/init.d/dnsmasq start

DNS

En opsætning af netværket med lokale hostnavne kræver enten, at man vedligeholder alle hostnavne i filen /etc/hosts på samtlige maskiner, eller at man bruger en lokal DNS-server. I det følgende vil vi forklare, hvordan man sætter dnsmasq op til at fungere som DNS-server og styre tildeling af faste IP-adresser til den enkelte maskine.

Først antager vi, at du gerne vil have faste IP-adresser til klient-maskinerne, men gerne vil undgå besværet med at konfigurere dem på hver enkelt maskine.

På serveren kan du reservere en IP-adresse til en bestemt maskine ved at tilføje en linje som denne i filen /etc/dnsmasq.conf:

dchp-host=00:04:5A:84:EA:8D,10.0.0.25

Denne linje angiver, at maskinen, hvis netkort har MAC-adressen 00:04:5A:84:EA:8D altid skal tildeles IP-adressen 10.0.0.25.

Man kan også angive et lokalt DNS-domæne - det kan være et domæne, den pågældende organisation ejer, men det kan også bare være en vilkårlig tekststreng, for eksempel "example.com". Hvis man har et rigtigt domæne, kan dette være en fleksibel metode til at integrere det interne netværk til Internettet.

Dette kan opnås ved i /etc/dnsmasq.conf at erstatte den linje, der begynder med #domain= med

domain=eksempel.dk

Du kan sætte lokale hostnavne op ved at tilføje dem til filen /etc/hosts på serveren. Hvis du har en maskine med fast IP-adresse 10.0.0.25, kan du gøre den kendt for alle andre maskiner på netværket under navnet "intranet-server" ved at tilføje denne linje i /etc/hosts:

10.0.0.25 intranet-server

NFS

NFS er den mest udbredte metode til at dele filer over et Linux- og UNIX-netværk. Vi vil derfor her gennemgå, hvordan man installerer NFS på en server og en klient, og hvordan man sætter forskellige dele af filsystemet op til altid at være monteret over NFS.

Det er muligt at sætte en vilkårlig computer på systemet op til at være NFS-server, men vi vil i det følgende antage, at du har tænkt dig at gøre det på den server, der også er sat op som gateway.

Opsætning af NFS-server

Det første, du skal gøre, for at installere NFS på serveren, er at installere selve NFS-serveren:

sudo apt-get install nfs-kernel-server

For at fortælle resten af netværket, hvilke mapper, du ønsker at gøre tilgængelige NFS, skal du tilføje dem i filen /etc/exports - det kunne for eksempel se sådan her ud:

/export/programs  *(ro,sync,no_root_squash)
/export/datadir   *.eksempel.dk(rw,sync)

Dette kræver selvfølgelig, at mapperne /export/programs og /export/datadir faktisk eksisterer. Et par bemærkninger om de parametre, vi bruger:

  • ro/rw betyder read-only eller read-write, alt efter om klienterne skal have lov til at skrive eller ej.

  • sync/async afgør, om skrivning til et NFS-filsystem skal betragtes som afsluttet, så snart serveren har modtaget det, eller først, når det faktisk er skrevet til disken. async giver selvsagt den bedste ydelse, men er også farlig, fordi klienten tror at have gemt noget til disk, som ikke faktisk er blevet det. async kan i værste fald føre til ødelagte filer, så det er måske et dårligt valg. Se artiklen Optimizing NFS performance for en nærmere diskussion - her vil vi anbefale for en sikkerheds skyld altid at bruge sync.

  • no_root_squash angiver, om brugeren 'root' på klienterne skal have superbruger-adgang til data i NFS-mappen. Standard er, at det har den ikke, hvilket er praktisk, hvis "almindelige" brugere er root på deres egne maskiner og NFS-mapperne kan indeholde andre brugeres private data. Ønsker man at give denne adgang alligevel, kan man tilføje parametren no_root_squash.

I eksemplet giver vi læseadgang til /export/programs til alle andre maskiner, mens vi giver læse-skriveadgang til /export/datadir til alle maskiner på domænet eksempel.dk. Bemærk, at dette kun giver læse- og skriveadgang til filsystemet - de enkelte filer og mapper i de eksporterede områder er stadig omfattet af de almindelige permissions, der begrænser brugernes adgang til dem.

Når du er færdig med at sætte de drev op, som du ønsker at eksportere, skal NFS-serveren startes:

sudo /etc/init.d/nfs-kernel-server start

Opsætning af NFS-mapper på klienterne

Lad os antage, at du har en NFS-server kørende på en maskine ved navn ubuntu-server med IP-adressen 10.0.0.1.

På en klient kan du nu montere eller mounte et NFS-drev. Først må du dog installere de nødvendige fildrivere:

sudo apt-get install nfs-common
Du kan nu montere et NFS-drev manuelt ved at skrive følgende i en kommandoprompt:

sudo mount 10.0.0.1:/export/datadir /home/user/datafiles

eller, alternativt

sudo mount ubuntu-server:/export/datadir /home/user/datafiles

Den lokale mappe /home/user/datafiles skal eksistere og bør være tom.

Du behøver ikke montere hele den eksporterede mappe. Hvis brugeren user har en privat mappe ved navn userdata i den eksporterede mappe data_dir, kan man angive stien til den i stedet og får så kun brugerens egne filer.

Man vil som regel ønske at montere et NFS-drev mere permanent, og det gør man ved at indføje en linje i filen /etc/fstab. Det kan for eksempel se sådan her ud:

ubuntu-server:/export/datadir /home/user/datafiles nfs rsize=8192  0  0 
ubuntu-server:/export/datadir /bin/programs        nfs defaults    0  0

Her angives serveren og det lokale monteringssted (mount point) ligesom i mount-kommandoen. De øvrige parametre fortæller, at mappen skal monteres som et NFS-filsystem, ligesom man specificerer, hvilke parametre, der gælder for monteringen. rsize er den mindste blok, der skrives til filsystemet. Standardværdien af denne parameter afhænger af NFS-versionen og af serveren, men 4K eller 8K er som regel fint.

Eksempel: Fælles /home på alle maskiner med NFS

En af de almindeligste anvendelser af NFS er opsætning af en central disk med en fast hjemmemappe for hver enkelt bruger. Vi antager, at hver enkelt bruger har sin hjemmemappe på en disk, der er koblet op på serveren, men den kunne også være på en vilkårlig anden maskine på netværket, der er sat op som NFS-server.

Fælles /home - server

På serveren sørger man i alle tilfælde for at eksportere alle brugeres hjemmemapper, som befinder sig under /home. Det gør man ved at tilføje denne linje i /etc/exports:

/home  *(rw,sync)

Vi ønsker ikke, at root-brugeren på den enkelte klient skal kunne snage i andres filer, så vi sætter ikke parametren no_root_squash. Ellers har vi bare angivet, at klienter skal kunne læse og skrive, og at skrivning til disken skal være synkron.

Efter at have rettet i /etc/exports/ skal vi gøre ændringen synlig for klienter - det gør vi ved at genstarte NFS-serveren som forklaret ovenfor. Alternativt kan vi bruge kommandoen exportfs, der opdaterer de eksporterede mapper uden at genstarte serveren:

sudo exportfs -a 

Fælles /home - klienter

Eksisterende brugere på klient-maskinerne har allerede en hjemmemappe, og den kan vi eventuelt være interesseret i et gemme til en dag, hvor computeren måske ikke længere skal leve på netværket. Begynd derfor med at tage backup af den:

sudo mv /home /home.backup

Lav nu en tom mappe ved navn /home, som kan bruges som monteringspunkt:

sudo mkdir /home

Check, at alt er, som det skal være - at serverens /home-mappe kan monteres, og at vi kan læse fra den:

sudo mount ubuntu-server:/home /home

ls /home

Hvis det virker, kan man nu indføje en linje i /etc/fstab, sådan at det fælles /home altid bliver monteret ved opstart af computeren:

ubuntu-server:/home /home nfs defaults 0 0 

Alle brugere på denne maskine har nu deres hjemmemappe på serveren og ikke lokalt.

For at dette kan virke tilfredsstillende, skal bruger-ID'er synkroniseres mellem hver enkelt maskine. Det skyldes, at tilladelser for hver fil er angivet ud fra brugerens numeriske ID (f.eks. 1005) og ikke brugernavnet (f.eks. "agger"). Hvis den samme bruger har forskellige ID'er på de forskellige maskiner, vil han eller hun ikke kunne læse og skrive sine egne private filer. Se næste afsnit om synkronisering af brugerkonti.

Her formoder vi stadig, at fstab-filen vedligeholdes separat på hver enkelt maskine. Dette vil i praksis være ret besværligt i et miljø med mange maskiner, og man vil derfor ofte vælge at vedligeholde den centralt. Man kunne for eksempel vælge at udnævne én af systemadministratorernes maskiner til "master-klient" og lade resten synkronisere de centrale opsætningsfiler derfra. Se omtalen af synkronisering i næste afsnit.

Simpel synkronisering af brugere og grupper

Som ovenfor nævnt kræver en opsætning med én hjemmemappe for hver bruger, der er fælles for alle maskiner, at brugerne holdes synkroniseret mellem alle maskiner på netværket. Gør man det, er opsætningen til gengæld ideel for et computerrum i en skole eller en lignende institution, hvor alle brugere vil blive præsenteret for deres egen foretrukne opsætning og deres egne filer, uanset hvilken af de synkroniserede maskiner, de logger ind på.

Den nemmeste måde at holde brugerne og deres login-oplysninger fælles er med jævne mellemrum at kopiere serverens version af fileren /etc/passwd, (/etc/shadow, /etc/group og /etc/gshadow ud på samtlige klienter.

Dette gøres på hver enkelt klient ved hjælp af kommandoen rsync. Man kan for eksempel tage nedenstående lille script og gemme det under navnet "syncusers.sh":

 #!/bin/bash

rsync -av ubuntu-server:/etc/passwd /etc/passwd
rsync -av ubuntu-server:/etc/shadow /etc/shadow
rsync -av ubuntu-server:/etc/group /etc/group
rsync -av ubuntu-server:/etc/gshadow /etc/gshadow

Dette script kan f.eks. sættes op i klienternes crontab til at køre en gang i timen eller en gang om dagen, og brugere og grupper vil så udelukkende skulle administreres på serveren.

  • Jeg har ikke testet dette script. Der er ikke meget at tage fejl af, men afprøv det mindst én gang, før du lægger det i produktion på et netværk.

Denne brug af rsync kræver, at der er installeret en SSH-daemon på serveren. Det kræver også, at brugeren root er sat op til at kunne bruge SSH til serveren uden at indtaste et password. Du kan læse her, hvordan man gør det.

Som antydet ovenfor kræver vedligeholdelse af en fælles fstab og fælles synkroniseringsscripts en del vedligeholdelse på den enkelte klient. En måde at komme uden om dette på kunne være at vedligeholde opsætningen på en "master-arbejdsstation" og så få alle de andre arbejdsstationer til at synkronisere de ønskede dele af opsætningen med passende mellemrum. Man kan undgå en del netværkstrafik og gøre den tekniske opsætning på alle klienter til kloner af hinanden ved at installere en NFS-server på "master-arbejdstationen" og lade alle andre arbejdsstationer NFS-montere dennes /etc-mappe ligesom de monterer serverens /home.

  • Og man kunne en masse andre ting. Administration af flerbrugersystemer er et kompliceret emne, som vi ikke kan dække i dette kursus.
  • Man kan få en ægte centraliseret brugerstyring ved hjælp af NIS, som vi afhængig af tid og lyst måske vil dække senere i forløbet.

  • Hvis brugerne skal kunne installere programmer på deres egen maskine, skal de have ret til at bruge sudo. Dette kræver, at de står opført i filen /etc/sudoers. Hvis denne synkroniseres mellem alle arbejdsstationer, vil disse brugere få root-adgang til alle klienter. Det var måske ikke meningen. I alle tilfælde bør kun systemadministratorer have adgang til at bruge sudo på serveren.