32.10. Network Address Translation

Bijgedragen door Chern Lee.

32.10.1. Overzicht

Het Network Address Translation daemon van FreeBSD, in het algemeen bekend als natd(8), is een daemon dat rauwe binnenkomende IP-pakketten accepteert, de bron naar die van de plaatselijke machine verandert en de pakketten terug in de uitgaande IP-pakketstroom injecteert. natd(8) doet dit door het IP-adres en de poort van de bron zo te veranderen dat wanneer de gegevens weer ontvangen worden, het in staat is om de originele plaats van de gegevens te achterhalen en ze door te sturen naar de originele aanvrager.

NAT wordt het meest gebruikt wat in het algemeen bekend is als het delen van een Internetverbinding.

32.10.2. Installatie

Wegens de krimpende IP-ruimte in IPv4, en het groeiend aantal gebruikers van consumentenlijnen op hoge snelheid zoals kabel of DSL, hebben steeds meer mensen een oplossing als het delen van een Internetverbinding nodig. Vanwege de mogelijkheid om meerdere computers online te verbinden door één verbinding en IP-adres is natd(8) een redelijke keuze.

In de meeste gevallen heeft een gebruiker een machine verbonden met een kabel- of DSL-lijn met één IP-adres en is het gewenst om deze ene verbonden computer te gebruiken om Internettoegang aan meerdere computers over een LAN te geven.

Hiervoor dient de FreeBSD-machine op het Internet dienst doen als gateway. Deze gateway-machine heeft twee NICs nodig — één voor de verbinding met de Internetrouter, de andere voor de verbinding met het LAN. Alle machines op het LAN zijn verbonden door een hub of switch.

Opmerking: Er zijn vele manieren om een LAN via een FreeBSD-gateway met het Internet te verbinden. Dit voorbeeld behandelt slechts een gateway met tenminste twee NICs.

Dit soort installaties wordt in het algemeen gebruikt om een Internetverbinding te delen. Eén van de LAN-machines is verbonden met het Internet. De rest van de machines hebben internettoegang via die “gateway”-machine.

32.10.3. Bootloader-configuratie

De mogelijkheden van de kernel voor network address translation met natd(8) staan niet aan in GENERIC, maar ze kunnen worden voorgeladen tijdens het opstarten door enkele opties aan /boot/loader.conf toe te voegen:

ipfw_load="YES"
ipdivert_load="YES"

Ook moet de tunable net.inet.ip.fw.default_to_accept op 1 worden gezet:

net.inet.ip.fw.default_to_accept="1"

Opmerking: Het is een goed idee om deze optie aan te zetten tijdens de eerste pogingen om een firewall en NAT gateway te installeren. Op deze manier zal het standaardbeleid van ipfw(8) allow ip from any to any zijn in plaats van het minder vrije deny ip from any to any, en zal het iets moeilijker zijn om buitengesloten te worden net na het opnieuw opstarten van het systeem.

32.10.4. Kernelconfiguratie

Wanneer modules geen optie zijn of wanneer het gewenst is om alle benodigde mogelijkheden in de draaiende kernel te bouwen, dienen de volgende opties in het kernelinstellingenbestand aanwezig te zijn:

options IPFIREWALL
options IPDIVERT

De volgende opties kunnen ook van pas komen:

options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_VERBOSE

32.10.5. Systeeminstellingen voor het opstarten

Om de firewall en NAT tijdens het opstarten aan te zetten, moet het volgende in /etc/rc.conf staan:

gateway_enable="YES" (1)
firewall_enable="YES" (2)
firewall_type="OPEN" (3)
natd_enable="YES"
natd_interface="fxp0" (4)
natd_flags="" (5)
(1)
Stelt de machine in om dienst te doen als gateway. Het draaien van sysctl net.inet.ip.forwarding=1 heeft hetzelfde effect.
(2)
Activeert de firewall-regels in /etc/rc.firewall tijdens het opstarten.
(3)
Dit specificeert een vooraf gedefinieerde verzameling van firewall-regels die alles binnenlaat. Raadpleeg /etc/rc.firewall voor aanvullende types.
(4)
Geeft aan welke interface te gebruiken om pakketten naar door te sturen (de interface die met het Internet verbonden is).
(5)
Alle aanvullende instelopties die tijdens het opstarten aan natd(8) worden doorgegeven.

Het gedefinieerd hebben van de bovenstaande opties in /etc/rc.conf zal natd -interface fxp0 draaien tijdens het opstarten. Dit kan ook handmatig worden gedraaid.

Opmerking: Het is ook mogelijk om een instellingenbestand voor natd(8) te gebruiken als er teveel opties zijn om door te geven. In dit geval dient het instellingenbestand te worden gedefinieerd door de volgende regel aan /etc/rc.conf toe te voegen:

natd_flags="-f /etc/natd.conf"

Het bestand /etc/natd.conf zal een lijst met instelopties bevatten, één per regel. Het geval in de volgende sectie bijvoorbeeld zal het volgende bestand gebruiken:

redirect_port tcp 192.168.0.2:6667 6667
redirect_port tcpc 192.168.0.3:80 80

Raadpleeg voor meer informatie over het instellingenbestand het gedeelte over de optie -f van de hulppagina natd(8).

Elke machine en interface achter het LAN dient een IP-adres in de privé-netwerkruimte toegewezen te krijgen zoals gedefinieerd in RFC 1918 en een standaard gateway van het interne IP-adres van de natd-machine hebben.

Bijvoorbeeld, cliënt A en B achter het LAN hebben IP-adressen 192.168.0.2 en 192.168.0.3, terwijl de LAN-interface van de natd-machine IP-adres 192.168.0.1 heeft. De standaard gateway van cliënt A en B dient ingesteld te worden op die van de natd-machine, 192.168.0.1. Voor de externe, of Internet-interface van de natd-machine zijn geen speciale wijzigingen nodig om natd(8) te laten werken.

32.10.6. Poorten omleiden

Het nadeel van natd(8) is dat de LAN-cliënten niet vanaf het Internet toegankelijk zijn. Cliënten op het LAN kunnen uitgaande verbinden naar de wereld maken maar kunnen geen inkomende verbindingen ontvangen. Dit vormt een probleem wanneer geprobeerd wordt om Internetdiensten op een van de LAN-cliëntmachines te draaien. Een eenvoudige om dit te omzeilen is om bepaalde Internetpoorten op de natd-machine om te leiden naar een LAN-cliënt.

Bijvoorbeeld, er draait een IRC-server op cliënt A, en er draait een webserver op cliënt B. Om dit goed te laten werken, dienen verbindingen die worden ontvangen op poorten 6667 (IRC) en 80 (web) te worden omgeleid naar de respectievelijke machines.

De optie -redirect_port dient aan natd(8) met de juiste opties te worden doorgegeven. De syntaxis is als volgt:

     -redirect_port proto doelIP:doelPOORT[-doelPOORT]
                 [aliasIP:]aliasPOORT[-aliasPOORT]
                 [verIP[:verrePOORT[-verrePOORT]]]

In het bovenstaand voorbeeld dienen de argumenten te zijn:

     -redirect_port tcp 192.168.0.2:6667 6667
-redirectport tcp 192.168.0.3:80 80

Dit zal de juiste tcp-poorten naar de LAN-cliënt-machines omleiden.

Het argument -redirect_port kan worden gebruikt om poortbereiken over individuele poorten aan te geven. Bijvoorbeeld, tcp 192.168.0.2:2000-3000 2000-3000 zal alle verbindingen die op poorten 2000 tot 3000 worden ontvangen omleiden naar poorten 2000 tot 3000 op cliënt A.

Deze opties kunnen worden gebruikt wanneer natd(8) direct wordt gedraaid, wanneer ze zijn geplaatst in de optie natd_flags="" van /etc/rc.conf, of wanneer ze via een instellingenbestand worden doorgegeven.

Raadpleeg voor meer instelopties natd(8).

32.10.7. Adressen omleiden

Adressen omleiden is handig wanneer er verschillende IP-adressen beschikbaar zijn, maar ze op één machine moeten zitten. Hiermee kan natd(8) aan elke LAN-cliënt een eigen extern IP-adres toewijzen. Vervolgens overschrijft natd(8) de uitgaande pakketten van de LAN-cliënten met het juiste IP-adres en leidt het al het binnenkomende verkeer op dat ene IP-adres terug naar de specifieke LAN-cliënt. Dit staat ook bekend als statisch NAT. Bijvoorbeeld, de IP-adressen 128.1.1.1, 128.1.1.2, en 1281.2..3 behoren toe aan de natd gateway-machine. 128.1.1.1 kan gebruikt worden als het externe IP-adres van de natd gateway-machine, terwijl 128.1.1.2 en 128.1.1.3 terug worden gestuurd naar de LAN-cliënten A en B.

De syntaxis van -redirect_address is als volgt:

-redirect_address lokaalIP publiekIP
lokaalIP Het interne IP-adres van de LAN-cliënt.
publiekIP Het externe IP-adres overeenkomend met de LAN-cliënt.

In het voorbeeld zou dit argument zijn:

-redirect_address 192.168.0.2 128.1.1.2
-redirect_address 192.168.0.3 128.1.1.3

Net zoals -redirect_port worden ook deze argumenten geplaatst in de optie natd_flags="" van /etc/rc.conf, of doorgegeven via een instellingenbestand. Met adresomleiding is het omleiden van poorten niet nodig aangezien alle gegevens die op een bepaald IP-adres worden ontvangen worden omgeleidt.

Het externe IP-adres op de natd machine dient actief en naar een externe interface gealiased te zijn. In rc.conf(5) staat hoe dit te doen.