2.2. Netværksprotokoller og porte

Før vi ser nærmere på, hvad Linux-maskinen kan servicere for et netværk, så lad os lige træde et skridt tilbage og se på, hvordan systemet er bygget op.

En Linux-maskine vil normalt foretage en masse ting samtidig, f.eks. håndtere e-post, login-brugere som kører programmer, samt have en web-server kørende. Derfor har man ikke bare kunnet nøjes med at hver enkelt computer har en IP-adresse. De forskellige services lytter på hver sin port, som har sit eget nummer. F.eks. bruges port 21 til ftp, port 22 til ssh (secure shell), port 23 til telnet, port 25 til smtp og port 80 til http. De mest kendte (well-known) portnumre, er tildelt af organisationen IANA (Internet Assigned Numbers Authority). I TCP/IP protokollen er det i TCP-datapakkerne, man finder information om afsender port og modtager port, imens IP-adressen på afsender og modtager er indeholdt i IP-transportlaget.

Porte er ikke fysiske men logiske konstruktioner, som anvendes i den måde, man sender data over netværket. Man skelner imellem TCP- og UDP-porte, som bruges til to forskellige typer dataoverførsler. TCP er forbindelsesorienteret. Den sender hele tiden kvitteringer frem og tilbage (handshakes), og når det går godt, behøver den ikke at få kvittering for sine data så tit. Hvis en datapakke går tabt, vil den blive gentransmitteret af protokollen. Der findes også en anden type IP-pakker med betegnelsen UDP. UDP anvendes oftest til hurtig letvægtsinformation, som kan accepteres at gå tabt i netværket såsom f.eks. NFS-forespørgsler. UDP-pakker, der går tabt vil kun blive retransmitteret, hvis applikationen sørger for det (typisk NFS).

Ofte tildeles en service både TCP og UDP porten med et givet nummer, selvom den kun bruger den ene.

User Friendly http://www.userfriendly.org/static ser på IP-pakker...

Figur 2-1. User Friendly

Porte vælges ikke tilfældigt, men mange er standardiserede, så maskiner kan koble sig til en given port og dermed vide hvilken service, der kan findes. Hvis du læser filen /etc/services på en vilkårlig UNIX-maskine såsom Linux, kan du se hvilke porte, der bruges til hvad. Udsnit af en /etc/services:

ftp-data        20/tcp
ftp             21/tcp
telnet          23/tcp
smtp            25/tcp          mail

Først står navnet på servicen, derefter portnummeret og om det er tcp eller udp. Det sidste felt er til et evt. alias for denne service - i eksemplet er mail et alias for smtp.

Portnumre under 1024 kaldes priviligerede porte, og man skal være root for at kunne lytte på dem. Dette er lavet, så en klient, der kontakter en fremmed maskine på en port under 1024, kan regne med at få fat i en standard service og ikke et eller andet tilfældigt bruger-program. Se man services.

IP (Internet Protocol) er den netværksprotokol, man bruger på internet-baserede netværk. Der findes mange andre. - Apple har deres egen AppleTalk-protokol, og Novell har IPX/SPX. UNIX-maskiner bruger normalt IP, men har historisk også gjort brug af andre protokoller, f.eks. Digital's DECNET og Regnecentralens IMC. Linux-maskiner kan forstå mange af disse andre protokoller.

2.2.1. Daemons

En service kan enten køres som en selvstændig daemon, eller den kan styres af inetd. En daemon er en proces, som kører i baggrunden hele tiden, og venter på forespørgsler. Nogle services skal køre hele tiden og altid være klar, fordi det er nødvendigt med en hurtig responstid, eller at de ikke må være nede. Et eksempel er named, som laver navneoplag via DNS, og som skal være hurtigt. Andre eksempler på daemons er lpd (printer daemon), syslogd (logger system events) og sendmail. Vi kigger nærmere på sendmail i et senere afsnit. En anden daemon, som vi skal se på om lidt, er inetd, der bruges til at starte andre services efter behov. Prøv at køre kommandoen

[robin@sherwood robin]$ ps aux | more

Denne kommando viser alle de kørende processer på systemet, og du vil kunne genkende processer som lpd, syslogd og inetd.

2.2.2. Inetd

En del services har kun brug for at køre relativt sjældent. Disse services er i Linux styret af inetd-programmet. I stedet for at have f.eks. in.telnetd kørende hele tiden, sættes inetd daemonen til at lytte efter, om der er telnet forespørgsler, og starter in.telnetd efter behov.

Hvilke services, der skal startes, bestemmes i kataloget /etc/xinetd.d, og de filer der ligger der. Eks.:


      

En service kan slås fra ved at udkommentere den linje, der starter den pågældende service. Eks. er telnet

# default: on
# description: The telnet server serves telnet sessions; it uses \
#       unencrypted username/password pairs for authentication.
service telnet
{
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID
        disable         = yes
}

Det du skal se efter er om der står disable=yes i hver fil, for dermed startes de enkelte services ikke.

For at ændringerne i /etc/xinetd.d skal træde i kraft, er det nødvendigt at genstarte xinetd processen. Dette kan gøres på flere måder. Nogle distributioner har en struktur med startup scripts, der bruges til dette formål. Under Red Hat og Debian ligger de under /etc/rc.d/init.d hhv. /etc/init.d. Så kan man bruge startup scriptet til at genstarte inetd med.

Red Hat:

[root@sherwood robin]# /etc/init.d/xinetd reload 

Der er dog også nogle Linux-distributioner, der ikke benytter denne struktur herunder Slackware, så vi har brug for en mere generel løsning. For en vilkårlig distribution kan man genstarte xinetd ved at skrive:

[root@sherwood robin]# killall -1 xinetd

Før Red Hat 7 anvendte man i stedet for xinetd forgængeren inetd og der skal man udkommentere linjerne i /etc/inetd.conf

Bemærk, at du i eksemplet kun slår din ftp-server fra. Du kan stadig bruge ftp fra maskinen til andre maskiner. Man kan bare ikke længere bruge ftp udefra og ind til din maskine.

Inetd har den sikring, at en service bliver lukket ned i 10 minutter, hvis der kommer mere end 20 forespørgsler i sekundet. For nogle services er dette ikke acceptabelt. Det er derfor, programmer som named og syslogd kører udenom inetd som daemons.

Gennemgå de andre services i /etc/xinetd.d på samme måde som vist ovenfor. Undersøg, hvad der kører på din maskine, og find ud af om det er nødvendigt at de enkelte services kører. Hvis ikke, så slå det fra. En gylden regel er, at du hellere må køre for få end for mange services. Vi kommer senere til en gennemgang af de services, der findes i /etc/xinetd.d.

Husk slutteligt, at hvis du ender med at du slet ikke vil køre services via /etc/xinetd.d, så kan du lige så godt lukke selve xinetd programmet ned.

2.2.3. TCP-wrappere

Adgangen til de services, der styres af inetd, kan på en nem måde konfigureres, så der er kontrol over hvem, der har adgang til at bruge de forskellige services, maskinen tilbyder.

Dette gøres ved at anvende en TCP-wrapper (tcpd), som er en agent, der bliver kørt i stedet for din normale server applikation. Den sørger for at requests om service bliver logget til syslogd, og den giver en stærk og fleksibel adgangskontrol. Man kan f.eks. også få den til at sende sig et e-brev, hvis nogen udefra forsøger at få adgang via telnet til maskinen.

2.2.4. Adgang til din maskine

Adgangskontrol sker via filerne /etc/hosts.allow og /etc/hosts.deny.

Når tcpd skal finde ud af, om der er adgang til en service, tjekker den først /etc/hosts.allow. Hvis der her er givet explicit adgang, godkendes forsøget, og servicen bliver startet. Hvis der ikke står noget om den pågældene service i /etc/hosts.allow, læses nu /etc/hosts.deny. Hvis /etc/hosts.deny ikke indeholder noget, der forbyder den forsøgte adgang, vil forsøget blive godkendt. Det kan altså være en god idé at sætte sin /etc/hosts.deny op til at slutte med at afvise alt og alle. På den måde er man sikker på, at hvis der er noget, man ikke explicit har givet adgang til, så er der ikke adgang. På den anden side må man så sikre sig, at alle services, der skal kunne anvendes, er sat op i /etc/hosts.allow.

Filerne har det følgende format. Eks. på en linje:

in.telnetd: 192.168.0.0/255.255.255.0

I /etc/hosts.allow ville denne linje tillade alle på lokalnettet 192.168.0.* at benytte telnet servicen. Stod linjen i /etc/hosts.deny, ville det betyde, at de ikke kunne.

Eksempel på /etc/hosts.allow fil:

in.ftpd: 0.0.0.0/0.0.0.0
ALL: 192.168.0.2
ipop3d: 192.168.0.0/255.255.255.0

Denne /etc/hosts.allow vil tillade hele verden adgang til ftp, og giver host 192.168.0.2 lov til alt. Hosts på netværket 192.168.0.* har desuden adgang til pop3.

Eksempel på /etc/hosts.deny fil:

in.telnetd: 0.0.0.0/0.0.0.0

Denne /etc/hosts.deny fil sørger for, at ingen har adgang til telnet servicen. Dette gælder dog ikke for 192.168.0.2, da den allerede i /etc/hosts.allow har fået lov til alt herunder telnet.

En mere sikker /etc/hosts.deny ville være denne:

ALL: 0.0.0.0/0.0.0.0

Denne linje nægter alle adgang til alt, medmindre der specifikt er givet lov i filen /etc/hosts.allow. Bemærk dog, at du kan blive overrasket over ting, der ikke virker, hvis du har sat den restriktive /etc/hosts.deny-fil op. Vær omhyggelig med at sætte de nødvendige tilladelser op i /etc/hosts.allow. Hvis du har glemt at give adgang til noget, opdager du det sikkert, når du skal bruge det, eller når nogen brokker sig. Har du derimod glemt at spærre for noget, opdager du det måske først den dag, det bliver brugt til at bryde ind på dit system. Med sikkerhed og paranoia i højsædet er det smart at have ovenstående linje i sin /etc/hosts.deny. Så bliver forespørgsler afvist, hvis du ikke har sat dem ind i /etc/hosts.allow. HUSK at en forespørgsel bliver godkendt, hvis du ikke har angivet andet.

Se i øvrigt man tcpd, og man hosts.allow eller man hosts.deny (de to sidste er samme fil).