Com convertir un servidor Linux en un encaminador per gestionar el trànsit de manera estàtica i dinàmica - Part 10


Com hem anticipat en tutorials anteriors d'aquesta sèrie LFCE (Linux Foundation Certified Engineer), en aquest article parlarem de l'encaminament del trànsit IP de manera estàtica i dinàmica amb aplicacions específiques.

Primer de tot, aclarim algunes definicions:

  1. En paraules senzilles, un paquet és la unitat bàsica que s'utilitza per transmetre informació dins d'una xarxa. Les xarxes que utilitzen TCP/IP com a protocol de xarxa segueixen les mateixes regles per a la transmissió de dades: la informació real es divideix en paquets que estan fets tant de dades com de l'adreça on s'ha d'enviar.
  2. L'encaminament és el procés de \guiar les dades de la font a la destinació dins d'una xarxa.
  3. L'encaminament estàtic requereix un conjunt de regles configurades manualment definides en una taula d'encaminament. Aquestes regles són fixes i s'utilitzen per definir la manera com ha de passar un paquet mentre viatja d'una màquina a una altra.
  4. Enrutament dinàmic, o encaminament intel·ligent (si ho desitja), significa que el sistema pot alterar automàticament, segons sigui necessari, la ruta que segueix un paquet.

Configuració avançada de dispositius de xarxa i IP

El paquet iproute proporciona un conjunt d'eines per gestionar la xarxa i el control del trànsit que utilitzarem al llarg d'aquest article, ja que representen la substitució d'eines heretades com ara ifconfig i route.

La utilitat central de la suite iproute s'anomena simplement ip. La seva sintaxi bàsica és la següent:

# ip object command

On objecte només pot ser un dels següents (només es mostren els objectes més freqüents; podeu fer referència a man ip per obtenir una llista completa):

  1. enllaç: dispositiu de xarxa.
  2. addr: adreça de protocol (IP o IPv6) en un dispositiu.
  3. ruta: entrada de la taula d'encaminament.
  4. regla: regla a la base de dades de polítiques d'encaminament.

Mentre que ordre representa una acció específica que es pot dur a terme sobre un objecte. Podeu executar l'ordre següent per mostrar la llista completa d'ordres que es poden aplicar a un objecte concret:

# ip object help

Per exemple,

# ip link help

La imatge de dalt mostra, per exemple, que podeu canviar l'estat d'una interfície de xarxa amb l'ordre següent:

# ip link set interface {up | down}

Per obtenir més exemples d'ordres ip, llegiu 10 ordres ip útils per configurar l'adreça IP

En aquest exemple, desactivarem i activarem eth1:

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

Si voleu tornar a habilitar eth1,

# ip link set eth1 up

En lloc de mostrar totes les interfícies de xarxa, podem especificar una d'elles:

# ip link show eth1

Que retornarà tota la informació per a eth1.

Podeu veure la vostra taula d'encaminament principal actual amb qualsevol de les 3 ordres següents:

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

La primera columna de la sortida de les tres ordres indica la xarxa de destinació. La sortida de ip route show (després de la paraula clau dev) també presenta els dispositius de xarxa que serveixen com a porta d'entrada física a aquestes xarxes.

Encara que avui en dia es prefereix l'ordre ip a la ruta, encara podeu fer referència a man ip-route i man route per obtenir una explicació detallada de la resta de les columnes.

Volem encaminar els paquets icmp (ping) de dev2 a dev4 i al revés també (tingueu en compte que ambdues màquines client estan en xarxes diferents). El nom de cada NIC, juntament amb la seva adreça IPv4 corresponent, es dóna entre claudàtors.

El nostre entorn de prova és el següent:

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

Vegem la taula d'encaminament a dev1 (quadre CentOS):

# ip route show

i després modifiqueu-lo per utilitzar la seva NIC enp0s3 i la connexió a 192.168.0.15 per accedir als amfitrions de la xarxa 10.0.0.0/24:

# ip route add 10.0.0.0/24 via 192.168.0.15 dev enp0s3

El que bàsicament diu: Afegiu una ruta a la xarxa 10.0.0.0/24 a través de la interfície de xarxa enp0s3 utilitzant 192.168.0.15 com a passarel·la.

De la mateixa manera a dev4 (caixa openSUSE) per fer ping als amfitrions de la xarxa 192.168.0.0/24:

# ip route add 192.168.0.0/24 via 10.0.0.15 dev enp0s3

Finalment, hem d'habilitar el reenviament al nostre encaminador Debian:

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

Ara fem ping:

i,

Per fer que aquests paràmetres siguin persistents entre els arrencades, editeu /etc/sysctl.conf a l'encaminador i assegureu-vos que la variable net.ipv4.ip_forward estigui configurada com a true de la manera següent:

net.ipv4.ip_forward = 1

A més, configureu les NIC als dos clients (cerqueu el fitxer de configuració a /etc/sysconfig/network a openSUSE i a /etc/sysconfig/network-scripts a CentOS: en ambdós casos s'anomena ifcfg-enp0s3).

Aquí teniu el fitxer de configuració del quadre d'openSUSE:

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

Un altre escenari on es pot utilitzar una màquina Linux com a encaminador és quan necessiteu compartir la vostra connexió a Internet amb una LAN privada.

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

A més de configurar el reenviament de paquets i la taula d'encaminament estàtica al client com a l'exemple anterior, hem d'afegir algunes regles iptables al router:

# 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

La primera ordre afegeix una regla a la cadena POSTROUTING a la taula nat (Traducció d'adreces de xarxa), indicant que s'ha d'utilitzar la NIC eth0 per als paquets de sortida.

MASQUERADE indica que aquesta NIC té una IP dinàmica i que abans d'enviar el paquet al \món salvatge salvatge d'Internet, l'adreça font privada del paquet ha de canviarà a la de la IP pública de l'encaminador.

En una LAN amb molts amfitrions, l'encaminador fa un seguiment de les connexions establertes a /proc/net/ip_conntrack perquè sàpiga on tornar la resposta d'Internet.

Només una part de la sortida de:

# cat /proc/net/ip_conntrack

es mostra a la captura de pantalla següent.

On es destaca l'origen (IP privada de la caixa openSUSE) i la destinació (DNS de Google) dels paquets. Aquest va ser el resultat de la carrera:

# curl linux-console.net

al quadre d'openSUSE.

Com estic segur que ja podeu endevinar, l'encaminador utilitza el 8.8.8.8 de Google com a servidor de noms, la qual cosa explica per què la destinació dels paquets de sortida apunta a aquesta adreça.

Nota: que els paquets entrants d'Internet només s'accepten si formen part d'una connexió ja establerta (ordre núm. 2), mentre que els paquets sortints es permeten \sortida lliure (ordre núm. 3).

No us oblideu de fer que les vostres regles d'iptables siguin persistents seguint els passos descrits a la Part 8: Configuració del tallafoc d'Iptables d'aquesta sèrie.

Encaminament dinàmic amb Quagga

Actualment, l'eina més utilitzada per a l'encaminament dinàmic a Linux és quagga. Permet als administradors de sistemes implementar, amb un servidor Linux de cost relativament baix, la mateixa funcionalitat que proporcionen els potents (i costosos) encaminadors de Cisco.

L'eina en si mateixa no gestiona l'encaminament, sinó que modifica la taula d'encaminament del nucli a mesura que aprèn noves millors rutes per gestionar els paquets.

Com que és una bifurcació de zebra, un programa el desenvolupament del qual va cessar fa un temps, manté per raons històriques les mateixes ordres i estructura que zebra. És per això que veureu moltes referències a la zebra a partir d'aquest moment.

Tingueu en compte que no és possible cobrir l'encaminament dinàmic i tots els protocols relacionats en un sol article, però estic segur que el contingut que es presenta aquí us servirà com a punt de partida per construir-lo.

Per instal·lar quagga a la distribució escollida:

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

Utilitzarem el mateix entorn que amb l'exemple #3, amb l'única diferència que eth0 està connectat a un encaminador de passarel·la principal amb IP 192.168.0.1.

A continuació, editeu /etc/quagga/daemons amb,

zebra=1
ripd=1

Ara creeu els fitxers de configuració següents.

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

i afegiu aquestes línies (substituïu el nom d'amfitrió i la contrasenya de la vostra elecció):

service quagga restart
hostname    	dev2
password    	quagga
# service quagga restart

Nota: aquest ripd.conf és el fitxer de configuració del protocol d'informació d'encaminament, que proporciona a l'encaminador la informació de quines xarxes es pot arribar i fins a quin punt (en termes de quantitat de salts) es troben.

Tingueu en compte que aquest és només un dels protocols que es poden utilitzar juntament amb quagga, i el vaig triar per a aquest tutorial per la facilitat d'ús i perquè la majoria de dispositius de xarxa ho admeten, tot i que té l'inconvenient de passar les credencials en text pla. Per aquest motiu, heu d'assignar els permisos adequats al fitxer de configuració:

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

En aquest exemple farem servir la configuració següent amb dos encaminadors (assegureu-vos de crear els fitxers de configuració per a l'encaminador #2 tal com s'ha explicat anteriorment):

Important: no oblideu repetir la configuració següent per als dos encaminadors.

Connecteu-vos a zebra (escoltant al port 2601), que és l'intermediari lògic entre l'encaminador i el nucli:

# telnet localhost 2601

Introduïu la contrasenya que s'ha establert al fitxer /etc/quagga/zebra.conf i, a continuació, activeu la configuració:

enable
configure terminal

Introduïu l'adreça IP i la màscara de xarxa de cada NIC:

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

Ara ens hem de connectar al terminal del dimoni RIP (port 2602):

# telnet localhost 2602

Introduïu el nom d'usuari i la contrasenya tal com s'ha configurat al fitxer /etc/quagga/ripd.conf i, a continuació, escriviu les ordres següents en negreta (s'afegeixen comentaris per aclarir-ho):

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.

Nota: que en ambdós casos la configuració s'adjunta a les línies que hem afegit anteriorment (/etc/quagga/zebra.conf i /etc/quagga/ripd.conf) .

Finalment, torneu a connectar-vos al servei zebra d'ambdós encaminadors i observeu com cadascun d'ells ha \apres la ruta a la xarxa que hi ha darrere de l'altre, i quin és el següent salt per arribar. aquesta xarxa, executant l'ordre mostra la ruta ip:

# show ip route

Si voleu provar diferents protocols o configuracions, podeu consultar el lloc del projecte Quagga per obtenir més documentació.

Conclusió

En aquest article hem explicat com configurar l'encaminament estàtic i dinàmic, utilitzant un(s) encaminador(s) de caixa de Linux. No dubteu a afegir tants encaminadors com vulgueu i experimentar tant com vulgueu. No dubteu a contactar amb nosaltres mitjançant el formulari de contacte següent si teniu algun comentari o pregunta.