31.2. Gateways en routes
Terug | Hoofdstuk 31. Geavanceerde netwerken | Volgende

## 31.2. Gateways en routes

Bijgedragen door Coranth Gryphon.

Indien een machine een andere machine over een netwerk wil vinden, dient er een mechanisme te zijn dat beschrijft hoe van de ene naar de andere machine te gaan. Dit wordt routen genoemd. Een “route” is een gedefinieerd adressenpaar: een “bestemming” en een “gateway”. Het paar geeft aan dat door deze gateway gecommuniceerd moet worden om bij deze bestemming aan te komen. Er zijn drie soorten bestemmingen: individuele host, subnetten en “standaard”. De “standaardroute” wordt gebruikt indien geen van de andere routes van toepassing zijn. Verderop wordt verder op standaardroutes ingegaan. Er zijn ook drie soorten gateways: individuele hosts, interfaces (ook wel “verbindingen ” genoemd), en Ethernet-hardware-adressen (MAC-adressen).

### 31.2.1. Een voorbeeld

Om de verschillende aspecten van routen te illustreren, wordt het volgende voorbeeld van `netstat` gebruikt:

`%` `netstat -r` Routing tables Destination Gateway Flags Refs Use Netif Expire default outside-gw UGSc 37 418 ppp0 localhost localhost UH 0 181 lo0 test0 0:e0:b5:36:cf:4f UHLW 5 63288 ed0 77 10.20.30.255 link#1 UHLW 1 2421 example.com link#1 UC 0 0 host1 0:e0:a8:37:8:1e UHLW 3 4601 lo0 host2 0:e0:a8:37:8:1e UHLW 0 5 lo0 => host2.example.com link#1 UC 0 0 224 link#1 UC 0 0

De eerste twee regels geven de standaardroute (die behandeld wordt in de volgende sectie) en de `localhost`-route aan.

De interface (kolom `Netif`) dat deze routeertabel aangeeft om voor `localhost` te gebruiken is `lo0`, ook bekend als het teruglusapparaat. Dit geeft aan dat alle verkeer voor deze bestemming intern gehouden moet worden, in plaats van het over het LAN te sturen, aangezien het alleen aankomt op de plaats waar het verzonden werd.

Het volgende dat opvalt zijn de adressen die beginnen met `0:e0:`. Dit zijn Ethernet-hardware adressen, ook bekend als MAC-adressen. FreeBSD zal automatisch elke host (`test0` in het voorbeeld) op het lokale Ethernet identificeren en een route voor die host toevoegen, direct van deze host over de Ethernet-interface, `ed0`. Er is ook een timeout (kolom `Expire`) met deze routesoort geassocieerd, die gebruikt wordt indien er binnen een bepaalde tijd geen bericht komt van de host. Indien dit gebeurt, wordt de route naar deze host automatisch verwijderd. Deze hosts worden geïdentificeerd door middel van een mechanisme dat bekend staat als RIP (Routing Information Protocol), dat routes naar lokale hosts bepaald door middel van een kortste-pad algoritme.

FreeBSD zal ook subnetroutes voor het lokale subnet toevoegen (`10.20.30.255` is het broadcast-adres voor het subnet `10.20.30`, en `example.com` is de domeinnaam die bij dat subnet hoort). De aanduiding `link#1` verwijst naar de eerste Ethernetkaart in de machine. Merk op dat voor hen geen aanvullende interface is gespecificeerd.

Voor beide groepen (lokale netwerkhosts en lokale subnetten) worden de routes automatisch ingesteld door een daemon genaamd routed. Indien dit niet draait, zullen alleen routes die statisch gedefinieerd (i.e., expliciet vermeld zijn) bestaan.

De regel met `host1` verwijst naar deze host, het kent deze door het Ethernetadres. Aangezien het de zendende host is, weet FreeBSD dat het de teruglus-interface (`lo0`) moet gebruiken, in plaats van het over de Ethernet-interface te verzenden.

De twee regels met `host2` geven een voorbeeld van wat er gebeurt als een alias met ifconfig(8) gebruikt wordt (in de sectie over Ethernet staan redenen waarom dit gedaan wordt). Het symbool `=>` na de interface `lo0` zegt dat niet alleen de teruglus gebruikt wordt (aangezien dit adres ook verwijst naar de lokale host), maar specifiek dat dit een alias is. Zulke routes verschijnen alleen op de hosts die de alias ondersteunen; alle andere hosts op het lokale netwerk vermelden simpelweg een regel met `link#1` voor zulke routes.

De laatste regel (bestemming subnet `224`) heeft te maken met multicasten, wat in een andere sectie besproken wordt.

Als laatste staan in de kolom `Flags` verschillende attributen. Hieronder staat een korte tabel met enkele van deze vlaggen en hun betekenis:

U | Up: De route is actief.
H | Host: De bestemming van de route is een enkele host.
G | Gateway: Stuur alles voor deze bestemming door naar dit verre systeem, dat zoekt daar uit waar het verder naar te sturen.
S | Statisch: Deze route was handmatig ingesteld, dus niet automatisch door het systeem aangemaakt.
C | Kloon: Maakt op basis van deze route een nieuwe route aan voor machines waarmee verbinding wordt gemaakt. Dit soort routes wordt gewoonlijk in lokale netwerken gebruikt.
W | WasGekloond: Geeft aan dat een route automatisch was ingesteld gebaseerd op een LAN (kloon)-route.
L | Verbinding: De route maakt gebruik van verwijzingen naar Ethernet-hardware.

### 31.2.2. Standaardroutes

Wanneer het lokale systeem een verbinding met een verre host moet maken, controleert het de routeertabel op reeds bekende paden. Indien de verre host binnen een subnet valt waarvan bekend is hoe het bereikt kan worden (gekloonde routes), controleert het systeem of het met de daarbij behorende interface verbinding kan maken.

Indien alle bekende paden falen, heeft het systeem één laatste mogelijkheid: de “standaardroute”. Deze route is een speciaal soort gateway-route (gewoonlijk de enig aanwezige in het systeem) en is altijd gemarkeerd met een `c` in het vlaggenveld. Voor hosts op een LAN staat deze gateway ingesteld op de machine die een directe verbinding met de buitenwereld heeft (via een PPP-verbinding, DSL, kabelmodem, T1, of een ander netwerkinterface).

Indien de standaardroute wordt ingesteld voor een machine die zelf als gateway naar de buitenwereld werkt, zal de standaardroute de gateway-machine van de internetprovider zijn.

Hieronder volgt een voorbeeld van standaardroutes. Dit is een veelgebruikte opstelling:

De hosts `Lokaal1` en `Lokaal2` staan op deze site. `Lokaal1` is verbonden met een internetprovider via een inbel-PPP-verbinding. Deze PPP-server is door een LAN verbonden met een andere gateway-computer door een externe interface naar de Internet-feed van de internetprovider.

De standaardroutes voor de machines zijn:

Host | Standaard gateway | Interface
--- | --- | ---
Lokaal2 | Lokaal1 | Ethernet
Lokaal1 | T1-GW | PPP

Een veelvoorkomende vraag is “Waarom (of hoe) moet worden ingesteld dat `T1-GW` de standaard gateway is voor `Lokaal1`, in plaats van de server van de internetprovider waarmee het verbonden is?”.

Onthoud dat, aangezien de PPP-interface een adres gebruikt op het lokale netwerk van de internetprovider voor deze kant van de verbinding, routes voor alle andere machines op het lokale netwerk van de internetprovider automatisch aangemaakt worden. Daarom is het al bekend hoe de machine `T1-GW` bereikt kan worden, dus is de tussenstap dat het verkeer eerst naar de server van de internetprovider gestuurd wordt niet nodig.

Het is gebruikelijk om het adres `X.X.X.1` te gebruiken als het gateway-adres voor het lokale netwerk. Dus (gebruikmakend van hetzelfde voorbeeld), indien de lokale klasse-C adresruimte `10.20.30` was en de internetprovider `10.9.9` gebruikte, zouden de standaardroutes als volgt zijn:

Host | Standaardroute
--- | ---
Lokaal2 (10.20.30.2) | Lokaal1 (10.20.30.1)
Lokaal1 (10.20.30.1, 10.9.9.30) | T1-GW (10.9.9.1)

De standaardroute kan eenvoudig in `/etc/rc.conf` gedefinieerd worden. In dit voorbeeld werd de volgende regel aan `/etc/rc.conf` van `Lokaal2` toegevoegd:

defaultrouter="10.20.30.1"

Het is ook mogelijk dit met het commando route(8) direct vanaf de opdrachtregel te doen:

`#` `route add default 10.20.30.1`

Voor meer informatie over het handmatig manipuleren van netwerkrouteertabellen kan de hulppagina route(8) geraadpleegd worden.

### 31.2.3. Dual Homed machines

Er is nog één andere soort opstelling die behandeld dient te worden, en dat is een host die in twee verschillende netwerken zit. Technisch gezien telt elke machine die als gateway dienst doet (in bovenstaand voorbeeld door een PPP-verbinding te gebruiken) als een dual-homed host. Maar de term wordt echt alleen gebruikt om naar een machine te verwijzen die in twee LAN's zit.

In het ene geval heeft de machine twee Ethernetkaarten, waarbij elke kaart een adres op de gescheiden subnetten heeft. Een alternatief is dat de machine slechts één Ethernetkaart heeft en gebruikt maakt van ifconfig(8) aliasing. Het eerste wordt gebruikt indien er twee fysiek gescheiden Ethernet-netwerken in gebruik zijn, het laatste indien er één fysiek netwerksegment is, maar er twee logisch gescheiden subnetten zijn.

In beide gevallen worden er routeertabellen aangemaakt zodat elk subnet weet dat deze machine de gedefinieerde gateway (ingaande route) naar het andere subnet is. Deze opstelling, waarbij de machine dienst doet als router tussen de twee subnetten, wordt vaak gebruikt voor het implementeren van pakketfilters of firewall-beveiliging in één of beide richtingen.

Om deze machine daadwerkelijk pakketten te laten forwarden tussen de twee interfaces, moet aan FreeBSD verteld worden dat het deze mogelijkheid aan moet zetten. In de volgende sectie staan meer details over hoe dit te doen.

### 31.2.4. Een router bouwen

Een netwerkrouter is simpelweg een systeem dat pakketten van de ene naar de andere interface doorstuurt. Internetstandaarden en goede ontwerppraktijken verhinderen het FreeBSD Project dit standaard in FreeBSD aan te zetten. Deze mogelijkheid kan worden aangezet door de volgende variabele in rc.conf(5) op `YES` in te stellen:

gateway_enable="YES" # Op YES instellen indien deze host een gateway is

Deze optie stelt de sysctl(8) variabele `net.inet.ip.forwarding` in op `1`. Indien het nodig is om het routen tijdelijk te stoppen, kan deze variabele tijdelijk op `0` worden teruggezet.

De nieuwe router heeft routes nodig om te weten waar het het verkeer naar toe moet sturen. Voor een eenvoudig netwerk kunnen statische routes gebruikt worden. FreeBSD wordt met het standaard BSD routeer-daemon routed(8) geleverd, dat RIP (zowel versie 1 en versie 2) en IRDP spreekt. Ondersteuning voor BGP v4, OSPF v2, en andere slimme routeerprotocollen is beschikbaar via het pakket `net/zebra`. Ook zijn commerciële producten als GateD® beschikbaar voor complexere netwerkrouteer-oplossingen.

### 31.2.5. Statische routes opzetten

Bijgedragen door Al Hoang.

#### 31.2.5.1. Handmatige configuratie

Er wordt van het volgende netwerk uitgegaan:

In dit scenario is `RouterA` een FreeBSD-machine die dienst doet als router naar de rest van het Internet. Het heeft een standaardroute ingesteld op `10.0.0.1`, dat het in staat stelt om verbindingen met de buitenwereld te maken. Er wordt aangenomen dat `RouterB` reeds juist is ingesteld en dat het weet hoe het waar naar toe moet gaan. (In dit plaatje is dit simpel. Voeg een standaardroute op `RouterB` toe door `192.168.1.1` als gateway te gebruiken.)

De routeertabel voor `RouterA` zou er ongeveer als volgt uitzien:

`%` `netstat -nr` Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 10.0.0.1 UGS 0 49378 xl0 127.0.0.1 127.0.0.1 UH 0 6 lo0 10.0.0.0/24 link#1 UC 0 0 xl0 192.168.1.0/24 link#2 UC 0 0 xl1

Met de huidige routeertabel is `RouterA` niet in staat om Intern Net 2 te bereiken. Het heeft geen route voor `192.168.2.0/24`. Een manier om dit te verhelpen is om de route handmatig toe te voegen. Het volgende commando voegt het netwerk Intern Net 2 toe aan de routeertabel van `RouterA` door `192.168.1.2` als de volgende hop te gebruiken:

`#` `route add -net 192.168.2.0/24 192.168.1.2`

Nu kan `RouterA` elke host op het netwerk `192.168.2.0/24` bereiken.

#### 31.2.5.2. Persistente configuratie

Bovenstaand voorbeeld is perfect voor het instellen van een statische route op een draaiend systeem. Een probleem is dat de routeerinformatie verdwijnt indien de FreeBSD-machine opnieuw wordt opgestart. Aanvullende statische routes kunnen in `/etc/rc.conf` opgenomen worden:

# Voeg Intern Net 2 als een statische route toe static_routes="internnet2" route_internnet2="-net 192.168.2.0/24 192.168.1.2"

De instellingsvariabele `static_routes` is een lijst van strings gescheiden door een spatie. Elke string verwijst naar een routenaam. Bovenstaand voorbeeld heeft slechts één string in `static_routes`. Dit is de string `internnet2`. Vervolgens wordt een instellingsvariabele `route_`internnet2`` toegevoegd waarin alle instellingsparameters staan die aan het commando route(8) moeten worden doorgegeven. Voor bovenstaand voorbeeld zou het volgende commando zijn gebruikt:

`#` `route add -net 192.168.2.0/24 192.168.1.2`

Dus is `"-net 192.168.2.0/24 192.168.1.2"` nodig.

Zoals hierboven is vermeld is het mogelijk om meerdere strings in `static_routes` te hebben. Dit maakt het mogelijk om meerdere statische routes aan te maken. De volgende regels geven een voorbeeld van het toevoegen van statische routes voor de netwerken `192.168.0.0/24` en `192.168.1.0/24` op een denkbeeldige router:

static_routes="net1 net2" route_net1="-net 192.168.0.0/24 192.168.0.1" route_net2="-net 192.168.1.0/24 192.168.1.1"

### 31.2.6. Routes propageren

Er is al gesproken over hoe routes naar de buitenwereld te definiëren, maar niet over hoe de buitenwereld ons kan vinden.

Het is al bekend dat routeertabellen aangemaakt kunnen worden zodat al het verkeer voor een bepaalde adresruimte (in ons voorbeeld een klasse-C subnet) naar een bepaalde host op dat netwerk gezonden kan worden, dat de ingaande pakketten doorgeeft.

Wanneer een adresruimte aan een site wordt toegewezen, stelt de serviceprovider al hun routeertabellen zodanig in dat al het verkeer voor het bijhorende subnet naar de PPP-verbinding van de site gezonden wordt. Maar hoe weten sites door het land heen hoe naar de internetprovider van deze site te versturen?

Er bestaat een systeem (dat veel lijkt op de gedistribueerde DNS-informatie) dat alle toegewezen adresruimtes bijhoudt, en hun verbindingspunt met de Internet Backbone definieert. De “Backbone” zijn de grote kabels die Internetverkeer door het land en over de wereld sturen. Elke backbone-machine heeft een kopie van een master-verzameling van tabellen, die verkeer voor een bepaald netwerk naar een bepaalde backbone-carrier sturen, en van daaruit naar een keten van serviceproviders totdat het netwerk van de site bereikt is.

Het is de taak van de serviceprovider om bij de backbone-sites aan te geven dat zij het verbindingspunt (en dus het ingaande pad) zijn voor de site. Dit staat bekend als routepropagatie.

### 31.2.7. Problemen oplossen

Soms is er een probleem met routepropagatie en kunnen sommige sites geen verbinding maken. Misschien is het nuttigste commando om proberen uit te zoeken waar het routen misgaat traceroute(8). Het is ook nuttig als er geen verbinding mogelijk lijkt met een verre machine (dus als ping(8) faalt).

Het commando traceroute(8) wordt gedraaid met de naam van de verre host waarmee geprobeerd wordt te verbinden. Het laat de gateway-hosts zien langs het gepoogde pad, dat uiteindelijk de doelhost bereikt, of wegens een gebrek aan verbinding afgebroken wordt.

Raadpleeg voor meer informatie de hulppagina voor traceroute(8).

### 31.2.8. Multicast routen

FreeBSD ondersteunt zowel multicast-applicaties als multicast routen van huis uit. Voor multicast-applicaties is geen speciale configuratie van FreeBSD nodig; applicaties draaien over het algemeen als geleverd. Voor multicast routen dient ondersteuning in de kernel gecompileerd te worden:

options MROUTING

Ook dient de multicast-routeer-daemon mrouted(8) ingesteld worden zodat het tunnels en DVMRP via `/etc/mrouted.conf` aanmaakt. Kijk voor meer details over multicast-instellingen in de hulppagina voor mrouted(8).

### Opmerking:

De mrouted(8) multicast-routeer-daemon implementeert het multicast-routeer-protocol DVRMP welke in veel multicast-installaties grotendeels is vervangen door pim(4). mrouted(8) en de gerelateerde map-mbone(8) en mrinfo(8) gereedschappen zijn beschikbaar in de FreeBSD Ports Collectie als `net/mrouted`.

Terug | Omhoog | Volgende
Hoofdstuk 31. Geavanceerde netwerken | Begin | 31.3. Draadloze netwerken