Sådan omdannes en Linux-server til en router, der håndterer trafik statisk og dynamisk - Del 10


Som vi har forventet i tidligere tutorials af denne LFCE ( Linux Foundation Certified Engineer ) -serie, i denne artikel vil vi diskutere routing af IP-trafik statisk og dynamisk med specifikke applikationer.

Første ting først, lad os få nogle definitioner lige:

  1. Med enkle ord er en pakke den basisenhed, der bruges til at overføre information inden for et netværk. Netværk, der bruger TCP/IP som netværksprotokol, følger de samme regler for transmission af data: den aktuelle information er opdelt i pakker, der er lavet af både data og den adresse, hvor de skal sendes til.
  2. Routing er processen med at " styre " dataene fra kilde til destination i et netværk.
  3. Statisk routing kræver et manuelt konfigureret regelsæt defineret i en routingtabel. Disse regler er faste og bruges til at definere den måde, en pakke skal gå igennem, når den bevæger sig fra en maskine til en anden.
  4. Dynamisk routing eller smart routing (hvis du ønsker det) betyder, at systemet automatisk kan ændre den rute, som en pakke følger, efter behov.

Avanceret konfiguration af IP- og netværksenheder

Pakken iproute indeholder et sæt værktøjer til styring af netværk og trafikkontrol, som vi vil bruge i hele denne artikel, da de repræsenterer erstatning af ældre værktøjer som ifconfig og rute .

Det centrale værktøj i pakken iproute kaldes simpelthen ip. Dens basale syntaks er som følger:

# ip object command

Hvor objekt kun kan være et af følgende (kun de hyppigste objekter vises - du kan henvise til mand ip for en komplet liste):

  1. link : netværksenhed.
  2. addr : protokol (IP eller IPv6) adresse på en enhed.
  3. rute : rutetabelpost.
  4. regel : regel i routingpolitisk database.

Mens kommando repræsenterer en bestemt handling, der kan udføres på objektet. Du kan køre følgende kommando for at få vist den komplette liste over kommandoer, der kan anvendes på et bestemt objekt:

# ip object help

For eksempel,

# ip link help

Ovenstående billede viser for eksempel, at du kan ændre status på en netværksgrænseflade med følgende kommando:

# ip link set interface {up | down}

For sådanne flere eksempler på kommandoen ' ip ', læs 10 nyttige 'ip'-kommandoer til konfiguration af IP-adresse

I dette eksempel vil vi deaktivere og aktivere eth1 :

# ip link show
# ip link set eth1 down
# ip link show

Hvis du vil genaktivere eth1,

# ip link set eth1 up

I stedet for at vise alle netværksgrænseflader kan vi angive en af dem:

# ip link show eth1

Hvilket vil returnere al information til eth1.

Du kan se din aktuelle hovedrutetabel med en af følgende 3 kommandoer:

# ip route show
# route -n
# netstat -rn

Den første kolonne i output af de tre kommandoer angiver målnetværket. Outputtet fra ip-rute viser (efter nøgleordet dev ) præsenterer også de netværksenheder, der fungerer som fysisk gateway til disse netværk.

Selvom ip-kommandoen i dag foretrækkes frem for rute, kan du stadig henvise til mand ip-rute og mandrute for en detaljeret forklaring på resten af kolonnerne.

Vi vil rute icmp (ping) -pakker fra dev2 til dev4 og omvendt også (bemærk, at begge klientmaskiner er på forskellige netværk). Navnet på hvert NIC sammen med dets tilsvarende IPv4-adresse er angivet inden for firkantede parenteser.

Vores testmiljø er som følger:

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

Lad os se routingtabellen i dev1 (CentOS-boks):

# ip route show

og rediger det derefter for at bruge dets enp0s3 NIC og forbindelsen til 192.168.0.15 for at få adgang til værter i 10.0.0.0/24-netværket:

# ip route add 10.0.0.0/24 via 192.168.0.15 dev enp0s3

Som i det væsentlige lyder: "Tilføj en rute til 10.0.0.0/24-netværket gennem enp0s3-netværksgrænsefladen ved hjælp af 192.168.0.15 som gateway".

Ligeledes i dev4 (openSUSE-boks) til ping-værter i 192.168.0.0/24-netværket:

# ip route add 192.168.0.0/24 via 10.0.0.15 dev enp0s3

Endelig er vi nødt til at aktivere videresendelse i vores Debian-router:

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

Lad os nu pinge:

og,

For at gøre disse indstillinger vedvarende på tværs af støvler skal du redigere /etc/sysctl.conf på routeren og sørge for, at variablen net.ipv4.ip_forward er sat til sand som følger:

net.ipv4.ip_forward = 1

Derudover skal du konfigurere NIC'erne på begge klienter (se efter konfigurationsfilen inden for /etc/sysconfig/network på openSUSE og /etc/sysconfig/network-scripts på CentOS - i begge tilfælde kaldes det ifcfg-enp0s3 ).

Her er konfigurationsfilen fra openSUSE-feltet:

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

Et andet scenario, hvor en Linux-maskine kan bruges som router, er når du har brug for at dele din internetforbindelse med et privat 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

Ud over at konfigurere videresendelse af pakker og den statiske routingtabel i klienten som i det foregående eksempel, skal vi tilføje et par iptables-regler i routeren:

# 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

Den første kommando tilføjer en regel til POSTROUTING -kæden i nat-tabellen (Network Address Translation), der angiver, at eth0 NIC skal bruges til udgående pakker.

MASQUERADE angiver, at dette NIC har en dynamisk IP, og at inden den sendes pakken til " den vilde vilde verden " på Internettet, skal den private kildeadresse være ændret til routerens offentlige IP.

I et LAN med mange værter holder routeren styr på etablerede forbindelser i /proc/net/ip_conntrack , så den ved, hvor svaret fra Internettet skal returneres.

Kun en del af output fra:

# cat /proc/net/ip_conntrack

vises i det følgende skærmbillede.

Hvor pakkernes oprindelse (privat IP i openSUSE-feltet) og destination (Google DNS) er fremhævet. Dette var resultatet af løb:

# curl linux-console.net

på openSUSE-boksen.

Som jeg er sikker på, at du allerede kan gætte, bruger routeren Googles 8.8.8.8 som navneserver, hvilket forklarer, hvorfor destinationen for udgående pakker peger på den adresse.

Bemærk: At indgående pakker fra Internettet kun accepteres, er, hvis de er en del af en allerede oprettet forbindelse (kommando nr. 2), mens udgående pakker er tilladt “ fri afslutning ” (kommando nr. 3).

Glem ikke at gøre dine iptables-regler vedholdende ved at følge trinene beskrevet i del 8 - Konfigurer Iptables Firewall i denne serie.

Dynamisk routing med Quagga

I dag er det værktøj, der er mest brugt til dynamisk routing i Linux, quagga . Det giver systemadministratorer mulighed for med en relativt billig Linux-server at implementere den samme funktionalitet, som leveres af kraftfulde (og dyre) Cisco-routere.

Selve værktøjet håndterer ikke routingen, men ændrer snarere kernen-routingtabellen, da det lærer nye bedste ruter til at håndtere pakker.

Da det er en gaffel med zebra, et program, hvis udvikling ophørte for et stykke tid siden, opretholder det af historiske årsager de samme kommandoer og struktur end zebra. Derfor vil du se en masse henvisning til zebra fra dette tidspunkt.

Bemærk, at det ikke er muligt at dække dynamisk routing og alle relaterede protokoller i en enkelt artikel, men jeg er overbevist om, at indholdet, der præsenteres her, vil tjene som udgangspunkt for dig at bygge videre på.

Sådan installeres quagga på din valgte distribution:

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

Vi bruger det samme miljø som med eksempel nr. 3, med den eneste forskel at eth0 er forbundet til en hovedgateway-router med IP 192.168.0.1.

Rediger derefter /etc/quagga/daemons med,

zebra=1
ripd=1

Opret nu følgende konfigurationsfiler.

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

og tilføj disse linjer (erstat for et værtsnavn og adgangskode efter eget valg):

service quagga restart
hostname    	dev2
password    	quagga
# service quagga restart

Bemærk: At ripd.conf er konfigurationsfilen til routinginformationsprotokollen, som giver routeren oplysningerne om, hvilke netværk der kan nås, og hvor langt (med hensyn til humle) de er.

Bemærk, at dette kun er en af de protokoller, der kan bruges sammen med quagga, og jeg valgte det til denne vejledning på grund af brugervenlighed, og fordi de fleste netværksenheder understøtter det, selvom det har ulempen ved at sende legitimationsoplysninger i almindelig tekst. Af den grund skal du tildele korrekte tilladelser til konfigurationsfilen:

# chown quagga:quaggavty /etc/quagga/*.conf
# chmod 640 /etc/quagga/*.conf 

I dette eksempel bruger vi følgende opsætning med to routere (sørg for at oprette konfigurationsfilerne til router nr. 2 som tidligere forklaret):

Vigtigt: Glem ikke at gentage følgende opsætning for begge routere.

Opret forbindelse til zebra (lytter på port 2601 ), som er den logiske formidler mellem routeren og kernen:

# telnet localhost 2601

Indtast den adgangskode, der blev indstillet i filen /etc/quagga/zebra.conf , og aktiver derefter konfiguration:

enable
configure terminal

Indtast IP-adressen og netværksmasken for hvert NIC:

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

Nu skal vi oprette forbindelse til RIP dæmonterminalen (port 2602):

# telnet localhost 2602

Indtast brugernavn og adgangskode som konfigureret i filen /etc/quagga/ripd.conf , og skriv derefter følgende kommandoer med fed skrift (kommentarer tilføjes af hensyn til afklaring):

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.

Bemærk: At konfigurationen i begge tilfælde føjes til de linjer, vi tidligere har tilføjet ( /etc/quagga/zebra.conf og /etc/quagga/ripd.conf ) .

Til sidst skal du oprette forbindelse igen til zebra-tjenesten på begge routere og bemærke, hvordan hver enkelt af dem har " lært " ruten til det netværk, der er bag den anden, og som er det næste hop for at komme til det netværk ved at køre kommandoen vis ip-rute :

# show ip route

Hvis du vil prøve forskellige protokoller eller opsætninger, kan du henvise til Quagga-projektstedet for yderligere dokumentation.

Konklusion

I denne artikel har vi forklaret, hvordan man konfigurerer statisk og dynamisk routing ved hjælp af en Linux box router. Du er velkommen til at tilføje så mange routere, som du ønsker, og eksperimentere så meget som du vil. Tøv ikke med at vende tilbage til os ved hjælp af nedenstående kontaktformular, hvis du har kommentarer eller spørgsmål.