Zoeken op website

Hoe u van een Linux-server een router kunt maken om verkeer statisch en dynamisch af te handelen - Deel 10


Zoals we hebben verwacht in eerdere tutorials van deze LFCE (Linux Foundation Certified Engineer) serie, zullen we in dit artikel de routering van IP-verkeer statisch en dynamisch met specifieke applicaties bespreken.

Introductie van het Linux Foundation-certificeringsprogramma

Laten we eerst een paar definities op een rij zetten:

  1. In eenvoudige bewoordingen is een pakket de basiseenheid die wordt gebruikt om informatie binnen een netwerk te verzenden. Netwerken die TCP/IP als netwerkprotocol gebruiken, volgen dezelfde regels voor de overdracht van gegevens: de feitelijke informatie wordt opgesplitst in pakketten die zijn gemaakt van zowel gegevens als het adres waar deze naartoe moeten worden verzonden.
  2. Routing is het proces waarbij de gegevens van bron naar bestemming binnen een netwerk worden “geleid”.
  3. Statische routering vereist een handmatig geconfigureerde set regels die zijn gedefinieerd in een routeringstabel. Deze regels liggen vast en worden gebruikt om de manier te definiëren waarop een pakket moet passeren als het van de ene machine naar de andere gaat.
  4. Dynamische routering, of slimme routering (als u dat wenst), betekent dat het systeem indien nodig automatisch de route kan wijzigen die een pakket volgt.

Geavanceerde IP- en netwerkapparaatconfiguratie

Het iproute-pakket biedt een set tools voor het beheren van netwerken en verkeerscontrole die we in dit artikel zullen gebruiken, aangezien ze de vervanging vertegenwoordigen van oudere tools zoals ifconfig en route.

Het centrale hulpprogramma in de iproute suite heet eenvoudigweg ip. De basissyntaxis is als volgt:

ip object command

Waar object slechts één van de volgende kan zijn (alleen de meest voorkomende objecten worden getoond – u kunt man ip raadplegen voor een volledige lijst):

  1. link: netwerkapparaat.
  2. addr: protocoladres (IP of IPv6) op een apparaat.
  3. route: invoer in routeringstabel.
  4. regel: regel in de routeringsbeleidsdatabase.

Terwijl opdracht een specifieke actie vertegenwoordigt die op een object kan worden uitgevoerd. U kunt de volgende opdracht uitvoeren om de volledige lijst met opdrachten weer te geven die op een bepaald object kunnen worden toegepast:

ip object help

Bijvoorbeeld,

ip link help

De bovenstaande afbeelding laat bijvoorbeeld zien dat je de status van een netwerkinterface kunt wijzigen met het volgende commando:

ip link set interface {up | down}

Voor meer voorbeelden van de opdracht ‘ip’ leest u 10 nuttige ‘ip’-opdrachten om het IP-adres te configureren

Voorbeeld 1: Een netwerkinterface in- en uitschakelen

In dit voorbeeld zullen we eth1 in- en uitschakelen:

ip link show
ip link set eth1 down
ip link show

Als u eth1 opnieuw wilt inschakelen,

ip link set eth1 up

In plaats van alle netwerkinterfaces weer te geven, kunnen we er één specificeren:

ip link show eth1

Welke alle informatie voor eth1 zal retourneren.

Voorbeeld 2: Weergave van de hoofdrouteringstabel

U kunt uw huidige hoofdrouteringstabel bekijken met een van de volgende 3 opdrachten:

ip route show
route -n
netstat -rn

De eerste kolom in de uitvoer van de drie opdrachten geeft het doelnetwerk aan. De uitvoer van ip route show (na het trefwoord dev) presenteert ook de netwerkapparaten die dienen als fysieke gateway voor die netwerken.

Hoewel tegenwoordig het ip-commando de voorkeur heeft boven route, kun je nog steeds man ip-route en man route raadplegen voor een gedetailleerde uitleg van de rest van de kolommen.

Voorbeeld 3: Een Linux-server gebruiken om pakketten tussen twee particuliere netwerken te routeren

We willen icmp (ping)-pakketten van dev2 naar dev4 routeren en ook andersom (merk op dat beide clientmachines zich op verschillende netwerken bevinden). De naam van elke NIC, samen met het bijbehorende IPv4-adres, staat tussen vierkante haakjes.

Onze testomgeving is als volgt:

Client 1: CentOS 7 [enp0s3: 192.168.0.17/24] - dev1
Router: Debian Wheezy 7.7 [eth0: 192.168.0.15/24, eth1: 10.0.0.15/24] - dev2
Client 2: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4

Laten we de routeringstabel in dev1 (CentOS-box) bekijken:

ip route show

en wijzig het vervolgens om de enp0s3 NIC en de verbinding met 192.168.0.15 te gebruiken om toegang te krijgen tot hosts in het 10.0.0.0/24 netwerk:

ip route add 10.0.0.0/24 via 192.168.0.15 dev enp0s3

Wat in wezen luidt: "Voeg een route toe aan het 10.0.0.0/24-netwerk via de enp0s3-netwerkinterface met behulp van 192.168.0.15 als gateway".

Op dezelfde manier in dev4 (openSUSE-box) om hosts in het 192.168.0.0/24-netwerk te pingen:

ip route add 192.168.0.0/24 via 10.0.0.15 dev enp0s3

Ten slotte moeten we het doorsturen inschakelen in onze Debian-router:

echo 1 > /proc/sys/net/ipv4/ip_forward

Laten we nu pingen:

En,

Om deze instellingen bij het opstarten persistent te maken, bewerkt u /etc/sysctl.conf op de router en zorgt u ervoor dat de variabele net.ipv4.ip_forward als volgt op true is ingesteld:

net.ipv4.ip_forward = 1

Configureer bovendien de NIC's op beide clients (zoek het configuratiebestand in /etc/sysconfig/network op openSUSE en /etc/sysconfig/network-scripts op CentOS – in beide gevallen heet het ifcfg-enp0s3).

Hier is het configuratiebestand uit de openSUSE-box:

BOOTPROTO=static
BROADCAST=10.0.0.255
IPADDR=10.0.0.18
NETMASK=255.255.255.0
GATEWAY=10.0.0.15
NAME=enp0s3
NETWORK=10.0.0.0
ONBOOT=yes
Voorbeeld 4: Een Linux-server gebruiken om pakketten te routeren tussen privénetwerken en internet

Een ander scenario waarin een Linux-machine als router kan worden gebruikt, is wanneer u uw internetverbinding moet delen met een privé-LAN.

Router: Debian Wheezy 7.7 [eth0: Public IP, eth1: 10.0.0.15/24] - dev2
Client: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4

Naast het instellen van pakketdoorsturen en de statische routeringstabel in de client, zoals in het vorige voorbeeld, moeten we een paar iptables-regels in de router toevoegen:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Het eerste commando voegt een regel toe aan de POSTROUTING-keten in de nat-tabel (Network Address Translation), waarmee wordt aangegeven dat de eth0 NIC moet worden gebruikt voor uitgaande pakketten.

MASQUERADE geeft aan dat deze NIC een dynamisch IP-adres heeft en dat voordat het pakket naar de “wilde wilde wereld ” van internet wordt verzonden, het privébronadres van het pakket moet worden gewijzigd gewijzigd in dat van het openbare IP-adres van de router.

In een LAN met veel hosts houdt de router de tot stand gebrachte verbindingen bij in /proc/net/ip_conntrack, zodat hij weet waar het antwoord van internet naartoe moet worden teruggestuurd.

Slechts een deel van de output van:

cat /proc/net/ip_conntrack

wordt weergegeven in de volgende schermafbeelding.

Waar de oorsprong (privé-IP van openSUSE-box) en bestemming (Google DNS) van pakketten is gemarkeerd. Dit was het resultaat van het hardlopen:

curl linux-console.net

op de openSUSE-box.

Zoals je vast al kunt raden, gebruikt de router 8.8.8.8 van Google als naamserver, wat verklaart waarom de bestemming van uitgaande pakketten naar dat adres verwijst.

Opmerking: dat inkomende pakketten van internet alleen worden geaccepteerd als ze deel uitmaken van een reeds tot stand gebrachte verbinding (opdracht #2), terwijl uitgaande pakketten zijn toegestaan “vrije uitgang ” (opdracht #3).

Vergeet niet om uw iptables-regels persistent te maken door de stappen te volgen die zijn beschreven in Deel 8 – Configureer Iptables Firewall van deze serie.

Dynamische routering met Quagga

Tegenwoordig is quagga het meest gebruikte hulpmiddel voor dynamische routering in Linux. Het stelt systeembeheerders in staat om met een relatief goedkope Linux-server dezelfde functionaliteit te implementeren die wordt geboden door krachtige (en dure) Cisco-routers.

De tool zelf verzorgt niet de routering, maar wijzigt eerder de kernelrouteringstabel terwijl het nieuwe beste routes leert om pakketten af te handelen.

Omdat het een vork van zebra is, een programma waarvan de ontwikkeling al een tijdje geleden is gestopt, behoudt het om historische redenen dezelfde commando's en structuur als zebra. Daarom zul je vanaf dit punt veel verwijzingen naar zebra's zien.

Houd er rekening mee dat het niet mogelijk is om dynamische routering en alle gerelateerde protocollen in één artikel te behandelen, maar ik ben ervan overtuigd dat de hier gepresenteerde inhoud als uitgangspunt zal dienen waarop u kunt voortbouwen.

Quagga installeren onder Linux

Om quagga op de door u gekozen distributie te installeren:

aptitude update && aptitude install quagga 				[On Ubuntu]
yum update && yum install quagga 					[CentOS/RHEL]
zypper refresh && zypper install quagga 				[openSUSE]

We zullen dezelfde omgeving gebruiken als in voorbeeld #3, met het enige verschil dat eth0 is verbonden met een hoofdgatewayrouter met IP 192.168.0.1.

Bewerk vervolgens /etc/quagga/daemons met,

zebra=1
ripd=1

Maak nu de volgende configuratiebestanden.

/etc/quagga/zebra.conf
/etc/quagga/ripd.conf

en voeg deze regels toe (vervang deze door een hostnaam en wachtwoord naar keuze):

service quagga restart
hostname    	dev2
password    	quagga
service quagga restart

Opmerking: ripd.conf is het configuratiebestand voor het Routing Information Protocol, dat de router voorziet van informatie over welke netwerken kunnen worden gebruikt bereikt en hoe ver ze zijn (in termen van hoeveelheid hop).

Merk op dat dit slechts een van de protocollen is die samen met quagga gebruikt kunnen worden, en ik heb dit voor deze tutorial gekozen vanwege het gebruiksgemak en omdat de meeste netwerkapparaten dit ondersteunen, hoewel het het nadeel heeft dat de inloggegevens in platte tekst worden doorgegeven. Om die reden moet u de juiste machtigingen toewijzen aan het configuratiebestand:

chown quagga:quaggavty /etc/quagga/*.conf
chmod 640 /etc/quagga/*.conf 
Voorbeeld 5: Quagga instellen om IP-verkeer dynamisch te routeren

In dit voorbeeld gebruiken we de volgende opstelling met twee routers (zorg ervoor dat u de configuratiebestanden voor router #2 maakt, zoals eerder uitgelegd):

Belangrijk: vergeet niet de volgende configuratie voor beide routers te herhalen.

Maak verbinding met zebra (luisterend op poort 2601), wat de logische tussenpersoon is tussen de router en de kernel:

telnet localhost 2601

Voer het wachtwoord in dat is ingesteld in het bestand /etc/quagga/zebra.conf en schakel vervolgens de configuratie in:

enable
configure terminal

Voer het IP-adres en netwerkmasker van elke NIC in:

inter eth0
ip addr 192.168.0.15
inter eth1
ip addr 10.0.0.15
exit
exit
write

Nu moeten we verbinding maken met de RIP daemon-terminal (poort 2602):

telnet localhost 2602

Voer de gebruikersnaam en het wachtwoord in zoals geconfigureerd in het bestand /etc/quagga/ripd.conf en typ vervolgens de volgende opdrachten vetgedrukt (commentaar is toegevoegd ter verduidelijking):

enable turns on privileged mode command.
configure terminal changes to configuration mode. This command is the first step to configuration
router rip enables RIP.
network 10.0.0.0/24 sets the RIP enable interface for the 10.0.0.0/24 network. 
exit
exit
write writes current configuration to configuration file.

Opmerking: in beide gevallen wordt de configuratie toegevoegd aan de regels die we eerder hebben toegevoegd (/etc/quagga/zebra.conf en < b>/etc/quagga/ripd.conf).

Maak ten slotte opnieuw verbinding met de zebra-service op beide routers en noteer hoe elk van hen de route heeft “geleerd” naar het netwerk dat zich achter de ander bevindt, en wat de volgende stap is om daar te komen netwerk, door het commando show ip route uit te voeren:

show ip route

Als u verschillende protocollen of opstellingen wilt proberen, kunt u de Quagga-projectsite raadplegen voor verdere documentatie.

Conclusie

In dit artikel hebben we uitgelegd hoe je statische en dynamische routing instelt met behulp van een Linux boxrouter(s). Voel je vrij om zoveel routers toe te voegen als je wilt, en te experimenteren zoveel je wilt. Aarzel niet om contact met ons op te nemen via het onderstaande contactformulier als u opmerkingen of vragen heeft.