\chapter{TCP/IP Netwerk Basis}
Linux komt met al het TCP/IP netwerk fraais dat je mag verwachten van een
Unix box met volledige features. Het bevat \program{telnet}, \program{ftp},
\program{mail} en nog vele andere services. 
Hier is een beknopte lijst met vitale opdrachten:


\begin{alltt}
\heading{Basisnetwerktoepassingen en -services}
\defcom{telnet}{\remote}{Maak een verbinding met een ander systeem}
\defcom{rlogin}{\remote}{Login op \remote}
\defcom{ftp}{\remote}{\term{File Transfer Protocol} transporteert bestanden
tussen hosts}
\defcom{rcp}{file \remote:file}{Remote kopie \term{bestand} vanaf hier naar \remote}
\defcom{rcp}{Host1:f1 Host2:f2}{Remote kopie \term{f1} van Host1 naar Host2}
\defcom{rsh}{\remote\ opdracht}{Voer \term{opdracht} uit op \remote}
\heading{TCP/IP Diagnostics}
\defcom{ping}{\remote}{Stuur een ``ping'' naar een remote host om de 
connectiviteit te controleren}
\defcom{nslookup}{\remote}{Verzoek een DNS-server om omzetting van een
hostnaam}
\defcom{route}{}{Geef de routingtabel weer}
\defcom{ifconfig}{}{Geef lokale TCP/IP network interface configuratie weer}
\defcom{arp}{}{print/manipuleer systeem ARP cache}
\defcom{tcpdump}{-i ethX}{luister naar verkeer op \term{ethX}}
\heading{Netwerktermen}
\defcom{TCP/IP}{}{Transmission Control Protocol / Internet Protocol}
\defcom{ARP}{}{Address Resolution Protocol}
\defcom{route}{}{een netwerkroute naar een andere machine}
\defcom{host}{}{Een machine op het netwerk}
\defcom{client}{}{De host die gegevens of een service wil}
\defcom{server}{}{De host die gegevens of een service levert}
\end{alltt}


\section{Netwerkcommunicatie}
Deze sectie gaat over netwerkcommunicatie vanuit gezichtspunt van een
gebruiker. We zullen het niet veel hebben over hoe je hardware of
serverconfiguraties instelt. Dit is reeds door je beheerder gedaan.

\subsection{Controleren van netwerkstatus}
Soms is het niet duidelijk of je netwerk correct functioneert.
Er zijn een aantal makkelijke opdrachten die je kunt gebruiken om te
controleren of een computer ``actief'' is op het netwerk.
De eerste en belangrijkste opdracht is  \program{ping} waarmee een
testbericht naar de computer zal worden gezonden waarvan we
een reactie terugverwachten:

\begin{Verbatim}[fontfamily=courier,frame=single,commandchars=\\\{\}]
\localhost{ping groucho}
PING groucho (192.168.1.3): 56 data bytes
64 bytes from 192.168.1.3: icmp_seq=0 ttl=255 time=0.7 ms
64 bytes from 192.168.1.3: icmp_seq=1 ttl=255 time=0.3 ms
64 bytes from 192.168.1.3: icmp_seq=2 ttl=255 time=0.3 ms
....
\end{Verbatim}

Dit laat zien dat de host \computer{groucho} ``in de lucht'' is.
Het voorziet ons van wat timing informatie wat de snelheid aangeeft
van de verbinding tussen \lokaal\ en \remote.

Als DNS (zie de volgende sectie) niet werkt, dan kan het zijn dat je
niet via de naam kunt pingen, maar misschien wel door het opgeven van
het nummer. Je kunt ook via het IP-nummer pingen, zoals in:

\begin{Verbatim}[fontfamily=courier,frame=single,commandchars=\\\{\}]
\localhost{ping 192.168.1.3}
PING 192.168.1.3 (192.168.1.3): 56 data bytes
64 bytes from 192.168.1.3: icmp_seq=0 ttl=255 time=0.7 ms
64 bytes from 192.168.1.3: icmp_seq=1 ttl=255 time=0.3 ms
...etc...
\end{Verbatim}

 Als je geen enkele reactie of een foutmelding krijgt, dan is er
 iets mis met het netwerk en zal je niet in staat zijn met die computer te
 communiceren.

\subsection{DNS en Nslookup}
 De \term{Domain Name Service} ook bekend als DNS staat je toe als een
 gebruikers naam zoals \term{www.yahoo.com} in een nummer om te zetten,
 zoals 216.32.74.52, wat nodig is voor je computer om over het netwerk
te communiceren. Netwerken worden bestuurd door gremlins die alleen
gebruik maken van nummers en niet van namen. Dus DNS is erg belangrijk
als je het netwerk gaat gebruiken.

Wie levert de DNS service? Meestal voorziet je ISP in deze service,
vooral als je een modem, kabelmodem, DSL, enz. gebruikt. Als je je bevindt
in een grote bedrijfsinstelling, zal je eigen bedrijfsnetwerk in DNS voorzien.

Het belangrijkste hulpmiddel dat je nodig hebt om de controleren of DNS 
functioneert is \program{nslookup}, waarmee namen naar nummers en vice-versa
kunnen worden omgezet:

\begin{Verbatim}[fontfamily=courier,frame=single,commandchars=\\\{\}]
\localhost{nslookup www.io.com}
Server:  flure.pair.com
Address:  209.68.1.159

Name:    www.io.com
Addresses:  199.170.88.21, 199.170.88.41, 199.170.88.39
\end{Verbatim}

\program{Nslookup} vertelt ons dat er 3 namen zijn die overeenkomen met
www.io.com. Grote sites, zoals www.io.com en www.yahoo.com hebben vaak
meer nummers omdat ze verscheidene servers onderhouden om alle verzoeken
naar hun zeer drukke sites af te handelen.
De server flure.pair.com is onze DNS server zoals wordt opgemerkt door
onze lokale DNS setup.

DNS kan ook nummers in namen omzetten:

\begin{Verbatim}[fontfamily=courier,frame=single,commandchars=\\\{\}]
\localhost{nslookup 199.170.88.21}
Server:  flure.pair.com
Address:  209.68.1.159

Name:    www-02.io.com
Address:  199.170.88.21
\end{Verbatim}

Dit was een van de www.io.com sites die werd weergegeven in het eerste
voorbeeld. Als DNS je naam niet kan vinden, is de kans klein dat je
er via het internet een verbinding mee kunt maken:

\begin{Verbatim}[fontfamily=courier,frame=single,commandchars=\\\{\}]
\localhost{nslookup belse.com}
Server:  flure.pair.com
Address:  209.68.1.159

*** flure.pair.com can't find belse.com: Non-existent host
\end{Verbatim}

Sorry, you are SOL. No can do.. (unless you know the number already)
Maybe try www.belse.com.

Soms kun je via het IP-nummer een verbinding maken zelfs als DNS niet
werkt. Probeer een verbinding te maken met www.io.com met een van de
gevonden nummers. Linux heeft een tekstbrowser genaamd
\program{Lynx} dat op veel manieren van pas komt

\subsection{De ``R'' opdrachten}
De zogenoemde \term{R-opdrachten} zijn \program{rlogin}, \program{rcp},
\program{rsh}, en gelijken. Dit zijn krachtige en gevaarlijke opdrachten,
en ze zouden met een grote zorgvuldigheid gebruikt moeten worden. 
Veel systemen die aan het Internet staan blootgesteld deactiveren
deze opdrachten, wat ze ook zouden moeten doen, omdat gegevens op dat
netwerk volledig open staan voor het publiek.
Tegenwoordig zijn er van een aantal van deze opdrachten veilige versies,
waarvan de gegevens zijn versleuteld, of zijn de opdrachten vervangen
door \program{ssh}, de secure shell.

Om zonder wachtwoord remote opdrachten op een remote machine uit te voeren,
stel je (in je homedir) een bestand in met de naam
\file{.rhosts} dat er ongeveer zo uitziet:

\begin{Verbatim}[fontfamily=courier,frame=single,commandchars=\\\{\}]
# .rhosts file for \remote
\local\ \user
\end{Verbatim}

en op de lokale machine een aanvullende setup laat je van daaraf werken.

\begin{Verbatim}[fontfamily=courier,frame=single,commandchars=\\\{\}]
# .rhosts file for \local
\remote\ \user
\end{Verbatim}

Probeer nu van hier naar daar een bestand te kopi\"eren:

\begin{alltt}
rcp bestandsnaam \remote:
rcp bestandsnaam \remote:.            # Hetzelfde als hierboven.
\end{alltt}

Kopieer nu een bestand van \remote\ naar \lokaal:

\begin{alltt}
rcp \remote:bestandA .          # Kopieer het bestand naar . met dezelfde naam.
rcp \remote:bestandA bestandB   # Hernoem het bestand
\end{alltt}

Gebruik nu \program{rlogin} om in te loggen op \remote:

\begin{alltt}
rlogin \remote
Last login: Sat Jan 15 02:53:13 from beppo
You have mail.
\remotehost{ls -agl}
total 3236
drwxr-xr-x  20 \user users        4096 Jan 14 09:45 .
drwxr-xr-x   5 root     root         4096 Jan 14 08:42 ..
-rw-------   1 \user users        1748 Jan 14 06:59 .ICEauthority
-rw-------   1 \user users         101 Jan 14 08:35 .Xauthority
-rw-r--r--   1 \user users        1506 Jan 14 08:18 .Xdefaults
-rw-------   1 \user users         133 Jan 11 15:56 .bash_history
....etc....
\end{alltt}

\newpage
\section{X-Window over het netwerk gebruiken}
Iets wat zo geweldig is aan X, is dat er directe netwerkmogelijkheiden in zijn
gebouwd.
Je kunt elke X-toepassing overal vandaan op je netwerk gebruiken. Het
enige wat je hiervoor hoeft te doen is een paar parameters instellen
die communicatie mogelijk maken.

\subsection{X verbinden met een andere client}
Er zijn twee dingen die je doen moet om X over het netwerk te kunnen
laten werken. Ten eerste moet je het mogelijk maken dat andere machines
een verbinding op kunnen zetten met je werkstation. Een manier om dit
te doen, is gebruik te maken van \program{xhost \remote}, waar
\remote\ de machine is waarmee je wilt communiceren.

Ten tweede moet je met telnet (of ssh) een verbinding maken met een
ander werkstation, en de \term{DISPLAY} omgevingsvariabele naar je
werkstation als volgt instellen:

\begin{alltt}
\localhost{xhost + \remote}
\localhost{telnet \remote}
Red Hat Linux release 6.1 
Kernel 2.2.12-20 on an i586
login: \user
Password: ******
Last login: Thu Jan 13 12:13:37 from bistro.rr.com
\remotehost{setenv DISPLAY \local:0}
\localhost{xcalc -title \remote}
Ctrl-C
\remotehost{exit}
\localhost{}
\end{alltt}

Denk eraan dat \remote\ en \local\ moeten worden gewijzigd in de
naam die aan je werkstation is toegekend.

Je zou nu een proces moeten hebben dat door het remote systeem wordt
uitgevoerd!  Het zal duidelijk zijn dat dit krachtig is. In het volgende
hoofdstuk zullen we het hebben over andere netwerkfeatures...
Als je een dergelijke regel in je .login of .bashrc plaatst 
zal de \term{DISPLAY} variabele automatisch voor je worden ingesteld.
Speel hier even mee:

\begin{alltt}
\tcsh{setenv DISPLAY `who am i \pipe perl -ne '/\bs((.+)\bs)/ ; print \$1'`":0"}
of in bash,
\bash{set DISPLAY= `who am i \pipe perl -ne '/\bs((.+)\bs)/ ; print \$1'`":0"}
\end{alltt}

\newpage
\subsection{Beveiligen van je X-connectie}

Hierboven hadden we het over \program{xhost} en hoe dit andere machines
toestaat een verbinding te maken met de \term{X-Server} op je werkstation.
Er is een onvolkomenheid in de beveiliging waardoor het voor ALLE mensen
mogelijk is een verbinding te maken vanaf de \remote\ naar je werkstation.
Dit beveiligingslek is gebruikt om op vele computers in te breken.

Gelukkig bestaat er een veilig alternatief voor het gebruik van \program{xhost} 
genaamd  \program{xauth}. De wijze waarop je \program{xauth} gebruikt, bestaat
eruit als eerste \program{xauth list} op de \remote uit te voeren, de
informatie die het produceert met je muis af te vangen
(links klikken en slepen), en het dan te plakken (klikken met de middelste 
muisknop) op je werkstation direct na het intikken van \program{xauth add}.

\begin{Verbatim}[fontfamily=courier,frame=single,commandchars=\\\{\}]
\remotehost{xauth list}
bistro.marx:0  MIT-MAGIC-COOKIE-1  6c7d8ba30a
\rv{\bf{}bistro/unix:0  MIT-MAGIC-COOKIE-1  7bf452301a230498}
localhost:0  MIT-MAGIC-COOKIE-1  a43f0989db
localhost:10  MIT-MAGIC-COOKIE-1  3c08b9241d
\end{Verbatim}

 Op je lokale werkstation:

\begin{Verbatim}[fontfamily=courier,frame=single,commandchars=\\\{\}]
\bash{xauth add bistro/unix:0 {\small{}MIT-MAGIC-COOKIE-1} 7bf452301a230498}
\end{Verbatim}

\newpage
\section{Netwerkbeveiliging voor gebruikers}

Netwerkbeveiliging vanuit het gezichtsveld van een gebruiker is simpel: Gebruik
geen eenvoudig-te-raden wachtwoorden, en laat geen ``R'' opdrachten open
voor een aanval.

Moeilijk te raden wachtwoorden lijken niet op enig woord en 
zouden niet alleen uit alfabetische tekens moeten bestaan.
\term{Hallo} is geen goed wachtwoord, maar
\term{h3l9Xz} is dat wel. Hackers gebruiken altijd \program{crack} waarbij
gebruik wordt gemaakt van een woordenlijst om wachtwoorden te raden,
en \term{Hallo} zou in een paar seconden zijn gekraakt.

Zover het de beveiliging betreft, hoef je slechts een paar dingen te
onthouden:

\begin{itemize}
 \item Houd altijd je homedirectory (\~{}) beveiligd.
 \item Gebruik geen R-opdrachten over een onveilig netwerk, aangezien
       hackers vrijwel alles kunnen zien.
       Je bent beter af als je het programma \program{ssh} hebt en
	   veilige versies van R-opdrachten.
 \item Programma's als \program{telnet} laten je wachtwoorden over
       het Internet zien. Gebruik \program{ssh}.
 \item Vertel nooit iemand je wachtwoord, en mocht je dat wel hebben gedaan,
       wijzig het dan de volgende dag.
 \item \command{chmod 600 .rhosts}
 \item Wijzig iedere paar maanden je wachtwoord.
 \item Schrijf je wachtwoord nooit op of identificeer het nooit als een
       wachtwoord.
 \item Kies een moeilijk niet voor te stellen accountnaam.
 \item Controleer bestanden regelmatig op de permissies. 
       Voor de meeste bestanden is 600 of 700 gebruikelijk.
\end{itemize}
